Avoid using FQNAME_TO_CLASS_DESCRIPTOR slice where module exists

This commit is contained in:
Alexander Udalov
2015-02-09 22:15:07 +03:00
parent 25775ee516
commit 9f74d64d03
3 changed files with 31 additions and 32 deletions
@@ -75,6 +75,11 @@ public class DeserializedResolverUtils {
if (owner instanceof PackageFragmentDescriptor) { if (owner instanceof PackageFragmentDescriptor) {
return new ClassId(((PackageFragmentDescriptor) owner).getFqName(), descriptor.getName()); 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);
}
} }
} }
@@ -57,13 +57,15 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.*; 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.resolve.DescriptorUtils.unwrapFakeOverride;
import static org.jetbrains.kotlin.serialization.deserialization.DeserializationPackage.findClassAcrossModuleDependencies;
public class BuiltInsReferenceResolver extends AbstractProjectComponent { public class BuiltInsReferenceResolver extends AbstractProjectComponent {
private static final File BUILT_INS_COMPILABLE_SRC_DIR = private static final File BUILT_INS_COMPILABLE_SRC_DIR =
new File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString()); new File("core/builtins/src", KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString());
private volatile BindingContext bindingContext; private volatile ModuleDescriptor moduleDescriptor;
private volatile Set<JetFile> builtInsSources; private volatile Set<JetFile> builtInsSources;
private volatile PackageFragmentDescriptor builtinsPackageFragment; private volatile PackageFragmentDescriptor builtinsPackageFragment;
@@ -87,7 +89,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
} }
private void initialize() { private void initialize() {
assert bindingContext == null : "Attempt to initialize twice"; assert moduleDescriptor == null : "Attempt to initialize twice";
final Set<JetFile> jetBuiltInsFiles = getJetBuiltInsFiles(); final Set<JetFile> jetBuiltInsFiles = getJetBuiltInsFiles();
@@ -100,28 +102,30 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
TopDownAnalysisParameters topDownAnalysisParameters = TopDownAnalysisParameters.create( TopDownAnalysisParameters topDownAnalysisParameters = TopDownAnalysisParameters.create(
globalContext.getStorageManager(), globalContext.getStorageManager(),
globalContext.getExceptionTracker(), globalContext.getExceptionTracker(),
Predicates.<PsiFile>alwaysFalse(), true, false); Predicates.<PsiFile>alwaysFalse(), true, false
);
ModuleDescriptorImpl module = new ModuleDescriptorImpl( ModuleDescriptorImpl module = new ModuleDescriptorImpl(
Name.special("<fake_module>"), Collections.<ImportPath>emptyList(), PlatformToKotlinClassMap.EMPTY); Name.special("<built-ins resolver module>"), Collections.<ImportPath>emptyList(), PlatformToKotlinClassMap.EMPTY
);
module.addDependencyOnModule(module); module.addDependencyOnModule(module);
module.seal(); module.seal();
BindingTraceContext trace = new BindingTraceContext();
FileBasedDeclarationProviderFactory declarationFactory = FileBasedDeclarationProviderFactory declarationFactory =
new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), jetBuiltInsFiles); new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), jetBuiltInsFiles);
LazyTopDownAnalyzerForTopLevel analyzer = new InjectorForLazyTopDownAnalyzerBasic( LazyTopDownAnalyzerForTopLevel analyzer = new InjectorForLazyTopDownAnalyzerBasic(
myProject, topDownAnalysisParameters, trace, module, declarationFactory).getLazyTopDownAnalyzerForTopLevel(); myProject, topDownAnalysisParameters, new BindingTraceContext(), module, declarationFactory
).getLazyTopDownAnalyzerForTopLevel();
analyzer.analyzeFiles(topDownAnalysisParameters, jetBuiltInsFiles, Collections.<PackageFragmentProvider>emptyList()); analyzer.analyzeFiles(topDownAnalysisParameters, jetBuiltInsFiles, Collections.<PackageFragmentProvider>emptyList());
List<PackageFragmentDescriptor> fragments = List<PackageFragmentDescriptor> fragments =
module.getPackageFragmentProvider().getPackageFragments(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME); module.getPackageFragmentProvider().getPackageFragments(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME);
moduleDescriptor = module;
builtinsPackageFragment = KotlinPackage.single(fragments); builtinsPackageFragment = KotlinPackage.single(fragments);
builtInsSources = Sets.newHashSet(jetBuiltInsFiles); 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 @Nullable
private DeclarationDescriptor findCurrentDescriptorForMember(@NotNull MemberDescriptor originalDescriptor) { private DeclarationDescriptor findCurrentDescriptorForMember(@NotNull MemberDescriptor originalDescriptor) {
if (originalDescriptor instanceof CallableMemberDescriptor && if (originalDescriptor instanceof CallableMemberDescriptor &&
@@ -224,8 +216,9 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
@Nullable @Nullable
private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) { private DeclarationDescriptor findCurrentDescriptor(@NotNull DeclarationDescriptor originalDescriptor) {
if (originalDescriptor instanceof ClassDescriptor) { if (originalDescriptor instanceof ClassDescriptor) {
if (!isFromBuiltinModule(originalDescriptor)) return null; return isFromBuiltinModule(originalDescriptor)
return findCurrentDescriptorForClass((ClassDescriptor) originalDescriptor); ? findClassAcrossModuleDependencies(moduleDescriptor, getClassId((ClassDescriptor) originalDescriptor))
: null;
} }
else if (originalDescriptor instanceof PackageFragmentDescriptor) { else if (originalDescriptor instanceof PackageFragmentDescriptor) {
return isFromBuiltinModule(originalDescriptor) return isFromBuiltinModule(originalDescriptor)
@@ -249,7 +242,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
@NotNull @NotNull
public Collection<PsiElement> resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) { public Collection<PsiElement> resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) {
if (bindingContext == null) { if (moduleDescriptor == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -261,6 +254,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
} }
public static boolean isFromBuiltIns(@NotNull PsiElement element) { public static boolean isFromBuiltIns(@NotNull PsiElement element) {
//noinspection SuspiciousMethodCalls
return element.getProject().getComponent(BuiltInsReferenceResolver.class).builtInsSources.contains(element.getContainingFile()); return element.getProject().getComponent(BuiltInsReferenceResolver.class).builtInsSources.contains(element.getContainingFile());
} }
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.refactoring.rename package org.jetbrains.kotlin.idea.refactoring.rename
import com.intellij.refactoring.MultiFileTestCase
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import java.io.File import java.io.File
import org.junit.Assert import org.junit.Assert
@@ -34,7 +33,6 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.JavaPsiFacade import com.intellij.psi.JavaPsiFacade
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.resolve.BindingContext
import java.util.Collections import java.util.Collections
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.descriptors.ClassDescriptor 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.getString
import org.jetbrains.kotlin.idea.refactoring.move.getNullableString import org.jetbrains.kotlin.idea.refactoring.move.getNullableString
import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException
import com.intellij.refactoring.util.CommonRefactoringUtil.RefactoringErrorHintException import com.intellij.refactoring.util.CommonRefactoringUtil.RefactoringErrorHintException
import org.jetbrains.kotlin.idea.KotlinMultiFileTestCase 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 { private enum class RenameType {
JAVA_CLASS JAVA_CLASS
@@ -179,10 +179,10 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() {
} }
} }
private fun doRenameInKotlinClass(renameParamsObject: JsonObject, context: TestContext, private fun doRenameInKotlinClass(
findDescriptorToRename: (ClassDescriptor) -> DeclarationDescriptor 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 newName = renameParamsObject.getString("newName")
val mainFilePath = renameParamsObject.getNullableString("mainFile") ?: "${getTestDirName(false)}.kt" val mainFilePath = renameParamsObject.getNullableString("mainFile") ?: "${getTestDirName(false)}.kt"
@@ -191,8 +191,8 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() {
val document = FileDocumentManager.getInstance()!!.getDocument(mainFile)!! val document = FileDocumentManager.getInstance()!!.getDocument(mainFile)!!
val jetFile = PsiDocumentManager.getInstance(context.project).getPsiFile(document) as JetFile val jetFile = PsiDocumentManager.getInstance(context.project).getPsiFile(document) as JetFile
val bindingContext = jetFile.analyzeFully() val module = jetFile.analyzeFullyAndGetResult().moduleDescriptor
val classDescriptor = bindingContext.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, classFqName)!! val classDescriptor = module.resolveTopLevelClass(classFqName)!!
val psiElement = DescriptorToSourceUtils.descriptorToDeclaration(findDescriptorToRename(classDescriptor))!! val psiElement = DescriptorToSourceUtils.descriptorToDeclaration(findDescriptorToRename(classDescriptor))!!