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
     }
 }