Move creating sink for extra diagnostics into generation state to take responsibility for correct diagnostics suppression

This commit is contained in:
Nikolay Krasko
2015-11-25 13:50:16 +03:00
parent 652eeca872
commit 29a9ba64ca
8 changed files with 30 additions and 49 deletions
@@ -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()
@@ -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");
@@ -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)