tmp
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
index 0d68dd5..9eaf421 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java
@@ -51,6 +51,9 @@
import org.jetbrains.kotlin.util.PerformanceCounter;
import javax.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.nio.charset.StandardCharsets;
import java.util.*;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
@@ -567,6 +570,13 @@
) {
Call call = context.call;
tracing.bindCall(context.trace, call);
+ System.out.println(
+ "[CallResolver.doResolveCall] NewInference = " +
+ context.languageVersionSettings.getFeatureSupport(LanguageFeature.NewInference) +
+ ", resolutionTask.name=" +
+ resolutionTask.name
+ );
+
boolean newInferenceEnabled = languageVersionSettings.supportsFeature(LanguageFeature.NewInference);
NewResolutionOldInference.ResolutionKind resolutionKind = resolutionTask.resolutionKind;
@@ -656,6 +666,10 @@
@NotNull ResolutionTask<D> resolutionTask,
@NotNull TracingStrategy tracing
) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos, true);
+ new Exception().printStackTrace(ps);
+
DataFlowInfo initialInfo = context.dataFlowInfoForArguments.getResultInfo();
if (context.checkArguments == CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS) {
argumentTypeResolver.analyzeArgumentsAndRecordTypes(context, ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS);
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
index 3efae64..20a165c 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt
@@ -28,6 +28,7 @@
import org.jetbrains.kotlin.analyzer.TrackableModuleInfo
import org.jetbrains.kotlin.caches.project.LibraryModuleInfo
import org.jetbrains.kotlin.config.KotlinSourceRootType
+import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
@@ -443,3 +444,8 @@
fun IdeaModuleInfo.projectSourceModules(): List<ModuleSourceInfo>? =
(this as? ModuleSourceInfo)?.let(::listOf) ?: (this as? PlatformModuleInfo)?.containedModules
+
+data class ModuleSourceInfoWithGivenLanguageSettings(
+ private val originalModuleSourceInfo: ModuleSourceInfo,
+ val languageVersionSettings: LanguageVersionSettings
+) : ModuleSourceInfo by originalModuleSourceInfo
\ No newline at end of file
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
index d49f287..05c70fe 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt
@@ -47,6 +47,7 @@
isReleaseCoroutines: Boolean?
): LanguageVersionSettings =
when (moduleInfo) {
+ is ModuleSourceInfoWithGivenLanguageSettings -> moduleInfo.languageVersionSettings
is ModuleSourceInfo -> moduleInfo.module.languageVersionSettings
is LibraryInfo -> project.getLanguageVersionSettings(
jsr305State = computeJsr305State(project), isReleaseCoroutines = isReleaseCoroutines
diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 3b3aab3..1b1f4bb 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -2976,6 +2976,16 @@
language="kotlin"
/>
+ <localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.migration.DivergedInferenceMigrationInspection"
+ displayName="Check inference divergence"
+ groupPath="Kotlin"
+ groupName="Migration"
+ enabledByDefault="false"
+ cleanupTool="true"
+ level="INFORMATION"
+ language="kotlin"
+ />
+
<localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.RedundantWithInspection"
displayName="Redundant 'with' call"
groupPath="Kotlin"
diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
index 54f463e..f24f882 100644
--- a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/DivergedInferenceMigrationInspection.kt
@@ -9,20 +9,23 @@
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analyzer.AnalysisResult
-import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
-import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
-import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult
-import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
+import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
+import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfoWithGivenLanguageSettings
+import org.jetbrains.kotlin.idea.caches.project.forcedModuleInfo
+import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
+import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix
+import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
+import org.jetbrains.kotlin.idea.resolve.frontendService
+import org.jetbrains.kotlin.idea.util.projectStructure.module
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.util.SymbolTable
-import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
@@ -33,39 +36,45 @@
return migrationInfo.isInferenceUpdate()
}
- override fun checkFile(file: PsiFile, manager: InspectionManager, isOnTheFly: Boolean): Array<ProblemDescriptor>? {
- if (file !is KtFile) return null
+ override fun checkFile(oldFile: PsiFile, manager: InspectionManager, isOnTheFly: Boolean): Array<ProblemDescriptor>? {
+ if (oldFile !is KtFile) return null
+ val oldModuleInfo = oldFile.getModuleInfo() as? ModuleSourceInfo ?: return null
- // TODO
- val languageVersionSettingsBefore = LanguageVersionSettingsImpl.DEFAULT
- val languageVersionSettingsAfter = LanguageVersionSettingsImpl.DEFAULT
+ val languageVersionSettingsBefore = oldFile.module?.languageVersionSettings!!
+ val languageVersionSettingsAfter = languageVersionSettingsBefore.wrapEnablingNewInference()
- val resolutionBefore = buildResolutionSummary(file, languageVersionSettingsBefore)
- val resolutionAfter = buildResolutionSummary(file, languageVersionSettingsAfter)
+ val syntheticFileCopy = oldFile.copy() as KtFile
+ syntheticFileCopy.forcedModuleInfo = ModuleSourceInfoWithGivenLanguageSettings(oldModuleInfo, languageVersionSettingsAfter)
+
+ val resolutionBefore = buildResolutionSummary(oldFile, oldFile.getResolutionFacade())
+ val resolutionAfter = buildResolutionSummary(syntheticFileCopy, syntheticFileCopy.getResolutionFacade())
val resolutionDifference = compareResolutionSummaries(resolutionBefore, resolutionAfter)
return resolutionDifference.toProblemsDescriptors()
}
+ private fun LanguageVersionSettings.wrapEnablingNewInference(): LanguageVersionSettings {
+ return object : LanguageVersionSettings by this {
+ override fun getFeatureSupport(feature: LanguageFeature): LanguageFeature.State =
+ if (feature == LanguageFeature.NewInference) LanguageFeature.State.ENABLED else getFeatureSupport(feature)
+
+ override fun supportsFeature(feature: LanguageFeature): Boolean =
+ if (feature == LanguageFeature.NewInference) true else supportsFeature(feature)
+ }
+ }
+
private fun compareResolutionSummaries(resolutionBefore: ResolutionSummary, resolutionAfter: ResolutionSummary): ResolutionDifference {
- // TODO()
return ResolutionDifference()
}
- @Suppress("UNREACHABLE_CODE")
- private fun buildResolutionSummary(file: KtFile, languageVersionSettings: LanguageVersionSettings): ResolutionSummary {
- val analysisResult = file.analyzeWithGivenLanguageVersionSettings(languageVersionSettings)
- val (ir, symbolTable) = buildIr(file, analysisResult, languageVersionSettings = TODO())
+ private fun buildResolutionSummary(file: KtFile, resolutionFacade: ResolutionFacade): ResolutionSummary {
+ val analysisResult = resolutionFacade.analyzeWithAllCompilerChecks(listOf(file))
+ val (ir, symbolTable) = buildIr(file, analysisResult, languageVersionSettings = resolutionFacade.frontendService())
return ResolutionSummary(analysisResult, ir, symbolTable, file)
}
- private fun KtFile.analyzeWithGivenLanguageVersionSettings(languageVersionSettings: LanguageVersionSettings): AnalysisResult {
- // TODO
- KotlinCacheService.getInstance(project).getResolutionFacade(listOf(this)).analyzeWithAllCompilerChecks(listOf(this)).bindingContext
- }
-
private fun buildIr(
sourceFile: KtFile,
analysisResult: AnalysisResult,
@@ -89,7 +98,8 @@
private class ResolutionDifference {
fun toProblemsDescriptors(): Array<ProblemDescriptor>? {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ // TODO
+ return null
}
}