Skip to content

Commit

Permalink
[skip ci] yolo
Browse files Browse the repository at this point in the history
  • Loading branch information
morgante committed Oct 16, 2024
1 parent 1faf84c commit 926f851
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 11 deletions.
7 changes: 6 additions & 1 deletion crates/core/src/pattern_compiler/within_compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
2 changes: 1 addition & 1 deletion crates/core/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7406,7 +7406,7 @@ fn within_until() {
|language js
|
|contains bubble `foo($x)` => `bar($x)` where {
| $x <: within `wrapped($x)` until `stop($_)`
| $x <: within `wrapped($_)` until `stop($_)`
|}
|"#
.trim_margin()
Expand Down
23 changes: 15 additions & 8 deletions crates/grit-pattern-matcher/src/pattern/within.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
}
}

Expand Down Expand Up @@ -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;
break;
} else {
cur_state = state;

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

0 comments on commit 926f851

Please sign in to comment.