Skip to content

Commit

Permalink
path filter
Browse files Browse the repository at this point in the history
  • Loading branch information
xuwei-k committed Mar 24, 2024
1 parent 9349729 commit b0c82f8
Show file tree
Hide file tree
Showing 10 changed files with 152 additions and 5 deletions.
5 changes: 4 additions & 1 deletion core/src/main/js/scalameta_ast/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ object Main extends MainCompat {
patch = "",
removeNewFields = false,
initialExtractor = false,
explanation = true
explanation = true,
pathFilter = false,
)
}

Expand All @@ -35,6 +36,7 @@ object Main extends MainCompat {
removeNewFields: Boolean,
initialExtractor: Boolean,
explanation: Boolean,
pathFilter: Boolean,
): js.Object = {
try {
val output =
Expand All @@ -49,6 +51,7 @@ object Main extends MainCompat {
removeNewFields = removeNewFields,
initialExtractor = initialExtractor,
explanation = explanation,
pathFilter = pathFilter,
)
new js.Object {
var ast = output.ast
Expand Down
3 changes: 3 additions & 0 deletions core/src/main/scala/scalameta_ast/Args.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ sealed abstract class ScalafixRule extends NotToken {
def ruleNameOption: Option[String]
def patch: Option[String]
def explanation: Boolean
def pathFilter: Boolean
def documentClass: String
def ruleClass: String
}
Expand Down Expand Up @@ -47,6 +48,7 @@ object Args {
patch: Option[String],
initialExtractor: Boolean,
explanation: Boolean,
pathFilter: Boolean,
) extends ScalafixRule {
override def documentClass: String = "SyntacticDocument"
override def ruleClass: String = "SyntacticRule"
Expand All @@ -62,6 +64,7 @@ object Args {
patch: Option[String],
initialExtractor: Boolean,
explanation: Boolean,
pathFilter: Boolean,
) extends ScalafixRule {
override def documentClass: String = "SemanticDocument"
override def ruleClass: String = "SemanticRule"
Expand Down
30 changes: 26 additions & 4 deletions core/src/main/scala/scalameta_ast/ScalametaAST.scala
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ class ScalametaAST {
removeNewFields: Boolean,
initialExtractor: Boolean,
explanation: Boolean,
pathFilter: Boolean,
): Output = {
convert(
outputType match {
Expand All @@ -278,6 +279,7 @@ class ScalametaAST {
patch = patch,
initialExtractor = initialExtractor,
explanation = explanation,
pathFilter = pathFilter,
)
case "semantic" =>
Args.Semantic(
Expand All @@ -290,6 +292,7 @@ class ScalametaAST {
patch = patch,
initialExtractor = initialExtractor,
explanation = explanation,
pathFilter = pathFilter,
)
case "comment" =>
Args.Comment(
Expand Down Expand Up @@ -410,6 +413,7 @@ class ScalametaAST {
patch = a.patch,
parsed = a0.value,
explanation = a.explanation,
pathFilter = a.pathFilter,
documentClass = a.documentClass,
ruleClass = a.ruleClass,
)
Expand Down Expand Up @@ -499,6 +503,7 @@ class ScalametaAST {
patch: Option[String],
parsed: () => Term,
explanation: Boolean,
pathFilter: Boolean,
documentClass: String,
ruleClass: String,
): String = {
Expand All @@ -510,22 +515,39 @@ class ScalametaAST {
} else {
List("scala.meta.transversers._")
},
if (pathFilter) {
List("scala.meta.inputs.Input")
} else {
Nil
},
List(
"scalafix.Patch",
s"scalafix.v1.${documentClass}",
s"scalafix.v1.${ruleClass}",
"scalafix.v1.XtensionSeqPatch",
)
).flatten.map("import " + _).sorted
val body =
s"""| doc.tree.collect {
| case t @ ${x} =>
|${p.value(8)}
| }.asPatch""".stripMargin
val withPathFilter = if (pathFilter) {
s"""| doc.input match {
| case f: Input.VirtualFile if f.path.contains("") =>
| Patch.empty
| case _ =>
|${body.linesIterator.map(" " + _).mkString("\n")}
| }""".stripMargin
} else {
body
}
s"""${header(x = x, packageName = packageName, wildcardImport = wildcardImport, parsed = parsed)}
|${imports.mkString("\n")}
|
|class ${ruleName} extends ${ruleClass}("${ruleNameRaw}") {
| override def fix(implicit doc: ${documentClass}): Patch = {
| doc.tree.collect {
| case t @ ${x} =>
|${p.value(8)}
| }.asPatch
|$withPathFilter
| }
|}
|""".stripMargin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = false,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect)
}
Expand All @@ -38,6 +39,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = false,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect)
}
Expand All @@ -54,6 +56,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = false,
initialExtractor = false,
explanation = true,
pathFilter = false,
)

val expect =
Expand All @@ -73,6 +76,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = false,
initialExtractor = false,
explanation = true,
pathFilter = false,
)

val expect =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = arg.remove,
initialExtractor = arg.initial,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect, arg)
}
Expand Down Expand Up @@ -63,6 +64,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = arg.remove,
initialExtractor = arg.initial,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect, arg)
}
Expand Down Expand Up @@ -94,6 +96,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = arg.remove,
initialExtractor = arg.initial,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect, arg)
}
Expand Down Expand Up @@ -125,6 +128,7 @@ class ScalametaASTSpec2 extends AnyFreeSpec {
removeNewFields = arg.remove,
initialExtractor = arg.initial,
explanation = true,
pathFilter = false,
)
assert(result.ast == expect, arg)
}
Expand Down
4 changes: 4 additions & 0 deletions core/src/test/scala/scalameta_ast/ScalametaASTSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class ScalametaASTSpec extends AnyFreeSpec {
removeNewFields = true,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
val expect = s"""package package_name
|
Expand Down Expand Up @@ -87,6 +88,7 @@ class ScalametaASTSpec extends AnyFreeSpec {
removeNewFields = true,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
val expect =
s"""package package_name
Expand Down Expand Up @@ -122,6 +124,7 @@ class ScalametaASTSpec extends AnyFreeSpec {
removeNewFields = true,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
val expect = """Seq(Token.BOF, Token.LeftParen, Token.EOF)"""
assert(result.ast == expect)
Expand All @@ -139,6 +142,7 @@ class ScalametaASTSpec extends AnyFreeSpec {
removeNewFields = true,
initialExtractor = false,
explanation = true,
pathFilter = false,
)
val expect =
"""Seq(Token.BOF, Token.KwDef, Token.Space, Token.Ident("x"), Token.LeftParen, Token.Ident("y"), Token.Colon, Token.Space, Token.Ident("Z"), Token.RightParen, Token.Space, Token.Equals, Token.Space, Token.LeftParen, Token.Constant.Symbol(scala.Symbol("y")), Token.Comma, Token.Space, Token.Constant.Char('a'), Token.Comma, Token.Space, Token.Constant.String("b"), Token.Comma, Token.Space, Token.Constant.Double(BigDecimal("1.5")), Token.Comma, Token.Space, Token.Constant.Float(BigDecimal("4.4")), Token.Comma, Token.Space, Token.Constant.Long(BigInt("2")), Token.Comma, Token.Space, Token.Constant.Int(BigInt("3")), Token.Comma, Token.Space, Token.Interpolation.Id("s"), Token.Interpolation.Start, Token.Interpolation.Part("x1"), Token.Interpolation.SpliceStart, Token.LeftBrace, Token.Ident("x2"), Token.RightBrace, Token.Interpolation.SpliceEnd, Token.Interpolation.Part(""), Token.Interpolation.End, Token.Comma, Token.Space, Token.Xml.Start, Token.Xml.Part("<g>"), Token.Xml.SpliceStart, Token.LeftBrace, Token.Ident("p"), Token.RightBrace, Token.Xml.SpliceEnd, Token.Xml.Part("</g>"), Token.Xml.End, Token.RightParen, Token.Space, Token.Comment(" c "), Token.EOF)"""
Expand Down
44 changes: 44 additions & 0 deletions localServer/src/test/resources/path-filter/semantic.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package fix

import scala.meta.Defn
import scala.meta.Term
import scala.meta.inputs.Input
import scala.meta.transversers._
import scalafix.Patch
import scalafix.lint.Diagnostic
import scalafix.lint.LintSeverity
import scalafix.v1.SemanticDocument
import scalafix.v1.SemanticRule
import scalafix.v1.XtensionSeqPatch

class Example extends SemanticRule("Example") {
override def fix(implicit
doc: SemanticDocument
): Patch = {
doc.input match {
case f: Input.VirtualFile
if f.path.contains("") =>
Patch.empty
case _ =>
doc.tree.collect {
case t @ Defn.Def.After_4_7_3(
Nil,
Term.Name("a"),
Nil,
None,
Term.Name("b")
) =>
Patch.lint(
Diagnostic(
id = "",
message = "",
position = t.pos,
explanation = "",
severity = LintSeverity.Warning
)
)
}.asPatch
}
}
}

35 changes: 35 additions & 0 deletions localServer/src/test/resources/path-filter/syntactic.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package fix

import scala.meta.Defn
import scala.meta.Term
import scala.meta.inputs.Input
import scala.meta.transversers._
import scalafix.Patch
import scalafix.lint.Diagnostic
import scalafix.lint.LintSeverity
import scalafix.v1.SyntacticDocument
import scalafix.v1.SyntacticRule
import scalafix.v1.XtensionSeqPatch

class Example extends SyntacticRule("Example") {
override def fix(implicit doc: SyntacticDocument): Patch = {
doc.input match {
case f: Input.VirtualFile if f.path.contains("") =>
Patch.empty
case _ =>
doc.tree.collect {
case t @ Defn.Def.After_4_7_3(Nil, Term.Name("a"), Nil, None, Term.Name("b")) =>
Patch.lint(
Diagnostic(
id = "",
message = "",
position = t.pos,
explanation = "",
severity = LintSeverity.Warning
)
)
}.asPatch
}
}
}

13 changes: 13 additions & 0 deletions localServer/src/test/scala/scalameta_ast/IntegrationTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ abstract class IntegrationTest(
input.press("\n")
}

private def pathFilter(page: Page): Locator = {
getById(page, AriaRole.CHECKBOX, "path_filter")
}

private def formatOutput(page: Page): Locator = {
getById(page, AriaRole.CHECKBOX, "format")
}
Expand Down Expand Up @@ -603,4 +607,13 @@ abstract class IntegrationTest(
pending
}
}

"path filter" in withBrowser { page =>
changeOutputType(page, "semantic")
pathFilter(page).check()
assert(output(page).textContent() == fromResource("path-filter/semantic.txt"))
changeOutputType(page, "syntactic")
formatOutput(page).uncheck()
assert(output(page).textContent() == fromResource("path-filter/syntactic.txt"))
}
}
15 changes: 15 additions & 0 deletions sources/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ const initialOutputType = getFromStorageOr("output_type", "raw");
const initialFormat = getBoolFromStorageOr("format", true);
const initialWildcardImport = getBoolFromStorageOr("wildcard_import", false);
const initialExplanation = getBoolFromStorageOr("explanation", true);
const initialPathFilter = getBoolFromStorageOr("path_filter", false);
const initialRemoveNewFields = getBoolFromStorageOr("remove_new_fields", false);
const initialInitialExtractor = getBoolFromStorageOr(
"initial_extractor",
Expand All @@ -107,6 +108,7 @@ const App = () => {
const [format, setFormat] = useState(initialFormat);
const [wildcardImport, setWildcardImport] = useState(initialWildcardImport);
const [explanation, setExplanation] = useState(initialExplanation);
const [pathFilter, setPathFilter] = useState(initialPathFilter);
const [removeNewFields, setRemoveNewFields] = useState(
initialRemoveNewFields,
);
Expand Down Expand Up @@ -148,6 +150,7 @@ const App = () => {
removeNewFields,
initialExtractor,
explanation,
pathFilter,
);

if (r.ast == null || format === false) {
Expand Down Expand Up @@ -216,6 +219,7 @@ const App = () => {
["remove_new_fields", removeNewFields],
["initial_extractor", initialExtractor],
["explanation", explanation],
["path_filter", pathFilter],
].forEach(([key, val]) => {
if (val.toString().length <= 1024) {
localStorage.setItem(key, val);
Expand Down Expand Up @@ -463,6 +467,17 @@ const App = () => {
/>
<label for="explanation">explanation</label>
</div>
<div>
<input
type="checkbox"
name="path_filter"
id="path_filter"
disabled=${disableScalafixRuleTemplateInput}
checked=${pathFilter}
onChange=${(e) => setPathFilter(e.target.checked)}
/>
<label for="path_filter">path filter</label>
</div>
<div class="row">
<div>
<label for="patch"
Expand Down

0 comments on commit b0c82f8

Please sign in to comment.