mirror of https://github.com/sbt/sbt.git
Source position mapper support
This commit is contained in:
parent
5e2fc5f005
commit
702ee44e0e
|
|
@ -20,7 +20,7 @@ final class AnalyzingCompiler(val scalaInstance: xsbti.compile.ScalaInstance, va
|
|||
{
|
||||
val arguments = (new CompilerArguments(scalaInstance, cp))(Nil, classpath, None, options)
|
||||
val output = CompileOutput(singleOutput)
|
||||
compile(sources, changes, arguments, output, callback, new LoggerReporter(maximumErrors, log), cache, log, None)
|
||||
compile(sources, changes, arguments, output, callback, new LoggerReporter(maximumErrors, log, p => p), cache, log, None)
|
||||
}
|
||||
|
||||
def compile(sources: Seq[File], changes: DependencyChanges, options: Seq[String], output: Output, callback: AnalysisCallback, reporter: Reporter, cache: GlobalsCache, log: Logger, progressOpt: Option[CompileProgress]): Unit =
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ object LoggerReporter
|
|||
}
|
||||
}
|
||||
|
||||
class LoggerReporter(maximumErrors: Int, log: Logger) extends xsbti.Reporter
|
||||
class LoggerReporter(maximumErrors: Int, log: Logger, sourcePositionMapper: Position => Position = {p => p}) extends xsbti.Reporter
|
||||
{
|
||||
val positions = new mutable.HashMap[PositionKey, Severity]
|
||||
val count = new EnumMap[Severity, Int](classOf[Severity])
|
||||
|
|
@ -115,15 +115,16 @@ class LoggerReporter(maximumErrors: Int, log: Logger) extends xsbti.Reporter
|
|||
|
||||
def log(pos: Position, msg: String, severity: Severity): Unit =
|
||||
{
|
||||
allProblems += problem("", pos, msg, severity)
|
||||
val mappedPos = sourcePositionMapper(pos)
|
||||
allProblems += problem("", mappedPos, msg, severity)
|
||||
severity match
|
||||
{
|
||||
case Warn | Error =>
|
||||
{
|
||||
if(!testAndLog(pos, severity))
|
||||
display(pos, msg, severity)
|
||||
if(!testAndLog(mappedPos, severity))
|
||||
display(mappedPos, msg, severity)
|
||||
}
|
||||
case _ => display(pos, msg, severity)
|
||||
case _ => display(mappedPos, msg, severity)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@ object Defaults extends BuildCommon
|
|||
classpathTypes :== Set("jar", "bundle", "hk2-jar", "orbit"),
|
||||
aggregate :== true,
|
||||
maxErrors :== 100,
|
||||
sourcePositionMappers :== Nil,
|
||||
showTiming :== true,
|
||||
timingFormat :== Aggregation.defaultFormat,
|
||||
showSuccess :== true,
|
||||
|
|
@ -577,15 +578,17 @@ object Defaults extends BuildCommon
|
|||
def compileInputsSettings: Seq[Setting[_]] = {
|
||||
val optionsPair = TaskKey.local[(Seq[String], Seq[String])]
|
||||
Seq(optionsPair <<= (scalacOptions, javacOptions) map Util.pairID,
|
||||
compileInputs <<= (dependencyClasspath, sources, compilers, optionsPair, classDirectory, compileOrder, compileIncSetup, maxErrors, streams) map {
|
||||
(cp, srcs, cs, optsPair, classes, order, incSetup, maxErr, s) =>
|
||||
Compiler.inputs(classes +: data(cp), srcs, classes, optsPair._1, optsPair._2, maxErr, order)(cs, incSetup, s.log)
|
||||
compileInputs <<= (dependencyClasspath, sources, compilers, optionsPair, classDirectory, compileOrder, compileIncSetup, maxErrors, streams, sourcePositionMappers) map {
|
||||
(cp, srcs, cs, optsPair, classes, order, incSetup, maxErr, s, spms) =>
|
||||
Compiler.inputs(classes +: data(cp), srcs, classes, optsPair._1, optsPair._2, maxErr, spms, order)(cs, incSetup, s.log)
|
||||
})
|
||||
}
|
||||
def printWarningsTask: Initialize[Task[Unit]] =
|
||||
(streams, compile, maxErrors) map { (s, analysis, max) =>
|
||||
(streams, compile, maxErrors, sourcePositionMappers) map { (s, analysis, max, spms) =>
|
||||
val problems = analysis.infos.allInfos.values.flatMap(i => i.reportedProblems++ i.unreportedProblems)
|
||||
val reporter = new LoggerReporter(max, s.log)
|
||||
val reporter = new LoggerReporter(max, s.log,
|
||||
spms.foldRight({p: xsbti.Position => p}) { (mapper, mappers) => {p: xsbti.Position => mapper(p).getOrElse(mappers(p))}}
|
||||
)
|
||||
problems foreach { p => reporter.display(p.position, p.message, p.severity) }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ object Keys
|
|||
val doc = TaskKey[File]("doc", "Generates API documentation.", AMinusTask)
|
||||
val copyResources = TaskKey[Seq[(File,File)]]("copy-resources", "Copies resources to the output directory.", AMinusTask)
|
||||
val aggregate = SettingKey[Boolean]("aggregate", "Configures task aggregation.", BMinusSetting)
|
||||
val sourcePositionMappers = TaskKey[Seq[xsbti.Position => Option[xsbti.Position]]]("source-position-mappers", "Maps positions in generated source files to the original source it was generated from", DTask)
|
||||
|
||||
// package keys
|
||||
val packageBin = TaskKey[File]("package-bin", "Produces a main artifact, such as a binary jar.", ATask)
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ object Compiler
|
|||
val DefaultMaxErrors = 100
|
||||
|
||||
final case class Inputs(compilers: Compilers, config: Options, incSetup: IncSetup)
|
||||
final case class Options(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder)
|
||||
final case class Options(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, sourcePositionMapper: Position => Position, order: CompileOrder)
|
||||
final case class IncSetup(analysisMap: File => Option[Analysis], definesClass: DefinesClass, skip: Boolean, cacheFile: File, cache: GlobalsCache)
|
||||
final case class Compilers(scalac: AnalyzingCompiler, javac: JavaTool)
|
||||
|
||||
|
|
@ -28,12 +28,14 @@ object Compiler
|
|||
val cacheFile = outputDirectory / "cache_old_style"
|
||||
val augClasspath = classesDirectory.asFile +: classpath
|
||||
val incSetup = IncSetup(Map.empty, definesClass, false, cacheFile, CompilerCache.fresh)
|
||||
inputs(augClasspath, sources, classesDirectory, options, javacOptions, maxErrors, order)(compilers, incSetup, log)
|
||||
inputs(augClasspath, sources, classesDirectory, options, javacOptions, maxErrors, Nil, order)(compilers, incSetup, log)
|
||||
}
|
||||
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder)(implicit compilers: Compilers, incSetup: IncSetup, log: Logger): Inputs =
|
||||
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, sourcePositionMappers: Seq[Position => Option[Position]], order: CompileOrder)(implicit compilers: Compilers, incSetup: IncSetup, log: Logger): Inputs =
|
||||
new Inputs(
|
||||
compilers,
|
||||
new Options(classpath, sources, classesDirectory, options, javacOptions, maxErrors, order),
|
||||
new Options(classpath, sources, classesDirectory, options, javacOptions, maxErrors,
|
||||
sourcePositionMappers.foldRight({p: Position => p}) { (mapper, mappers) => {p: Position => mapper(p).getOrElse(mappers(p))}},
|
||||
order),
|
||||
incSetup
|
||||
)
|
||||
|
||||
|
|
@ -76,6 +78,6 @@ object Compiler
|
|||
import in.incSetup._
|
||||
|
||||
val agg = new AggressiveCompile(cacheFile)
|
||||
agg(scalac, javac, sources, classpath, CompileOutput(classesDirectory), cache, None, options, javacOptions, analysisMap, definesClass, new LoggerReporter(maxErrors, log), order, skip)(log)
|
||||
agg(scalac, javac, sources, classpath, CompileOutput(classesDirectory), cache, None, options, javacOptions, analysisMap, definesClass, new LoggerReporter(maxErrors, log, sourcePositionMapper), order, skip)(log)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue