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