diff --git a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java index cf72cca91a8..9086edc9f72 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java @@ -22,7 +22,8 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; @@ -43,7 +44,10 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.renderer.DescriptorRenderer; +import org.jetbrains.jet.utils.ExceptionUtils; +import java.io.File; +import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.Collections; @@ -51,6 +55,8 @@ import java.util.HashSet; import java.util.Set; public class BuiltInsReferenceResolver extends AbstractProjectComponent { + private static final File BUILT_INS_COMPILABLE_SRC_DIR = new File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME_STRING); + private volatile BindingContext bindingContext; private volatile Set builtInsSources; private volatile MutablePackageFragmentDescriptor builtinsPackageFragment; @@ -107,8 +113,28 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { } + @NotNull private Set getJetBuiltInsFiles() { - URL url = LightClassUtil.getBuiltInsDirUrl(); + Set builtIns = getBuiltInSourceFiles(LightClassUtil.getBuiltInsDirUrl()); + + if (ApplicationManager.getApplication().isUnitTestMode()) { + // In production, the above URL is enough as it contains sources for both native and compilable built-ins + // (it's simply "jet" directory in kotlin-plugin.jar) + // But in tests, sources of built-ins are not added to the classpath automatically, so we manually specify URLs for both: + // LightClassUtil.getBuiltInsDirUrl() does so for native built-ins and the code below for compilable built-ins + try { + builtIns.addAll(getBuiltInSourceFiles(BUILT_INS_COMPILABLE_SRC_DIR.toURI().toURL())); + } + catch (MalformedURLException e) { + throw ExceptionUtils.rethrow(e); + } + } + + return builtIns; + } + + @NotNull + private Set getBuiltInSourceFiles(@NotNull URL url) { VirtualFile vf = VfsUtil.findFileByURL(url); assert vf != null : "Virtual file not found by URL: " + url; diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetReferenceUtil.java b/idea/src/org/jetbrains/jet/plugin/references/JetReferenceUtil.java index ce67e382df2..0e2d8b9bcdd 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetReferenceUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetReferenceUtil.java @@ -23,12 +23,10 @@ import com.intellij.psi.ResolveResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; -import org.jetbrains.jet.plugin.libraries.DecompiledNavigationUtils; +import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil; -import java.util.Collection; import java.util.List; public class JetReferenceUtil { @@ -44,22 +42,12 @@ public class JetReferenceUtil { DeclarationDescriptor original = resultingDescriptor.getOriginal(); - List declarations = BindingContextUtils.descriptorToDeclarations(context, original); - for (PsiElement declaration : declarations) { - results.add(new PsiElementResolveResult(declaration, true)); + for (PsiElement declaration : BindingContextUtils.descriptorToDeclarations(context, original)) { + results.add(new PsiElementResolveResult(declaration)); } - JetDeclaration declarationInDecompiledFile = - DecompiledNavigationUtils.findDeclarationForReference(project, original); - if (declarationInDecompiledFile != null) { - results.add(new PsiElementResolveResult(declarationInDecompiledFile)); - } - - Collection builtInSymbols = - project.getComponent(BuiltInsReferenceResolver.class).resolveBuiltInSymbol(original); - - for (PsiElement symbol : builtInSymbols) { - results.add(new PsiElementResolveResult(symbol)); + for (PsiElement declaration : DescriptorToDeclarationUtil.findDeclarationsForDescriptorWithoutTrace(project, original)) { + results.add(new PsiElementResolveResult(declaration)); } } }