diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java index 8c395d79643..74a83a2a702 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java @@ -16,9 +16,7 @@ package org.jetbrains.jet.lang.resolve.java.descriptor; -import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -26,7 +24,6 @@ import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.lazy.LazyClassDescriptor; -import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.Collection; @@ -38,8 +35,8 @@ import java.util.Collection; public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite { @NotNull private final JavaDescriptorResolver javaDescriptorResolver; - @NotNull - private final ResolverClassData resolverBinaryClassData; + + private ResolverClassData resolverBinaryClassData = null; // lazy @@ -47,24 +44,23 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite { public ClassDescriptorFromJvmBytecode( @NotNull DeclarationDescriptor containingDeclaration, @NotNull ClassKind kind, - @NotNull PsiClass psiClass, @Nullable FqName fqName, - @NotNull JavaDescriptorResolver javaDescriptorResolver) { + @NotNull JavaDescriptorResolver javaDescriptorResolver + ) { super(containingDeclaration, kind); this.javaDescriptorResolver = javaDescriptorResolver; - this.resolverBinaryClassData = ResolverClassData.createBinaryClassData(psiClass, fqName, this); - } - - @NotNull - public ResolverClassData getResolverBinaryClassData() { - return resolverBinaryClassData; } @NotNull @Override public Collection getConstructors() { if (constructors == null) { + assert resolverBinaryClassData != null; this.constructors = javaDescriptorResolver.resolveConstructors(resolverBinaryClassData); } return constructors; } + + public void setClassData(@NotNull ResolverClassData resolverBinaryClassData) { + this.resolverBinaryClassData = resolverBinaryClassData; + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java index 48df0eab7dd..0c586fa6432 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java @@ -76,14 +76,14 @@ public final class JavaClassObjectResolver { } @Nullable - public ResolverClassData createClassObjectDescriptor( + public ClassDescriptorFromJvmBytecode createClassObjectDescriptor( @NotNull ClassDescriptor containing, @NotNull PsiClass psiClass ) { DescriptorResolverUtils.checkPsiClassIsNotJet(psiClass); if (psiClass.isEnum()) { - return createClassObjectDescriptorForEnum(containing, psiClass).getResolverBinaryClassData(); + return createClassObjectDescriptorForEnum(containing, psiClass); } if (!DescriptorResolverUtils.isKotlinClass(psiClass)) { @@ -91,7 +91,7 @@ public final class JavaClassObjectResolver { } if (hasInnerEnums(containing, psiClass)) { - return createSyntheticClassObject(containing, psiClass).getResolverBinaryClassData(); + return createSyntheticClassObject(containing, psiClass); } PsiClass classObjectPsiClass = getClassObjectPsiClass(psiClass); @@ -103,19 +103,21 @@ public final class JavaClassObjectResolver { } @NotNull - private ResolverClassData createClassObjectFromPsi(@NotNull ClassDescriptor containing, @NotNull PsiClass classObjectPsiClass) { + private ClassDescriptorFromJvmBytecode createClassObjectFromPsi( + @NotNull ClassDescriptor containing, + @NotNull PsiClass classObjectPsiClass + ) { String qualifiedName = classObjectPsiClass.getQualifiedName(); assert qualifiedName != null; FqName fqName = new FqName(qualifiedName); - ResolverClassData classData = new ClassDescriptorFromJvmBytecode( - containing, ClassKind.CLASS_OBJECT, classObjectPsiClass, fqName, javaDescriptorResolver) - .getResolverBinaryClassData(); - - ClassDescriptorFromJvmBytecode classObjectDescriptor = classData.getClassDescriptor(); - classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData, + ClassDescriptorFromJvmBytecode classObjectDescriptor + = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver); + ResolverClassData classObjectData = ResolverClassData.createBinaryClassData(classObjectPsiClass, fqName, classObjectDescriptor); + classObjectDescriptor.setClassData(classObjectData); + classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(new PsiClassWrapper(classObjectPsiClass), classObjectData, Collections.emptyList())); - setUpClassObjectDescriptor(containing, fqName, classData, getClassObjectName(containing.getName())); - return classObjectDescriptor.getResolverBinaryClassData(); + setUpClassObjectDescriptor(containing, fqName, classObjectData, getClassObjectName(containing.getName())); + return classObjectDescriptor; } private static boolean hasInnerEnums(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) { @@ -146,8 +148,11 @@ public final class JavaClassObjectResolver { @NotNull PsiClass psiClass ) { FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass); + ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode( - containing, ClassKind.CLASS_OBJECT, psiClass, null, javaDescriptorResolver); + containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver); + ResolverClassData classData = ResolverClassData.createBinaryClassData(psiClass, null, classObjectDescriptor); + classObjectDescriptor.setClassData(classData); ResolverClassData data = ResolverClassData.createSyntheticClassObjectClassData(psiClass, classObjectDescriptor); setUpClassObjectDescriptor(containing, fqName, data, getClassObjectName(containing.getName().getName())); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index a6883844229..c36c8f9500c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -225,20 +225,21 @@ public final class JavaClassResolver { JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass); ClassKind kind = getClassKind(psiClass, jetClassAnnotation); ClassDescriptorFromJvmBytecode classDescriptor - = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind, psiClass, fqName, javaDescriptorResolver); + = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind, javaDescriptorResolver); + ResolverClassData classData = ResolverClassData.createBinaryClassData(psiClass, fqName, classDescriptor); + classDescriptor.setClassData(classData); - ResolverClassData classData = classDescriptor.getResolverBinaryClassData(); cache(javaClassToKotlinFqName(fqName), classDescriptor); classDescriptor.setName(Name.identifier(psiClass.getName())); List typeParameterDescriptorInitializations - = signatureResolver.createUninitializedClassTypeParameters(psiClass, classData); + = signatureResolver.createUninitializedClassTypeParameters(psiClass, classDescriptor); classDescriptor.setTypeParameterDescriptors(getTypeParametersDescriptors(typeParameterDescriptorInitializations)); List supertypes = Lists.newArrayList(); classDescriptor.setSupertypes(supertypes); classDescriptor.setVisibility(DescriptorResolverUtils.resolveVisibility(psiClass, jetClassAnnotation)); - classDescriptor.setModality(resolveModality(psiClass, classData)); + classDescriptor.setModality(resolveModality(psiClass, classDescriptor)); classDescriptor.createTypeConstructor(); classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData)); @@ -249,11 +250,9 @@ public final class JavaClassResolver { List classTypeParameters = classDescriptor.getTypeConstructor().getParameters(); supertypes.addAll(supertypesResolver.getSupertypes(new PsiClassWrapper(psiClass), classData, classTypeParameters)); - ResolverClassData classObjectData = classObjectResolver.createClassObjectDescriptor(classDescriptor, psiClass); - cache(DescriptorResolverUtils.getFqNameForClassObject(psiClass), - classObjectData != null ? classObjectData.getClassDescriptor() : null); - if (classObjectData != null) { - ClassDescriptorFromJvmBytecode classObjectDescriptor = classObjectData.getClassDescriptor(); + ClassDescriptorFromJvmBytecode classObjectDescriptor = classObjectResolver.createClassObjectDescriptor(classDescriptor, psiClass); + cache(DescriptorResolverUtils.getFqNameForClassObject(psiClass), classObjectDescriptor); + if (classObjectDescriptor != null) { classDescriptor.getBuilder().setClassObjectDescriptor(classObjectDescriptor); } @@ -286,8 +285,8 @@ public final class JavaClassResolver { } @NotNull - private static Modality resolveModality(@NotNull PsiClass psiClass, @NotNull ResolverClassData classData) { - if (classData.getClassDescriptor().getKind() == ClassKind.ANNOTATION_CLASS) { + private static Modality resolveModality(@NotNull PsiClass psiClass, @NotNull ClassDescriptor classDescriptor) { + if (classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) { return Modality.FINAL; } return Modality.convertFromFlags( diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java index d3cea146808..3f0bcfe068c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java @@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.*; -import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.name.Name; @@ -325,17 +324,16 @@ public final class JavaSignatureResolver { public List createUninitializedClassTypeParameters( - PsiClass psiClass, - ResolverClassData classData + PsiClass psiClass, ClassDescriptor classDescriptor ) { JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass); if (jetClassAnnotation.signature().length() > 0) { return resolveClassTypeParametersFromJetSignature( - jetClassAnnotation.signature(), psiClass, classData.getClassDescriptor()); + jetClassAnnotation.signature(), psiClass, classDescriptor); } - return makeUninitializedTypeParameters(classData.getClassDescriptor(), psiClass.getTypeParameters()); + return makeUninitializedTypeParameters(classDescriptor, psiClass.getTypeParameters()); }