Search in sources :

Example 1 with ClassResolverProcessor

use of com.intellij.psi.impl.source.resolve.ClassResolverProcessor in project intellij-community by JetBrains.

the class JavaClassReference method advancedResolveInner.

private JavaResolveResult advancedResolveInner(@NotNull PsiElement psiElement, @NotNull String qName, @NotNull PsiFile containingFile) {
    final PsiManager manager = containingFile.getManager();
    final GlobalSearchScope scope = getScope(containingFile);
    if (myIndex == myJavaClassReferenceSet.getReferences().length - 1) {
        final PsiClass aClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(qName, scope);
        if (aClass != null) {
            return new ClassCandidateInfo(aClass, PsiSubstitutor.EMPTY, false, psiElement);
        } else {
            if (!JavaClassReferenceProvider.ADVANCED_RESOLVE.getBooleanValue(getOptions())) {
                return JavaResolveResult.EMPTY;
            }
        }
    }
    PsiElement resolveResult = JavaPsiFacade.getInstance(manager.getProject()).findPackage(qName);
    if (resolveResult == null) {
        resolveResult = JavaPsiFacade.getInstance(manager.getProject()).findClass(qName, scope);
    }
    if (myInStaticImport && resolveResult == null) {
        resolveResult = resolveMember(qName, manager, getElement().getResolveScope());
    }
    if (resolveResult == null) {
        if (containingFile instanceof PsiJavaFile) {
            if (containingFile instanceof ServerPageFile) {
                containingFile = containingFile.getViewProvider().getPsi(JavaLanguage.INSTANCE);
                if (containingFile == null)
                    return JavaResolveResult.EMPTY;
            }
            final ClassResolverProcessor processor = new ClassResolverProcessor(getCanonicalText(), psiElement, containingFile);
            PsiClass contextClass = myJavaClassReferenceSet.getProvider().getContextClass(psiElement);
            if (contextClass != null) {
                PsiScopesUtil.treeWalkUp(processor, contextClass, null);
            } else {
                containingFile.processDeclarations(processor, ResolveState.initial(), null, psiElement);
            }
            if (processor.getResult().length == 1) {
                final JavaResolveResult javaResolveResult = processor.getResult()[0];
                if (javaResolveResult != JavaResolveResult.EMPTY && getOptions() != null) {
                    final Boolean value = JavaClassReferenceProvider.RESOLVE_QUALIFIED_CLASS_NAME.getValue(getOptions());
                    final PsiClass psiClass = (PsiClass) javaResolveResult.getElement();
                    if (value != null && value.booleanValue() && psiClass != null) {
                        final String qualifiedName = psiClass.getQualifiedName();
                        if (!qName.equals(qualifiedName)) {
                            return JavaResolveResult.EMPTY;
                        }
                    }
                }
                return javaResolveResult;
            }
        }
    }
    return resolveResult != null ? new CandidateInfo(resolveResult, PsiSubstitutor.EMPTY, false, false, psiElement) : JavaResolveResult.EMPTY;
}
Also used : ClassResolverProcessor(com.intellij.psi.impl.source.resolve.ClassResolverProcessor) GlobalSearchScope(com.intellij.psi.search.GlobalSearchScope) ClassCandidateInfo(com.intellij.psi.infos.ClassCandidateInfo) CandidateInfo(com.intellij.psi.infos.CandidateInfo) ClassCandidateInfo(com.intellij.psi.infos.ClassCandidateInfo)

Example 2 with ClassResolverProcessor

use of com.intellij.psi.impl.source.resolve.ClassResolverProcessor in project intellij-community by JetBrains.

the class PsiJavaFileBaseImpl method processDeclarations.

@Override
public boolean processDeclarations(@NotNull final PsiScopeProcessor processor, @NotNull final ResolveState state, PsiElement lastParent, @NotNull PsiElement place) {
    assert isValid();
    if (processor instanceof ClassResolverProcessor && isPhysical() && (getUserData(PsiFileEx.BATCH_REFERENCE_PROCESSING) == Boolean.TRUE || myResolveCache.hasUpToDateValue())) {
        final ClassResolverProcessor hint = (ClassResolverProcessor) processor;
        String name = hint.getName(state);
        MostlySingularMultiMap<String, SymbolCollectingProcessor.ResultWithContext> cache = myResolveCache.getValue();
        MyResolveCacheProcessor cacheProcessor = new MyResolveCacheProcessor(processor, state);
        return name != null ? cache.processForKey(name, cacheProcessor) : cache.processAllValues(cacheProcessor);
    }
    return processDeclarationsNoGuess(processor, state, lastParent, place);
}
Also used : ClassResolverProcessor(com.intellij.psi.impl.source.resolve.ClassResolverProcessor)

Aggregations

ClassResolverProcessor (com.intellij.psi.impl.source.resolve.ClassResolverProcessor)2 CandidateInfo (com.intellij.psi.infos.CandidateInfo)1 ClassCandidateInfo (com.intellij.psi.infos.ClassCandidateInfo)1 GlobalSearchScope (com.intellij.psi.search.GlobalSearchScope)1