From bd54e070bb9963c61698a3cdcf13c50ba8400910 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 22 Jul 2013 21:07:38 +0400 Subject: [PATCH] Get rid of dependency on PsiClass from deserialized resolver --- .../AnnotationDescriptorDeserializer.java | 8 +++- .../DeserializedDescriptorResolver.java | 40 ++++--------------- .../resolver/DeserializedResolverUtils.java | 21 +++------- .../java/resolver/JavaClassResolver.java | 22 +++++++--- .../java/resolver/JavaNamespaceResolver.java | 12 ++++-- 5 files changed, 45 insertions(+), 58 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java index 9149fe7fdf0..5fdd0985d9b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.*; import org.jetbrains.asm4.commons.Method; +import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; import org.jetbrains.jet.descriptors.serialization.NameResolver; import org.jetbrains.jet.descriptors.serialization.ProtoBuf; @@ -111,7 +112,12 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer if (psiClass == null) { throw new IllegalStateException("Psi class is not found for class: " + descriptor); } - VirtualFile virtualFile = getVirtualFile(psiClass, fqName, (ClassOrNamespaceDescriptor) descriptor.getContainingDeclaration()); + VirtualFile outerClassFile = psiClass.getContainingFile().getVirtualFile(); + if (outerClassFile == null) { + throw new IllegalStateException("Outer class file is not found for class: " + descriptor); + } + ClassId id = ClassId.fromFqNameAndContainingDeclaration(fqName, (ClassOrNamespaceDescriptor) descriptor.getContainingDeclaration()); + VirtualFile virtualFile = getVirtualFile(id, outerClassFile); if (virtualFile == null) { throw new IllegalStateException("Virtual file is not found for class: " + descriptor); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java index 83240a0d2cb..46c4f6c5ab7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedDescriptorResolver.java @@ -17,14 +17,12 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager; @@ -37,7 +35,6 @@ import java.util.Collection; import static org.jetbrains.jet.lang.resolve.java.AbiVersionUtil.isAbiVersionCompatible; import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_KOTLIN; -import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.getVirtualFile; import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.kotlinFqNameToJavaFqName; public final class DeserializedDescriptorResolver { @@ -87,50 +84,29 @@ public final class DeserializedDescriptorResolver { } @Nullable - public ClassDescriptor resolveClass( - @NotNull FqName fqName, - @NotNull PsiClass psiClass, - @NotNull ClassOrNamespaceDescriptor containingDeclaration, - @NotNull ErrorReporter reporter - ) { - VirtualFile virtualFile = getVirtualFile(psiClass, fqName, containingDeclaration); - if (virtualFile == null) { - // TODO: use ErrorReporter here - return null; - } - ClassData classData = readClassDataFromClassFile(virtualFile, reporter); + public ClassDescriptor resolveClass(@NotNull ClassId id, @NotNull VirtualFile file, @NotNull ErrorReporter reporter) { + ClassData classData = readClassDataFromClassFile(file, reporter); if (classData == null) { return null; } - return deserializeClass(classData, fqName, containingDeclaration); + return createDeserializedClass(classData, id); } @Nullable public JetScope createKotlinPackageScope( - @NotNull PsiClass kotlinPackagePsiClass, - @NotNull NamespaceDescriptor packageDescriptor, + @NotNull NamespaceDescriptor descriptor, + @NotNull VirtualFile file, @NotNull ErrorReporter reporter ) { - VirtualFile virtualFile = kotlinPackagePsiClass.getContainingFile().getVirtualFile(); - if (virtualFile == null) { - return null; - } - PackageData packageData = readPackageDataFromClassFile(virtualFile, reporter); + PackageData packageData = readPackageDataFromClassFile(file, reporter); if (packageData == null) { return null; } - return new DeserializedPackageMemberScope(storageManager, packageDescriptor, annotationDeserializer, javaDescriptorFinder, - packageData); + return new DeserializedPackageMemberScope(storageManager, descriptor, annotationDeserializer, javaDescriptorFinder, packageData); } @Nullable - private ClassDescriptor deserializeClass( - @NotNull ClassData classData, - @NotNull FqName fqName, - @NotNull ClassOrNamespaceDescriptor containingDeclaration - ) { - ClassId classId = ClassId.fromFqNameAndContainingDeclaration(fqName, containingDeclaration); - + private ClassDescriptor createDeserializedClass(@NotNull ClassData classData, @NotNull ClassId classId) { DeclarationDescriptor owner = classId.isTopLevelClass() ? javaNamespaceResolver.resolveNamespace(classId.getPackageFqName(), INCLUDE_KOTLIN) : javaClassResolver diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedResolverUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedResolverUtils.java index a717f6a3d8e..81890d7b0fe 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedResolverUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DeserializedResolverUtils.java @@ -17,12 +17,10 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; @@ -54,26 +52,17 @@ public class DeserializedResolverUtils { } @Nullable - public static VirtualFile getVirtualFile( - @NotNull PsiClass psiClass, - @NotNull FqName classFqName, - @NotNull ClassOrNamespaceDescriptor containingDeclaration - ) { - VirtualFile mostOuterClassVirtualFile = psiClass.getContainingFile().getVirtualFile(); - if (mostOuterClassVirtualFile == null) { - throw new IllegalStateException("Could not find virtual file for " + classFqName.asString()); - } - String fileExtension = mostOuterClassVirtualFile.getExtension(); - if (fileExtension == null || !fileExtension.equals("class")) { + public static VirtualFile getVirtualFile(@NotNull ClassId id, @NotNull VirtualFile outerClassFile) { + String fileExtension = outerClassFile.getExtension(); + if (!"class".equals(fileExtension)) { return null; } - ClassId id = ClassId.fromFqNameAndContainingDeclaration(classFqName, containingDeclaration); FqNameUnsafe relativeClassName = id.getRelativeClassName(); assert relativeClassName.isSafe() : "Relative class name " + relativeClassName.asString() + " should be safe at this point"; String classNameWithBucks = relativeClassName.asString().replace(".", "$") + ".class"; - VirtualFile virtualFile = mostOuterClassVirtualFile.getParent().findChild(classNameWithBucks); + VirtualFile virtualFile = outerClassFile.getParent().findChild(classNameWithBucks); if (virtualFile == null) { - throw new IllegalStateException("No virtual file for " + classFqName.asString()); + throw new IllegalStateException("No virtual file for " + id.asSingleFqName().asString()); } return virtualFile; } 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 0ac46843809..ac3b16fdaba 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 @@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; @@ -26,6 +27,7 @@ import gnu.trove.THashMap; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.descriptors.serialization.ClassId; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; @@ -56,6 +58,7 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValueOfMethod; import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValuesMethod; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName; +import static org.jetbrains.jet.lang.resolve.java.resolver.DeserializedResolverUtils.getVirtualFile; public final class JavaClassResolver { @@ -245,13 +248,20 @@ public final class JavaClassResolver { assert (!unresolvedCache.contains(fqName)) : "We can resolve the class, so it can't be 'unresolved' during parent resolution"; - ClassDescriptor deserializedDescriptor = kotlinDescriptorResolver.resolveClass(fqName, psiClass, containingDeclaration, - DescriptorResolverUtils.createPsiBasedErrorReporter(psiClass, trace)); + VirtualFile outerClassFile = psiClass.getContainingFile().getVirtualFile(); + if (outerClassFile != null) { + ClassId id = ClassId.fromFqNameAndContainingDeclaration(fqName, containingDeclaration); + VirtualFile file = getVirtualFile(id, outerClassFile); + if (file != null) { + ClassDescriptor deserializedDescriptor = kotlinDescriptorResolver.resolveClass(id, file, + DescriptorResolverUtils.createPsiBasedErrorReporter(psiClass, trace)); - if (deserializedDescriptor != null) { - //TODO: class object and psi class - cache(javaClassToKotlinFqName(fqName), deserializedDescriptor); - return deserializedDescriptor; + if (deserializedDescriptor != null) { + //TODO: class object and psi class + cache(javaClassToKotlinFqName(fqName), deserializedDescriptor); + return deserializedDescriptor; + } + } } return doCreateClassDescriptor(fqName, psiClass, taskList, containingDeclaration); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index 0a2f8f3af9d..2d2e3c609b9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMember; import com.intellij.psi.PsiModifier; @@ -174,9 +175,14 @@ public final class JavaNamespaceResolver { if (isCompiledKotlinPackageClass) { // If psiClass has @KotlinPackage (regardless of whether it has @JetPackage or not), deserialize it to Kotlin descriptor. // Note that @KotlinPackage may still have an old ABI version, in which case null is returned by createKotlinPackageScope - JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(psiClass, namespaceDescriptor, - DescriptorResolverUtils.createPsiBasedErrorReporter(psiClass, trace)); - if (kotlinPackageScope != null) return kotlinPackageScope; + VirtualFile file = psiClass.getContainingFile().getVirtualFile(); + if (file != null) { + JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(namespaceDescriptor, + file, DescriptorResolverUtils.createPsiBasedErrorReporter(psiClass, trace)); + if (kotlinPackageScope != null) { + return kotlinPackageScope; + } + } } }