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.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<FqName> = emptySet(),
public val obsoleteMultifileClasses: Collection<FqName> = 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()
@@ -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)
@@ -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() {
@Override
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.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);
}
}
@@ -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<T : WithFileStubAndExtraDiagnostics>(
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<StubElement<PsiElement>>()
@@ -88,7 +88,7 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
@Suppress("UNCHECKED_CAST")
stubStack.push(javaFileStub as StubElement<PsiElement>)
val state = GenerationState(
state = GenerationState(
project,
KotlinLightClassBuilderFactory(stubStack),
context.module,
@@ -99,8 +99,7 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
generateDeclaredClassFilter = generateClassFilter,
disableInline = false,
disableOptimization = false,
useTypeTableInSerializer = false,
diagnostics = forExtraDiagnostics)
useTypeTableInSerializer = false)
state.beforeCompile()
bindingContext = state.bindingContext
@@ -122,9 +121,8 @@ abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
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
)
}
@@ -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();
}
@@ -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<Diagnostic> diagnostics = sink.getDiagnostics();
Collection<Diagnostic> diagnostics = state.getCollectedExtraJvmDiagnostics().all();
if (!diagnostics.isEmpty()) {
answer.append("// Backend Errors: \n");
answer.append("// ================\n");
@@ -38,8 +38,6 @@ public class StubProducerExtension(val stubsOutputDir: File) : AnalysisCompleted
bindingContext: BindingContext,
files: Collection<KtFile>
): 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)