From 652eeca872f8dda98d9c57e7f1464672c2750443 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 23 Nov 2015 21:53:47 +0300 Subject: [PATCH] Allow suppress additional diagnostics for JVM target Suppression doesn't work without resolved annotation in binding context. --- .../compiler/KotlinToJVMBytecodeCompiler.java | 7 ++----- .../resolve/DelegatingBindingTrace.java | 8 ++++++- .../MutableDiagnosticsWithSuppression.kt | 2 +- .../kotlin/asJava/LightClassDataProvider.kt | 21 +++++++++++-------- .../kotlin/codegen/CodegenTestUtil.java | 5 ++--- .../idea/debugger/KotlinPositionManager.kt | 3 ++- .../annotation/StubProducerExtension.kt | 4 ++-- 7 files changed, 28 insertions(+), 22 deletions(-) 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 d1c0eca8c53..bbb0c8cc2a2 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 @@ -58,10 +58,7 @@ import org.jetbrains.kotlin.parsing.KotlinScriptDefinition; import org.jetbrains.kotlin.parsing.KotlinScriptDefinitionProvider; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.resolve.AnalyzerScriptParameter; -import org.jetbrains.kotlin.resolve.BindingTrace; -import org.jetbrains.kotlin.resolve.BindingTraceContext; -import org.jetbrains.kotlin.resolve.ScriptNameUtil; +import org.jetbrains.kotlin.resolve.*; import org.jetbrains.kotlin.resolve.jvm.JvmClassName; import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; import org.jetbrains.kotlin.util.PerformanceCounter; @@ -401,7 +398,7 @@ public class KotlinToJVMBytecodeCompiler { obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).getFqNameForClassNameWithoutDollars()); } } - BindingTraceContext diagnosticHolder = new BindingTraceContext(); + BindingTrace diagnosticHolder = new DelegatingBindingTrace(result.getBindingContext(), false, "For extra diagnostics in ${this.javaClass}"); GenerationState generationState = new GenerationState( environment.getProject(), ClassBuilderFactories.BINARIES, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.java index 2287dccae27..6d6fe4f5081 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.java @@ -85,9 +85,15 @@ public class DelegatingBindingTrace implements BindingTrace { }; public DelegatingBindingTrace(BindingContext parentContext, String debugName) { + this(parentContext, true, debugName); + } + + public DelegatingBindingTrace(BindingContext parentContext, boolean withParentDiagnostics, String debugName) { this.parentContext = parentContext; this.name = debugName; - this.mutableDiagnostics = new MutableDiagnosticsWithSuppression(bindingContext, parentContext.getDiagnostics()); + this.mutableDiagnostics = withParentDiagnostics ? + new MutableDiagnosticsWithSuppression(bindingContext, parentContext.getDiagnostics()) : + new MutableDiagnosticsWithSuppression(bindingContext); } public DelegatingBindingTrace(BindingContext parentContext, String debugName, @Nullable Object resolutionSubjectForMessage) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt index cac67e1f8aa..195659bb3e1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt @@ -25,7 +25,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.resolve.BindingContext -public class MutableDiagnosticsWithSuppression( +public class MutableDiagnosticsWithSuppression @JvmOverloads constructor( private val bindingContext: BindingContext, private val delegateDiagnostics: Diagnostics = Diagnostics.EMPTY ) : Diagnostics { 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 d010709d8b1..f8a962dc6a5 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt @@ -39,7 +39,6 @@ import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.Stack import org.jetbrains.kotlin.codegen.CompilationErrorHandler -import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.ClassDescriptor @@ -51,7 +50,7 @@ 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.BindingTraceContext +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 @@ -81,9 +80,12 @@ abstract class LightClassDataProvider( val javaFileStub = createJavaFileStub(packageFqName, files) val bindingContext: BindingContext - val forExtraDiagnostics = BindingTraceContext() + val forExtraDiagnostics = DelegatingBindingTrace(context.bindingContext, false, "For extra diagnostics in ${this.javaClass}") + try { val stubStack = Stack>() + + @Suppress("UNCHECKED_CAST") stubStack.push(javaFileStub as StubElement) val state = GenerationState( @@ -92,12 +94,13 @@ abstract class LightClassDataProvider( context.module, context.bindingContext, Lists.newArrayList(files), - /*disable not-null assertions*/false, false, - /*generateClassFilter=*/generateClassFilter, - /*disableInline=*/false, - /*disableOptimization=*/false, - /*useTypeTableInSerializer=*/false, - forExtraDiagnostics) + disableCallAssertions = false, + disableParamAssertions = false, + generateDeclaredClassFilter = generateClassFilter, + disableInline = false, + disableOptimization = false, + useTypeTableInSerializer = false, + diagnostics = forExtraDiagnostics) state.beforeCompile() bindingContext = state.bindingContext diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java index 85c5de88186..2450c3a165c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestUtil.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.codegen; import com.google.common.base.Function; import com.google.common.collect.Lists; +import org.jetbrains.kotlin.resolve.*; import org.jetbrains.kotlin.utils.StringsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,8 +29,6 @@ import org.jetbrains.kotlin.cli.jvm.config.JVMConfigurationKeys; import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.jetbrains.kotlin.resolve.AnalyzingUtils; -import org.jetbrains.kotlin.resolve.BindingTraceContext; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; @@ -58,7 +57,7 @@ public class CodegenTestUtil { analysisResult.throwIfError(); AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext()); CompilerConfiguration configuration = environment.getConfiguration(); - BindingTraceContext forExtraDiagnostics = new BindingTraceContext(); + 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(), diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index d57c851bd75..046e6c540eb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -452,7 +452,8 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M val element = getElementToCreateTypeMapperForLibraryFile(notPositionedElement) val analysisResult = element!!.analyzeAndGetResult() - val state = GenerationState(file.project, ClassBuilderFactories.THROW_EXCEPTION, analysisResult.moduleDescriptor, analysisResult.bindingContext, listOf(file)) + val state = GenerationState(file.project, ClassBuilderFactories.THROW_EXCEPTION, + analysisResult.moduleDescriptor, analysisResult.bindingContext, listOf(file)) state.beforeCompile() return state.typeMapper } 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 1718d9cb21c..9af5fae4f46 100644 --- a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt +++ b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.BindingTraceContext +import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import org.jetbrains.org.objectweb.asm.ClassWriter @@ -38,7 +38,7 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted bindingContext: BindingContext, files: Collection ): AnalysisResult? { - val forExtraDiagnostics = BindingTraceContext() + val forExtraDiagnostics = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}") val generationState = GenerationState( project,