Allow suppress additional diagnostics for JVM target

Suppression doesn't work without resolved annotation in binding context.
This commit is contained in:
Nikolay Krasko
2015-11-23 21:53:47 +03:00
parent 5bb141381b
commit 652eeca872
7 changed files with 28 additions and 22 deletions
@@ -58,10 +58,7 @@ import org.jetbrains.kotlin.parsing.KotlinScriptDefinition;
import org.jetbrains.kotlin.parsing.KotlinScriptDefinitionProvider; import org.jetbrains.kotlin.parsing.KotlinScriptDefinitionProvider;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.AnalyzerScriptParameter; import org.jetbrains.kotlin.resolve.*;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.BindingTraceContext;
import org.jetbrains.kotlin.resolve.ScriptNameUtil;
import org.jetbrains.kotlin.resolve.jvm.JvmClassName; import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM;
import org.jetbrains.kotlin.util.PerformanceCounter; import org.jetbrains.kotlin.util.PerformanceCounter;
@@ -401,7 +398,7 @@ public class KotlinToJVMBytecodeCompiler {
obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).getFqNameForClassNameWithoutDollars()); 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( GenerationState generationState = new GenerationState(
environment.getProject(), environment.getProject(),
ClassBuilderFactories.BINARIES, ClassBuilderFactories.BINARIES,
@@ -85,9 +85,15 @@ public class DelegatingBindingTrace implements BindingTrace {
}; };
public DelegatingBindingTrace(BindingContext parentContext, String debugName) { public DelegatingBindingTrace(BindingContext parentContext, String debugName) {
this(parentContext, true, debugName);
}
public DelegatingBindingTrace(BindingContext parentContext, boolean withParentDiagnostics, String debugName) {
this.parentContext = parentContext; this.parentContext = parentContext;
this.name = debugName; 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) { public DelegatingBindingTrace(BindingContext parentContext, String debugName, @Nullable Object resolutionSubjectForMessage) {
@@ -25,7 +25,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
public class MutableDiagnosticsWithSuppression( public class MutableDiagnosticsWithSuppression @JvmOverloads constructor(
private val bindingContext: BindingContext, private val bindingContext: BindingContext,
private val delegateDiagnostics: Diagnostics = Diagnostics.EMPTY private val delegateDiagnostics: Diagnostics = Diagnostics.EMPTY
) : Diagnostics { ) : Diagnostics {
@@ -39,7 +39,6 @@ import com.intellij.psi.util.PsiTreeUtil
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.Stack import com.intellij.util.containers.Stack
import org.jetbrains.kotlin.codegen.CompilationErrorHandler import org.jetbrains.kotlin.codegen.CompilationErrorHandler
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade
import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.binding.CodegenBinding
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.ClassDescriptor 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.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.BindingTraceContext 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
@@ -81,9 +80,12 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
val javaFileStub = createJavaFileStub(packageFqName, files) val javaFileStub = createJavaFileStub(packageFqName, files)
val bindingContext: BindingContext val bindingContext: BindingContext
val forExtraDiagnostics = BindingTraceContext() val forExtraDiagnostics = DelegatingBindingTrace(context.bindingContext, false, "For extra diagnostics in ${this.javaClass}")
try { try {
val stubStack = Stack<StubElement<PsiElement>>() val stubStack = Stack<StubElement<PsiElement>>()
@Suppress("UNCHECKED_CAST")
stubStack.push(javaFileStub as StubElement<PsiElement>) stubStack.push(javaFileStub as StubElement<PsiElement>)
val state = GenerationState( val state = GenerationState(
@@ -92,12 +94,13 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
context.module, context.module,
context.bindingContext, context.bindingContext,
Lists.newArrayList(files), Lists.newArrayList(files),
/*disable not-null assertions*/false, false, disableCallAssertions = false,
/*generateClassFilter=*/generateClassFilter, disableParamAssertions = false,
/*disableInline=*/false, generateDeclaredClassFilter = generateClassFilter,
/*disableOptimization=*/false, disableInline = false,
/*useTypeTableInSerializer=*/false, disableOptimization = false,
forExtraDiagnostics) useTypeTableInSerializer = false,
diagnostics = forExtraDiagnostics)
state.beforeCompile() state.beforeCompile()
bindingContext = state.bindingContext bindingContext = state.bindingContext
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.codegen;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.jetbrains.kotlin.resolve.*;
import org.jetbrains.kotlin.utils.StringsKt; import org.jetbrains.kotlin.utils.StringsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.forTestCompile.ForTestCompileRuntime;
import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.CompilerConfiguration; 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.resolve.lazy.JvmResolveUtil;
import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
@@ -58,7 +57,7 @@ public class CodegenTestUtil {
analysisResult.throwIfError(); analysisResult.throwIfError();
AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext()); AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext());
CompilerConfiguration configuration = environment.getConfiguration(); 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( GenerationState state = new GenerationState(
environment.getProject(), ClassBuilderFactories.TEST, environment.getProject(), ClassBuilderFactories.TEST,
analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), files.getPsiFiles(), analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), files.getPsiFiles(),
@@ -452,7 +452,8 @@ public class KotlinPositionManager(private val myDebugProcess: DebugProcess) : M
val element = getElementToCreateTypeMapperForLibraryFile(notPositionedElement) val element = getElementToCreateTypeMapperForLibraryFile(notPositionedElement)
val analysisResult = element!!.analyzeAndGetResult() 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() state.beforeCompile()
return state.typeMapper return state.typeMapper
} }
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext 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.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension
import org.jetbrains.org.objectweb.asm.ClassWriter import org.jetbrains.org.objectweb.asm.ClassWriter
@@ -38,7 +38,7 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted
bindingContext: BindingContext, bindingContext: BindingContext,
files: Collection<KtFile> files: Collection<KtFile>
): AnalysisResult? { ): AnalysisResult? {
val forExtraDiagnostics = BindingTraceContext() val forExtraDiagnostics = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}")
val generationState = GenerationState( val generationState = GenerationState(
project, project,