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()
This commit is contained in:
@@ -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<JetFile> builtInsSources;
|
||||
private volatile MutablePackageFragmentDescriptor builtinsPackageFragment;
|
||||
@@ -107,8 +113,28 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
|
||||
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Set<JetFile> getJetBuiltInsFiles() {
|
||||
URL url = LightClassUtil.getBuiltInsDirUrl();
|
||||
Set<JetFile> 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<JetFile> getBuiltInSourceFiles(@NotNull URL url) {
|
||||
VirtualFile vf = VfsUtil.findFileByURL(url);
|
||||
assert vf != null : "Virtual file not found by URL: " + url;
|
||||
|
||||
|
||||
@@ -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<PsiElement> 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<PsiElement> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user