Skip to content

Commit

Permalink
Showing 6 changed files with 76 additions and 14 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/code-quality.yaml
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ jobs:
runs-on: namespace-profile-standard-ubuntu22-amd64
steps:
- name: clone code
uses: namespacelabs/nscloud-checkout-action@v4
uses: namespacelabs/nscloud-checkout-action@v5
with:
submodules: recursive
- name: Install Protoc
6 changes: 3 additions & 3 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ jobs:
BUILD_PLATFORM: amd64
steps:
- name: clone code
uses: namespacelabs/nscloud-checkout-action@v4
uses: namespacelabs/nscloud-checkout-action@v5
with:
submodules: recursive
- name: Install Protoc
@@ -75,7 +75,7 @@ jobs:
id-token: "write"
steps:
- name: clone code
uses: namespacelabs/nscloud-checkout-action@v4
uses: namespacelabs/nscloud-checkout-action@v5
with:
submodules: recursive
- name: install Rust
@@ -99,7 +99,7 @@ jobs:
runs-on: namespace-profile-standard-ubuntu22-amd64
steps:
- name: clone code
uses: namespacelabs/nscloud-checkout-action@v4
uses: namespacelabs/nscloud-checkout-action@v5
with:
submodules: recursive
- name: install Rust
7 changes: 6 additions & 1 deletion crates/core/src/pattern_compiler/within_compiler.rs
Original file line number Diff line number Diff line change
@@ -20,7 +20,12 @@ impl NodeCompiler for WithinCompiler {
let within = node
.child_by_field_name("pattern")
.ok_or_else(|| anyhow!("missing pattern of pattern within"))?;

let within = PatternCompiler::from_node(&within, context)?;
Ok(Within::new(within))
let until = node
.child_by_field_name("until")
.map(|n| PatternCompiler::from_node(&n, context))
.transpose()?;
Ok(Within::new(within, until))
}
}
50 changes: 50 additions & 0 deletions crates/core/src/test.rs
Original file line number Diff line number Diff line change
@@ -7398,6 +7398,56 @@ fn simple_until() {
.unwrap();
}

#[test]
fn within_until() {
run_test_expected({
TestArgExpected {
pattern: r#"
|language js
|
|contains bubble `foo($x)` => `bar($x)` where {
| $x <: within `wrapped($_)` until `stop($_)`
|}
|"#
.trim_margin()
.unwrap(),
source: r#"
|// not match:
|foo(10)
|// this will match, since it is inside a wrapped
|wrapped(() => {
| foo(11)
|})
|// this will not match, since the wrap is outside the stop
|wrapped(() => {
| stop(() => {
| foo(12)
| })
|})
|"#
.trim_margin()
.unwrap(),
expected: r#"
|// not match:
|foo(10)
|// this will match, since it is inside a wrapped
|wrapped(() => {
| bar(11)
|})
|// this will not match, since the wrap is outside the stop
|wrapped(() => {
| stop(() => {
| foo(12)
| })
|})
|"#
.trim_margin()
.unwrap(),
}
})
.unwrap();
}

#[test]
fn capitalize_no_args() {
let pattern = r#"
23 changes: 15 additions & 8 deletions crates/grit-pattern-matcher/src/pattern/within.rs
Original file line number Diff line number Diff line change
@@ -10,11 +10,12 @@ use grit_util::{error::GritResult, AnalysisLogs, AstNode};
#[derive(Debug, Clone)]
pub struct Within<Q: QueryContext> {
pub pattern: Pattern<Q>,
until: Option<Pattern<Q>>,
}

impl<Q: QueryContext> Within<Q> {
pub fn new(pattern: Pattern<Q>) -> Self {
Self { pattern }
pub fn new(pattern: Pattern<Q>, until: Option<Pattern<Q>>) -> Self {
Self { pattern, until }
}
}

@@ -50,15 +51,21 @@ impl<Q: QueryContext> Matcher<Q> for Within<Q> {
};
for n in node.ancestors() {
let state = cur_state.clone();
if self.pattern.execute(
&ResolvedPattern::from_node_binding(n),
&mut cur_state,
context,
logs,
)? {
let resolved = ResolvedPattern::from_node_binding(n);
if self
.pattern
.execute(&resolved, &mut cur_state, context, logs)?
{
did_match = true;
// We still traverse upwards, so side effects can be applied to all ancestors
} else {
cur_state = state;

if let Some(until) = &self.until {
if until.execute(&resolved, &mut cur_state, context, logs)? {
break;
}
}
}
}
if did_match {
2 changes: 1 addition & 1 deletion vendor/tree-sitter-gritql

0 comments on commit 802c2c0

Please sign in to comment.