package org.dlangplugin.psi; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.resolve.ResolveCache; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; /* Very, Very, Very important class. It's responsible for class lookup. When you put cursor on some class name * and press Ctrl+B (Go to declaration) this methods provides search for declaration. */ public class DLangResolver implements ResolveCache.AbstractResolver<DLangReference, List<? extends PsiElement>> { public static final DLangResolver INSTANCE = new DLangResolver(); @Override public List<? extends PsiElement> resolve(@NotNull DLangReference dLangReference, boolean incompleteCode) { List<PsiElement> results = new LinkedList<PsiElement>(); final DLangClass resultClass = DLangResolveUtil.tryResolveClassByName(dLangReference); if (resultClass != null) { results.add(resultClass.getComponentName()); } //Look inside imported modules PsiFile rootFile = dLangReference.getContainingFile(); Collection<DLangImportDeclaration> imports = PsiTreeUtil.findChildrenOfType(rootFile, DLangImportDeclaration.class); for(DLangImportDeclaration importStmnt : imports) { for(DLangModuleFullyQualifiedName moduleNameElm : PsiTreeUtil.findChildrenOfType(importStmnt, DLangModuleFullyQualifiedName.class)) { String moduleName = moduleNameElm.getText(); DLangClass foundClass = DLangResolveUtil.findClassByNameModule(dLangReference, moduleName); if(foundClass!=null) { results.add(foundClass.getComponentName()); } } } return results; } private static List<? extends PsiElement> toCandidateInfoArray(@Nullable PsiElement element) { return element == null ? Collections.<PsiElement>emptyList() : Arrays.asList(element); } }