From a1fa230d8258b85e6eb7a7a6bd472e406f2a0aab Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 20 Jan 2014 16:15:22 +0400 Subject: [PATCH] Fix built-ins reference resolve tests Built-in sources are contained now in two directories: compiled and non-compiled (native). kotlin-plugin.jar has them both under 'jet/', but for tests we manually specify where to look for the former, as it was for the latter in LightClassUtil.java. Simplify code in JetReferenceUtil to have almost the same meaning as in JetPsiReference.multiResolve() --- .../references/BuiltInsReferenceResolver.java | 30 +++++++++++++++++-- .../plugin/references/JetReferenceUtil.java | 22 ++++---------- 2 files changed, 33 insertions(+), 19 deletions(-) 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)); } } }