Support -Werror CLI argument to treat warnings as errors

The option is named "warningsAsErrors" in the Gradle plugin

 #KT-10563 Fixed
This commit is contained in:
Alexander Udalov
2017-08-25 17:11:34 +03:00
committed by Ilya Gorbunov
parent 897261a8a6
commit 5cbcbe4a9c
26 changed files with 133 additions and 9 deletions
@@ -44,4 +44,8 @@ abstract class CommonToolArguments : Freezable(), Serializable {
@GradleOption(DefaultValues.BooleanFalseDefault::class)
@Argument(value = "-nowarn", description = "Generate no warnings")
var suppressWarnings: Boolean by FreezableVar(false)
@GradleOption(DefaultValues.BooleanFalseDefault::class)
@Argument(value = "-Werror", description = "Report an error if there are any warnings")
var warningsAsErrors: Boolean by FreezableVar(false)
}
@@ -35,11 +35,14 @@ public enum CompilerMessageSeverity {
*/
OUTPUT;
public static final EnumSet<CompilerMessageSeverity> ERRORS = EnumSet.of(ERROR, EXCEPTION);
public static final EnumSet<CompilerMessageSeverity> VERBOSE = EnumSet.of(LOGGING);
public boolean isError() {
return ERRORS.contains(this);
return this == EXCEPTION || this == ERROR;
}
public boolean isWarning() {
return this == STRONG_WARNING || this == WARNING;
}
@NotNull
@@ -24,16 +24,19 @@ import org.jetbrains.annotations.Nullable;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class GroupingMessageCollector implements MessageCollector {
private final MessageCollector delegate;
private final boolean treatWarningsAsErrors;
// Note that the key in this map can be null
private final Multimap<CompilerMessageLocation, Message> groupedMessages = LinkedHashMultimap.create();
public GroupingMessageCollector(@NotNull MessageCollector delegate) {
public GroupingMessageCollector(@NotNull MessageCollector delegate, boolean treatWarningsAsErrors) {
this.delegate = delegate;
this.treatWarningsAsErrors = treatWarningsAsErrors;
}
@Override
@@ -57,17 +60,29 @@ public class GroupingMessageCollector implements MessageCollector {
@Override
public boolean hasErrors() {
return hasExplicitErrors() || (treatWarningsAsErrors && hasWarnings());
}
private boolean hasExplicitErrors() {
return groupedMessages.entries().stream().anyMatch(entry -> entry.getValue().severity.isError());
}
private boolean hasWarnings() {
return groupedMessages.entries().stream().anyMatch(entry -> entry.getValue().severity.isWarning());
}
public void flush() {
boolean hasErrors = hasErrors();
boolean hasExplicitErrors = hasExplicitErrors();
if (treatWarningsAsErrors && !hasExplicitErrors && hasWarnings()) {
report(CompilerMessageSeverity.ERROR, "warnings found and -Werror specified", null);
}
List<CompilerMessageLocation> sortedKeys =
CollectionsKt.sortedWith(groupedMessages.keySet(), Comparator.nullsFirst(CompilerMessageLocationComparator.INSTANCE));
for (CompilerMessageLocation location : sortedKeys) {
for (Message message : groupedMessages.get(location)) {
if (!hasErrors || message.severity.isError() || message.severity == CompilerMessageSeverity.STRONG_WARNING) {
if (!hasExplicitErrors || message.severity.isError() || message.severity == CompilerMessageSeverity.STRONG_WARNING) {
delegate.report(message.severity, message.message, message.location);
}
}