Make KotlinJvmCheckerProvider non-singleton, pass module to it

This commit is contained in:
Alexander Udalov
2015-07-03 16:18:13 +03:00
parent ac0db5ce80
commit 0bad4e0137
10 changed files with 46 additions and 39 deletions
@@ -38,7 +38,7 @@ public fun createContainerForReplWithJava(
moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory, moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope, additionalFileScopeProvider: FileScopeProvider.AdditionalScopes moduleContentScope: GlobalSearchScope, additionalFileScopeProvider: FileScopeProvider.AdditionalScopes
): ContainerForReplWithJava = createContainer("ReplWithJava") { ): ContainerForReplWithJava = createContainer("ReplWithJava") {
configureModule(moduleContext, KotlinJvmCheckerProvider, bindingTrace) configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project)
useInstance(additionalFileScopeProvider) useInstance(additionalFileScopeProvider)
@@ -71,7 +71,7 @@ public fun createContainerForLazyResolveWithJava(
moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory, moduleContext: ModuleContext, bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope, moduleClassResolver: ModuleClassResolver moduleContentScope: GlobalSearchScope, moduleClassResolver: ModuleClassResolver
): Pair<ResolveSession, JavaDescriptorResolver> = createContainer("LazyResolveWithJava") { ): Pair<ResolveSession, JavaDescriptorResolver> = createContainer("LazyResolveWithJava") {
configureModule(moduleContext, KotlinJvmCheckerProvider, bindingTrace) configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project)
useInstance(moduleClassResolver) useInstance(moduleClassResolver)
@@ -92,7 +92,7 @@ public fun createContainerForTopDownAnalyzerForJvm(
declarationProviderFactory: DeclarationProviderFactory, declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope moduleContentScope: GlobalSearchScope
): ContainerForTopDownAnalyzerForJvm = createContainer("TopDownAnalyzerForJvm") { ): ContainerForTopDownAnalyzerForJvm = createContainer("TopDownAnalyzerForJvm") {
configureModule(moduleContext, KotlinJvmCheckerProvider, bindingTrace) configureModule(moduleContext, KotlinJvmCheckerProvider(moduleContext.module), bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project) configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
useInstance(BodyResolveCache.ThrowException) useInstance(BodyResolveCache.ThrowException)
@@ -52,7 +52,7 @@ import org.jetbrains.kotlin.types.expressions.SenselessComparisonChecker
import org.jetbrains.kotlin.types.flexibility import org.jetbrains.kotlin.types.flexibility
import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.types.isFlexible
public object KotlinJvmCheckerProvider : AdditionalCheckerProvider( public class KotlinJvmCheckerProvider(private val module: ModuleDescriptor) : AdditionalCheckerProvider(
additionalDeclarationCheckers = listOf(PlatformStaticAnnotationChecker(), additionalDeclarationCheckers = listOf(PlatformStaticAnnotationChecker(),
LocalFunInlineChecker(), LocalFunInlineChecker(),
ReifiedTypeParameterAnnotationChecker(), ReifiedTypeParameterAnnotationChecker(),
@@ -53,7 +53,8 @@ public abstract class AbstractDescriptorRendererTest : KotlinTestWithEnvironment
context, context,
FileBasedDeclarationProviderFactory(context.storageManager, listOf(psiFile)), FileBasedDeclarationProviderFactory(context.storageManager, listOf(psiFile)),
CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(), CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
KotlinJvmCheckerProvider, DynamicTypesSettings()) KotlinJvmCheckerProvider(context.module), DynamicTypesSettings()
)
context.initializeModuleContents(resolveSession.getPackageFragmentProvider()) context.initializeModuleContents(resolveSession.getPackageFragmentProvider())
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.types.expressions.FakeCallResolver
public fun createContainerForTests(project: Project, module: ModuleDescriptor): ContainerForTests { public fun createContainerForTests(project: Project, module: ModuleDescriptor): ContainerForTests {
return ContainerForTests(createContainer("Tests") { return ContainerForTests(createContainer("Tests") {
configureModule(ModuleContext(module, project), KotlinJvmCheckerProvider) configureModule(ModuleContext(module, project), KotlinJvmCheckerProvider(module))
useImpl<ExpressionTypingServices>() useImpl<ExpressionTypingServices>()
}) })
} }
@@ -401,11 +401,17 @@ public abstract class ElementResolver protected constructor(
return trace return trace
} }
private fun createBodyResolver(resolveSession: ResolveSession, trace: BindingTrace, file: JetFile, statementFilter: StatementFilter): BodyResolver { private fun createBodyResolver(
resolveSession: ResolveSession,
trace: BindingTrace,
file: JetFile,
statementFilter: StatementFilter
): BodyResolver {
val globalContext = SimpleGlobalContext(resolveSession.getStorageManager(), resolveSession.getExceptionTracker()) val globalContext = SimpleGlobalContext(resolveSession.getStorageManager(), resolveSession.getExceptionTracker())
val module = resolveSession.getModuleDescriptor()
return createContainerForBodyResolve( return createContainerForBodyResolve(
globalContext.withProject(file.getProject()).withModule(resolveSession.getModuleDescriptor()), globalContext.withProject(file.getProject()).withModule(module),
trace, getAdditionalCheckerProvider(file), statementFilter, getDynamicTypesSettings(file) trace, createAdditionalCheckerProvider(file, module), statementFilter, getDynamicTypesSettings(file)
).get<BodyResolver>() ).get<BodyResolver>()
} }
@@ -477,7 +483,7 @@ public abstract class ElementResolver protected constructor(
return null return null
} }
protected abstract fun getAdditionalCheckerProvider(jetFile: JetFile): AdditionalCheckerProvider protected abstract fun createAdditionalCheckerProvider(jetFile: JetFile, module: ModuleDescriptor): AdditionalCheckerProvider
protected abstract fun getDynamicTypesSettings(jetFile: JetFile): DynamicTypesSettings protected abstract fun getDynamicTypesSettings(jetFile: JetFile): DynamicTypesSettings
private class BodyResolveContextForLazy( private class BodyResolveContextForLazy(
@@ -215,11 +215,9 @@ private object KotlinResolveDataProvider {
fun analyze(project: Project, resolveSession: ResolveSessionForBodies, analyzableElement: JetElement): AnalysisResult { fun analyze(project: Project, resolveSession: ResolveSessionForBodies, analyzableElement: JetElement): AnalysisResult {
try { try {
val module = resolveSession.getModuleDescriptor()
if (analyzableElement is JetCodeFragment) { if (analyzableElement is JetCodeFragment) {
return AnalysisResult.success( return AnalysisResult.success(analyzeExpressionCodeFragment(resolveSession, analyzableElement), module)
analyzeExpressionCodeFragment(resolveSession, analyzableElement),
resolveSession.getModuleDescriptor()
)
} }
val file = analyzableElement.getContainingJetFile() val file = analyzableElement.getContainingJetFile()
@@ -232,12 +230,12 @@ private object KotlinResolveDataProvider {
val targetPlatform = TargetPlatformDetector.getPlatform(analyzableElement.getContainingJetFile()) val targetPlatform = TargetPlatformDetector.getPlatform(analyzableElement.getContainingJetFile())
val globalContext = SimpleGlobalContext(resolveSession.getStorageManager(), resolveSession.getExceptionTracker()) val globalContext = SimpleGlobalContext(resolveSession.getStorageManager(), resolveSession.getExceptionTracker())
val moduleContext = globalContext.withProject(project).withModule(resolveSession.getModuleDescriptor()) val moduleContext = globalContext.withProject(project).withModule(module)
val lazyTopDownAnalyzer = createContainerForLazyBodyResolve( val lazyTopDownAnalyzer = createContainerForLazyBodyResolve(
moduleContext, moduleContext,
resolveSession, resolveSession,
trace, trace,
targetPlatform.getAdditionalCheckerProvider(), targetPlatform.createAdditionalCheckerProvider(module),
targetPlatform.getDynamicTypesSettings(), targetPlatform.getDynamicTypesSettings(),
resolveSession.getBodyResolveCache() resolveSession.getBodyResolveCache()
).get<LazyTopDownAnalyzerForTopLevel>() ).get<LazyTopDownAnalyzerForTopLevel>()
@@ -248,7 +246,7 @@ private object KotlinResolveDataProvider {
) )
return AnalysisResult.success( return AnalysisResult.success(
trace.getBindingContext(), trace.getBindingContext(),
resolveSession.getModuleDescriptor() module
) )
} }
catch (e: ProcessCanceledException) { catch (e: ProcessCanceledException) {
@@ -24,6 +24,7 @@ import com.intellij.psi.util.PsiModificationTracker;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.idea.stubindex.JetProbablyNothingFunctionShortNameIndex; import org.jetbrains.kotlin.idea.stubindex.JetProbablyNothingFunctionShortNameIndex;
import org.jetbrains.kotlin.idea.stubindex.JetProbablyNothingPropertyShortNameIndex; import org.jetbrains.kotlin.idea.stubindex.JetProbablyNothingPropertyShortNameIndex;
import org.jetbrains.kotlin.psi.JetElement; import org.jetbrains.kotlin.psi.JetElement;
@@ -88,8 +89,8 @@ public class ResolveElementCache extends ElementResolver implements BodyResolveC
@NotNull @NotNull
@Override @Override
public AdditionalCheckerProvider getAdditionalCheckerProvider(@NotNull JetFile jetFile) { public AdditionalCheckerProvider createAdditionalCheckerProvider(@NotNull JetFile jetFile, @NotNull ModuleDescriptor module) {
return TargetPlatformDetector.getPlatform(jetFile).getAdditionalCheckerProvider(); return TargetPlatformDetector.getPlatform(jetFile).createAdditionalCheckerProvider(module);
} }
@NotNull @NotNull
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.project; package org.jetbrains.kotlin.idea.project;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.js.resolve.KotlinJsCheckerProvider; import org.jetbrains.kotlin.js.resolve.KotlinJsCheckerProvider;
import org.jetbrains.kotlin.load.kotlin.KotlinJvmCheckerProvider; import org.jetbrains.kotlin.load.kotlin.KotlinJvmCheckerProvider;
import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider; import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider;
@@ -25,11 +26,24 @@ import org.jetbrains.kotlin.types.DynamicTypesSettings;
public interface TargetPlatform { public interface TargetPlatform {
@NotNull @NotNull
AdditionalCheckerProvider getAdditionalCheckerProvider(); AdditionalCheckerProvider createAdditionalCheckerProvider(@NotNull ModuleDescriptor module);
@NotNull @NotNull
DynamicTypesSettings getDynamicTypesSettings(); DynamicTypesSettings getDynamicTypesSettings();
TargetPlatform JVM = new TargetPlatformImpl("JVM", KotlinJvmCheckerProvider.INSTANCE$, new DynamicTypesSettings()); TargetPlatform JVM = new TargetPlatformImpl("JVM", new DynamicTypesSettings()) {
TargetPlatform JS = new TargetPlatformImpl("JS", KotlinJsCheckerProvider.INSTANCE$, new DynamicTypesAllowed()); @NotNull
@Override
public AdditionalCheckerProvider createAdditionalCheckerProvider(@NotNull ModuleDescriptor module) {
return new KotlinJvmCheckerProvider(module);
}
};
TargetPlatform JS = new TargetPlatformImpl("JS", new DynamicTypesAllowed()) {
@NotNull
@Override
public AdditionalCheckerProvider createAdditionalCheckerProvider(@NotNull ModuleDescriptor module) {
return KotlinJsCheckerProvider.INSTANCE$;
}
};
} }
@@ -17,30 +17,17 @@
package org.jetbrains.kotlin.idea.project; package org.jetbrains.kotlin.idea.project;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider;
import org.jetbrains.kotlin.types.DynamicTypesSettings; import org.jetbrains.kotlin.types.DynamicTypesSettings;
public class TargetPlatformImpl implements TargetPlatform { public abstract class TargetPlatformImpl implements TargetPlatform {
@NotNull private final String platformName; private final String platformName;
@NotNull private final AdditionalCheckerProvider additionalCheckerProvider; private final DynamicTypesSettings dynamicTypesSettings;
@NotNull private final DynamicTypesSettings dynamicTypesSettings;
public TargetPlatformImpl( public TargetPlatformImpl(@NotNull String platformName, @NotNull DynamicTypesSettings dynamicTypesSettings) {
@NotNull String platformName,
@NotNull AdditionalCheckerProvider additionalCheckerProvider,
@NotNull DynamicTypesSettings dynamicTypesSettings
) {
this.platformName = platformName; this.platformName = platformName;
this.additionalCheckerProvider = additionalCheckerProvider;
this.dynamicTypesSettings = dynamicTypesSettings; this.dynamicTypesSettings = dynamicTypesSettings;
} }
@NotNull
@Override
public AdditionalCheckerProvider getAdditionalCheckerProvider() {
return additionalCheckerProvider;
}
@NotNull @NotNull
@Override @Override
public DynamicTypesSettings getDynamicTypesSettings() { public DynamicTypesSettings getDynamicTypesSettings() {