Big refactoring. Migrating to package views and fragments.
This commit is contained in:
@@ -244,7 +244,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
|
||||
for (FqName fqName : topLevelFunctionFqNames) {
|
||||
JetImportDirective importDirective = JetPsiFactory.createImportDirective(project, new ImportPath(fqName, false));
|
||||
Collection<? extends DeclarationDescriptor> declarationDescriptors = new QualifiedExpressionResolver().analyseImportReference(
|
||||
importDirective, jetScope, new BindingTraceContext(), resolveSession.getRootModuleDescriptor());
|
||||
importDirective, jetScope, new BindingTraceContext(), resolveSession.getModuleDescriptor());
|
||||
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
|
||||
if (declarationDescriptor instanceof FunctionDescriptor) {
|
||||
result.add((FunctionDescriptor) declarationDescriptor);
|
||||
@@ -267,7 +267,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
|
||||
}
|
||||
|
||||
for (FqName affectedPackage : affectedPackages) {
|
||||
NamespaceDescriptor packageDescriptor = resolveSession.getPackageDescriptorByFqName(affectedPackage);
|
||||
PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(affectedPackage);
|
||||
assert packageDescriptor != null : "There's a function in stub index with invalid package: " + affectedPackage;
|
||||
JetScope memberScope = packageDescriptor.getMemberScope();
|
||||
result.addAll(memberScope.getFunctions(referenceName));
|
||||
@@ -316,7 +316,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
|
||||
// Iterate through the function with attempt to resolve found functions
|
||||
for (FqName functionFQN : functionFQNs) {
|
||||
for (CallableDescriptor functionDescriptor : ExpressionTypingUtils.canFindSuitableCall(
|
||||
functionFQN, project, receiverExpression, expressionType, scope, resolveSession.getRootModuleDescriptor())) {
|
||||
functionFQN, project, receiverExpression, expressionType, scope, resolveSession.getModuleDescriptor())) {
|
||||
|
||||
resultDescriptors.add(functionDescriptor);
|
||||
}
|
||||
|
||||
@@ -57,15 +57,14 @@ class JvmDeclarationsCacheProvider extends DeclarationsCacheProvider {
|
||||
// This lock is already acquired by the calling method,
|
||||
// but we put it here to guard for the case of further modifications
|
||||
synchronized (declarationAnalysisLock) {
|
||||
BindingTraceContext trace = new BindingTraceContext();
|
||||
incompleteTrace = new BindingTraceContext();
|
||||
|
||||
incompleteTrace = trace;
|
||||
AnalyzeExhaust analyzeExhaust;
|
||||
try {
|
||||
analyzeExhaust = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
|
||||
project,
|
||||
JetFilesProvider.getInstance(project).allInScope(GlobalSearchScope.allScope(project)),
|
||||
trace,
|
||||
incompleteTrace,
|
||||
Collections.<AnalyzerScriptParameter>emptyList(),
|
||||
Predicates.<PsiFile>alwaysFalse(),
|
||||
true);
|
||||
@@ -90,11 +89,13 @@ class JvmDeclarationsCacheProvider extends DeclarationsCacheProvider {
|
||||
synchronized (declarationAnalysisLock) {
|
||||
if (allowIncomplete) {
|
||||
if (incompleteTrace != null) {
|
||||
// saving context to local variable to avoid race condition
|
||||
final BindingContext context = incompleteTrace.getBindingContext();
|
||||
return new KotlinDeclarationsCache() {
|
||||
@NotNull
|
||||
@Override
|
||||
public BindingContext getBindingContext() {
|
||||
return incompleteTrace.getBindingContext();
|
||||
return context;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext
|
||||
import org.jetbrains.jet.lexer.JetTokens
|
||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
||||
import org.jetbrains.jet.plugin.JetBundle
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||
|
||||
public object JetUsageTypeProvider : UsageTypeProviderEx {
|
||||
@@ -185,7 +185,7 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
|
||||
} else {
|
||||
getClassUsageType()
|
||||
}
|
||||
is JavaNamespaceDescriptor -> getClassUsageType()
|
||||
is JavaPackageFragmentDescriptor -> getClassUsageType()
|
||||
is VariableDescriptor -> getVariableUsageType()
|
||||
is FunctionDescriptor -> getFunctionUsageType(descriptor)
|
||||
else -> null
|
||||
|
||||
@@ -21,11 +21,9 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||
import org.jetbrains.jet.lang.psi.JetElement;
|
||||
@@ -33,8 +31,6 @@ import org.jetbrains.jet.lang.psi.JetFile;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
|
||||
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
@@ -69,22 +65,11 @@ public class CancelableResolveSession implements KotlinCodeAnalyzer, Modificatio
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleDescriptor getRootModuleDescriptor() {
|
||||
public ModuleDescriptor getModuleDescriptor() {
|
||||
return computableWithProcessingCancel(new Computable<ModuleDescriptor>() {
|
||||
@Override
|
||||
public ModuleDescriptor compute() {
|
||||
return resolveSession.getRootModuleDescriptor();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public NamespaceDescriptor getPackageDescriptorByFqName(final FqName fqName) {
|
||||
return computableWithProcessingCancel(new Computable<NamespaceDescriptor>() {
|
||||
@Override
|
||||
public NamespaceDescriptor compute() {
|
||||
return resolveSession.getPackageDescriptorByFqName(fqName);
|
||||
return resolveSession.getModuleDescriptor();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@ public class ResolveElementCache {
|
||||
if (Name.isValidIdentifier(name.asString())) {
|
||||
if (trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, packageNameExpression) == null) {
|
||||
FqName fqName = header.getParentFqName(packageNameExpression).child(name);
|
||||
NamespaceDescriptor packageDescriptor = resolveSession.getPackageDescriptorByFqName(fqName);
|
||||
PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(fqName);
|
||||
assert packageDescriptor != null: "Package descriptor should be present in session for " + fqName;
|
||||
trace.record(BindingContext.REFERENCE_TARGET, packageNameExpression, packageDescriptor);
|
||||
}
|
||||
@@ -231,7 +231,7 @@ public class ResolveElementCache {
|
||||
private static void delegationSpecifierAdditionalResolve(
|
||||
KotlinCodeAnalyzer analyzer,
|
||||
JetDelegationSpecifierList specifier, BindingTrace trace, JetFile file) {
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, analyzer.getRootModuleDescriptor());
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, analyzer.getModuleDescriptor());
|
||||
|
||||
JetClassOrObject classOrObject = (JetClassOrObject) specifier.getParent();
|
||||
LazyClassDescriptor descriptor = (LazyClassDescriptor) analyzer.resolveToDescriptor(classOrObject);
|
||||
@@ -256,7 +256,7 @@ public class ResolveElementCache {
|
||||
return propertyResolutionScope;
|
||||
}
|
||||
});
|
||||
BodyResolver bodyResolver = createBodyResolver(trace, file, bodyResolveContext, resolveSession.getRootModuleDescriptor());
|
||||
BodyResolver bodyResolver = createBodyResolver(trace, file, bodyResolveContext, resolveSession.getModuleDescriptor());
|
||||
PropertyDescriptor descriptor = (PropertyDescriptor) resolveSession.resolveToDescriptor(jetProperty);
|
||||
|
||||
JetExpression propertyInitializer = jetProperty.getInitializer();
|
||||
@@ -278,7 +278,7 @@ public class ResolveElementCache {
|
||||
BindingTrace trace,
|
||||
JetFile file
|
||||
) {
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getRootModuleDescriptor());
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getModuleDescriptor());
|
||||
JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(namedFunction);
|
||||
FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(namedFunction);
|
||||
bodyResolver.resolveFunctionBody(trace, namedFunction, functionDescriptor, scope);
|
||||
@@ -290,7 +290,7 @@ public class ResolveElementCache {
|
||||
BindingTrace trace,
|
||||
JetFile file
|
||||
) {
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getRootModuleDescriptor());
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getModuleDescriptor());
|
||||
JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(klass);
|
||||
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) resolveSession.resolveToDescriptor(klass);
|
||||
@@ -306,7 +306,7 @@ public class ResolveElementCache {
|
||||
BindingTrace trace,
|
||||
JetFile file
|
||||
) {
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, analyzer.getRootModuleDescriptor());
|
||||
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, analyzer.getModuleDescriptor());
|
||||
JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(classInitializer, JetClassOrObject.class);
|
||||
LazyClassDescriptor classOrObjectDescriptor = (LazyClassDescriptor) analyzer.resolveToDescriptor(classOrObject);
|
||||
bodyResolver.resolveAnonymousInitializers(classOrObject, classOrObjectDescriptor.getUnsubstitutedPrimaryConstructor(),
|
||||
@@ -364,15 +364,16 @@ public class ResolveElementCache {
|
||||
|
||||
// Inside import
|
||||
if (PsiTreeUtil.getParentOfType(expression, JetImportDirective.class, false) != null) {
|
||||
NamespaceDescriptor rootPackage = resolveSession.getPackageDescriptorByFqName(FqName.ROOT);
|
||||
PackageViewDescriptor rootPackage = resolveSession.getModuleDescriptor().getPackage(FqName.ROOT);
|
||||
assert rootPackage != null;
|
||||
|
||||
if (expression.getParent() instanceof JetDotQualifiedExpression) {
|
||||
JetExpression element = ((JetDotQualifiedExpression) expression.getParent()).getReceiverExpression();
|
||||
String name = ((JetFile) expression.getContainingFile()).getPackageName();
|
||||
|
||||
NamespaceDescriptor filePackage =
|
||||
name != null ? resolveSession.getPackageDescriptorByFqName(new FqName(name)) : rootPackage;
|
||||
PackageViewDescriptor filePackage = name != null
|
||||
? resolveSession.getModuleDescriptor().getPackage(new FqName(name))
|
||||
: rootPackage;
|
||||
assert filePackage != null : "File package should be already resolved and be found";
|
||||
|
||||
JetScope scope = filePackage.getMemberScope();
|
||||
@@ -390,8 +391,8 @@ public class ResolveElementCache {
|
||||
}
|
||||
|
||||
for (DeclarationDescriptor descriptor : descriptors) {
|
||||
if (descriptor instanceof NamespaceDescriptor) {
|
||||
return ((NamespaceDescriptor) descriptor).getMemberScope();
|
||||
if (descriptor instanceof PackageViewDescriptor) {
|
||||
return ((PackageViewDescriptor) descriptor).getMemberScope();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -403,8 +404,8 @@ public class ResolveElementCache {
|
||||
// Inside package declaration
|
||||
JetNamespaceHeader namespaceHeader = PsiTreeUtil.getParentOfType(expression, JetNamespaceHeader.class, false);
|
||||
if (namespaceHeader != null) {
|
||||
NamespaceDescriptor packageDescriptor = resolveSession.getPackageDescriptorByFqName(
|
||||
namespaceHeader.getParentFqName((JetReferenceExpression) expression));
|
||||
PackageViewDescriptor packageDescriptor = resolveSession.getModuleDescriptor().getPackage(
|
||||
namespaceHeader.getParentFqName((JetSimpleNameExpression) expression));
|
||||
if (packageDescriptor != null) {
|
||||
return packageDescriptor.getMemberScope();
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
|
||||
import org.jetbrains.jet.lang.diagnostics.*;
|
||||
@@ -56,6 +57,7 @@ import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
import org.jetbrains.jet.lang.types.*;
|
||||
@@ -578,6 +580,7 @@ public class CreateFunctionFromUsageFix extends CreateFromUsageFixBase {
|
||||
private Editor currentFileEditor;
|
||||
private Editor containingFileEditor;
|
||||
private BindingContext currentFileContext;
|
||||
private ModuleDescriptor currentFileModule;
|
||||
private JetClass ownerClass;
|
||||
private ClassDescriptor ownerClassDescriptor;
|
||||
private TypeCandidate selectedReceiverType;
|
||||
@@ -604,7 +607,9 @@ public class CreateFunctionFromUsageFix extends CreateFromUsageFixBase {
|
||||
public void invoke(@NotNull final Project project, Editor editor, JetFile file) throws IncorrectOperationException {
|
||||
currentFile = file;
|
||||
currentFileEditor = editor;
|
||||
currentFileContext = AnalyzerFacadeWithCache.analyzeFileWithCache(currentFile).getBindingContext();
|
||||
AnalyzeExhaust exhaust = AnalyzerFacadeWithCache.analyzeFileWithCache(currentFile);
|
||||
currentFileContext = exhaust.getBindingContext();
|
||||
currentFileModule = exhaust.getModuleDescriptor();
|
||||
|
||||
ownerType.computeTypeCandidates(currentFileContext);
|
||||
List<TypeCandidate> ownerTypeCandidates = ownerType.getTypeCandidates();
|
||||
@@ -663,9 +668,7 @@ public class CreateFunctionFromUsageFix extends CreateFromUsageFixBase {
|
||||
|
||||
JetScope scope;
|
||||
if (isExtension) {
|
||||
NamespaceDescriptor namespaceDescriptor = currentFileContext.get(BindingContext.FILE_TO_NAMESPACE, currentFile);
|
||||
assert namespaceDescriptor != null;
|
||||
scope = namespaceDescriptor.getMemberScope();
|
||||
scope = currentFileModule.getPackage(JetPsiUtil.getFQName(currentFile)).getMemberScope();
|
||||
} else {
|
||||
assert ownerClassDescriptor instanceof MutableClassDescriptor;
|
||||
scope = ((MutableClassDescriptor) ownerClassDescriptor).getScopeForMemberResolution();
|
||||
|
||||
@@ -239,7 +239,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
|
||||
new ModuleDescriptorImpl(Name.special("<fake_module>"), Collections.<ImportPath>emptyList(), PlatformToKotlinClassMap.EMPTY)
|
||||
.setModuleConfiguration(ModuleConfiguration.EMPTY),
|
||||
Collections.<AnnotationDescriptor>emptyList(), Name.special("<root>")), Collections.<AnnotationDescriptor>emptyList(),
|
||||
KotlinBuiltIns.getInstance().getBuiltInsPackage().getName());
|
||||
KotlinBuiltIns.BUILT_INS_PACKAGE_NAME);
|
||||
}
|
||||
|
||||
void setMemberScope(WritableScope memberScope) {
|
||||
|
||||
@@ -74,7 +74,7 @@ public class BuiltInsReferenceResolverTest extends ResolveTestCase {
|
||||
|
||||
public void testAllReferencesResolved() {
|
||||
BuiltInsReferenceResolver referenceResolver = getProject().getComponent(BuiltInsReferenceResolver.class);
|
||||
for (DeclarationDescriptor descriptor : getAllStandardDescriptors(KotlinBuiltIns.getInstance().getBuiltInsPackage())) {
|
||||
for (DeclarationDescriptor descriptor : getAllStandardDescriptors(KotlinBuiltIns.getInstance().getBuiltInsPackageFragment())) {
|
||||
if (descriptor instanceof NamespaceDescriptor && "jet".equals(descriptor.getName().asString())) continue;
|
||||
assertNotNull("Can't resolve " + descriptor, referenceResolver.resolveBuiltInSymbol(descriptor));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user