diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java index c00e44ccff3..6e19fcf6af6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java @@ -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; + } + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java index 628e8c585b4..56fbf2d9420 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java @@ -87,9 +87,19 @@ public class ImportsResolver { } } - private void processImportsInFile( - boolean onlyClasses, WritableScope namespaceScope, - List importDirectives, @NotNull JetScope rootScope) { + private void processImportsInFile(boolean classes, WritableScope scope, List directives, JetScope rootScope) { + processImportsInFile(classes, scope, directives, rootScope, configuration, trace, qualifiedExpressionResolver); + } + + public static void processImportsInFile( + boolean onlyClasses, + @NotNull WritableScope namespaceScope, + @NotNull List 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 resolvedDirectives) { + private static void reportUselessImport( + @NotNull JetImportDirective importDirective, + @NotNull WritableScope namespaceScope, + @NotNull Map resolvedDirectives, + @NotNull BindingTrace trace + ) { JetExpression importedReference = importDirective.getImportedReference(); if (importedReference == null || !resolvedDirectives.containsKey(importDirective)) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyPackageDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyPackageDescriptor.java index 13f878a6890..af7f58d4c92 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyPackageDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyPackageDescriptor.java @@ -44,8 +44,8 @@ public class LazyPackageDescriptor extends AbstractNamespaceDescriptorImpl imple @NotNull PackageMemberDeclarationProvider declarationProvider ) { super(containingDeclaration, Collections.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); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java index b04f2a513d9..af253723d26 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java @@ -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 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 diff --git a/compiler/testData/lazyResolve/simpleClass.kt b/compiler/testData/lazyResolve/simpleClass.kt index db5e88bb2b0..f694a892512 100644 --- a/compiler/testData/lazyResolve/simpleClass.kt +++ b/compiler/testData/lazyResolve/simpleClass.kt @@ -8,7 +8,7 @@ package p; class C {fun f() {}} package p; open class G {open fun f(): T {} fun a() {}} // FILE: d.kt -package p; class G2 : G { fun g() : E {} override fun f() : T {}} +package p; class G2 : G { fun g() : E {} override fun f() : E {}} // FILE: e.kt package p; fun foo() {} diff --git a/compiler/testData/lazyResolve/simpleClass.txt b/compiler/testData/lazyResolve/simpleClass.txt index 58830c8b0a7..0f392c0b5fa 100644 --- a/compiler/testData/lazyResolve/simpleClass.txt +++ b/compiler/testData/lazyResolve/simpleClass.txt @@ -15,7 +15,7 @@ open class p.G : jet.Any { final class p.G2 : p.G { final /*constructor*/ fun (): p.G2 final override /*1*/ fun a(): jet.Tuple0 - open override /*1*/ fun f(): + open override /*1*/ fun f(): E final fun g(): E } final fun foo(): jet.Tuple0 diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveComparingTest.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveComparingTest.java index fee34210a15..73b2de8ba5c 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveComparingTest.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveComparingTest.java @@ -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> transform) throws IOException { - TopDownAnalysisParameters params = new TopDownAnalysisParameters( - Predicates.alwaysTrue(), false, false, Collections.emptyList()); ModuleDescriptor module = new ModuleDescriptor(Name.special("")); - InjectorForTopDownAnalyzerForJvm - injector = new InjectorForTopDownAnalyzerForJvm(project, params, new BindingTraceContext(), module, compilerDependencies); + InjectorForTopDownAnalyzerForJvm injector = createInjectorForTDA(module); List files = JetTestUtils .createTestFiles(testFileName, FileUtil.loadFile(new File(testFileName)), new JetTestUtils.TestFileFactory() { @@ -88,16 +86,30 @@ public abstract class AbstractLazyResolveComparingTest { }); ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); + ModuleDescriptor eagerModuleForLazy = new ModuleDescriptor(Name.special("")); - ResolveSession session = new ResolveSession(project, lazyModule, injector.getJavaBridgeConfiguration(), new FileBasedDeclarationProviderFactory(files)); + InjectorForTopDownAnalyzerForJvm tdaInjectorForLazy = createInjectorForTDA(eagerModuleForLazy); + tdaInjectorForLazy.getTopDownAnalyzer().analyzeFiles(Collections.singletonList(JetPsiFactory.createFile(project, "")), Collections.emptyList()); + ResolveSession session = new ResolveSession(project, lazyModule, tdaInjectorForLazy.getJavaBridgeConfiguration(), new FileBasedDeclarationProviderFactory(files)); injector.getTopDownAnalyzer().analyzeFiles(files, Collections.emptyList()); Pair namespacesToCompare = transform.fun(Pair.create(module, lazyModule)); + Predicate filterJetNamespace = new Predicate() { + @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.alwaysTrue(), false, false, Collections.emptyList()); + return new InjectorForTopDownAnalyzerForJvm(project, params, new BindingTraceContext(), module, compilerDependencies); } protected void doTest(String testFileName) throws Exception { diff --git a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java index 61d1eb9d1ed..c804bb9205d 100644 --- a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java @@ -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"); } diff --git a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java index 4f73ebc8b12..28d3fb92dc8 100644 --- a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java @@ -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 + ";");