some classes from runtime.jar are not meant to be loaded by JDR
* assert runtime implementations from JetStandard* are not loaded by JavaDescriptorResolver * fix wrong @JetMethod in jet.Iterator * fix jet.Iterator ns was created * fix incorrect number of functions and tuples in JetStandardClasses * added TODO about inconsisten Tuple class
This commit is contained in:
+3
-3
@@ -360,7 +360,7 @@ public class JavaDescriptorResolver {
|
||||
// Not let's take a descriptor of a Java class
|
||||
ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
|
||||
if (classData == null) {
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
|
||||
if (psiClass == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -944,7 +944,7 @@ public class JavaDescriptorResolver {
|
||||
break lookingForPsi;
|
||||
}
|
||||
|
||||
psiClass = psiClassFinder.findPsiClass(fqName);
|
||||
psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
|
||||
if (psiClass != null) {
|
||||
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
|
||||
break lookingForPsi;
|
||||
@@ -983,7 +983,7 @@ public class JavaDescriptorResolver {
|
||||
|
||||
@Nullable
|
||||
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
|
||||
return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS));
|
||||
return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
|
||||
}
|
||||
|
||||
private static class ValueParameterDescriptors {
|
||||
|
||||
@@ -64,6 +64,10 @@ public class JvmStdlibNames {
|
||||
|
||||
|
||||
public static final JvmClassName JET_OBJECT = new JvmClassName("jet.JetObject");
|
||||
|
||||
|
||||
public static final JvmClassName ASSERT_INVISIBLE_IN_RESOLVER = new JvmClassName("org.jetbrains.jet.rt.annotation.AssertInvisibleInResolver");
|
||||
|
||||
|
||||
private JvmStdlibNames() {
|
||||
}
|
||||
|
||||
@@ -26,8 +26,13 @@ import org.jetbrains.jet.lang.resolve.FqName;
|
||||
* @author Stepan Koltsov
|
||||
*/
|
||||
public interface PsiClassFinder {
|
||||
enum RuntimeClassesHandleMode {
|
||||
THROW,
|
||||
IGNORE,
|
||||
}
|
||||
|
||||
@Nullable
|
||||
PsiClass findPsiClass(@NotNull FqName fqName);
|
||||
PsiClass findPsiClass(@NotNull FqName fqName, @NotNull RuntimeClassesHandleMode runtimeClassesHandleMode);
|
||||
@Nullable
|
||||
PsiPackage findPsiPackage(@NotNull FqName fqName);
|
||||
}
|
||||
|
||||
+22
-3
@@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.java;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.JavaPsiFacade;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import com.intellij.psi.impl.compiled.ClsClassImpl;
|
||||
@@ -29,11 +30,9 @@ import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.resolve.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
|
||||
import org.jetbrains.jet.plugin.JetFileType;
|
||||
import org.jetbrains.jet.utils.PathUtil;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* @author Stepan Koltsov
|
||||
@@ -74,7 +73,7 @@ public class PsiClassFinderForJvm implements PsiClassFinder {
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public PsiClass findPsiClass(@NotNull FqName qualifiedName) {
|
||||
public PsiClass findPsiClass(@NotNull FqName qualifiedName, @NotNull RuntimeClassesHandleMode runtimeClassesHandleMode) {
|
||||
PsiClass original = javaFacade.findClass(qualifiedName.getFqName(), javaSearchScope);
|
||||
PsiClass altClass = altClassFinder.findClass(qualifiedName);
|
||||
PsiClass result = original;
|
||||
@@ -97,6 +96,26 @@ public class PsiClassFinderForJvm implements PsiClassFinder {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
PsiAnnotation assertInvisibleAnnotation = result.getModifierList().findAnnotation(
|
||||
JvmStdlibNames.ASSERT_INVISIBLE_IN_RESOLVER.getFqName().getFqName());
|
||||
if (assertInvisibleAnnotation != null) {
|
||||
if (runtimeClassesHandleMode == RuntimeClassesHandleMode.IGNORE) {
|
||||
return null;
|
||||
}
|
||||
else if (runtimeClassesHandleMode == RuntimeClassesHandleMode.THROW) {
|
||||
throw new IllegalStateException(
|
||||
"classpath is configured incorrectly:" +
|
||||
" class " + qualifiedName + " from runtime must not be loaded by compiler");
|
||||
}
|
||||
else {
|
||||
throw new IllegalStateException("unknown parameter value: " + runtimeClassesHandleMode);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user