Lazy resolve: Support for imports and Java interop
This commit is contained in:
@@ -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)) {
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+19
-7
@@ -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 + ";");
|
||||
|
||||
Reference in New Issue
Block a user