public static ElementPattern<PsiElement> getDocBlockTag() {
   return PlatformPatterns.or(
       PlatformPatterns.psiElement()
           .withSuperParent(1, PhpDocPsiElement.class)
           .withParent(PhpDocComment.class)
           .withLanguage(PhpLanguage.INSTANCE),
       // eap:
       // * @<completion>
       //
       // "@" char is not detected on lexer, so provider additional asterisk check for more secured
       // pattern filter
       PlatformPatterns.psiElement()
           .afterLeafSkipping(
               PlatformPatterns.or(PlatformPatterns.psiElement(PsiWhiteSpace.class)),
               PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_LEADING_ASTERISK))
           .withSuperParent(1, PhpDocPsiElement.class)
           .withLanguage(PhpLanguage.INSTANCE));
 }
 /** foo: b<caret>ar foo: [ b<caret>ar ] foo: { b<caret>ar } foo: - b<caret>ar */
 private PsiElementPattern.Capture<PsiElement> getGlobalServiceStringPattern() {
   return PlatformPatterns.psiElement()
       .withParent(
           PlatformPatterns.or(
               PlatformPatterns.psiElement(YAMLKeyValue.class),
               PlatformPatterns.psiElement(YAMLSequence.class),
               PlatformPatterns.psiElement(YAMLArray.class),
               PlatformPatterns.psiElement(YAMLHash.class)));
 }
 /** return 'value' inside class method */
 public static ElementPattern<PhpExpression> getMethodReturnPattern() {
   return PlatformPatterns.or(
       PlatformPatterns.psiElement(StringLiteralExpression.class)
           .withParent(PlatformPatterns.psiElement(PhpReturn.class).inside(Method.class))
           .withLanguage(PhpLanguage.INSTANCE),
       PlatformPatterns.psiElement(ClassConstantReference.class)
           .withParent(PlatformPatterns.psiElement(PhpReturn.class).inside(Method.class))
           .withLanguage(PhpLanguage.INSTANCE));
 }
 /** matches "@Callback(propertyName="<value>")" */
 public static PsiElementPattern.Capture<StringLiteralExpression> getPropertyIdentifierValue(
     String propertyName) {
   return PlatformPatterns.psiElement(StringLiteralExpression.class)
       .afterLeafSkipping(
           PlatformPatterns.or(
               PlatformPatterns.psiElement(PsiWhiteSpace.class),
               PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_TEXT).withText("=")),
           PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_IDENTIFIER).withText(propertyName))
       .withParent(PlatformPatterns.psiElement(PhpDocElementTypes.phpDocAttributeList));
 }
 /**
  * fire on: @Callback(<completion>), @Callback("", <completion>) * @ORM\Column( <completion>, )
  */
 public static ElementPattern<PsiElement> getDocAttribute() {
   return PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_IDENTIFIER)
       .afterLeafSkipping(
           PlatformPatterns.psiElement(PsiWhiteSpace.class),
           PlatformPatterns.or(
               PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_COMMA),
               PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_LPAREN),
               PlatformPatterns.psiElement(PhpDocTokenTypes.DOC_LEADING_ASTERISK)))
       .inside(PlatformPatterns.psiElement(PhpDocElementTypes.phpDocTag))
       .withLanguage(PhpLanguage.INSTANCE);
 }
  /**
   * $this->methodName('service_name') $this->methodName(SERVICE::NAME)
   * $this->methodName($this->name)
   */
  public static boolean isMethodWithFirstStringOrFieldReference(
      PsiElement psiElement, String... methodName) {

    if (!PlatformPatterns.psiElement(PhpElementTypes.METHOD_REFERENCE)
        .withChild(
            PlatformPatterns.psiElement(PhpElementTypes.PARAMETER_LIST)
                .withFirstChild(
                    PlatformPatterns.or(
                        PlatformPatterns.psiElement(PhpElementTypes.STRING),
                        PlatformPatterns.psiElement(PhpElementTypes.FIELD_REFERENCE),
                        PlatformPatterns.psiElement(PhpElementTypes.CLASS_CONSTANT_REFERENCE))))
        .accepts(psiElement)) {

      return false;
    }

    // cant we move it up to PlatformPatterns? withName condition dont looks working
    String methodRefName = ((MethodReference) psiElement).getName();

    return null != methodRefName && Arrays.asList(methodName).contains(methodRefName);
  }