Skip to content
This repository was archived by the owner on Jun 10, 2020. It is now read-only.

Follow-up to the fields added in #173, and add Problem#rendered #175

Merged
merged 4 commits into from
Aug 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ val mimaSettings = Def settings (
mimaPreviousArtifacts := Set(
"1.0.0", "1.0.1", "1.0.2", "1.0.3",
"1.1.0", "1.1.1", "1.1.2", "1.1.3",
"1.2.0",
"1.2.0", "1.2.1"
) map (version =>
organization.value %% moduleName.value % version
cross (if (crossPaths.value) CrossVersion.binary else CrossVersion.disabled)
Expand All @@ -54,7 +54,7 @@ lazy val utilRoot: Project = (project in file("."))
.settings(
inThisBuild(
Seq(
git.baseVersion := "1.2.1",
git.baseVersion := "1.2.2",
version := {
val v = version.value
if (v contains "SNAPSHOT") git.baseVersion.value + "-SNAPSHOT"
Expand Down Expand Up @@ -124,8 +124,9 @@ lazy val utilLogging = (project in internalPath / "util-logging")
exclude[DirectMissingMethodProblem]("sbt.internal.util.SuccessEvent.copy*"),
exclude[DirectMissingMethodProblem]("sbt.internal.util.TraceEvent.copy*"),
exclude[DirectMissingMethodProblem]("sbt.internal.util.StringEvent.copy*"),
// Private final class constructor changed
// Private final class constructors changed
exclude[DirectMissingMethodProblem]("sbt.util.InterfaceUtil#ConcretePosition.this"),
exclude[DirectMissingMethodProblem]("sbt.util.InterfaceUtil#ConcreteProblem.this"),
),
)
.configure(addSbtIO)
Expand Down
12 changes: 11 additions & 1 deletion internal/util-interface/src/main/java/xsbti/Problem.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,20 @@
*/
package xsbti;

import java.util.Optional;

public interface Problem
{
String category();
Severity severity();
String message();
Position position();
}

// Default value to avoid breaking binary compatibility
/**
* If present, the string shown to the user when displaying this Problem.
* Otherwise, the Problem will be shown in an implementation-defined way
* based on the values of its other fields.
*/
default Optional<String> rendered() { return Optional.empty(); }
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also add the excellent commit message as documentation here? It explains pretty good why this field is necessary and how it differs from message.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which part of the commit message exactly? I've tried to keep the comment generic enough since the implementation may change.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This new addition makes sense, good job.

Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@ type Position {
pointerSpace: String
sourcePath: String
sourceFile: java.io.File
startOffset: Int
endOffset: Int
startLine: Int
startColumn: Int
endLine: Int
endColumn: Int
}

type Problem {
category: String!
severity: Severity!
message: String!
position: Position!
rendered: String
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ trait PositionFormats { self: sjsonnew.BasicJsonProtocol =>
val pointerSpace0 = unbuilder.readField[Optional[String]]("pointerSpace")
val sourcePath0 = unbuilder.readField[Optional[String]]("sourcePath")
val sourceFile0 = unbuilder.readField[Optional[java.io.File]]("sourceFile")
val startOffset0 = unbuilder.readField[Optional[java.lang.Integer]]("startOffset")
val endOffset0 = unbuilder.readField[Optional[java.lang.Integer]]("endOffset")
val startLine0 = unbuilder.readField[Optional[java.lang.Integer]]("startLine")
val startColumn0 = unbuilder.readField[Optional[java.lang.Integer]]("startColumn")
val endLine0 = unbuilder.readField[Optional[java.lang.Integer]]("endLine")
val endColumn0 = unbuilder.readField[Optional[java.lang.Integer]]("endColumn")

unbuilder.endObject()
new Position() {
override val line = line0
Expand All @@ -28,6 +35,13 @@ trait PositionFormats { self: sjsonnew.BasicJsonProtocol =>
override val pointerSpace = pointerSpace0
override val sourcePath = sourcePath0
override val sourceFile = sourceFile0
override val startOffset = startOffset0
override val endOffset = endOffset0
override val startLine = startLine0
override val startColumn = startColumn0
override val endLine = endLine0
override val endColumn = endColumn0

}
case None =>
deserializationError("Expected JsObject but found None")
Expand All @@ -42,6 +56,13 @@ trait PositionFormats { self: sjsonnew.BasicJsonProtocol =>
builder.addField("pointerSpace", obj.pointerSpace)
builder.addField("sourcePath", obj.sourcePath)
builder.addField("sourceFile", obj.sourceFile)
builder.addField("startOffset", obj.startOffset)
builder.addField("endOffset", obj.endOffset)
builder.addField("startLine", obj.startLine)
builder.addField("startColumn", obj.startColumn)
builder.addField("endLine", obj.endLine)
builder.addField("endColumn", obj.endColumn)

builder.endObject()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,29 @@
package sbt.internal.util.codec

import xsbti.{ Problem, Severity, Position }
import sbt.util.InterfaceUtil.problem
import _root_.sjsonnew.{ deserializationError, Builder, JsonFormat, Unbuilder }
import java.util.Optional

trait ProblemFormats { self: SeverityFormats with PositionFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val ProblemFormat: JsonFormat[Problem] = new JsonFormat[Problem] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): Problem = {
jsOpt match {
case Some(js) =>
unbuilder.beginObject(js)
val category = unbuilder.readField[String]("category")
val severity = unbuilder.readField[Severity]("severity")
val message = unbuilder.readField[String]("message")
val position = unbuilder.readField[Position]("position")
val category0 = unbuilder.readField[String]("category")
val severity0 = unbuilder.readField[Severity]("severity")
val message0 = unbuilder.readField[String]("message")
val position0 = unbuilder.readField[Position]("position")
val rendered0 = unbuilder.readField[Optional[String]]("rendered")

unbuilder.endObject()
problem(category, position, message, severity)
new Problem {
override val category = category0
override val position = position0
override val message = message0
override val severity = severity0
override val rendered = rendered0
}
case None =>
deserializationError("Expected JsObject but found None")
}
Expand All @@ -29,6 +37,7 @@ trait ProblemFormats { self: SeverityFormats with PositionFormats with sjsonnew.
builder.addField("severity", obj.severity)
builder.addField("message", obj.message)
builder.addField("position", obj.position)
builder.addField("rendered", obj.rendered)
builder.endObject()
}
}
Expand Down
30 changes: 26 additions & 4 deletions internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ object InterfaceUtil {
case None => Optional.empty[A]()
}

// Overload to preserve binary compatibility
@deprecated("Use the overload of this method with more arguments", "1.2.2")
def position(
line0: Option[Integer],
content: String,
Expand All @@ -46,7 +46,19 @@ object InterfaceUtil {
sourcePath0: Option[String],
sourceFile0: Option[File]
): Position =
position(line0, content, offset0, pointer0, pointerSpace0, sourcePath0, sourceFile0, None, None, None, None, None, None)
position(line0,
content,
offset0,
pointer0,
pointerSpace0,
sourcePath0,
sourceFile0,
None,
None,
None,
None,
None,
None)

def position(
line0: Option[Integer],
Expand Down Expand Up @@ -77,8 +89,16 @@ object InterfaceUtil {
endLine0,
endColumn0)

@deprecated("Use the overload of this method with more arguments", "1.2.2")
def problem(cat: String, pos: Position, msg: String, sev: Severity): Problem =
new ConcreteProblem(cat, pos, msg, sev)
problem(cat, pos, msg, sev, None)

def problem(cat: String,
pos: Position,
msg: String,
sev: Severity,
rendered: Option[String]): Problem =
new ConcreteProblem(cat, pos, msg, sev, rendered)

private final class ConcreteT2[A1, A2](a1: A1, a2: A2) extends T2[A1, A2] {
val get1: A1 = a1
Expand Down Expand Up @@ -132,12 +152,14 @@ object InterfaceUtil {
cat: String,
pos: Position,
msg: String,
sev: Severity
sev: Severity,
rendered0: Option[String]
) extends Problem {
val category = cat
val position = pos
val message = msg
val severity = sev
override val rendered = o2jo(rendered0)
override def toString = s"[$severity] $pos: $message"
}
}
2 changes: 2 additions & 0 deletions internal/util-logging/src/main/scala/sbt/util/Logger.scala
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ object Logger {
def jo2o[A](o: Optional[A]): Option[A] = InterfaceUtil.jo2o(o)
def o2jo[A](o: Option[A]): Optional[A] = InterfaceUtil.o2jo(o)

@deprecated("Use InterfaceUtil.position", "1.2.2")
def position(
line0: Option[Integer],
content: String,
Expand All @@ -116,6 +117,7 @@ object Logger {
sourceFile0
)

@deprecated("Use InterfaceUtil.problem", "1.2.2")
def problem(cat: String, pos: Position, msg: String, sev: Severity): Problem =
InterfaceUtil.problem(cat, pos, msg, sev)
}