diff options
Diffstat (limited to 'src/dotty/tools')
-rw-r--r-- | src/dotty/tools/dotc/ast/Trees.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Comments.scala | 77 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Contexts.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/parsing/Parsers.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/parsing/Scanners.scala | 6 |
5 files changed, 81 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala index 6986e40e7..70701ecd7 100644 --- a/src/dotty/tools/dotc/ast/Trees.scala +++ b/src/dotty/tools/dotc/ast/Trees.scala @@ -4,7 +4,7 @@ package ast import core._ import Types._, Names._, Flags._, util.Positions._, Contexts._, Constants._, SymDenotations._, Symbols._ -import Denotations._, StdNames._ +import Denotations._, StdNames._, Comments._ import annotation.tailrec import language.higherKinds import collection.IndexedSeqOptimized @@ -15,7 +15,6 @@ import printing.Printer import util.{Stats, Attachment, Property, DotClass} import annotation.unchecked.uncheckedVariance import language.implicitConversions -import parsing.Scanners.Comment object Trees { diff --git a/src/dotty/tools/dotc/core/Comments.scala b/src/dotty/tools/dotc/core/Comments.scala new file mode 100644 index 000000000..bf1f25537 --- /dev/null +++ b/src/dotty/tools/dotc/core/Comments.scala @@ -0,0 +1,77 @@ +package dotty.tools +package dotc +package core + +import dotc.ast.{ untpd, tpd } +import Decorators._ +import Symbols._ +import Contexts.Context +import Flags.EmptyFlags +import dotc.util.SourceFile +import dotc.util.Positions.Position +import dotc.parsing.Parsers.Parser +import dotty.tools.dottydoc.model.comment.CommentUtils._ + +object Comments { + + case class Comment(pos: Position, raw: String)(implicit ctx: Context) { + val isDocComment = raw.startsWith("/**") + + private[this] lazy val sections = tagIndex(raw) + + private def fold[A](z: A)(op: => A) = if (!isDocComment) z else op + + lazy val usecases = fold(List.empty[UseCase]) { + sections + .filter { startsWithTag(raw, _, "@usecase") } + .map { case (start, end) => decomposeUseCase(start, end) } + } + + /** Turns a usecase section into a UseCase, with code changed to: + * {{{ + * // From: + * def foo: A + * // To: + * def foo: A = ??? + * }}} + */ + private def decomposeUseCase(start: Int, end: Int): UseCase = { + val codeStart = skipWhitespace(raw, start + "@usecase".length) + val codeEnd = skipToEol(raw, codeStart) + val code = raw.substring(codeStart, codeEnd) + val codePos = Position(codeStart, codeEnd) + val commentStart = skipLineLead(raw, codeEnd + 1) min end + val comment = "/** " + raw.substring(commentStart, end) + "*/" + val commentPos = Position(commentStart, end) + + UseCase(Comment(commentPos, comment), code + " = ???", codePos) + } + } + + case class UseCase(comment: Comment, code: String, codePos: Position)(implicit ctx: Context) { + /** Entered by Namer */ + var symbol: Symbol = _ + + lazy val untpdCode: untpd.Tree = { + val tree = new Parser(new SourceFile("<usecase>", code)).localDef(codePos.start, EmptyFlags) + + tree match { + case tree: untpd.DefDef => tree + case _ => + ctx.error("proper def was not found in `@usecase`", codePos) + tree + } + } + + /** Set by typer calling `typeTree` */ + var tpdCode: tpd.DefDef = _ + + def typeTree()(implicit ctx: Context): Unit = untpdCode match { + case df: untpd.DefDef => ctx.typer.typedDefDef(df, symbol) match { + case tree: tpd.DefDef => tpdCode = tree + case _ => ctx.error("proper def was not found in `@usecase`", codePos) + } + case _ => ctx.error("proper def was not found in `@usecase`", codePos) + } + } +} diff --git a/src/dotty/tools/dotc/core/Contexts.scala b/src/dotty/tools/dotc/core/Contexts.scala index 313ea3124..429b95c1e 100644 --- a/src/dotty/tools/dotc/core/Contexts.scala +++ b/src/dotty/tools/dotc/core/Contexts.scala @@ -13,6 +13,7 @@ import Scopes._ import NameOps._ import Uniques._ import SymDenotations._ +import Comments._ import Flags.ParamAccessor import util.Positions._ import ast.Trees._ @@ -29,7 +30,6 @@ import printing._ import config.{Settings, ScalaSettings, Platform, JavaPlatform, SJSPlatform} import language.implicitConversions import DenotTransformers.DenotTransformer -import parsing.Scanners.Comment import util.Property.Key import xsbti.AnalysisCallback diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala index 0a25bf801..9aadf0c61 100644 --- a/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/src/dotty/tools/dotc/parsing/Parsers.scala @@ -19,10 +19,10 @@ import StdNames._ import util.Positions._ import Constants._ import ScriptParsers._ +import Comments._ import scala.annotation.{tailrec, switch} import util.DotClass import rewrite.Rewrites.patch -import Scanners.Comment object Parsers { diff --git a/src/dotty/tools/dotc/parsing/Scanners.scala b/src/dotty/tools/dotc/parsing/Scanners.scala index e16aa670f..60003d098 100644 --- a/src/dotty/tools/dotc/parsing/Scanners.scala +++ b/src/dotty/tools/dotc/parsing/Scanners.scala @@ -3,7 +3,7 @@ package dotc package parsing import core.Names._, core.Contexts._, core.Decorators._, util.Positions._ -import core.StdNames._ +import core.StdNames._, core.Comments._ import util.SourceFile import java.lang.Character.isDigit import scala.reflect.internal.Chars._ @@ -22,10 +22,6 @@ object Scanners { /** An undefined offset */ val NoOffset: Offset = -1 - case class Comment(pos: Position, chrs: String) { - def isDocComment = chrs.startsWith("/**") - } - type Token = Int trait TokenData { |