Introduce JavaClass.OriginKind

Answers to the question: where had this class originated from
This commit is contained in:
Alexander Udalov
2013-08-09 21:08:10 +04:00
parent 2d58bd571e
commit b9f96fe960
5 changed files with 27 additions and 15 deletions
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.intellij.psi.impl.compiled.ClsClassImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
@@ -38,7 +37,7 @@ public final class DescriptorResolverUtils {
} }
public static boolean isCompiledKotlinPackageClass(@NotNull JavaClass javaClass) { public static boolean isCompiledKotlinPackageClass(@NotNull JavaClass javaClass) {
if (javaClass.getPsi() instanceof ClsClassImpl) { if (javaClass.getOriginKind() == JavaClass.OriginKind.COMPILED) {
FqName fqName = javaClass.getFqName(); FqName fqName = javaClass.getFqName();
if (fqName != null && PackageClassUtils.isPackageClassFqName(fqName)) { if (fqName != null && PackageClassUtils.isPackageClassFqName(fqName)) {
return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE.getFqName().asString()) != null; return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE.getFqName().asString()) != null;
@@ -48,7 +47,7 @@ public final class DescriptorResolverUtils {
} }
public static boolean isCompiledKotlinClass(@NotNull JavaClass javaClass) { public static boolean isCompiledKotlinClass(@NotNull JavaClass javaClass) {
if (javaClass.getPsi() instanceof ClsClassImpl) { if (javaClass.getOriginKind() == JavaClass.OriginKind.COMPILED) {
return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_CLASS.getFqName().asString()) != null; return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_CLASS.getFqName().asString()) != null;
} }
return false; return false;
@@ -35,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.java.JavaClassFinder;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
@@ -265,8 +264,9 @@ public final class JavaClassResolver {
.contains(qualifiedName)) : "We can resolve the class, so it can't be 'unresolved' during parent resolution"; .contains(qualifiedName)) : "We can resolve the class, so it can't be 'unresolved' during parent resolution";
checkFqNamesAreConsistent(javaClass, qualifiedName); checkFqNamesAreConsistent(javaClass, qualifiedName);
checkPsiClassIsNotJet(javaClass);
assert javaClass.getOriginKind() != JavaClass.OriginKind.KOTLIN_LIGHT_CLASS :
"Trying to resolve a light class as a regular PsiClass: " + javaClass.getFqName();
return doCreateClassDescriptor(qualifiedName, javaClass, tasks, containingDeclaration); return doCreateClassDescriptor(qualifiedName, javaClass, tasks, containingDeclaration);
} }
@@ -404,12 +404,6 @@ public final class JavaClassResolver {
} }
} }
private static void checkPsiClassIsNotJet(@NotNull JavaClass javaClass) {
if (javaClass.getPsi() instanceof JetJavaMirrorMarker) {
throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + javaClass.getFqName());
}
}
@NotNull @NotNull
private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull FqName childClassFQName, boolean isInnerClass) { private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull FqName childClassFQName, boolean isInnerClass) {
FqName parentFqName = childClassFQName.parent(); FqName parentFqName = childClassFQName.parent();
@@ -21,7 +21,6 @@ import com.intellij.openapi.progress.ProgressIndicatorProvider;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
@@ -97,7 +96,7 @@ public final class JavaPackageScope extends JavaBaseScope {
for (JavaClass javaClass : DescriptorResolverUtils.filterDuplicateClasses(javaPackage.getClasses())) { for (JavaClass javaClass : DescriptorResolverUtils.filterDuplicateClasses(javaPackage.getClasses())) {
if (DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) continue; if (DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) continue;
if (javaClass.getPsi() instanceof JetJavaMirrorMarker) continue; if (javaClass.getOriginKind() == JavaClass.OriginKind.KOTLIN_LIGHT_CLASS) continue;
if (javaClass.getVisibility() != Visibilities.PUBLIC) continue; if (javaClass.getVisibility() != Visibilities.PUBLIC) continue;
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.Visibilities; import org.jetbrains.jet.lang.descriptors.Visibilities;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.structure.*; import org.jetbrains.jet.lang.resolve.java.structure.*;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -110,7 +109,7 @@ import java.util.Map;
private void process() { private void process() {
for (JavaClass javaClass : javaClasses) { for (JavaClass javaClass : javaClasses) {
if (!(javaClass.getPsi() instanceof JetJavaMirrorMarker)) { // to filter out JetLightClasses if (javaClass.getOriginKind() != JavaClass.OriginKind.KOTLIN_LIGHT_CLASS) {
if (SingleAbstractMethodUtils.isSamInterface(javaClass)) { if (SingleAbstractMethodUtils.isSamInterface(javaClass)) {
processSamInterface(javaClass); processSamInterface(javaClass);
} }
@@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.Modality; import org.jetbrains.jet.lang.descriptors.Modality;
import org.jetbrains.jet.lang.descriptors.Visibility; import org.jetbrains.jet.lang.descriptors.Visibility;
import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -32,6 +33,12 @@ import static org.jetbrains.jet.lang.resolve.java.structure.JavaElementCollectio
public class JavaClass extends JavaClassifier public class JavaClass extends JavaClassifier
implements JavaNamedElement, JavaTypeParameterListOwner, JavaModifierListOwner, JavaAnnotationOwner { implements JavaNamedElement, JavaTypeParameterListOwner, JavaModifierListOwner, JavaAnnotationOwner {
public enum OriginKind {
COMPILED,
SOURCE,
KOTLIN_LIGHT_CLASS
}
public JavaClass(@NotNull PsiClass psiClass) { public JavaClass(@NotNull PsiClass psiClass) {
super(psiClass); super(psiClass);
assert !(psiClass instanceof PsiTypeParameter) assert !(psiClass instanceof PsiTypeParameter)
@@ -175,4 +182,18 @@ public class JavaClass extends JavaClassifier
public JavaClassifierType getDefaultType() { public JavaClassifierType getDefaultType() {
return new JavaClassifierType(JavaPsiFacade.getElementFactory(getPsi().getProject()).createType(getPsi())); return new JavaClassifierType(JavaPsiFacade.getElementFactory(getPsi().getProject()).createType(getPsi()));
} }
@NotNull
public OriginKind getOriginKind() {
PsiClass psiClass = getPsi();
if (psiClass instanceof JetJavaMirrorMarker) {
return OriginKind.KOTLIN_LIGHT_CLASS;
}
else if (psiClass instanceof PsiCompiledElement) {
return OriginKind.COMPILED;
}
else {
return OriginKind.SOURCE;
}
}
} }