From 702ee44e0eec72289b742acb85044cdd1c0c5869 Mon Sep 17 00:00:00 2001 From: James Roper Date: Tue, 28 Aug 2012 18:01:26 +0200 Subject: [PATCH] Source position mapper support --- compile/AnalyzingCompiler.scala | 2 +- compile/LoggerReporter.scala | 11 ++++++----- main/Defaults.scala | 13 ++++++++----- main/Keys.scala | 1 + main/actions/Compiler.scala | 12 +++++++----- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/compile/AnalyzingCompiler.scala b/compile/AnalyzingCompiler.scala index a92ad7aa8..02d2d9b2f 100644 --- a/compile/AnalyzingCompiler.scala +++ b/compile/AnalyzingCompiler.scala @@ -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 = diff --git a/compile/LoggerReporter.scala b/compile/LoggerReporter.scala index 9fd586d8a..38be5bfe7 100644 --- a/compile/LoggerReporter.scala +++ b/compile/LoggerReporter.scala @@ -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) } } diff --git a/main/Defaults.scala b/main/Defaults.scala index 7edf2fa71..94703ee7a 100755 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -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) } } diff --git a/main/Keys.scala b/main/Keys.scala index 49bf4d11b..64fb210a5 100644 --- a/main/Keys.scala +++ b/main/Keys.scala @@ -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) diff --git a/main/actions/Compiler.scala b/main/actions/Compiler.scala index 79383554e..9e966bfb4 100644 --- a/main/actions/Compiler.scala +++ b/main/actions/Compiler.scala @@ -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) } }