From 08a31bcce208f9aa2395f0d0e51dcb359bb7122a Mon Sep 17 00:00:00 2001 From: Takashi Yoneuchi Date: Thu, 30 Sep 2021 00:53:52 +0900 Subject: [PATCH] bugfix: fix handling of trailing elipsis operator (#91) Signed-off-by: Takashi Yoneuchi --- src/cli/tests/ruleset/hcl/comment/match.tf | 8 ++--- .../tests/ruleset/hcl/comment/ruleset.yaml | 2 +- src/cli/tests/ruleset/hcl/comment/unmatch.tf | 2 +- src/cli/tests/ruleset/hcl/mod.rs | 2 +- src/core/matcher/tree.rs | 36 +++++++++++++++---- third_party/tree-sitter-hcl | 2 +- third_party/tree-sitter-hcl-query | 2 +- 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/cli/tests/ruleset/hcl/comment/match.tf b/src/cli/tests/ruleset/hcl/comment/match.tf index 707b9d1..6b8add2 100644 --- a/src/cli/tests/ruleset/hcl/comment/match.tf +++ b/src/cli/tests/ruleset/hcl/comment/match.tf @@ -1,19 +1,19 @@ -resource "aws_ebs_volume" "volume" { +resource "comment_test" "volume" { a = 1 // hoge b = 1 } -resource "aws_ebs_volume" "volume" { +resource "comment_test" "volume" { a = 1 // hoge } -resource "aws_ebs_volume" "volume" { +resource "comment_test" "volume" { // hoge b = 1 } -resource "aws_ebs_volume" "volume" { +resource "comment_test" "volume" { // hoge } diff --git a/src/cli/tests/ruleset/hcl/comment/ruleset.yaml b/src/cli/tests/ruleset/hcl/comment/ruleset.yaml index 053cd2c..cbd2b8c 100644 --- a/src/cli/tests/ruleset/hcl/comment/ruleset.yaml +++ b/src/cli/tests/ruleset/hcl/comment/ruleset.yaml @@ -5,7 +5,7 @@ rules: message: | test pattern: | - resource "aws_ebs_volume" :[NAME] { + resource "comment_test" :[NAME] { :[...] // hoge :[...] diff --git a/src/cli/tests/ruleset/hcl/comment/unmatch.tf b/src/cli/tests/ruleset/hcl/comment/unmatch.tf index 3fa0a2c..20944cb 100644 --- a/src/cli/tests/ruleset/hcl/comment/unmatch.tf +++ b/src/cli/tests/ruleset/hcl/comment/unmatch.tf @@ -1,3 +1,3 @@ -resource "aws_ebs_volume" "volume" { +resource "comment_test" "volume" { size = 1 } diff --git a/src/cli/tests/ruleset/hcl/mod.rs b/src/cli/tests/ruleset/hcl/mod.rs index a8f35fc..1865c31 100644 --- a/src/cli/tests/ruleset/hcl/mod.rs +++ b/src/cli/tests/ruleset/hcl/mod.rs @@ -3,6 +3,6 @@ mod tests { ruleset_test! { unencrypted_ebs: [("ruleset.yaml", "match.tf", Ok(2), None), ("ruleset.yaml", "unmatch.tf", Ok(0), None)], uncontrolled_ebs_encryption_key: [("ruleset.yaml", "match.tf", Ok(2), None), ("ruleset.yaml", "unmatch.tf", Ok(0), None)], - // comment: [("ruleset.yaml", "match.tf", Ok(3), None), ("ruleset.yaml", "unmatch.tf", Ok(0), None)], + comment: [("ruleset.yaml", "match.tf", Ok(4), None), ("ruleset.yaml", "unmatch.tf", Ok(0), None)], } } diff --git a/src/core/matcher/tree.rs b/src/core/matcher/tree.rs index 4b55ddd..fd4c7fa 100644 --- a/src/core/matcher/tree.rs +++ b/src/core/matcher/tree.rs @@ -87,19 +87,44 @@ impl<'tree, 'query, T: Queryable> TreeMatcher<'tree, 'query, T> { )) } + (None, Some(qchild)) => match qchild.kind() { + NodeType::Ellipsis => { + let nodes = tsibilings[..tidx.min(tsibilings.len())].to_vec(); + result.push(( + MatcherState { + subtree: ConsecutiveNodes::try_from(nodes).ok(), + captures, + }, + None, + )) + } + NodeType::EllipsisMetavariable(mid) => { + let nodes = tsibilings[..tidx.min(tsibilings.len())].to_vec(); + result.push(( + MatcherState { + subtree: ConsecutiveNodes::try_from(nodes).ok(), + captures: [ + captures.clone(), + vec![(mid, CaptureItem::from(vec![]))], + ] + .concat(), + }, + None, + )) + } + _ => {} + }, (Some(tchild), Some(qchild)) => match qchild.kind() { NodeType::Ellipsis => { - let mut captured_nodes = vec![]; + // NOTE: this loop must end with `tsibilings.len()` for tcidx in tidx..=tsibilings.len() { queue.push((tcidx, qidx + 1, captures.clone())); - if let Some(tchild) = tsibilings.get(tcidx) { - captured_nodes.push(tchild); - } } } NodeType::EllipsisMetavariable(mid) => { let mut captured_nodes = vec![]; - for tcidx in tidx..(tsibilings.len() + 1) { + // NOTE: this loop must end with `tsibilings.len()` + for tcidx in tidx..=tsibilings.len() { queue.push(( tcidx, qidx + 1, @@ -124,7 +149,6 @@ impl<'tree, 'query, T: Queryable> TreeMatcher<'tree, 'query, T> { } } }, - _ => (), } } result diff --git a/third_party/tree-sitter-hcl b/third_party/tree-sitter-hcl index a4c902c..81276eb 160000 --- a/third_party/tree-sitter-hcl +++ b/third_party/tree-sitter-hcl @@ -1 +1 @@ -Subproject commit a4c902cff89c53bc707c09dbba7385f2db4b4d6a +Subproject commit 81276ebd7d9bd0626c17306a27c9644cad7ae2d7 diff --git a/third_party/tree-sitter-hcl-query b/third_party/tree-sitter-hcl-query index 89982ca..27fdb96 160000 --- a/third_party/tree-sitter-hcl-query +++ b/third_party/tree-sitter-hcl-query @@ -1 +1 @@ -Subproject commit 89982ca2654c8fcfbc9527aa77df84eed2d47da0 +Subproject commit 27fdb9661077e80df2db02fc12ac31e19461aa42