From 9f74d64d030f603852db48c5d02a712e1f0b92ab Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 9 Feb 2015 22:15:07 +0300 Subject: [PATCH] Avoid using FQNAME_TO_CLASS_DESCRIPTOR slice where module exists --- .../kotlin/DeserializedResolverUtils.java | 7 +++- .../references/BuiltInsReferenceResolver.java | 40 ++++++++----------- .../refactoring/rename/AbstractRenameTest.kt | 16 ++++---- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedResolverUtils.java index ef8dce515b0..5a91e89fe99 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedResolverUtils.java @@ -75,6 +75,11 @@ public class DeserializedResolverUtils { if (owner instanceof PackageFragmentDescriptor) { return new ClassId(((PackageFragmentDescriptor) owner).getFqName(), descriptor.getName()); } - return getClassId((ClassDescriptor) owner).createNestedClassId(descriptor.getName()); + else if (owner instanceof ClassDescriptor) { + return getClassId((ClassDescriptor) owner).createNestedClassId(descriptor.getName()); + } + else { + throw new IllegalStateException("Illegal container: " + descriptor); + } } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.java index 1569c90d144..a4706379636 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.java @@ -57,13 +57,15 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.*; +import static org.jetbrains.kotlin.load.kotlin.DeserializedResolverUtils.getClassId; import static org.jetbrains.kotlin.resolve.DescriptorUtils.unwrapFakeOverride; +import static org.jetbrains.kotlin.serialization.deserialization.DeserializationPackage.findClassAcrossModuleDependencies; public class BuiltInsReferenceResolver extends AbstractProjectComponent { private static final File BUILT_INS_COMPILABLE_SRC_DIR = new File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString()); - private volatile BindingContext bindingContext; + private volatile ModuleDescriptor moduleDescriptor; private volatile Set builtInsSources; private volatile PackageFragmentDescriptor builtinsPackageFragment; @@ -87,7 +89,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { } private void initialize() { - assert bindingContext == null : "Attempt to initialize twice"; + assert moduleDescriptor == null : "Attempt to initialize twice"; final Set jetBuiltInsFiles = getJetBuiltInsFiles(); @@ -100,28 +102,30 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { TopDownAnalysisParameters topDownAnalysisParameters = TopDownAnalysisParameters.create( globalContext.getStorageManager(), globalContext.getExceptionTracker(), - Predicates.alwaysFalse(), true, false); + Predicates.alwaysFalse(), true, false + ); + ModuleDescriptorImpl module = new ModuleDescriptorImpl( - Name.special(""), Collections.emptyList(), PlatformToKotlinClassMap.EMPTY); + Name.special(""), Collections.emptyList(), PlatformToKotlinClassMap.EMPTY + ); module.addDependencyOnModule(module); module.seal(); - BindingTraceContext trace = new BindingTraceContext(); FileBasedDeclarationProviderFactory declarationFactory = new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), jetBuiltInsFiles); LazyTopDownAnalyzerForTopLevel analyzer = new InjectorForLazyTopDownAnalyzerBasic( - myProject, topDownAnalysisParameters, trace, module, declarationFactory).getLazyTopDownAnalyzerForTopLevel(); + myProject, topDownAnalysisParameters, new BindingTraceContext(), module, declarationFactory + ).getLazyTopDownAnalyzerForTopLevel(); analyzer.analyzeFiles(topDownAnalysisParameters, jetBuiltInsFiles, Collections.emptyList()); List fragments = module.getPackageFragmentProvider().getPackageFragments(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME); + moduleDescriptor = module; builtinsPackageFragment = KotlinPackage.single(fragments); - builtInsSources = Sets.newHashSet(jetBuiltInsFiles); - bindingContext = trace.getBindingContext(); } }; @@ -180,18 +184,6 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { })); } - @Nullable - private DeclarationDescriptor findCurrentDescriptorForClass(@NotNull ClassDescriptor originalDescriptor) { - // BindingContext doesn't contain an information about class descriptor of class object. For example see testEmptyRange. - if (DescriptorUtils.isClassObject(originalDescriptor)) { - DeclarationDescriptor currentParent = findCurrentDescriptor(originalDescriptor.getContainingDeclaration()); - if (currentParent == null) return null; - return ((ClassDescriptor) currentParent).getClassObjectDescriptor(); - } - - return bindingContext.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, DescriptorUtils.getFqName(originalDescriptor)); - } - @Nullable private DeclarationDescriptor findCurrentDescriptorForMember(@NotNull MemberDescriptor originalDescriptor) { if (originalDescriptor instanceof CallableMemberDescriptor && @@ -224,8 +216,9 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { @Nullable private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) { if (originalDescriptor instanceof ClassDescriptor) { - if (!isFromBuiltinModule(originalDescriptor)) return null; - return findCurrentDescriptorForClass((ClassDescriptor) originalDescriptor); + return isFromBuiltinModule(originalDescriptor) + ? findClassAcrossModuleDependencies(moduleDescriptor, getClassId((ClassDescriptor) originalDescriptor)) + : null; } else if (originalDescriptor instanceof PackageFragmentDescriptor) { return isFromBuiltinModule(originalDescriptor) @@ -249,7 +242,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { @NotNull public Collection resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) { - if (bindingContext == null) { + if (moduleDescriptor == null) { return Collections.emptyList(); } @@ -261,6 +254,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { } public static boolean isFromBuiltIns(@NotNull PsiElement element) { + //noinspection SuspiciousMethodCalls return element.getProject().getComponent(BuiltInsReferenceResolver.class).builtInsSources.contains(element.getContainingFile()); } diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt index 94cd2aab835..2675a1334bc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.refactoring.rename -import com.intellij.refactoring.MultiFileTestCase import com.intellij.openapi.util.io.FileUtil import java.io.File import org.junit.Assert @@ -34,7 +33,6 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.JavaPsiFacade import com.intellij.openapi.project.Project import com.intellij.openapi.module.Module -import org.jetbrains.kotlin.resolve.BindingContext import java.util.Collections import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.descriptors.ClassDescriptor @@ -44,11 +42,13 @@ import org.jetbrains.kotlin.name.isSubpackageOf import org.jetbrains.kotlin.idea.refactoring.move.getString import org.jetbrains.kotlin.idea.refactoring.move.getNullableString import org.jetbrains.kotlin.idea.search.allScope -import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException import com.intellij.refactoring.util.CommonRefactoringUtil.RefactoringErrorHintException import org.jetbrains.kotlin.idea.KotlinMultiFileTestCase +import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult +import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass +import org.jetbrains.kotlin.name.FqName private enum class RenameType { JAVA_CLASS @@ -179,10 +179,10 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() { } } - private fun doRenameInKotlinClass(renameParamsObject: JsonObject, context: TestContext, - findDescriptorToRename: (ClassDescriptor) -> DeclarationDescriptor + private fun doRenameInKotlinClass( + renameParamsObject: JsonObject, context: TestContext, findDescriptorToRename: (ClassDescriptor) -> DeclarationDescriptor ) { - val classFqName = FqNameUnsafe(renameParamsObject.getString("classFQN")) + val classFqName = FqName(renameParamsObject.getString("classFQN")) val newName = renameParamsObject.getString("newName") val mainFilePath = renameParamsObject.getNullableString("mainFile") ?: "${getTestDirName(false)}.kt" @@ -191,8 +191,8 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() { val document = FileDocumentManager.getInstance()!!.getDocument(mainFile)!! val jetFile = PsiDocumentManager.getInstance(context.project).getPsiFile(document) as JetFile - val bindingContext = jetFile.analyzeFully() - val classDescriptor = bindingContext.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, classFqName)!! + val module = jetFile.analyzeFullyAndGetResult().moduleDescriptor + val classDescriptor = module.resolveTopLevelClass(classFqName)!! val psiElement = DescriptorToSourceUtils.descriptorToDeclaration(findDescriptorToRename(classDescriptor))!!