Skip to content

Commit 62d15ad

Browse files
committed
sbt.internal.inc.Problem: add "rendered" field
See sbt/util#175 for more information.
1 parent 1cfce2d commit 62d15ad

File tree

7 files changed

+46
-31
lines changed

7 files changed

+46
-31
lines changed

internal/zinc-compile-core/src/main/scala/sbt/internal/inc/FilteredReporter.scala

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,20 @@ class FilteredReporter(
7878
* registered as problems so that users of `problems()` receive them.
7979
*/
8080
override def log(problem: Problem): Unit = {
81-
val (category, position, message, severity) =
82-
(problem.category, problem.position, problem.message, problem.severity)
81+
import sbt.util.InterfaceUtil
82+
83+
val (category, position, message, severity, rendered) =
84+
(problem.category,
85+
problem.position,
86+
problem.message,
87+
problem.severity,
88+
InterfaceUtil.jo2o(problem.rendered))
8389
val dontShow = isFiltered(position, message, severity)
8490
if (!dontShow) super.log(problem)
8591
else {
8692
// Even if we don't display, we do want to register the problem
87-
import sbt.util.InterfaceUtil
8893
val transformedPos: Position = positionMapper(position)
89-
val problem = InterfaceUtil.problem(category, transformedPos, message, severity)
94+
val problem = InterfaceUtil.problem(category, transformedPos, message, severity, rendered)
9095
allProblems += problem
9196
()
9297
}

internal/zinc-compile-core/src/main/scala/sbt/internal/inc/LoggedReporter.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ import scala.collection.mutable
2121
import LoggedReporter._
2222
import sbt.internal.util.ManagedLogger
2323
import sbt.internal.util.codec._
24+
import sbt.util.InterfaceUtil.jo2o
2425
import Severity.{ Error, Warn, Info => SInfo }
2526

2627
object LoggedReporter {
2728
final class PositionKey(pos: Position) {
28-
import sbt.util.InterfaceUtil.jo2o
2929
def offset = pos.offset
3030
def sourceFile = pos.sourceFile
3131

@@ -121,11 +121,15 @@ class LoggedReporter(
121121

122122
override def log(problem0: Problem): Unit = {
123123
import sbt.util.InterfaceUtil
124-
val (category, position, message, severity) =
125-
(problem0.category, problem0.position, problem0.message, problem0.severity)
124+
val (category, position, message, severity, rendered) =
125+
(problem0.category,
126+
problem0.position,
127+
problem0.message,
128+
problem0.severity,
129+
jo2o(problem0.rendered))
126130
// Note: positions in reported errors can be fixed with `sourcePositionMapper`.
127131
val transformedPos: Position = sourcePositionMapper(position)
128-
val problem = InterfaceUtil.problem(category, transformedPos, message, severity)
132+
val problem = InterfaceUtil.problem(category, transformedPos, message, severity, rendered)
129133
allProblems += problem
130134
severity match {
131135
case Warn | Error =>

internal/zinc-compile-core/src/main/scala/sbt/internal/inc/ProblemStringFormats.scala

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@ import sbt.util.InterfaceUtil.jo2o
2020
trait ProblemStringFormats {
2121
implicit lazy val ProblemStringFormat: ShowLines[Problem] = new ShowLines[Problem] {
2222
def showLines(p: Problem): Seq[String] =
23-
p match {
24-
case p if !p.position.sourcePath.isPresent && !p.position.line.isPresent =>
25-
Vector(p.message)
26-
case _ =>
27-
val pos = p.position
28-
val sourcePrefix = jo2o(pos.sourcePath).getOrElse("")
29-
val columnNumber = jo2o(pos.pointer).fold(1)(_.toInt + 1)
30-
val lineNumberString = jo2o(pos.line).fold(":")(":" + _ + ":" + columnNumber + ":") + " "
31-
val line1 = sourcePrefix + lineNumberString + p.message
32-
val lineContent = pos.lineContent
33-
if (!lineContent.isEmpty) {
34-
Vector(line1, lineContent) ++
35-
(for { space <- jo2o(pos.pointerSpace) } yield
36-
(space + "^")).toVector // pointer to the column position of the error/warning
37-
} else Vector(line1)
23+
if (p.rendered.isPresent)
24+
Vector(p.rendered.get)
25+
else if (!p.position.sourcePath.isPresent && !p.position.line.isPresent)
26+
Vector(p.message)
27+
else {
28+
val pos = p.position
29+
val sourcePrefix = jo2o(pos.sourcePath).getOrElse("")
30+
val columnNumber = jo2o(pos.pointer).fold(1)(_.toInt + 1)
31+
val lineNumberString = jo2o(pos.line).fold(":")(":" + _ + ":" + columnNumber + ":") + " "
32+
val line1 = sourcePrefix + lineNumberString + p.message
33+
val lineContent = pos.lineContent
34+
if (!lineContent.isEmpty) {
35+
Vector(line1, lineContent) ++
36+
(for { space <- jo2o(pos.pointerSpace) } yield
37+
(space + "^")).toVector // pointer to the column position of the error/warning
38+
} else Vector(line1)
3839
}
3940
}
4041
}

internal/zinc-compile-core/src/main/scala/sbt/internal/inc/javac/DiagnosticsReporter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ final class DiagnosticsReporter(reporter: Reporter) extends DiagnosticListener[J
4545
val msg = d.getMessage(null)
4646
val pos: xsbti.Position = PositionImpl(d)
4747
if (severity == Severity.Error) errorEncountered = true
48-
reporter.log(problem("", pos, msg, severity))
48+
reporter.log(problem("", pos, msg, severity, rendered = None))
4949
}
5050
}
5151

internal/zinc-persist/src/main/protobuf/schema.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ message Problem {
7979
Severity severity = 2;
8080
string message = 3;
8181
Position position = 4;
82+
string rendered = 5;
8283
}
8384

8485
message SourceInfo {

internal/zinc-persist/src/main/scala/sbt/internal/inc/binary/converters/ProtobufReaders.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import sbt.internal.inc.binary.converters.ProtobufDefaults.{ Classes, ReadersCon
2121
import sbt.internal.util.Relation
2222
import xsbti.api._
2323

24+
import ProtobufDefaults.{ MissingString, MissingInt }
25+
2426
final class ProtobufReaders(mapper: ReadMapper) {
2527
def fromPathString(path: String): File = {
2628
java.nio.file.Paths.get(path).toFile
@@ -115,11 +117,6 @@ final class ProtobufReaders(mapper: ReadMapper) {
115117
}
116118

117119
def fromPosition(position: schema.Position): Position = {
118-
import ProtobufDefaults.{ MissingString, MissingInt }
119-
def fromString(value: String): Option[String] =
120-
if (value == MissingString) None else Some(value)
121-
def fromInt(value: Int): Option[Integer] =
122-
if (value == MissingInt) None else Some(value)
123120
InterfaceUtil.position(
124121
line0 = fromInt(position.line),
125122
content = position.lineContent,
@@ -146,14 +143,21 @@ final class ProtobufReaders(mapper: ReadMapper) {
146143
}
147144
}
148145

146+
private def fromString(value: String): Option[String] =
147+
if (value == MissingString) None else Some(value)
148+
149+
private def fromInt(value: Int): Option[Integer] =
150+
if (value == MissingInt) None else Some(value)
151+
149152
def fromProblem(problem: schema.Problem): Problem = {
150153
val category = problem.category
151154
val message = problem.message
152155
val severity = fromSeverity(problem.severity)
153156
val position = problem.position
154157
.map(fromPosition)
155158
.getOrElse(ReadersFeedback.ExpectedPositionInProblem.!!)
156-
InterfaceUtil.problem(category, position, message, severity)
159+
val rendered = fromString(problem.rendered)
160+
InterfaceUtil.problem(category, position, message, severity, rendered)
157161
}
158162

159163
def fromSourceInfo(sourceInfo: schema.SourceInfo): SourceInfo = {

internal/zinc-persist/src/main/scala/sbt/internal/inc/text/TextAnalysisFormat.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class TextAnalysisFormat(val mappers: ReadWriteMappers)
101101
}
102102
private implicit val companionsFomrat: Format[Companions] = CompanionsFormat
103103
private implicit def problemFormat: Format[Problem] =
104-
asProduct4(problem)(p => (p.category, p.position, p.message, p.severity))
104+
asProduct5(problem)(p => (p.category, p.position, p.message, p.severity, jo2o(p.rendered)))
105105
private implicit def positionFormat: Format[Position] =
106106
asProduct13(position)(
107107
p =>

0 commit comments

Comments
 (0)