Big refactoring. Migrating to package views and fragments.

This commit is contained in:
Evgeny Gerashchenko
2013-10-11 21:43:40 +04:00
parent 369824cd2e
commit 7abe6a5b4a
141 changed files with 1728 additions and 1465 deletions
@@ -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));
}