From 29a9ba64caa53107d60c0a8bcffb9539d19bb54a Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 25 Nov 2015 13:50:16 +0300 Subject: [PATCH] Move creating sink for extra diagnostics into generation state to take responsibility for correct diagnostics suppression --- .../kotlin/codegen/state/GenerationState.kt | 11 ++++++++--- .../compiler/KotlinToJVMBytecodeCompiler.java | 4 +--- .../kotlin/diagnostics/DiagnosticSink.java | 15 --------------- .../kotlin/resolve/AnalyzingUtils.java | 7 ++++++- .../kotlin/asJava/LightClassDataProvider.kt | 12 +++++------- .../kotlin/codegen/CodegenTestUtil.java | 6 ++---- .../internal/KotlinBytecodeToolWindow.java | 19 +++++++------------ .../annotation/StubProducerExtension.kt | 5 +---- 8 files changed, 30 insertions(+), 49 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 6adaf825764..e4d350361ef 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DelegatingBindingTrace +import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import java.io.File public class GenerationState @JvmOverloads constructor( @@ -52,7 +53,6 @@ public class GenerationState @JvmOverloads constructor( disableInline: Boolean = false, disableOptimization: Boolean = false, public val useTypeTableInSerializer: Boolean = false, - public val diagnostics: DiagnosticSink = DiagnosticSink.DO_NOTHING, public val packagesWithObsoleteParts: Collection = emptySet(), public val obsoleteMultifileClasses: Collection = emptySet(), // for PackageCodegen in incremental compilation mode @@ -91,6 +91,13 @@ public class GenerationState @JvmOverloads constructor( incrementalCompilationComponents.getIncrementalCache(targetId) 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 classBuilderMode: ClassBuilderMode = builderFactory.getClassBuilderMode() 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 jvmRuntimeTypes: JvmRuntimeTypes = JvmRuntimeTypes() public val factory: ClassFileFactory - private val interceptedBuilderFactory: ClassBuilderFactory - private var used = false public val replSpecific = ForRepl() diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index bbb0c8cc2a2..3209c4fe85e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -398,7 +398,6 @@ public class KotlinToJVMBytecodeCompiler { obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).getFqNameForClassNameWithoutDollars()); } } - BindingTrace diagnosticHolder = new DelegatingBindingTrace(result.getBindingContext(), false, "For extra diagnostics in ${this.javaClass}"); GenerationState generationState = new GenerationState( environment.getProject(), ClassBuilderFactories.BINARIES, @@ -411,7 +410,6 @@ public class KotlinToJVMBytecodeCompiler { configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false), configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false), /* useTypeTableInSerializer = */ false, - diagnosticHolder, packagesWithObsoleteParts, obsoleteMultifileClasses, targetId, @@ -434,7 +432,7 @@ public class KotlinToJVMBytecodeCompiler { AnalyzerWithCompilerReport.reportDiagnostics( new FilteredJvmDiagnostics( - diagnosticHolder.getBindingContext().getDiagnostics(), + generationState.getCollectedExtraJvmDiagnostics(), result.getBindingContext().getDiagnostics() ), environment.getConfiguration().get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java index 9dc7486d572..44c3f7d3d71 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java @@ -32,21 +32,6 @@ public interface DiagnosticSink { } }; - class CollectAll implements DiagnosticSink { - - List diagnostics = new ArrayList(); - - @Override - public void report(@NotNull Diagnostic diagnostic) { - diagnostics.add(diagnostic); - } - - @NotNull - public List getDiagnostics() { - return Collections.unmodifiableList(diagnostics); - } - }; - DiagnosticSink THROW_EXCEPTION = new DiagnosticSink() { @Override public void report(@NotNull Diagnostic diagnostic) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzingUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzingUtils.java index e67f8c931e2..45740a0c402 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzingUtils.java @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils; import org.jetbrains.kotlin.psi.KtElement; import org.jetbrains.kotlin.psi.KtTreeVisitorVoid; import org.jetbrains.kotlin.psi.debugText.DebugTextUtilKt; +import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics; import java.util.ArrayList; import java.util.List; @@ -59,7 +60,11 @@ public class AnalyzingUtils { } 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); } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt index f8a962dc6a5..4d7f2e09bb9 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt @@ -50,7 +50,6 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.descriptorToDeclaration import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.jvm.JvmClassName @@ -80,7 +79,8 @@ abstract class LightClassDataProvider( val javaFileStub = createJavaFileStub(packageFqName, files) val bindingContext: BindingContext - val forExtraDiagnostics = DelegatingBindingTrace(context.bindingContext, false, "For extra diagnostics in ${this.javaClass}") + + val state: GenerationState try { val stubStack = Stack>() @@ -88,7 +88,7 @@ abstract class LightClassDataProvider( @Suppress("UNCHECKED_CAST") stubStack.push(javaFileStub as StubElement) - val state = GenerationState( + state = GenerationState( project, KotlinLightClassBuilderFactory(stubStack), context.module, @@ -99,8 +99,7 @@ abstract class LightClassDataProvider( generateDeclaredClassFilter = generateClassFilter, disableInline = false, disableOptimization = false, - useTypeTableInSerializer = false, - diagnostics = forExtraDiagnostics) + useTypeTableInSerializer = false) state.beforeCompile() bindingContext = state.bindingContext @@ -122,9 +121,8 @@ abstract class LightClassDataProvider( throw e } - val extraDiagnostics = forExtraDiagnostics.bindingContext.diagnostics 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 ) } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java index 2450c3a165c..408c663fb4d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java @@ -57,7 +57,6 @@ public class CodegenTestUtil { analysisResult.throwIfError(); AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext()); CompilerConfiguration configuration = environment.getConfiguration(); - BindingTrace forExtraDiagnostics = new DelegatingBindingTrace(analysisResult.getBindingContext(), false, "For extra diagnostics in ${this.javaClass}"); GenerationState state = new GenerationState( environment.getProject(), ClassBuilderFactories.TEST, analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), files.getPsiFiles(), @@ -66,13 +65,12 @@ public class CodegenTestUtil { GenerationState.GenerateClassFilter.GENERATE_ALL, configuration.get(JVMConfigurationKeys.DISABLE_INLINE, false), configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false), - /* useTypeTableInSerializer = */ false, - forExtraDiagnostics + /* useTypeTableInSerializer = */ false ); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); // For JVM-specific errors - AnalyzingUtils.throwExceptionOnErrors(forExtraDiagnostics.getBindingContext()); + AnalyzingUtils.throwExceptionOnErrors(state.getCollectedExtraJvmDiagnostics()); return state.getFactory(); } diff --git a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java index 9b4df48118d..1e7c25868e9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java +++ b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.codegen.CompilationErrorHandler; import org.jetbrains.kotlin.codegen.KotlinCodegenFacade; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.diagnostics.Diagnostic; -import org.jetbrains.kotlin.diagnostics.DiagnosticSink; import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; import org.jetbrains.kotlin.idea.resolve.ResolutionFacade; @@ -57,10 +56,8 @@ import javax.swing.*; import java.awt.*; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collections; +import java.util.*; import java.util.List; -import java.util.Scanner; public class KotlinBytecodeToolWindow extends JPanel implements Disposable { private static final int UPDATE_DELAY = 1000; @@ -195,7 +192,6 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { boolean enableOptimization ) { GenerationState state; - DiagnosticSink.CollectAll sink = new DiagnosticSink.CollectAll(); try { ResolutionFacade resolutionFacade = ResolutionUtils.getResolutionFacade(jetFile); @@ -211,22 +207,22 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { GenerationState.GenerateClassFilter generateClassFilter = new GenerationState.GenerateClassFilter() { @Override - public boolean shouldGeneratePackagePart(KtFile file) { + public boolean shouldGeneratePackagePart(@NotNull KtFile file) { return file == jetFile; } @Override - public boolean shouldAnnotateClass(KtClassOrObject classOrObject) { + public boolean shouldAnnotateClass(@NotNull KtClassOrObject classOrObject) { return true; } @Override - public boolean shouldGenerateClass(KtClassOrObject classOrObject) { + public boolean shouldGenerateClass(@NotNull KtClassOrObject classOrObject) { return classOrObject.getContainingKtFile() == jetFile; } @Override - public boolean shouldGenerateScript(KtScript script) { + public boolean shouldGenerateScript(@NotNull KtScript script) { return script.getContainingKtFile() == jetFile; } }; @@ -239,8 +235,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { generateClassFilter, !enableInline, !enableOptimization, - /*useTypeTableInSerializer=*/false, - sink); + /*useTypeTableInSerializer=*/false); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); } catch (ProcessCanceledException e) { @@ -252,7 +247,7 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { StringBuilder answer = new StringBuilder(); - List diagnostics = sink.getDiagnostics(); + Collection diagnostics = state.getCollectedExtraJvmDiagnostics().all(); if (!diagnostics.isEmpty()) { answer.append("// Backend Errors: \n"); answer.append("// ================\n"); diff --git a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt index 9af5fae4f46..ddfb65010f4 100644 --- a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt +++ b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt @@ -38,8 +38,6 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted bindingContext: BindingContext, files: Collection ): AnalysisResult? { - val forExtraDiagnostics = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}") - val generationState = GenerationState( project, StubClassBuilderFactory(), @@ -47,8 +45,7 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted bindingContext, files.toArrayList(), disableCallAssertions = false, - disableParamAssertions = false, - diagnostics = forExtraDiagnostics) + disableParamAssertions = false) KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)