Route Scala and Rust through the structural matcher; fix root-wrapper unwrap
ober
8b254864da543a13c1cdfe14f82d4ec5a1c394c0
--- a/lib/semgrep/match/structural.sls +++ b/lib/semgrep/match/structural.sls @@ -571,6 +571,15 @@ [(go-language? language) (or (string=? type "source_file") (string=? type "expression_statement"))] + [(string=? language "java") + (or (string=? type "program") + (string=? type "expression_statement"))] + [(string=? language "scala") + (or (string=? type "compilation_unit") + (string=? type "expression_statement"))] + [(string=? language "rust") + (or (string=? type "source_file") + (string=? type "expression_statement"))] [else #f])) (def (normalized-pattern-root language root) (let loop ([current root] [owned '()]) --- a/lib/semgrep/parse/parse-target.sls +++ b/lib/semgrep/parse/parse-target.sls @@ -26,6 +26,8 @@ [(string=? canonical "go") 'go] [(string=? canonical "php") 'php] [(string=? canonical "java") 'java] + [(string=? canonical "scala") 'scala] + [(string=? canonical "rust") 'rust] [else (error 'parse-target-string "unsupported language in current MVP" --- a/lib/semgrep/scan.sls +++ b/lib/semgrep/scan.sls @@ -750,8 +750,6 @@ (string=? canonical "julia") (string=? canonical "kotlin") (string=? canonical "ruby") - (string=? canonical "rust") - (string=? canonical "scala") (string=? canonical "cpp")))) (def (c-language? language) (let ([canonical (or (canonical-language language) @@ -31276,6 +31274,10 @@ "$L[$I] = $R" "for $L in $R:\n ..." "def $F(..., $L = $R, ...):\n ...")] + [(string=? language "scala") + '("$L = $R" "$L[$I] = $R" "val $L = $R" "var $L = $R")] + [(string=? language "rust") + '("$L = $R" "$L[$I] = $R" "let $L = $R" "let mut $L = $R")] [else '("$L = $R" "$L[$I] = $R")])) (def (scan-implicit-assignment-propagators rule language path source target-root) --- a/src/.jerbuild-hashes +++ b/src/.jerbuild-hashes @@ -2,12 +2,12 @@ ("src/semgrep/result.ss" . "22D23E40B49BA529") ("src/semgrep/output/json.ss" . "293881CFA2ADB7BC") ("src/semgrep/lang.ss" . "6982E07679D20836") - ("src/semgrep/parse/parse-target.ss" . "DD1EF1A5E883A90D") - ("src/semgrep/scan.ss" . "4EA92FEDD236FE4F") - ("src/semgrep/schema/lang.ss" . "CAE2CA859C9A9FD0") - ("src/semgrep/rule.ss" . "E12C108153C181FA") + ("src/semgrep/parse/parse-target.ss" . "3FE8E8985B2E3461") + ("src/semgrep/scan.ss" . "70E81C1629B569BB") ("src/semgrep/fix.ss" . "2E5B65B1FEF3B2B1") ("src/semgrep/output/text.ss" . "BE476CB84B807FBA") - ("src/semgrep/match/structural.ss" . "DF9CD3E0C00E5D40") + ("src/semgrep/rule.ss" . "E12C108153C181FA") + ("src/semgrep/schema/lang.ss" . "CAE2CA859C9A9FD0") + ("src/semgrep/match/structural.ss" . "331D07881B8C8C56") ("src/semgrep/main.ss" . "A4EC9E7F2A09D25E") ("src/semgrep/cli.ss" . "EBDC4B1DAD3F13CC")) --- a/src/semgrep/match/structural.ss +++ b/src/semgrep/match/structural.ss @@ -595,6 +595,15 @@ [(go-language? language) (or (string=? type "source_file") (string=? type "expression_statement"))] + [(string=? language "java") + (or (string=? type "program") + (string=? type "expression_statement"))] + [(string=? language "scala") + (or (string=? type "compilation_unit") + (string=? type "expression_statement"))] + [(string=? language "rust") + (or (string=? type "source_file") + (string=? type "expression_statement"))] [else #f])) (def (normalized-pattern-root language root) --- a/src/semgrep/parse/parse-target.ss +++ b/src/semgrep/parse/parse-target.ss @@ -18,6 +18,8 @@ [(string=? canonical "go") 'go] [(string=? canonical "php") 'php] [(string=? canonical "java") 'java] + [(string=? canonical "scala") 'scala] + [(string=? canonical "rust") 'rust] [else (error 'parse-target-string "unsupported language in current MVP" language)]))) --- a/src/semgrep/scan.ss +++ b/src/semgrep/scan.ss @@ -822,8 +822,6 @@ (string=? canonical "julia") (string=? canonical "kotlin") (string=? canonical "ruby") - (string=? canonical "rust") - (string=? canonical "scala") (string=? canonical "cpp")))) (def (c-language? language) @@ -31254,6 +31252,18 @@ "$L[$I] = $R" "for $L in $R:\n ..." "def $F(..., $L = $R, ...):\n ...")] + [(string=? language "scala") + ;; Scala bindings are val/var definitions, not bare assignments. + '("$L = $R" + "$L[$I] = $R" + "val $L = $R" + "var $L = $R")] + [(string=? language "rust") + ;; Rust bindings are let declarations. + '("$L = $R" + "$L[$I] = $R" + "let $L = $R" + "let mut $L = $R")] [else '("$L = $R" "$L[$I] = $R")]))