ElementFilter (PsiElement position) { PsiClass containingClass = PsiTreeUtil.getParentOfType(position, PsiClass.class, false, PsiCodeBlock.class, PsiMethod.class, PsiExpressionList.class, PsiVariable.class, PsiAnnotation.class); if (containingClass != null) { if (IN_PERMITS_LIST.accepts(position)) { return createPermitsListFilter(); } if (IN_EXTENDS_OR_IMPLEMENTS.accepts(position)) { AndFilter filter = new AndFilter(ElementClassFilter.CLASS, new NotFilter(new AssignableFromContextFilter()), new ExcludeDeclaredFilter(new ClassFilter(PsiClass.class))); PsiElement cls = position.getParent().getParent().getParent(); if (cls instanceof PsiClass && !(cls instanceof PsiTypeParameter)) { filter = new AndFilter(filter, new NoFinalLibraryClassesFilter()); } return filter; } if (IN_TYPE_PARAMETER.accepts(position)) { return new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)); } } if (getAnnotationNameIfInside(position) != null) { return new OrFilter(ElementClassFilter.PACKAGE, new AnnotationTypeFilter()); } if (JavaKeywordCompletion.isDeclarationStart(position) || JavaKeywordCompletion.isInsideParameterList(position) || isInsideAnnotationName(position) || PsiTreeUtil.getParentOfType(position, PsiReferenceParameterList.class, false, PsiAnnotation.class) != null || IN_VARIABLE_TYPE.accepts(position)) { return new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.PACKAGE); } if (psiElement().afterLeaf(PsiKeyword.INSTANCEOF).accepts(position) || position.getParent() instanceof PsiJavaCodeReferenceElement ref && ref.getParent() instanceof PsiTypeElement typeElement && (typeElement.getParent() instanceof PsiPatternVariable || typeElement.getParent() instanceof PsiDeconstructionList)) { return new ElementFilter() { @Override public boolean isAcceptable(Object element, @Nullable PsiElement context) { return element instanceof PsiClass && !(element instanceof PsiTypeParameter); } @Override public boolean isClassAcceptable(Class<?> hintClass) { return PsiClass.class.isAssignableFrom(hintClass) && !PsiTypeParameter.class.isAssignableFrom(hintClass); } }; } if (JavaKeywordCompletion.VARIABLE_AFTER_FINAL.accepts(position)) { return ElementClassFilter.CLASS; } if (CATCH_OR_FINALLY.accepts(position) || JavaKeywordCompletion.START_SWITCH.accepts(position) || JavaKeywordCompletion.isInstanceofPlace(position) || JavaKeywordCompletion.isAfterPrimitiveOrArrayType(position)) { return null; } if (JavaKeywordCompletion.START_FOR.withParents(PsiJavaCodeReferenceElement.class, PsiExpressionStatement.class, PsiForStatement.class).accepts(position)) { return new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.VARIABLE); } if (JavaSmartCompletionContributor.AFTER_NEW.accepts(position)) { return ElementClassFilter.CLASS; } if (psiElement().inside(PsiAnnotationParameterList.class).accepts(position)) { return createAnnotationFilter(); } PsiVariable var = PsiTreeUtil.getParentOfType(position, PsiVariable.class, false, PsiClass.class); if (var != null && PsiTreeUtil.isAncestor(var.getInitializer(), position, false)) { return new ExcludeFilter(var); } if (IN_CASE_LABEL_ELEMENT_LIST.accepts(position)) { return getCaseLabelElementListFilter(position); } PsiForeachStatement loop = PsiTreeUtil.getParentOfType(position, PsiForeachStatement.class); if (loop != null && PsiTreeUtil.isAncestor(loop.getIteratedValue(), position, false)) { return new ExcludeFilter(loop.getIterationParameter()); } if (PsiTreeUtil.getParentOfType(position, PsiPackageAccessibilityStatement.class) != null) { return applyScopeFilter(ElementClassFilter.PACKAGE, position); } if (PsiTreeUtil.getParentOfType(position, PsiUsesStatement.class, PsiProvidesStatement.class) != null) { ElementFilter filter = new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.PACKAGE); if (PsiTreeUtil.getParentOfType(position, PsiReferenceList.class) != null) { filter = applyScopeFilter(filter, position); } return filter; } if (position.getParent() instanceof PsiReferenceExpression) { PsiClass enumClass = GenericsHighlightUtil.getEnumClassForExpressionInInitializer((PsiReferenceExpression)position.getParent()); if (enumClass != null) { return new EnumStaticFieldsFilter(enumClass); } } return TrueFilter.INSTANCE; }