From 1c0cdbf14292bf24ce04ebbec341b9275d63066b Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 25 Jan 2013 22:01:36 +0400 Subject: [PATCH] Look up kotlin-runtime.jar through the marker class + more marker classes --- .../versions/KotlinRuntimeLibraryUtil.java | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/versions/KotlinRuntimeLibraryUtil.java b/idea/src/org/jetbrains/jet/plugin/versions/KotlinRuntimeLibraryUtil.java index 88636591f1f..1adbcdd25fe 100644 --- a/idea/src/org/jetbrains/jet/plugin/versions/KotlinRuntimeLibraryUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/versions/KotlinRuntimeLibraryUtil.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin.versions; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; @@ -37,6 +38,7 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.impl.elements.ManifestFileUtil; import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; import com.intellij.util.Processor; @@ -46,13 +48,14 @@ import com.intellij.util.indexing.ID; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil; -import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.utils.PathUtil; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Set; +import java.util.*; import java.util.jar.Attributes; import java.util.jar.JarFile; @@ -142,7 +145,30 @@ public class KotlinRuntimeLibraryUtil { private static boolean isWithJavaModule(Module module) { // Can find a reference to kotlin class in module scope GlobalSearchScope scope = module.getModuleWithDependenciesAndLibrariesScope(false); - return (JavaPsiFacade.getInstance(module.getProject()).findClass(JvmStdlibNames.JET_OBJECT.getFqName().getFqName(), scope) != null); + + return getKotlinRuntimeMarkerClass(scope) != null; + } + + @Nullable + private static PsiClass getKotlinRuntimeMarkerClass(@NotNull GlobalSearchScope scope) { + FqName kotlinPackageFqName = FqName.topLevel(Name.identifier("kotlin")); + String kotlinPackageClassFqName = PackageClassUtils.getPackageClassFqName(kotlinPackageFqName).getFqName(); + + ImmutableList candidateClassNames = ImmutableList.of( + kotlinPackageClassFqName, + // For older versions + "kotlin.namespace", + // For really old versions + "jet.JetObject" + ); + + for (String className : candidateClassNames) { + PsiClass psiClass = JavaPsiFacade.getInstance(scope.getProject()).findClass(className, scope); + if (psiClass != null) { + return psiClass; + } + } + return null; } static void setUpKotlinRuntimeLibrary( @@ -261,16 +287,15 @@ public class KotlinRuntimeLibraryUtil { @Nullable private static VirtualFile getKotlinRuntimeJar(@NotNull Project project) { - LibraryTable table = ProjectLibraryTable.getInstance(project); - Library kotlinRuntime = table.getLibraryByName(LIBRARY_NAME); - if (kotlinRuntime != null) { - for (VirtualFile root : kotlinRuntime.getFiles(OrderRootType.CLASSES)) { - if (root.getName().equals(KOTLIN_RUNTIME_JAR)) { - return root; - } - } - } - return null; + PsiClass markerClass = getKotlinRuntimeMarkerClass(ProjectScope.getAllScope(project)); + if (markerClass == null) return null; + + VirtualFile virtualFile = markerClass.getContainingFile().getVirtualFile(); + if (virtualFile == null) return null; + + + ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project); + return projectFileIndex.getClassRootForFile(virtualFile); } @Nullable