Move creating sink for extra diagnostics into generation state to take responsibility for correct diagnostics suppression
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
+1
-3
@@ -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");
|
||||
|
||||
+1
-4
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user