From fbe4e9f96e44f20e9505f6f9c03a400522cf68ae Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 19 Sep 2012 16:14:49 +0400 Subject: [PATCH] KT-2710 code completion doesn't work #KT-2710 In Progress --- .../resolve/java/AnalyzerFacadeForJVM.java | 74 +++++++++++++++++++ .../jet/analyzer/AnalyzerFacade.java | 7 ++ .../project/AnalyzerFacadeWithCache.java | 74 +------------------ .../project/JSAnalyzerFacadeForIDEA.java | 7 ++ .../k2js/analyze/AnalyzerFacadeForJS.java | 44 +++++++++++ 5 files changed, 134 insertions(+), 72 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java index 23906b542c2..550acdd8a4c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java @@ -18,20 +18,33 @@ package org.jetbrains.jet.lang.resolve.java; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzerFacade; import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything; +import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; +import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.ModuleConfiguration; +import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetImportDirective; +import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +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 org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -70,6 +83,67 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade { headersTraceContext, bodiesResolveContext, configuration); } + @NotNull + @Override + public ResolveSession getLazyResolveSession(@NotNull final Project fileProject, @NotNull Collection files) { + ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("")); + + BindingTraceContext javaResolverTrace = new BindingTraceContext(); + InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver( + fileProject, javaResolverTrace, javaModule, BuiltinsScopeExtensionMode.ALL); + + final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); + + // TODO: Replace with stub declaration provider + final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { + @Override + public boolean apply(FqName fqName) { + return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); + } + }); + + final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); + + ModuleConfiguration moduleConfiguration = new ModuleConfiguration() { + @Override + public void addDefaultImports(@NotNull Collection directives) { + final Collection defaultImports = Lists.newArrayList(JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS); + defaultImports.addAll(Arrays.asList(DefaultModuleConfiguration.DEFAULT_JET_IMPORTS)); + + for (ImportPath defaultJetImport : defaultImports) { + directives.add(JetPsiFactory.createImportDirective(fileProject, defaultJetImport)); + } + } + + @Override + public void extendNamespaceScope( + @NotNull BindingTrace trace, + @NotNull NamespaceDescriptor namespaceDescriptor, + @NotNull WritableScope namespaceMemberScope + ) { + FqName fqName = DescriptorUtils.getFQName(namespaceDescriptor).toSafe(); + if (new FqName("jet").equals(fqName)) { + namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); + } + if (psiClassFinder.findPsiPackage(fqName) != null) { + JavaPackageScope javaPackageScope = javaDescriptorResolver.getJavaPackageScope(fqName, namespaceDescriptor); + assert javaPackageScope != null; + namespaceMemberScope.importScope(javaPackageScope); + } + } + + @NotNull + @Override + public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { + return PlatformToKotlinClassMap.EMPTY; + } + }; + + ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); + + return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory); + } + public static AnalyzeExhaust analyzeOneFileWithJavaIntegrationAndCheckForErrors( JetFile file, List scriptParameters, @NotNull BuiltinsScopeExtensionMode builtinsScopeExtensionMode) { AnalyzingUtils.checkForSyntacticErrors(file); diff --git a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java index 852378c0f17..eb7256f0ec9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java +++ b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BodiesResolveContext; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import java.util.Collection; import java.util.List; @@ -51,4 +52,10 @@ public interface AnalyzerFacade { @NotNull BodiesResolveContext bodiesResolveContext, @NotNull ModuleConfiguration configuration ); + + @NotNull + ResolveSession getLazyResolveSession( + @NotNull Project project, + @NotNull Collection files + ); } diff --git a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java index 5b12bcc3832..36fdd62d1e1 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java @@ -16,9 +16,7 @@ package org.jetbrains.jet.plugin.project; -import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.Lists; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.DumbService; @@ -35,29 +33,15 @@ import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; -import org.jetbrains.jet.di.InjectorForJavaDescriptorResolver; -import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; -import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.ModuleConfiguration; -import org.jetbrains.jet.lang.PlatformToKotlinClassMap; -import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetImportDirective; -import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; -import org.jetbrains.jet.lang.resolve.java.*; -import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.java.JetFilesProvider; 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 org.jetbrains.jet.lang.resolve.scopes.WritableScope; -import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.plugin.util.ApplicationUtils; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -194,11 +178,6 @@ public final class AnalyzerFacadeWithCache { @NotNull public static ResolveSession getLazyResolveSession(@NotNull final JetFile file) { final Project fileProject = file.getProject(); - ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("")); - - BindingTraceContext javaResolverTrace = new BindingTraceContext(); - InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver( - fileProject, javaResolverTrace, javaModule, BuiltinsScopeExtensionMode.ALL); Collection files = JetFilesProvider.getInstance(fileProject).allInScope(GlobalSearchScope.allScope(fileProject)); @@ -207,55 +186,6 @@ public final class AnalyzerFacadeWithCache { files.remove(originalFile); files.add(file); - final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); - - // TODO: Replace with stub declaration provider - final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { - @Override - public boolean apply(FqName fqName) { - return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); - } - }); - - final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); - - ModuleConfiguration moduleConfiguration = new ModuleConfiguration() { - @Override - public void addDefaultImports(@NotNull Collection directives) { - final Collection defaultImports = Lists.newArrayList(JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS); - defaultImports.addAll(Arrays.asList(DefaultModuleConfiguration.DEFAULT_JET_IMPORTS)); - - for (ImportPath defaultJetImport : defaultImports) { - directives.add(JetPsiFactory.createImportDirective(fileProject, defaultJetImport)); - } - } - - @Override - public void extendNamespaceScope( - @NotNull BindingTrace trace, - @NotNull NamespaceDescriptor namespaceDescriptor, - @NotNull WritableScope namespaceMemberScope - ) { - FqName fqName = DescriptorUtils.getFQName(namespaceDescriptor).toSafe(); - if (new FqName("jet").equals(fqName)) { - namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); - } - if (psiClassFinder.findPsiPackage(fqName) != null) { - JavaPackageScope javaPackageScope = javaDescriptorResolver.getJavaPackageScope(fqName, namespaceDescriptor); - assert javaPackageScope != null; - namespaceMemberScope.importScope(javaPackageScope); - } - } - - @NotNull - @Override - public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { - return PlatformToKotlinClassMap.EMPTY; - } - }; - - ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); - - return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory); + return AnalyzerFacadeProvider.getAnalyzerFacadeForFile(file).getLazyResolveSession(fileProject, files); } } diff --git a/idea/src/org/jetbrains/jet/plugin/project/JSAnalyzerFacadeForIDEA.java b/idea/src/org/jetbrains/jet/plugin/project/JSAnalyzerFacadeForIDEA.java index 8c23a4e82c8..3c9d1ceb77a 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/JSAnalyzerFacadeForIDEA.java +++ b/idea/src/org/jetbrains/jet/plugin/project/JSAnalyzerFacadeForIDEA.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BodiesResolveContext; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS; import java.util.Collection; @@ -65,4 +66,10 @@ public enum JSAnalyzerFacadeForIDEA implements AnalyzerFacade { ) { return AnalyzerFacadeForJS.analyzeBodiesInFiles(filesForBodiesResolve, new IDEAConfig(project), traceContext, bodiesResolveContext, configuration); } + + @NotNull + @Override + public ResolveSession getLazyResolveSession(@NotNull Project project, @NotNull Collection files) { + return AnalyzerFacadeForJS.getLazyResolveSession(files, new IDEAConfig(project)); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java index 2dba34b18cc..b99a43e0506 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -26,10 +26,19 @@ import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJs; import org.jetbrains.jet.lang.ModuleConfiguration; +import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetImportDirective; +import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +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 org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.k2js.config.Config; import java.util.Collection; @@ -136,4 +145,39 @@ public final class AnalyzerFacadeForJS { } }; } + + @NotNull + public static ResolveSession getLazyResolveSession(Collection files, final Config config) { + FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory( + Config.withJsLibAdded(files, config), Predicates.alwaysFalse()); + + // ModuleConfiguration moduleConfiguration = new JsConfiguration(config.getProject(), null); + + ModuleConfiguration moduleConfigurationJs = new ModuleConfiguration() { + @Override + public void addDefaultImports(@NotNull Collection directives) { + for (ImportPath path : JsConfiguration.DEFAULT_IMPORT_PATHS) { + directives.add(JetPsiFactory.createImportDirective(config.getProject(), path)); + } + } + + @Override + public void extendNamespaceScope( + @NotNull BindingTrace trace, + @NotNull NamespaceDescriptor namespaceDescriptor, + @NotNull WritableScope namespaceMemberScope + ) { + namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); + } + + @NotNull + @Override + public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { + return PlatformToKotlinClassMap.EMPTY; + } + }; + + ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); + return new ResolveSession(config.getProject(), lazyModule, moduleConfigurationJs, declarationProviderFactory); + } }