Move creating sink for extra diagnostics into generation state to take responsibility for correct diagnostics suppression
This commit is contained in:
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.psi.KtScript
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
||||||
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
public class GenerationState @JvmOverloads constructor(
|
public class GenerationState @JvmOverloads constructor(
|
||||||
@@ -52,7 +53,6 @@ public class GenerationState @JvmOverloads constructor(
|
|||||||
disableInline: Boolean = false,
|
disableInline: Boolean = false,
|
||||||
disableOptimization: Boolean = false,
|
disableOptimization: Boolean = false,
|
||||||
public val useTypeTableInSerializer: Boolean = false,
|
public val useTypeTableInSerializer: Boolean = false,
|
||||||
public val diagnostics: DiagnosticSink = DiagnosticSink.DO_NOTHING,
|
|
||||||
public val packagesWithObsoleteParts: Collection<FqName> = emptySet(),
|
public val packagesWithObsoleteParts: Collection<FqName> = emptySet(),
|
||||||
public val obsoleteMultifileClasses: Collection<FqName> = emptySet(),
|
public val obsoleteMultifileClasses: Collection<FqName> = emptySet(),
|
||||||
// for PackageCodegen in incremental compilation mode
|
// for PackageCodegen in incremental compilation mode
|
||||||
@@ -91,6 +91,13 @@ public class GenerationState @JvmOverloads constructor(
|
|||||||
incrementalCompilationComponents.getIncrementalCache(targetId)
|
incrementalCompilationComponents.getIncrementalCache(targetId)
|
||||||
else null
|
else null
|
||||||
|
|
||||||
|
private val extraJvmDiagnosticsTrace: BindingTrace = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}")
|
||||||
|
private val interceptedBuilderFactory: ClassBuilderFactory
|
||||||
|
private var used = false
|
||||||
|
|
||||||
|
public val diagnostics: DiagnosticSink get() = extraJvmDiagnosticsTrace
|
||||||
|
public val collectedExtraJvmDiagnostics: Diagnostics get() = extraJvmDiagnosticsTrace.bindingContext.diagnostics
|
||||||
|
|
||||||
public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module)
|
public val moduleName: String = moduleName ?: JvmCodegenUtil.getModuleName(module)
|
||||||
public val classBuilderMode: ClassBuilderMode = builderFactory.getClassBuilderMode()
|
public val classBuilderMode: ClassBuilderMode = builderFactory.getClassBuilderMode()
|
||||||
public val bindingTrace: BindingTrace = DelegatingBindingTrace(bindingContext, "trace in GenerationState")
|
public val bindingTrace: BindingTrace = DelegatingBindingTrace(bindingContext, "trace in GenerationState")
|
||||||
@@ -103,8 +110,6 @@ public class GenerationState @JvmOverloads constructor(
|
|||||||
public val reflectionTypes: ReflectionTypes = ReflectionTypes(module)
|
public val reflectionTypes: ReflectionTypes = ReflectionTypes(module)
|
||||||
public val jvmRuntimeTypes: JvmRuntimeTypes = JvmRuntimeTypes()
|
public val jvmRuntimeTypes: JvmRuntimeTypes = JvmRuntimeTypes()
|
||||||
public val factory: ClassFileFactory
|
public val factory: ClassFileFactory
|
||||||
private val interceptedBuilderFactory: ClassBuilderFactory
|
|
||||||
private var used = false
|
|
||||||
|
|
||||||
public val replSpecific = ForRepl()
|
public val replSpecific = ForRepl()
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -398,7 +398,6 @@ public class KotlinToJVMBytecodeCompiler {
|
|||||||
obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).getFqNameForClassNameWithoutDollars());
|
obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).getFqNameForClassNameWithoutDollars());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BindingTrace diagnosticHolder = new DelegatingBindingTrace(result.getBindingContext(), false, "For extra diagnostics in ${this.javaClass}");
|
|
||||||
GenerationState generationState = new GenerationState(
|
GenerationState generationState = new GenerationState(
|
||||||
environment.getProject(),
|
environment.getProject(),
|
||||||
ClassBuilderFactories.BINARIES,
|
ClassBuilderFactories.BINARIES,
|
||||||
@@ -411,7 +410,6 @@ public class KotlinToJVMBytecodeCompiler {
|
|||||||
configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false),
|
configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false),
|
||||||
configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false),
|
configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false),
|
||||||
/* useTypeTableInSerializer = */ false,
|
/* useTypeTableInSerializer = */ false,
|
||||||
diagnosticHolder,
|
|
||||||
packagesWithObsoleteParts,
|
packagesWithObsoleteParts,
|
||||||
obsoleteMultifileClasses,
|
obsoleteMultifileClasses,
|
||||||
targetId,
|
targetId,
|
||||||
@@ -434,7 +432,7 @@ public class KotlinToJVMBytecodeCompiler {
|
|||||||
|
|
||||||
AnalyzerWithCompilerReport.reportDiagnostics(
|
AnalyzerWithCompilerReport.reportDiagnostics(
|
||||||
new FilteredJvmDiagnostics(
|
new FilteredJvmDiagnostics(
|
||||||
diagnosticHolder.getBindingContext().getDiagnostics(),
|
generationState.getCollectedExtraJvmDiagnostics(),
|
||||||
result.getBindingContext().getDiagnostics()
|
result.getBindingContext().getDiagnostics()
|
||||||
),
|
),
|
||||||
environment.getConfiguration().get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
|
environment.getConfiguration().get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
|
||||||
|
|||||||
@@ -32,21 +32,6 @@ public interface DiagnosticSink {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CollectAll implements DiagnosticSink {
|
|
||||||
|
|
||||||
List<Diagnostic> diagnostics = new ArrayList<Diagnostic>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void report(@NotNull Diagnostic diagnostic) {
|
|
||||||
diagnostics.add(diagnostic);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public List<Diagnostic> getDiagnostics() {
|
|
||||||
return Collections.unmodifiableList(diagnostics);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
DiagnosticSink THROW_EXCEPTION = new DiagnosticSink() {
|
DiagnosticSink THROW_EXCEPTION = new DiagnosticSink() {
|
||||||
@Override
|
@Override
|
||||||
public void report(@NotNull Diagnostic diagnostic) {
|
public void report(@NotNull Diagnostic diagnostic) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils;
|
|||||||
import org.jetbrains.kotlin.psi.KtElement;
|
import org.jetbrains.kotlin.psi.KtElement;
|
||||||
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid;
|
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid;
|
||||||
import org.jetbrains.kotlin.psi.debugText.DebugTextUtilKt;
|
import org.jetbrains.kotlin.psi.debugText.DebugTextUtilKt;
|
||||||
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -59,7 +60,11 @@ public class AnalyzingUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void throwExceptionOnErrors(BindingContext bindingContext) {
|
public static void throwExceptionOnErrors(BindingContext bindingContext) {
|
||||||
for (Diagnostic diagnostic : bindingContext.getDiagnostics()) {
|
throwExceptionOnErrors(bindingContext.getDiagnostics());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void throwExceptionOnErrors(Diagnostics diagnostics) {
|
||||||
|
for (Diagnostic diagnostic : diagnostics) {
|
||||||
DiagnosticSink.THROW_EXCEPTION.report(diagnostic);
|
DiagnosticSink.THROW_EXCEPTION.report(diagnostic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
import org.jetbrains.kotlin.psi.KtPsiUtil
|
import org.jetbrains.kotlin.psi.KtPsiUtil
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.descriptorToDeclaration
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.descriptorToDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
@@ -80,7 +79,8 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
|
|||||||
|
|
||||||
val javaFileStub = createJavaFileStub(packageFqName, files)
|
val javaFileStub = createJavaFileStub(packageFqName, files)
|
||||||
val bindingContext: BindingContext
|
val bindingContext: BindingContext
|
||||||
val forExtraDiagnostics = DelegatingBindingTrace(context.bindingContext, false, "For extra diagnostics in ${this.javaClass}")
|
|
||||||
|
val state: GenerationState
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val stubStack = Stack<StubElement<PsiElement>>()
|
val stubStack = Stack<StubElement<PsiElement>>()
|
||||||
@@ -88,7 +88,7 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
stubStack.push(javaFileStub as StubElement<PsiElement>)
|
stubStack.push(javaFileStub as StubElement<PsiElement>)
|
||||||
|
|
||||||
val state = GenerationState(
|
state = GenerationState(
|
||||||
project,
|
project,
|
||||||
KotlinLightClassBuilderFactory(stubStack),
|
KotlinLightClassBuilderFactory(stubStack),
|
||||||
context.module,
|
context.module,
|
||||||
@@ -99,8 +99,7 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
|
|||||||
generateDeclaredClassFilter = generateClassFilter,
|
generateDeclaredClassFilter = generateClassFilter,
|
||||||
disableInline = false,
|
disableInline = false,
|
||||||
disableOptimization = false,
|
disableOptimization = false,
|
||||||
useTypeTableInSerializer = false,
|
useTypeTableInSerializer = false)
|
||||||
diagnostics = forExtraDiagnostics)
|
|
||||||
state.beforeCompile()
|
state.beforeCompile()
|
||||||
|
|
||||||
bindingContext = state.bindingContext
|
bindingContext = state.bindingContext
|
||||||
@@ -122,9 +121,8 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
|
|||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
|
|
||||||
val extraDiagnostics = forExtraDiagnostics.bindingContext.diagnostics
|
|
||||||
return CachedValueProvider.Result.create(
|
return CachedValueProvider.Result.create(
|
||||||
createLightClassData(javaFileStub, bindingContext, extraDiagnostics),
|
createLightClassData(javaFileStub, bindingContext, state.collectedExtraJvmDiagnostics),
|
||||||
if (isLocal) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
|
if (isLocal) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ public class CodegenTestUtil {
|
|||||||
analysisResult.throwIfError();
|
analysisResult.throwIfError();
|
||||||
AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext());
|
AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext());
|
||||||
CompilerConfiguration configuration = environment.getConfiguration();
|
CompilerConfiguration configuration = environment.getConfiguration();
|
||||||
BindingTrace forExtraDiagnostics = new DelegatingBindingTrace(analysisResult.getBindingContext(), false, "For extra diagnostics in ${this.javaClass}");
|
|
||||||
GenerationState state = new GenerationState(
|
GenerationState state = new GenerationState(
|
||||||
environment.getProject(), ClassBuilderFactories.TEST,
|
environment.getProject(), ClassBuilderFactories.TEST,
|
||||||
analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), files.getPsiFiles(),
|
analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), files.getPsiFiles(),
|
||||||
@@ -66,13 +65,12 @@ public class CodegenTestUtil {
|
|||||||
GenerationState.GenerateClassFilter.GENERATE_ALL,
|
GenerationState.GenerateClassFilter.GENERATE_ALL,
|
||||||
configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false),
|
configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false),
|
||||||
configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false),
|
configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false),
|
||||||
/* useTypeTableInSerializer = */ false,
|
/* useTypeTableInSerializer = */ false
|
||||||
forExtraDiagnostics
|
|
||||||
);
|
);
|
||||||
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
||||||
|
|
||||||
// For JVM-specific errors
|
// For JVM-specific errors
|
||||||
AnalyzingUtils.throwExceptionOnErrors(forExtraDiagnostics.getBindingContext());
|
AnalyzingUtils.throwExceptionOnErrors(state.getCollectedExtraJvmDiagnostics());
|
||||||
|
|
||||||
return state.getFactory();
|
return state.getFactory();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.codegen.CompilationErrorHandler;
|
|||||||
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade;
|
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade;
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic;
|
import org.jetbrains.kotlin.diagnostics.Diagnostic;
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink;
|
|
||||||
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages;
|
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages;
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils;
|
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils;
|
||||||
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade;
|
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade;
|
||||||
@@ -57,10 +56,8 @@ import javax.swing.*;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
||||||
private static final int UPDATE_DELAY = 1000;
|
private static final int UPDATE_DELAY = 1000;
|
||||||
@@ -195,7 +192,6 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
boolean enableOptimization
|
boolean enableOptimization
|
||||||
) {
|
) {
|
||||||
GenerationState state;
|
GenerationState state;
|
||||||
DiagnosticSink.CollectAll sink = new DiagnosticSink.CollectAll();
|
|
||||||
try {
|
try {
|
||||||
ResolutionFacade resolutionFacade = ResolutionUtils.getResolutionFacade(jetFile);
|
ResolutionFacade resolutionFacade = ResolutionUtils.getResolutionFacade(jetFile);
|
||||||
|
|
||||||
@@ -211,22 +207,22 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
GenerationState.GenerateClassFilter generateClassFilter = new GenerationState.GenerateClassFilter() {
|
GenerationState.GenerateClassFilter generateClassFilter = new GenerationState.GenerateClassFilter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldGeneratePackagePart(KtFile file) {
|
public boolean shouldGeneratePackagePart(@NotNull KtFile file) {
|
||||||
return file == jetFile;
|
return file == jetFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldAnnotateClass(KtClassOrObject classOrObject) {
|
public boolean shouldAnnotateClass(@NotNull KtClassOrObject classOrObject) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldGenerateClass(KtClassOrObject classOrObject) {
|
public boolean shouldGenerateClass(@NotNull KtClassOrObject classOrObject) {
|
||||||
return classOrObject.getContainingKtFile() == jetFile;
|
return classOrObject.getContainingKtFile() == jetFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldGenerateScript(KtScript script) {
|
public boolean shouldGenerateScript(@NotNull KtScript script) {
|
||||||
return script.getContainingKtFile() == jetFile;
|
return script.getContainingKtFile() == jetFile;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -239,8 +235,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
generateClassFilter,
|
generateClassFilter,
|
||||||
!enableInline,
|
!enableInline,
|
||||||
!enableOptimization,
|
!enableOptimization,
|
||||||
/*useTypeTableInSerializer=*/false,
|
/*useTypeTableInSerializer=*/false);
|
||||||
sink);
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
|
||||||
}
|
}
|
||||||
catch (ProcessCanceledException e) {
|
catch (ProcessCanceledException e) {
|
||||||
@@ -252,7 +247,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable {
|
|||||||
|
|
||||||
StringBuilder answer = new StringBuilder();
|
StringBuilder answer = new StringBuilder();
|
||||||
|
|
||||||
List<Diagnostic> diagnostics = sink.getDiagnostics();
|
Collection<Diagnostic> diagnostics = state.getCollectedExtraJvmDiagnostics().all();
|
||||||
if (!diagnostics.isEmpty()) {
|
if (!diagnostics.isEmpty()) {
|
||||||
answer.append("// Backend Errors: \n");
|
answer.append("// Backend Errors: \n");
|
||||||
answer.append("// ================\n");
|
answer.append("// ================\n");
|
||||||
|
|||||||
+1
-4
@@ -38,8 +38,6 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted
|
|||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
files: Collection<KtFile>
|
files: Collection<KtFile>
|
||||||
): AnalysisResult? {
|
): AnalysisResult? {
|
||||||
val forExtraDiagnostics = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}")
|
|
||||||
|
|
||||||
val generationState = GenerationState(
|
val generationState = GenerationState(
|
||||||
project,
|
project,
|
||||||
StubClassBuilderFactory(),
|
StubClassBuilderFactory(),
|
||||||
@@ -47,8 +45,7 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted
|
|||||||
bindingContext,
|
bindingContext,
|
||||||
files.toArrayList(),
|
files.toArrayList(),
|
||||||
disableCallAssertions = false,
|
disableCallAssertions = false,
|
||||||
disableParamAssertions = false,
|
disableParamAssertions = false)
|
||||||
diagnostics = forExtraDiagnostics)
|
|
||||||
|
|
||||||
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user