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;
import com.google.common.collect.ImmutableSet;
import com.intellij.psi.impl.compiled.ClsClassImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -38,7 +37,7 @@ public final class DescriptorResolverUtils {
}
public static boolean isCompiledKotlinPackageClass(@NotNull JavaClass javaClass) {
if (javaClass.getPsi() instanceof ClsClassImpl) {
if (javaClass.getOriginKind() == JavaClass.OriginKind.COMPILED) {
FqName fqName = javaClass.getFqName();
if (fqName != null && PackageClassUtils.isPackageClassFqName(fqName)) {
return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE.getFqName().asString()) != null;
@@ -48,7 +47,7 @@ public final class DescriptorResolverUtils {
}
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 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.JvmAnnotationNames;
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.scope.JavaClassNonStaticMembersScope;
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";
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);
}
@@ -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
private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull FqName childClassFQName, boolean isInnerClass) {
FqName parentFqName = childClassFQName.parent();
@@ -21,7 +21,6 @@ import com.intellij.openapi.progress.ProgressIndicatorProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
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.structure.JavaClass;
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())) {
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;
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.Visibilities;
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.structure.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -110,7 +109,7 @@ import java.util.Map;
private void process() {
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)) {
processSamInterface(javaClass);
}
@@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.Modality;
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.Name;
@@ -32,6 +33,12 @@ import static org.jetbrains.jet.lang.resolve.java.structure.JavaElementCollectio
public class JavaClass extends JavaClassifier
implements JavaNamedElement, JavaTypeParameterListOwner, JavaModifierListOwner, JavaAnnotationOwner {
public enum OriginKind {
COMPILED,
SOURCE,
KOTLIN_LIGHT_CLASS
}
public JavaClass(@NotNull PsiClass psiClass) {
super(psiClass);
assert !(psiClass instanceof PsiTypeParameter)
@@ -175,4 +182,18 @@ public class JavaClass extends JavaClassifier
public JavaClassifierType getDefaultType() {
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;
}
}
}