Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
parse comment mode
Browse files Browse the repository at this point in the history
xuwei-k committed Mar 14, 2024
1 parent 7886f52 commit e921d62
Showing 4 changed files with 83 additions and 4 deletions.
7 changes: 7 additions & 0 deletions core/src/main/scala/scalameta_ast/Args.scala
Original file line number Diff line number Diff line change
@@ -28,6 +28,13 @@ object Args {
dialect: Option[String],
) extends Args

case class Comment(
src: String,
format: Boolean,
scalafmtConfig: Conf,
dialect: Option[String],
) extends Args

case class Raw(
src: String,
format: Boolean,
26 changes: 25 additions & 1 deletion core/src/main/scala/scalameta_ast/ScalametaAST.scala
Original file line number Diff line number Diff line change
@@ -319,6 +319,13 @@ class ScalametaAST {
patch = patch,
initialExtractor = initialExtractor,
)
case "comment" =>
Args.Comment(
src = src,
format = format,
scalafmtConfig = scalafmtConfig,
dialect = dialect,
)
case _ =>
Args.Raw(
src = src,
@@ -334,7 +341,7 @@ class ScalametaAST {
def convert(
args: Args
): Output = {
val input = convert.apply(args.src)
lazy val input = convert.apply(args.src)
val ((ast, parsedOpt), astBuildMs) = stopwatch {
val dialects = args.dialect.fold(dialectsDefault) { x =>
stringToDialects.getOrElse(
@@ -363,6 +370,23 @@ class ScalametaAST {
}
tokensToString(loop(input, dialects)) -> None

case _: Args.Comment =>
scala.meta.contrib.CommentOps
.docTokens(
new scala.meta.tokens.Token.Comment(
input = Input.String(args.src),
dialect = dialects.head,
start = 0,
end = args.src.length,
value = args.src
)
)
.map(_.map { x =>
val q: String => String = s => scala.meta.Lit.String(s).toString
s"""DocToken(kind = ${x.kind}, name = ${x.name.map(q)}, body = ${x.body.map(q)})"""
})
.toString -> None

case a: NotToken =>
val tree = loopParse(
input,
32 changes: 32 additions & 0 deletions localServer/src/test/scala/scalameta_ast/IntegrationTest.scala
Original file line number Diff line number Diff line change
@@ -218,21 +218,53 @@ abstract class IntegrationTest(
"raw" in withBrowser { page =>
changeOutputType(page, "raw")
assert(output(page).textContent() == fromResource("raw.txt"))
assert(!packageName(page).isEnabled())
assert(!ruleName(page).isEnabled())
assert(!wildcardImport(page).isEnabled())
}
"SyntacticRule" in withBrowser { page =>
changeOutputType(page, "syntactic")
assert(output(page).textContent() == fromResource("syntactic.txt"))
assert(wildcardImport(page).isEnabled())
}
"SemanticRule" in withBrowser { page =>
changeOutputType(page, "semantic")
assert(output(page).textContent() == fromResource("semantic.txt"))
assert(wildcardImport(page).isEnabled())
}
"Tokens" in withBrowser { page =>
changeOutputType(page, "tokens")
assert(output(page).textContent() == fromResource("tokens.txt"))
assert(!wildcardImport(page).isEnabled())
assert(!removeNewFields(page).isEnabled())
assert(!initialExtractor(page).isEnabled())
assert(!packageName(page).isEnabled())
assert(!ruleName(page).isEnabled())
}
"Comment" in withBrowser { page =>
changeOutputType(page, "comment")
assert(!wildcardImport(page).isEnabled())
assert(!removeNewFields(page).isEnabled())
assert(!initialExtractor(page).isEnabled())
assert(!packageName(page).isEnabled())
assert(!ruleName(page).isEnabled())
setInput(
page,
Seq(
"""/**""",
""" * @param a1 a2""",
""" * @tparam a3 a4""",
""" * @throws a5 a6""",
""" * @see example.com""",
""" * @note a7""",
""" *""",
""" * {{{""",
""" * def x = List("y", 2)""",
""" * }}}""",
""" */""",
).mkString("\n")
)
assert(output(page).textContent() == fromResource("comment.txt"))
}
}

22 changes: 19 additions & 3 deletions sources/main.js
Original file line number Diff line number Diff line change
@@ -183,10 +183,14 @@ const App = () => {
});
}

const disableScalafixRuleTemplateInput =
outputType === "raw" || outputType === "tokens";
const disableScalafixRuleTemplateInput = [
"raw",
"tokens",
"comment",
].includes(outputType);

const disableCompat = scalameta != "scalafix" || outputType === "tokens";
const disableCompat =
scalameta != "scalafix" || ["tokens", "comment"].includes(outputType);

return html` <div class="container mw-100">
<details open ontoggle="${(e) => changeDetails(e)}">
@@ -342,6 +346,18 @@ const App = () => {
<span>Tokens</span>
</label>
</div>
<div>
<label>
<input
type="radio"
name="output_type"
value="comment"
checked=${outputType === "comment"}
onChange=${() => setOutputType("comment")}
/>
<span>Comment</span>
</label>
</div>
</fieldset>
</div>
<div class="row">

0 comments on commit e921d62

Please sign in to comment.