diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorPlainTextToStream.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorPlainTextToStream.java deleted file mode 100644 index 62be00e93b0..00000000000 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorPlainTextToStream.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.cli.common.messages; - -import org.jetbrains.annotations.NotNull; - -import java.io.PrintStream; -import java.util.EnumSet; -import java.util.Set; - -public class MessageCollectorPlainTextToStream implements MessageCollector { - public static final EnumSet NON_VERBOSE = EnumSet.complementOf(CompilerMessageSeverity.VERBOSE); - - public static final MessageCollector PLAIN_TEXT_TO_SYSTEM_ERR = new MessageCollectorPlainTextToStream(System.err, NON_VERBOSE); - - private final PrintStream stream; - private final Set severitiesToPrint; - - public MessageCollectorPlainTextToStream(@NotNull PrintStream stream, @NotNull Set severities) { - this.stream = stream; - this.severitiesToPrint = severities; - } - - @Override - public void report(@NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location) { - if (severitiesToPrint.contains(severity)) { - stream.println(MessageRenderer.PLAIN_FULL_PATHS.render(severity, message, location)); - } - } -} diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/PrintingMessageCollector.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/PrintingMessageCollector.java index d3d127f427d..9b8a4e74e9e 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/PrintingMessageCollector.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/PrintingMessageCollector.java @@ -21,6 +21,9 @@ import org.jetbrains.annotations.NotNull; import java.io.PrintStream; public class PrintingMessageCollector implements MessageCollector { + public static final MessageCollector PLAIN_TEXT_TO_SYSTEM_ERR = + new PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false); + private final boolean verbose; private final PrintStream errStream; private final MessageRenderer messageRenderer; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java index d4fde68da24..50d1f343041 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport.java @@ -62,27 +62,13 @@ public final class AnalyzerWithCompilerReport { throw new IllegalStateException("Unknown severity: " + severity); } - @NotNull private static final DiagnosticFactory0 SYNTAX_ERROR_FACTORY = DiagnosticFactory0.create(Severity.ERROR); - private boolean hasErrors = false; - @NotNull - private final MessageCollector messageCollectorWrapper; - @Nullable + private final MessageSeverityCollector messageCollector; private AnalysisResult analysisResult = null; - public AnalyzerWithCompilerReport(@NotNull final MessageCollector collector) { - messageCollectorWrapper = new MessageCollector() { - @Override - public void report(@NotNull CompilerMessageSeverity severity, - @NotNull String message, - @NotNull CompilerMessageLocation location) { - if (CompilerMessageSeverity.ERRORS.contains(severity)) { - hasErrors = true; - } - collector.report(severity, message, location); - } - }; + public AnalyzerWithCompilerReport(@NotNull MessageCollector collector) { + messageCollector = new MessageSeverityCollector(collector); } private static boolean reportDiagnostic(@NotNull Diagnostic diagnostic, @NotNull MessageCollector messageCollector) { @@ -114,7 +100,7 @@ public final class AnalyzerWithCompilerReport { "Incomplete hierarchy should be reported with names of unresolved superclasses: " + fqName; message.append(" ").append(fqName).append(", unresolved: ").append(unresolved).append("\n"); } - messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, message.toString(), CompilerMessageLocation.NO_LOCATION); + messageCollector.report(CompilerMessageSeverity.ERROR, message.toString(), CompilerMessageLocation.NO_LOCATION); } } @@ -138,8 +124,7 @@ public final class AnalyzerWithCompilerReport { message.append(" ").append(error).append("\n"); } } - messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, - message.toString(), CompilerMessageLocation.NO_LOCATION); + messageCollector.report(CompilerMessageSeverity.ERROR, message.toString(), CompilerMessageLocation.NO_LOCATION); } } @@ -152,11 +137,12 @@ public final class AnalyzerWithCompilerReport { TraceBasedErrorReporter.AbiVersionErrorData data = bindingContext.get(TraceBasedErrorReporter.ABI_VERSION_ERRORS, kotlinClass); assert data != null; String path = toSystemDependentName(kotlinClass); - messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, - "Class '" + JvmClassName.byClassId(data.getClassId()) + - "' was compiled with an incompatible version of Kotlin. " + - "Its ABI version is " + data.getActualVersion() + ", expected ABI version is " + JvmAbi.VERSION, - CompilerMessageLocation.create(path, 0, 0)); + messageCollector.report( + CompilerMessageSeverity.ERROR, + "Class '" + JvmClassName.byClassId(data.getClassId()) + "' was compiled with an incompatible version of Kotlin. " + + "Its ABI version is " + data.getActualVersion() + ", expected ABI version is " + JvmAbi.VERSION, + CompilerMessageLocation.create(path, 0, 0) + ); } } @@ -170,7 +156,7 @@ public final class AnalyzerWithCompilerReport { private void reportSyntaxErrors(@NotNull Collection files) { for (JetFile file : files) { - reportSyntaxErrors(file, messageCollectorWrapper); + reportSyntaxErrors(file, messageCollector); } } @@ -225,7 +211,7 @@ public final class AnalyzerWithCompilerReport { } public boolean hasErrors() { - return hasErrors; + return messageCollector.anyReported(CompilerMessageSeverity.ERROR); } public void analyzeAndReport(@NotNull Collection files, @NotNull Function0 analyzer) { @@ -233,12 +219,11 @@ public final class AnalyzerWithCompilerReport { reportAbiVersionErrors(); reportSyntaxErrors(files); //noinspection ConstantConditions - reportDiagnostics(analysisResult.getBindingContext().getDiagnostics(), messageCollectorWrapper); + reportDiagnostics(analysisResult.getBindingContext().getDiagnostics(), messageCollector); reportIncompleteHierarchies(); reportAlternativeSignatureErrors(); } - private static class MyDiagnostic extends SimpleDiagnostic { private final String message; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java index 6bbe9d3e8b4..43d59e2122b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java @@ -33,8 +33,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport; -import org.jetbrains.kotlin.cli.common.messages.MessageCollector; -import org.jetbrains.kotlin.cli.common.messages.MessageCollectorToString; import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; @@ -238,10 +236,10 @@ public class ReplInterpreter { JetFile psiFile = (JetFile) psiFileFactory.trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false); assert psiFile != null : "Script file not analyzed at line " + lineNumber + ": " + fullText; - MessageCollectorToString errorCollector = new MessageCollectorToString(); + ReplMessageCollectorWrapper errorCollector = new ReplMessageCollectorWrapper(); AnalyzerWithCompilerReport.SyntaxErrorReport syntaxErrorReport = - AnalyzerWithCompilerReport.reportSyntaxErrors(psiFile, errorCollector); + AnalyzerWithCompilerReport.reportSyntaxErrors(psiFile, errorCollector.getMessageCollector()); if (syntaxErrorReport.isHasErrors() && syntaxErrorReport.isAllErrorsAtEof()) { previousIncompleteLines.add(line); @@ -339,7 +337,7 @@ public class ReplInterpreter { } @Nullable - private ScriptDescriptor doAnalyze(@NotNull JetFile psiFile, @NotNull MessageCollector messageCollector) { + private ScriptDescriptor doAnalyze(@NotNull JetFile psiFile, @NotNull ReplMessageCollectorWrapper messageCollector) { scriptDeclarationFactory.setDelegateFactory( new FileBasedDeclarationProviderFactory(resolveSession.getStorageManager(), Collections.singletonList(psiFile))); @@ -352,7 +350,9 @@ public class ReplInterpreter { trace.record(BindingContext.FILE_TO_PACKAGE_FRAGMENT, psiFile, resolveSession.getPackageFragment(FqName.ROOT)); } - boolean hasErrors = AnalyzerWithCompilerReport.reportDiagnostics(trace.getBindingContext().getDiagnostics(), messageCollector); + boolean hasErrors = AnalyzerWithCompilerReport.reportDiagnostics( + trace.getBindingContext().getDiagnostics(), messageCollector.getMessageCollector() + ); if (hasErrors) { return null; } diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorToString.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplMessageCollectorWrapper.java similarity index 64% rename from compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorToString.java rename to compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplMessageCollectorWrapper.java index 5f87ee7012e..444b85c3b4e 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/messages/MessageCollectorToString.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplMessageCollectorWrapper.java @@ -14,27 +14,30 @@ * limitations under the License. */ -package org.jetbrains.kotlin.cli.common.messages; +package org.jetbrains.kotlin.cli.jvm.repl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.cli.common.messages.MessageCollector; +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer; +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.nio.ByteBuffer; import java.nio.charset.Charset; -public class MessageCollectorToString implements MessageCollector { - private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - private final MessageCollector actualCollector = new MessageCollectorPlainTextToStream(new PrintStream(outputStream), - MessageCollectorPlainTextToStream.NON_VERBOSE); - - @Override - public void report(@NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location) { - actualCollector.report(severity, message, location); - } - +public class ReplMessageCollectorWrapper { private static final Charset UTF8 = Charset.forName("utf-8"); + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + private final MessageCollector actualCollector = + new PrintingMessageCollector(new PrintStream(outputStream), MessageRenderer.PLAIN_FULL_PATHS, false); + + @NotNull + public MessageCollector getMessageCollector() { + return actualCollector; + } + @NotNull public String getString() { return UTF8.decode(ByteBuffer.wrap(outputStream.toByteArray())).toString(); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/TestlibTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/TestlibTest.java index 1764843b442..89986eed5e0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/TestlibTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/TestlibTest.java @@ -23,7 +23,7 @@ import junit.framework.TestCase; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; -import org.jetbrains.kotlin.cli.common.messages.MessageCollectorPlainTextToStream; +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; @@ -91,8 +91,7 @@ public class TestlibTest extends UsefulTestCase { addKotlinSourceRoot(configuration, JetTestUtils.getHomeDirectory() + "/libraries/stdlib/test"); addKotlinSourceRoot(configuration, JetTestUtils.getHomeDirectory() + "/libraries/kunit/src"); - configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, - new MessageCollectorPlainTextToStream(System.out, MessageCollectorPlainTextToStream.NON_VERBOSE)); + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR); myEnvironment = KotlinCoreEnvironment.createForTests(getTestRootDisposable(), configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java index 032f9ee2481..124fc493292 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.cli.CliBaseTest; import org.jetbrains.kotlin.cli.common.ExitCode; import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport; -import org.jetbrains.kotlin.cli.common.messages.MessageCollectorPlainTextToStream; +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; @@ -182,7 +182,7 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { result.throwIfError(); BindingContext bindingContext = result.getBindingContext(); - AnalyzerWithCompilerReport.reportDiagnostics(bindingContext.getDiagnostics(), MessageCollectorPlainTextToStream.PLAIN_TEXT_TO_SYSTEM_ERR); + AnalyzerWithCompilerReport.reportDiagnostics(bindingContext.getDiagnostics(), PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR); assertEquals("There should be no diagnostics", 0, Iterables.size(bindingContext.getDiagnostics())); } diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java index 57657ad5cf9..b612c40a55e 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java @@ -77,7 +77,7 @@ public class ScriptTest { @NotNull List scriptDefinitions ) { KotlinPaths paths = PathUtil.getKotlinPathsForDistDirectory(); - MessageCollector messageCollector = MessageCollectorPlainTextToStream.PLAIN_TEXT_TO_SYSTEM_ERR; + MessageCollector messageCollector = PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR; Disposable rootDisposable = Disposer.newDisposable(); try { diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/NoErrorsInStdlibTest.kt b/idea/tests/org/jetbrains/kotlin/idea/highlighter/NoErrorsInStdlibTest.kt index ae59e0131f0..751d2a6ceef 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/NoErrorsInStdlibTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/NoErrorsInStdlibTest.kt @@ -16,20 +16,20 @@ package org.jetbrains.kotlin.idea.highlighter -import com.intellij.testFramework.LightProjectDescriptor -import org.jetbrains.kotlin.idea.test.JetJdkAndLibraryProjectDescriptor -import com.intellij.openapi.vfs.VfsUtil -import org.jetbrains.kotlin.psi.JetFile -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.cli.common.messages.MessageCollectorPlainTextToStream import com.intellij.openapi.projectRoots.Sdk -import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import kotlin.test.assertEquals -import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully +import com.intellij.openapi.vfs.VfsUtil +import com.intellij.testFramework.LightProjectDescriptor +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector import org.jetbrains.kotlin.diagnostics.Severity -import kotlin.test.assertTrue +import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully +import org.jetbrains.kotlin.idea.test.JetJdkAndLibraryProjectDescriptor import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.psi.JetFile import java.io.File +import kotlin.test.assertEquals +import kotlin.test.assertTrue public class NoErrorsInStdlibTest : JetLightCodeInsightFixtureTestCase() { public fun testNoErrors() { @@ -49,12 +49,12 @@ public class NoErrorsInStdlibTest : JetLightCodeInsightFixtureTestCase() { val errors = bindingContext.getDiagnostics().all().filter { it.getSeverity() == Severity.ERROR } if (errors.isNotEmpty()) { - System.err.println("${psiFile.getName()}: ${errors.size} errors") + System.err.println("${psiFile.getName()}: ${errors.size()} errors") AnalyzerWithCompilerReport.reportDiagnostics( - bindingContext.getDiagnostics(), MessageCollectorPlainTextToStream.PLAIN_TEXT_TO_SYSTEM_ERR + bindingContext.getDiagnostics(), PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR ) - totalErrors += errors.size + totalErrors += errors.size() } } }