From 33fa0651628020d3f86e9e4f2c70504d6e7116db Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 13 Feb 2013 15:02:05 +0400 Subject: [PATCH] Splitting PrintingMessageCollector into Grouping and Printing collectors --- .../messages/CompilerMessageLocation.java | 22 +++++ .../messages/CompilerMessageSeverity.java | 1 + .../messages/GroupingMessageCollector.java | 93 +++++++++++++++++++ .../messages/PrintingMessageCollector.java | 33 ++----- .../jetbrains/jet/cli/common/CLICompiler.java | 16 ++-- .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 2 +- .../compiler/KotlinToJVMBytecodeCompiler.java | 4 +- 7 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/GroupingMessageCollector.java diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageLocation.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageLocation.java index e152ff7777f..5fdbde325fa 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageLocation.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageLocation.java @@ -51,4 +51,26 @@ public class CompilerMessageLocation { public int getColumn() { return column; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CompilerMessageLocation location = (CompilerMessageLocation) o; + + if (column != location.column) return false; + if (line != location.line) return false; + if (path != null ? !path.equals(location.path) : location.path != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = path != null ? path.hashCode() : 0; + result = 31 * result + line; + result = 31 * result + column; + return result; + } } diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageSeverity.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageSeverity.java index 15cb11741d6..acd8e1df6b7 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageSeverity.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/CompilerMessageSeverity.java @@ -27,4 +27,5 @@ public enum CompilerMessageSeverity { OUTPUT; public static final EnumSet ERRORS = EnumSet.of(ERROR, EXCEPTION); + public static final EnumSet VERBOSE = EnumSet.of(OUTPUT, LOGGING); } diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/GroupingMessageCollector.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/GroupingMessageCollector.java new file mode 100644 index 00000000000..458823f69d0 --- /dev/null +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/GroupingMessageCollector.java @@ -0,0 +1,93 @@ +/* + * Copyright 2010-2013 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.jet.cli.common.messages; + +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public class GroupingMessageCollector implements MessageCollector { + + private final MessageCollector delegate; + + // File path (nullable) -> message + private final Multimap groupedMessages = LinkedHashMultimap.create(); + + public GroupingMessageCollector(@NotNull MessageCollector delegate) { + this.delegate = delegate; + } + + @Override + public void report( + @NotNull CompilerMessageSeverity severity, + @NotNull String message, + @NotNull CompilerMessageLocation location + ) { + if (CompilerMessageSeverity.VERBOSE.contains(severity)) { + delegate.report(severity, message, location); + } + else { + groupedMessages.put(location.getPath(), new Message(severity, message, location)); + } + } + + public void flush() { + for (String path : groupedMessages.keySet()) { + Collection messages = groupedMessages.get(path); + for (Message message : messages) { + delegate.report(message.severity, message.message, message.location); + } + } + groupedMessages.clear(); + } + + private static class Message { + private final CompilerMessageSeverity severity; + private final String message; + private final CompilerMessageLocation location; + + private Message(@NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location) { + this.severity = severity; + this.message = message; + this.location = location; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Message message1 = (Message) o; + + if (!location.equals(message1.location)) return false; + if (!message.equals(message1.message)) return false; + if (severity != message1.severity) return false; + + return true; + } + + @Override + public int hashCode() { + int result = severity.hashCode(); + result = 31 * result + message.hashCode(); + result = 31 * result + location.hashCode(); + return result; + } + } +} diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/PrintingMessageCollector.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/PrintingMessageCollector.java index ef16c579114..5eee76d7a14 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/PrintingMessageCollector.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/PrintingMessageCollector.java @@ -16,12 +16,12 @@ package org.jetbrains.jet.cli.common.messages; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; import org.jetbrains.annotations.NotNull; import java.io.PrintStream; -import java.util.Collection; + +import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.LOGGING; +import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.OUTPUT; public class PrintingMessageCollector implements MessageCollector { @@ -29,9 +29,6 @@ public class PrintingMessageCollector implements MessageCollector { private final PrintStream errStream; private final MessageRenderer messageRenderer; - // File path (nullable) -> error message - private final Multimap groupedMessages = LinkedHashMultimap.create(); - public PrintingMessageCollector( @NotNull PrintStream errStream, @NotNull MessageRenderer messageRenderer, @@ -48,27 +45,9 @@ public class PrintingMessageCollector implements MessageCollector { @NotNull String message, @NotNull CompilerMessageLocation location ) { + boolean verboseMessage = severity == LOGGING || severity == OUTPUT; + if (!verbose && verboseMessage) return; - String text = messageRenderer.render(severity, message, location); - if (severity == CompilerMessageSeverity.LOGGING || severity == CompilerMessageSeverity.OUTPUT) { - if (!verbose) { - return; - } - errStream.println(text); - } - else { - groupedMessages.put(location.getPath(), text); - } - } - - public void printToErrStream() { - if (!groupedMessages.isEmpty()) { - for (String path : groupedMessages.keySet()) { - Collection messageTexts = groupedMessages.get(path); - for (String text : messageTexts) { - errStream.println(text); - } - } - } + errStream.println(messageRenderer.render(severity, message, location)); } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java index c2f17dcafc9..eb0ae9e6be2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/CLICompiler.java @@ -102,28 +102,29 @@ public abstract class CLICompiler { usage(errStream); return OK; } + MessageRenderer messageRenderer = getMessageRenderer(arguments); errStream.print(messageRenderer.renderPreamble()); printVersionIfNeeded(errStream, arguments, messageRenderer); - PrintingMessageCollector messageCollector = new PrintingMessageCollector(errStream, messageRenderer, arguments.isVerbose()); + PrintingMessageCollector printingCollector = new PrintingMessageCollector(errStream, messageRenderer, arguments.isVerbose()); try { - return exec(messageCollector, arguments); + return exec(printingCollector, arguments); } finally { - messageCollector.printToErrStream(); errStream.print(messageRenderer.renderConclusion()); } } @NotNull public ExitCode exec(@NotNull MessageCollector messageCollector, @NotNull A arguments) { + GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector); try { Disposable rootDisposable = CompileEnvironmentUtil.createMockDisposable(); try { - MessageSeverityCollector severityCollector = new MessageSeverityCollector(messageCollector); + MessageSeverityCollector severityCollector = new MessageSeverityCollector(groupingCollector); ExitCode code = doExecute(arguments, severityCollector, rootDisposable); return severityCollector.anyReported(CompilerMessageSeverity.ERROR) ? COMPILATION_ERROR : code; } @@ -132,10 +133,13 @@ public abstract class CLICompiler { } } catch (Throwable t) { - messageCollector.report(CompilerMessageSeverity.EXCEPTION, MessageRenderer.PLAIN.renderException(t), - CompilerMessageLocation.NO_LOCATION); + groupingCollector.report(CompilerMessageSeverity.EXCEPTION, MessageRenderer.PLAIN.renderException(t), + CompilerMessageLocation.NO_LOCATION); return INTERNAL_ERROR; } + finally { + groupingCollector.flush(); + } } //TODO: can't declare parameters as not null due to KT-1863 diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index d189c99b03d..f7681726e89 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -220,7 +220,7 @@ public class K2JVMCompiler extends CLICompiler { public void report( @NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location ) { - if (!(severity == CompilerMessageSeverity.LOGGING || severity == CompilerMessageSeverity.OUTPUT)) { + if (!CompilerMessageSeverity.VERBOSE.contains(severity)) { messageCollector.report(severity, message, location); } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 80bbc884239..e896ccbe423 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -374,7 +374,7 @@ public class KotlinToJVMBytecodeCompiler { @Nullable List scriptParameters, @Nullable List scriptDefinitions) { final MessageRenderer messageRenderer = MessageRenderer.PLAIN; - PrintingMessageCollector messageCollector = new PrintingMessageCollector(System.err, messageRenderer, false); + GroupingMessageCollector messageCollector = new GroupingMessageCollector(new PrintingMessageCollector(System.err, messageRenderer, false)); Disposable rootDisposable = CompileEnvironmentUtil.createMockDisposable(); try { CompilerConfiguration compilerConfiguration = new CompilerConfiguration(); @@ -407,7 +407,7 @@ public class KotlinToJVMBytecodeCompiler { } finally { - messageCollector.printToErrStream(); + messageCollector.flush(); Disposer.dispose(rootDisposable); } }