Inline LazyTopDownAnalyzerForTopLevel#analyzeFiles

To make module initialization more explicit and configurable (especially in
TopDownAnalyzerFacadeForJVM)
This commit is contained in:
Alexander Udalov
2016-09-27 19:00:56 +03:00
parent a5a874f23f
commit 9fb9c12f5e
5 changed files with 27 additions and 37 deletions
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.context.MutableModuleContext
import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl
@@ -46,6 +47,7 @@ import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension
import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
import java.util.*
@@ -103,7 +105,12 @@ object TopDownAnalyzerFacadeForJVM {
extension.getPackageFragmentProvider(project, module, storageManager, trace, null)
}
container.get<LazyTopDownAnalyzerForTopLevel>().analyzeFiles(TopDownAnalysisMode.TopLevelDeclarations, files, additionalProviders)
module.initialize(CompositePackageFragmentProvider(
listOf(container.get<KotlinCodeAnalyzer>().packageFragmentProvider) +
additionalProviders
))
container.get<LazyTopDownAnalyzerForTopLevel>().analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files)
for (extension in AnalysisCompletedHandlerExtension.getInstances(project)) {
val result = extension.analysisCompleted(project, module, trace, files)
@@ -17,25 +17,18 @@
package org.jetbrains.kotlin.resolve;
import com.intellij.psi.PsiElement;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider;
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider;
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtScript;
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory;
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.kotlin.resolve.lazy.ImportResolver;
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class LazyTopDownAnalyzerForTopLevel {
@NotNull private final KotlinCodeAnalyzer codeAnalyzer;
@NotNull private final LazyTopDownAnalyzer lazyTopDownAnalyzer;
private final KotlinCodeAnalyzer codeAnalyzer;
private final LazyTopDownAnalyzer lazyTopDownAnalyzer;
public LazyTopDownAnalyzerForTopLevel(
@NotNull LazyTopDownAnalyzer lazyTopDownAnalyzer,
@@ -45,27 +38,6 @@ public class LazyTopDownAnalyzerForTopLevel {
this.codeAnalyzer = codeAnalyzer;
}
@NotNull
public TopDownAnalysisContext analyzeFiles(
@NotNull TopDownAnalysisMode topDownAnalysisMode,
@NotNull Collection<KtFile> files,
@NotNull List<? extends PackageFragmentProvider> additionalProviders
) {
PackageFragmentProvider provider;
if (additionalProviders.isEmpty()) {
provider = codeAnalyzer.getPackageFragmentProvider();
}
else {
provider = new CompositePackageFragmentProvider(CollectionsKt.plus(
Arrays.asList(codeAnalyzer.getPackageFragmentProvider()),
additionalProviders));
}
((ModuleDescriptorImpl) codeAnalyzer.getModuleDescriptor()).initialize(provider);
return analyzeDeclarations(topDownAnalysisMode, files);
}
@NotNull
public TopDownAnalysisContext analyzeDeclarations(
@NotNull TopDownAnalysisMode topDownAnalysisMode,
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.context.ModuleContext;
import org.jetbrains.kotlin.context.SimpleGlobalContext;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor;
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider;
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
import org.jetbrains.kotlin.diagnostics.*;
import org.jetbrains.kotlin.frontend.java.di.InjectionKt;
@@ -59,6 +60,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform;
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
import org.jetbrains.kotlin.storage.ExceptionTracker;
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
@@ -290,12 +292,17 @@ public abstract class AbstractDiagnosticsTest extends BaseDiagnosticsTest {
configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT)
);
DslKt.getService(container, LazyTopDownAnalyzerForTopLevel.class).analyzeFiles(
TopDownAnalysisMode.TopLevelDeclarations, files,
Collections.singletonList(DslKt.getService(container, JavaDescriptorResolver.class).getPackageFragmentProvider())
ModuleDescriptorImpl moduleDescriptor = (ModuleDescriptorImpl) moduleContext.getModule();
moduleDescriptor.initialize(new CompositePackageFragmentProvider(Arrays.asList(
DslKt.getService(container, KotlinCodeAnalyzer.class).getPackageFragmentProvider(),
DslKt.getService(container, JavaDescriptorResolver.class).getPackageFragmentProvider()
)));
DslKt.getService(container, LazyTopDownAnalyzerForTopLevel.class).analyzeDeclarations(
TopDownAnalysisMode.TopLevelDeclarations, files
);
return AnalysisResult.success(moduleTrace.getBindingContext(), moduleContext.getModule());
return AnalysisResult.success(moduleTrace.getBindingContext(), moduleDescriptor);
}
private void validateAndCompareDescriptorWithFile(
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.js.resolve.JsPlatform
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel
import org.jetbrains.kotlin.resolve.createContainer
import org.jetbrains.kotlin.resolve.lazy.FileScopeProviderImpl
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
@@ -50,6 +52,8 @@ fun createTopDownAnalyzerForJs(
useInstance(languageVersionSettings)
useImpl<ResolveSession>()
useImpl<LazyTopDownAnalyzerForTopLevel>()
}.apply {
get<ModuleDescriptorImpl>().initialize(get<KotlinCodeAnalyzer>().packageFragmentProvider)
}
return storageComponentContainer.get<LazyTopDownAnalyzerForTopLevel>()
}
@@ -56,7 +56,7 @@ object TopDownAnalyzerFacadeForJS {
FileBasedDeclarationProviderFactory(moduleContext.storageManager, allFiles),
config.configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT)
)
analyzerForJs.analyzeFiles(TopDownAnalysisMode.TopLevelDeclarations, files, emptyList())
analyzerForJs.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files)
return JsAnalysisResult.success(trace, moduleContext.module)
}