From d17aeef7ac428479f53a3bc72eca0716bf30ecfd Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Wed, 22 Jun 2016 18:25:46 -0700 Subject: Add dummy javadoc typer and instrumentation --- build.sbt | 2 + src/compiler/scala/tools/nsc/ast/DocComments.scala | 11 ++- .../scala/tools/nsc/doc/ScaladocAnalyzer.scala | 90 ++++++++++++++++++---- .../scala/tools/nsc/doc/ScaladocGlobal.scala | 3 + 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/build.sbt b/build.sbt index a25685fee1..fa66d4947d 100644 --- a/build.sbt +++ b/build.sbt @@ -115,6 +115,8 @@ baseVersion in Global := "2.12.0" baseVersionSuffix in Global := "SNAPSHOT" lazy val commonSettings = clearSourceAndResourceDirectories ++ publishSettings ++ Seq[Setting[_]]( + publishArtifact in (Compile, packageDoc) := false, + publishArtifact in (Compile, packageSrc) := false, organization := "org.scala-lang", scalaVersion := bootstrapScalaVersion, // we don't cross build Scala itself diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala index c70690e697..15dee81e77 100644 --- a/src/compiler/scala/tools/nsc/ast/DocComments.scala +++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala @@ -74,7 +74,7 @@ trait DocComments { self: Global => else DocComment(docStr).template ownComment = replaceInheritDocToInheritdoc(ownComment) - superComment(sym) match { + val c = superComment(sym) match { case None => // SI-8210 - The warning would be false negative when this symbol is a setter if (ownComment.indexOf("@inheritdoc") != -1 && ! sym.isSetter) @@ -84,6 +84,15 @@ trait DocComments { self: Global => if (ownComment == "") sc else expandInheritdoc(sc, merge(sc, ownComment, sym), sym) } + if (sym.toString.contains("magic")) { + println("all cooked comments: ") + docComments.foreach{d => + println(d) + } + println("cooked comment for " + sym + ": " + c) + } + + c }) /** The cooked doc comment of symbol `sym` after variable expansion, or "" if missing. diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala index b048d96405..530a20fc3a 100644 --- a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala +++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala @@ -16,7 +16,66 @@ trait ScaladocAnalyzer extends Analyzer { val global : Global // generally, a ScaladocGlobal import global._ - override def newTyper(context: Context): ScaladocTyper = new Typer(context) with ScaladocTyper + override def newTyper(context: Context): Typer = if (context.unit.isJava) { + new Typer(context) with ScaladocJavaTyper //super hack + } else { + new Typer(context) with ScaladocTyper + } + + //super hack + trait ScaladocJavaTyper extends Typer { + private def unit = context.unit + + val docCollector = new Traverser { + override def traverse(tree: Tree): Unit = tree match { + case dd: DocDef if dd.symbol != null && dd.symbol != NoSymbol => + println("got a docdef: " + dd.comment) + docComments(dd.symbol) = dd.comment + dd.comment.defineVariables(dd.symbol) + case dd: DocDef => + println("Argh!!! No sym in doc comment") + case t => + println("Unknown tree: " + t.getClass.getSimpleName) + super.traverse(t) + } + } + + + override def typed(tree: Tree): Tree = { + println("The java typer says hi! From source file: " + unit.source.file.name) + docCollector.traverse(tree) + tree + } + + override protected def macroImplementationNotFoundMessage(name: Name): String = ( + super.macroImplementationNotFoundMessage(name) + + "\nWhen generating scaladocs for multiple projects at once, consider using -Ymacro-no-expand to disable macro expansions altogether." + ) + + override def typedDocDef(docDef: DocDef, mode: Mode, pt: Type): Tree = { + val sym = docDef.symbol + + if ((sym ne null) && (sym ne NoSymbol)) { + val comment = docDef.comment + docComments(sym) = comment + comment.defineVariables(sym) + val typer1 = newTyper(context.makeNewScope(docDef, context.owner)) + for (useCase <- comment.useCases) { + typer1.silent(_.asInstanceOf[ScaladocTyper].defineUseCases(useCase)) match { + case SilentTypeError(err) => + reporter.warning(useCase.pos, err.errMsg) + case _ => + } + for (useCaseSym <- useCase.defined) { + if (sym.name != useCaseSym.name) + reporter.warning(useCase.pos, "@usecase " + useCaseSym.name.decode + " does not match commented symbol: " + sym.name.decode) + } + } + } + + super.typedDocDef(docDef, mode, pt) + } + } trait ScaladocTyper extends Typer { private def unit = context.unit @@ -110,27 +169,24 @@ abstract class ScaladocSyntaxAnalyzer[G <: Global](val global: G) extends Syntax if ((doc ne null) && doc.raw.length > 0) { log(s"joinComment(doc=$doc)") - val joined = trees map { - t => - DocDef(doc, t) setPos { - if (t.pos.isDefined) { - val pos = doc.pos.withEnd(t.pos.end) - pos.makeTransparent - } else { - t.pos - } + val joined = trees map { t => + DocDef(doc, t) setPos { + if (t.pos.isDefined) { + val pos = doc.pos.withEnd(t.pos.end) + pos.makeTransparent + } else { + t.pos } + } } - joined.find(_.pos.isOpaqueRange) foreach { - main => - val mains = List(main) - joined foreach { t => if (t ne main) ensureNonOverlapping(t, mains) } + joined.find(_.pos.isOpaqueRange) foreach { main => + val mains = List(main) + joined foreach { t => if (t ne main) ensureNonOverlapping(t, mains) } } joined + } else { + trees } - else trees - - // trees } diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala index 107d81f78a..bdce34f7ca 100644 --- a/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala +++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala @@ -31,6 +31,9 @@ trait ScaladocGlobalTrait extends Global { log(s"Suppressing error involving $root: $ex") } } + + override def createJavadoc = true + } class ScaladocGlobal(settings: doc.Settings, reporter: Reporter) extends Global(settings, reporter) with ScaladocGlobalTrait { -- cgit v1.2.3