Lazy resolve: Support for imports and Java interop

This commit is contained in:
Andrey Breslav
2012-06-09 15:53:29 +04:00
parent 52d175108d
commit d6f279926c
9 changed files with 68 additions and 37 deletions
@@ -18,20 +18,14 @@
package org.jetbrains.jet.di;
import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import javax.annotation.PreDestroy;
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
@@ -45,9 +39,9 @@ public class InjectorForLazyResolve {
private TypeResolver typeResolver;
private ScopeProvider scopeProvider;
private AnnotationResolver annotationResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver;
private CallResolver callResolver;
private OverloadingConflictResolver overloadingConflictResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver;
public InjectorForLazyResolve(
@NotNull Project project,
@@ -62,9 +56,9 @@ public class InjectorForLazyResolve {
this.typeResolver = new TypeResolver();
this.scopeProvider = new ScopeProvider(resolveSession);
this.annotationResolver = new AnnotationResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.callResolver = new CallResolver();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
@@ -113,4 +107,8 @@ public class InjectorForLazyResolve {
return this.annotationResolver;
}
public QualifiedExpressionResolver getQualifiedExpressionResolver() {
return this.qualifiedExpressionResolver;
}
}
@@ -87,9 +87,19 @@ public class ImportsResolver {
}
}
private void processImportsInFile(
boolean onlyClasses, WritableScope namespaceScope,
List<JetImportDirective> importDirectives, @NotNull JetScope rootScope) {
private void processImportsInFile(boolean classes, WritableScope scope, List<JetImportDirective> directives, JetScope rootScope) {
processImportsInFile(classes, scope, directives, rootScope, configuration, trace, qualifiedExpressionResolver);
}
public static void processImportsInFile(
boolean onlyClasses,
@NotNull WritableScope namespaceScope,
@NotNull List<JetImportDirective> importDirectives,
@NotNull JetScope rootScope,
@NotNull ModuleConfiguration configuration,
@NotNull BindingTrace trace,
@NotNull QualifiedExpressionResolver qualifiedExpressionResolver
) {
Importer.DelayedImporter delayedImporter = new Importer.DelayedImporter(namespaceScope);
if (!onlyClasses) {
@@ -114,14 +124,17 @@ public class ImportsResolver {
if (!onlyClasses) {
for (JetImportDirective importDirective : importDirectives) {
reportUselessImport(importDirective, namespaceScope, resolvedDirectives);
reportUselessImport(importDirective, namespaceScope, resolvedDirectives, trace);
}
}
}
private void reportUselessImport(@NotNull JetImportDirective importDirective,
@NotNull WritableScope namespaceScope,
@NotNull Map<JetImportDirective, DeclarationDescriptor> resolvedDirectives) {
private static void reportUselessImport(
@NotNull JetImportDirective importDirective,
@NotNull WritableScope namespaceScope,
@NotNull Map<JetImportDirective, DeclarationDescriptor> resolvedDirectives,
@NotNull BindingTrace trace
) {
JetExpression importedReference = importDirective.getImportedReference();
if (importedReference == null || !resolvedDirectives.containsKey(importDirective)) {
@@ -44,8 +44,8 @@ public class LazyPackageDescriptor extends AbstractNamespaceDescriptorImpl imple
@NotNull PackageMemberDeclarationProvider declarationProvider
) {
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), name);
WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, this, RedeclarationHandler.DO_NOTHING, "Package scope for " + name);
//resolveSession.getModuleConfiguration().extendNamespaceScope(resolveSession.getTrace(), this, scope);
WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, this, RedeclarationHandler.DO_NOTHING, "Package scope");
resolveSession.getModuleConfiguration().extendNamespaceScope(resolveSession.getTrace(), this, scope);
LazyPackageMemberScope lazyPackageMemberScope = new LazyPackageMemberScope(resolveSession, declarationProvider, this);
scope.importScope(lazyPackageMemberScope);
scope.changeLockLevel(WritableScope.LockLevel.READING);
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.collect.Lists;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
@@ -23,14 +24,14 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*;
import java.util.List;
/**
* @author abreslav
*/
@@ -59,8 +60,14 @@ public class ScopeProvider {
}
WritableScope writableScope = new WritableScopeImpl(
JetScope.EMPTY, packageDescriptor, RedeclarationHandler.DO_NOTHING, "file scope for declaration resollution");
JetScope.EMPTY, packageDescriptor, RedeclarationHandler.DO_NOTHING, "File scope for declaration resolution");
writableScope.importScope(resolveSession.getPackageDescriptorByFqName(FqName.ROOT).getMemberScope());
List<JetImportDirective> importDirectives = Lists.newArrayList(file.getImportDirectives());
resolveSession.getModuleConfiguration().addDefaultImports(importDirectives);
ImportsResolver.processImportsInFile(true, writableScope, importDirectives,
resolveSession.getPackageDescriptorByFqName(FqName.ROOT).getMemberScope(),
resolveSession.getModuleConfiguration(), resolveSession.getTrace(),
resolveSession.getInjector().getQualifiedExpressionResolver());
writableScope.importScope(packageDescriptor.getMemberScope());
// TODO: imports