void (@NotNull PsiDeclarationStatement psiDeclarationStatement) { super.visitDeclarationStatement(psiDeclarationStatement); final PsiElement firstChild = psiDeclarationStatement.getFirstChild(); if (firstChild instanceof PsiTypeElement) { // search for expression or symbol final PsiJavaCodeReferenceElement reference = ((PsiTypeElement)firstChild).getInnermostComponentReferenceElement(); if (reference != null) { final PsiReferenceParameterList parameterList = reference.getParameterList(); if (parameterList != null) { final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements(); if (typeParameterElements.length > 0) { myCompilingVisitor.setHandler(psiDeclarationStatement, new TypedSymbolHandler()); // typed symbol myCompilingVisitor.setFilterSimple(psiDeclarationStatement, TypedSymbolNodeFilter.getInstance()); for (PsiTypeElement param : typeParameterElements) { if (param.getInnermostComponentReferenceElement() != null && myCompilingVisitor.getContext().getPattern().isRealTypedVar( param.getInnermostComponentReferenceElement().getReferenceNameElement())) { myCompilingVisitor.setFilterSimple(param, TypeParameterFilter.getInstance()); } } return; } } } } else if (firstChild instanceof PsiModifierList modifierList) { final PsiAnnotation[] annotations = modifierList.getAnnotations(); if (annotations.length != 1) { throw new MalformedPatternException(); } for (String modifier : PsiModifier.MODIFIERS) { if (modifierList.hasExplicitModifier(modifier)) { throw new MalformedPatternException(); } } myCompilingVisitor.setHandler(psiDeclarationStatement, new AnnotationHandler()); myCompilingVisitor.setFilterSimple(psiDeclarationStatement, AnnotationFilter.getInstance()); return; } final DeclarationStatementHandler handler = new DeclarationStatementHandler(); myCompilingVisitor.getContext().getPattern().setHandler(psiDeclarationStatement, handler); final PsiElement previousNonWhiteSpace = PsiTreeUtil.skipWhitespacesBackward(psiDeclarationStatement); if (previousNonWhiteSpace instanceof PsiComment) { handler.setCommentHandler(myCompilingVisitor.getContext().getPattern().getHandler(previousNonWhiteSpace)); myCompilingVisitor.getContext().getPattern().setHandler(previousNonWhiteSpace, handler); } // detect typed symbol, it will have no variable handler.setFilter(DeclarationFilter.getInstance()); }