Avoid using FQNAME_TO_CLASS_DESCRIPTOR slice where module exists
This commit is contained in:
+6
-1
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-23
@@ -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))!!
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user