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
+1 -1
View File
@@ -8,7 +8,7 @@ package p; class C {fun f() {}}
package p; open class G<T> {open fun f(): T {} fun a() {}}
// FILE: d.kt
package p; class G2<E> : G<E> { fun g() : E {} override fun f() : T {}}
package p; class G2<E> : G<E> { fun g() : E {} override fun f() : E {}}
// FILE: e.kt
package p; fun foo() {}
@@ -15,7 +15,7 @@ open class p.G</*0*/ T : jet.Any?> : jet.Any {
final class p.G2</*0*/ E : jet.Any?> : p.G<E> {
final /*constructor*/ fun </*0*/ E : jet.Any?><init>(): p.G2<E>
final override /*1*/ fun a(): jet.Tuple0
open override /*1*/ fun f(): <root>
open override /*1*/ fun f(): E
final fun g(): E
}
final fun foo(): jet.Tuple0
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
@@ -73,11 +74,8 @@ public abstract class AbstractLazyResolveComparingTest {
}
protected void doTest(String testFileName, Function<Pair<ModuleDescriptor, ModuleDescriptor>, Pair<NamespaceDescriptor, NamespaceDescriptor>> transform) throws IOException {
TopDownAnalysisParameters params = new TopDownAnalysisParameters(
Predicates.<PsiFile>alwaysTrue(), false, false, Collections.<AnalyzerScriptParameter>emptyList());
ModuleDescriptor module = new ModuleDescriptor(Name.special("<test module>"));
InjectorForTopDownAnalyzerForJvm
injector = new InjectorForTopDownAnalyzerForJvm(project, params, new BindingTraceContext(), module, compilerDependencies);
InjectorForTopDownAnalyzerForJvm injector = createInjectorForTDA(module);
List<JetFile> files = JetTestUtils
.createTestFiles(testFileName, FileUtil.loadFile(new File(testFileName)), new JetTestUtils.TestFileFactory<JetFile>() {
@@ -88,16 +86,30 @@ public abstract class AbstractLazyResolveComparingTest {
});
ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("<lazy module>"));
ModuleDescriptor eagerModuleForLazy = new ModuleDescriptor(Name.special("<eager module for lazy>"));
ResolveSession session = new ResolveSession(project, lazyModule, injector.getJavaBridgeConfiguration(), new FileBasedDeclarationProviderFactory(files));
InjectorForTopDownAnalyzerForJvm tdaInjectorForLazy = createInjectorForTDA(eagerModuleForLazy);
tdaInjectorForLazy.getTopDownAnalyzer().analyzeFiles(Collections.singletonList(JetPsiFactory.createFile(project, "")), Collections.<AnalyzerScriptParameter>emptyList());
ResolveSession session = new ResolveSession(project, lazyModule, tdaInjectorForLazy.getJavaBridgeConfiguration(), new FileBasedDeclarationProviderFactory(files));
injector.getTopDownAnalyzer().analyzeFiles(files, Collections.<AnalyzerScriptParameter>emptyList());
Pair<NamespaceDescriptor, NamespaceDescriptor> namespacesToCompare = transform.fun(Pair.create(module, lazyModule));
Predicate<NamespaceDescriptor> filterJetNamespace = new Predicate<NamespaceDescriptor>() {
@Override
public boolean apply(NamespaceDescriptor namespaceDescriptor) {
return !namespaceDescriptor.getName().equals(Name.identifier("jet"));
}
};
NamespaceComparator.compareNamespaces(namespacesToCompare.first, namespacesToCompare.second,
true,
new File(FileUtil.getNameWithoutExtension(testFileName) + ".txt"));
true, filterJetNamespace, new File(FileUtil.getNameWithoutExtension(testFileName) + ".txt"));
}
private InjectorForTopDownAnalyzerForJvm createInjectorForTDA(ModuleDescriptor module) {
TopDownAnalysisParameters params = new TopDownAnalysisParameters(
Predicates.<PsiFile>alwaysTrue(), false, false, Collections.<AnalyzerScriptParameter>emptyList());
return new InjectorForTopDownAnalyzerForJvm(project, params, new BindingTraceContext(), module, compilerDependencies);
}
protected void doTest(String testFileName) throws Exception {
@@ -62,6 +62,7 @@ public class AllInjectorsGenerator {
generator.addPublicField(TypeResolver.class);
generator.addPublicField(ScopeProvider.class);
generator.addPublicField(AnnotationResolver.class);
generator.addPublicField(QualifiedExpressionResolver.class);
generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve");
}
@@ -89,7 +89,7 @@ public class DependencyInjectorGenerator {
}
String copyright = "injector-generator/copyright.txt";
out.println(FileUtil.loadFile(new File(copyright)));
out.println(FileUtil.loadFile(new File(copyright), true));
out.println();
out.println("package " + injectorPackageName + ";");