Extract interface from CompilerMessageLocation to ease extension
The CompilerMessageLocation is an implicit part of the binary daemon protocol so changing it breaks compatibility with older daemons. This change allows to extend location for non-daemon uses without breaking the binary protocol.
This commit is contained in:
+15
-8
@@ -18,23 +18,30 @@ package org.jetbrains.kotlin.cli.common.messages
|
||||
|
||||
import java.io.Serializable
|
||||
|
||||
interface CompilerMessageSourceLocation : Serializable {
|
||||
val path: String
|
||||
val line: Int
|
||||
val column: Int
|
||||
val lineContent: String?
|
||||
}
|
||||
|
||||
data class CompilerMessageLocation private constructor(
|
||||
val path: String,
|
||||
val line: Int,
|
||||
val column: Int,
|
||||
val lineContent: String?
|
||||
) : Serializable {
|
||||
override val path: String,
|
||||
override val line: Int,
|
||||
override val column: Int,
|
||||
override val lineContent: String?
|
||||
) : CompilerMessageSourceLocation {
|
||||
override fun toString(): String =
|
||||
path + (if (line != -1 || column != -1) " ($line:$column)" else "")
|
||||
path + (if (line != -1 || column != -1) " ($line:$column)" else "")
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun create(path: String?): CompilerMessageLocation? =
|
||||
create(path, -1, -1, null)
|
||||
create(path, -1, -1, null)
|
||||
|
||||
@JvmStatic
|
||||
fun create(path: String?, line: Int, column: Int, lineContent: String?): CompilerMessageLocation? =
|
||||
if (path == null) null else CompilerMessageLocation(path, line, column, lineContent)
|
||||
if (path == null) null else CompilerMessageLocation(path, line, column, lineContent)
|
||||
|
||||
private val serialVersionUID: Long = 8228357578L
|
||||
}
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ public class FilteringMessageCollector implements MessageCollector {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void report(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location) {
|
||||
public void report(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageSourceLocation location) {
|
||||
if (!decline.test(severity)) {
|
||||
messageCollector.report(severity, message, location);
|
||||
}
|
||||
|
||||
+8
-9
@@ -24,7 +24,6 @@ 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 {
|
||||
@@ -32,7 +31,7 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
private final boolean treatWarningsAsErrors;
|
||||
|
||||
// Note that the key in this map can be null
|
||||
private final Multimap<CompilerMessageLocation, Message> groupedMessages = LinkedHashMultimap.create();
|
||||
private final Multimap<CompilerMessageSourceLocation, Message> groupedMessages = LinkedHashMultimap.create();
|
||||
|
||||
public GroupingMessageCollector(@NotNull MessageCollector delegate, boolean treatWarningsAsErrors) {
|
||||
this.delegate = delegate;
|
||||
@@ -48,7 +47,7 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
public void report(
|
||||
@NotNull CompilerMessageSeverity severity,
|
||||
@NotNull String message,
|
||||
@Nullable CompilerMessageLocation location
|
||||
@Nullable CompilerMessageSourceLocation location
|
||||
) {
|
||||
if (CompilerMessageSeverity.VERBOSE.contains(severity)) {
|
||||
delegate.report(severity, message, location);
|
||||
@@ -78,9 +77,9 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
report(CompilerMessageSeverity.ERROR, "warnings found and -Werror specified", null);
|
||||
}
|
||||
|
||||
List<CompilerMessageLocation> sortedKeys =
|
||||
List<CompilerMessageSourceLocation> sortedKeys =
|
||||
CollectionsKt.sortedWith(groupedMessages.keySet(), Comparator.nullsFirst(CompilerMessageLocationComparator.INSTANCE));
|
||||
for (CompilerMessageLocation location : sortedKeys) {
|
||||
for (CompilerMessageSourceLocation location : sortedKeys) {
|
||||
for (Message message : groupedMessages.get(location)) {
|
||||
if (!hasExplicitErrors || message.severity.isError() || message.severity == CompilerMessageSeverity.STRONG_WARNING) {
|
||||
delegate.report(message.severity, message.message, message.location);
|
||||
@@ -91,7 +90,7 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
groupedMessages.clear();
|
||||
}
|
||||
|
||||
private static class CompilerMessageLocationComparator implements Comparator<CompilerMessageLocation> {
|
||||
private static class CompilerMessageLocationComparator implements Comparator<CompilerMessageSourceLocation> {
|
||||
public static final CompilerMessageLocationComparator INSTANCE = new CompilerMessageLocationComparator();
|
||||
|
||||
// First, output all messages without any location information. Then, only those with the file path.
|
||||
@@ -104,7 +103,7 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
// foo.kt:42: error: bad line
|
||||
// foo.kt:42:43: error: bad character
|
||||
@Override
|
||||
public int compare(CompilerMessageLocation o1, CompilerMessageLocation o2) {
|
||||
public int compare(CompilerMessageSourceLocation o1, CompilerMessageSourceLocation o2) {
|
||||
if (o1.getColumn() == -1 && o2.getColumn() != -1) return -1;
|
||||
if (o1.getColumn() != -1 && o2.getColumn() == -1) return 1;
|
||||
|
||||
@@ -118,9 +117,9 @@ public class GroupingMessageCollector implements MessageCollector {
|
||||
private static class Message {
|
||||
private final CompilerMessageSeverity severity;
|
||||
private final String message;
|
||||
private final CompilerMessageLocation location;
|
||||
private final CompilerMessageSourceLocation location;
|
||||
|
||||
private Message(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location) {
|
||||
private Message(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageSourceLocation location) {
|
||||
this.severity = severity;
|
||||
this.message = message;
|
||||
this.location = location;
|
||||
|
||||
+2
-2
@@ -19,13 +19,13 @@ package org.jetbrains.kotlin.cli.common.messages
|
||||
interface MessageCollector {
|
||||
fun clear()
|
||||
|
||||
fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation? = null)
|
||||
fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation? = null)
|
||||
|
||||
fun hasErrors(): Boolean
|
||||
|
||||
companion object {
|
||||
val NONE: MessageCollector = object : MessageCollector {
|
||||
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) {
|
||||
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.cli.common.messages
|
||||
|
||||
class GradleStyleMessageRenderer : MessageRenderer {
|
||||
|
||||
override fun render(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?): String {
|
||||
override fun render(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?): String {
|
||||
val prefix = when (severity) {
|
||||
CompilerMessageSeverity.WARNING, CompilerMessageSeverity.STRONG_WARNING -> "w"
|
||||
CompilerMessageSeverity.ERROR, CompilerMessageSeverity.EXCEPTION -> "e"
|
||||
|
||||
@@ -32,7 +32,7 @@ public interface MessageRenderer {
|
||||
MessageRenderer WITHOUT_PATHS = new PlainTextMessageRenderer() {
|
||||
@Nullable
|
||||
@Override
|
||||
protected String getPath(@NotNull CompilerMessageLocation location) {
|
||||
protected String getPath(@NotNull CompilerMessageSourceLocation location) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public interface MessageRenderer {
|
||||
MessageRenderer PLAIN_FULL_PATHS = new PlainTextMessageRenderer() {
|
||||
@NotNull
|
||||
@Override
|
||||
protected String getPath(@NotNull CompilerMessageLocation location) {
|
||||
protected String getPath(@NotNull CompilerMessageSourceLocation location) {
|
||||
return location.getPath();
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public interface MessageRenderer {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected String getPath(@NotNull CompilerMessageLocation location) {
|
||||
protected String getPath(@NotNull CompilerMessageSourceLocation location) {
|
||||
return FileUtilsKt.descendantRelativeTo(new File(location.getPath()), cwd).getPath();
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public interface MessageRenderer {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected String getPath(@NotNull CompilerMessageLocation location) {
|
||||
protected String getPath(@NotNull CompilerMessageSourceLocation location) {
|
||||
return FileUtil.toSystemIndependentName(
|
||||
FileUtilsKt.descendantRelativeTo(new File(location.getPath()), cwd).getPath()
|
||||
);
|
||||
@@ -91,7 +91,7 @@ public interface MessageRenderer {
|
||||
|
||||
String renderPreamble();
|
||||
|
||||
String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location);
|
||||
String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageSourceLocation location);
|
||||
|
||||
String renderUsage(@NotNull String usage);
|
||||
|
||||
|
||||
+2
-2
@@ -58,7 +58,7 @@ public abstract class PlainTextMessageRenderer implements MessageRenderer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location) {
|
||||
public String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageSourceLocation location) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
int line = location != null ? location.getLine() : -1;
|
||||
@@ -156,7 +156,7 @@ public abstract class PlainTextMessageRenderer implements MessageRenderer {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected abstract String getPath(@NotNull CompilerMessageLocation location);
|
||||
protected abstract String getPath(@NotNull CompilerMessageSourceLocation location);
|
||||
|
||||
@Override
|
||||
public String renderUsage(@NotNull String usage) {
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ public class PrintingMessageCollector implements MessageCollector {
|
||||
public void report(
|
||||
@NotNull CompilerMessageSeverity severity,
|
||||
@NotNull String message,
|
||||
@Nullable CompilerMessageLocation location
|
||||
@Nullable CompilerMessageSourceLocation location
|
||||
) {
|
||||
if (!verbose && CompilerMessageSeverity.VERBOSE.contains(severity)) return;
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class XmlMessageRenderer implements MessageRenderer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location) {
|
||||
public String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageSourceLocation location) {
|
||||
StringBuilder out = new StringBuilder();
|
||||
String tagName = severity.getPresentableName();
|
||||
out.append("<").append(tagName);
|
||||
|
||||
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.compiler.plugin.*
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import java.io.File
|
||||
import java.net.URLClassLoader
|
||||
import java.util.*
|
||||
|
||||
object PluginCliParser {
|
||||
@JvmStatic
|
||||
|
||||
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.config.K2MetadataConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
|
||||
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
|
||||
import org.jetbrains.kotlin.codegen.CompilationException
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
|
||||
Reference in New Issue
Block a user