Skip to content

Commit 9b69a5b

Browse files
committed
refactor: ast node range doesn't include trivia
1 parent 0afc4c4 commit 9b69a5b

6 files changed

Lines changed: 112 additions & 9 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/ast/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ alloy_workspace = { path = "../workspace" }
1212
salsa = { workspace = true }
1313
ordered-float = { workspace = true }
1414
text-size = { workspace = true }
15+
rowan = { workspace = true }
1516

1617
[dev-dependencies]
1718
alloy_test_harness = {path = "../test_harness"}

compiler/ast/src/ast.rs

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ macro_rules! ast_token {
1919
fn syntax(&self) -> SyntaxElement {
2020
self.0.clone().into()
2121
}
22+
23+
fn range(&self) -> TextRange {
24+
self.syntax().text_range()
25+
}
2226
}
2327

2428
impl fmt::Debug for $kind {
@@ -49,6 +53,30 @@ macro_rules! ast_node {
4953
fn syntax(&self) -> SyntaxElement {
5054
self.0.clone().into()
5155
}
56+
57+
fn range(&self) -> TextRange {
58+
let total_range = self.syntax().text_range();
59+
60+
self.0
61+
.preorder_with_tokens()
62+
.filter_map(|event| match event {
63+
rowan::WalkEvent::Enter(element) => {
64+
match element {
65+
SyntaxElement::Node(_) => None, // Skip nodes in this pass
66+
SyntaxElement::Token(t) => Some(t),
67+
}
68+
},
69+
_ => None,
70+
})
71+
.filter_map(|token| {
72+
if !token.kind().is_trivia() {
73+
return Some(token.text_range());
74+
}
75+
None
76+
})
77+
.reduce(|acc, range| acc.cover(range))
78+
.unwrap_or(total_range)
79+
}
5280
}
5381

5482
impl fmt::Debug for $kind {
@@ -82,6 +110,12 @@ macro_rules! ast_union_node {
82110
$( Self::$kind(s) => s.syntax(), )+
83111
}
84112
}
113+
114+
fn range(&self) -> TextRange {
115+
match self {
116+
$( Self::$kind(kind) => kind.range(), )+
117+
}
118+
}
85119
}
86120
};
87121

@@ -107,6 +141,13 @@ macro_rules! ast_union_node {
107141
$( Self::$kind(s) => s.syntax(), )+
108142
}
109143
}
144+
145+
fn range(&self) -> TextRange {
146+
match self {
147+
Self::$else(kind) => kind.range(),
148+
$( Self::$kind(kind) => kind.range(), )+
149+
}
150+
}
110151
}
111152
};
112153
}
@@ -165,9 +206,7 @@ pub trait AstElement: Sized {
165206
}
166207
}
167208

168-
fn range(&self) -> TextRange {
169-
self.syntax().text_range()
170-
}
209+
fn range(&self) -> TextRange;
171210
}
172211

173212
#[derive(Debug)]

compiler/ast/src/ast/expression.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ impl AstElement for BinaryOp {
6363
fn syntax(&self) -> SyntaxElement {
6464
self.0.clone().into()
6565
}
66+
67+
fn range(&self) -> TextRange {
68+
self.syntax().text_range()
69+
}
6670
}
6771

6872
ast_node!(VariableRef, fields: [name]);

compiler/hir/hir_def/src/tests/repl_line_lowering_errors/trait__error_multiple_self_typevars.test

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import std::{functor, debug}
22

33
trait TestTrait1 where
4-
self = functor::Functor
5-
self = debug::Debug
4+
self = functor::Functor -- first
5+
self = debug::Debug -- second
66
end
77
===
88
HirModule {
@@ -44,7 +44,7 @@ HirModule {
4444
members: [],
4545
},
4646
"name": "TestTrait1",
47-
"range": 30..108,
47+
"range": 30..131,
4848
"scope_id": Idx::<Scope>(0),
4949
},
5050
},
@@ -94,11 +94,11 @@ HirModule {
9494
kind: MultipleSelfTypeVariablesInTraitDefinition {
9595
trait_name: "TestTrait1",
9696
ranges: [
97-
57..85,
98-
85..105,
97+
57..94,
98+
94..128,
9999
],
100100
},
101-
range: 30..108,
101+
range: 30..131,
102102
},
103103
],
104104
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import std::{functor, debug}
2+
3+
trait TestTrait1 where
4+
self = functor::Functor -- first
5+
self = debug::Debug -- second
6+
end
7+
===
8+
SourceFile@0..131
9+
ImportDef@0..30
10+
ImportKw@0..6 "import"
11+
Whitespace@6..7 " "
12+
ImportDefSegment@7..10
13+
Ident@7..10 "std"
14+
DoubleColon@10..12 "::"
15+
ImportDefGroup@12..30
16+
LBrace@12..13 "{"
17+
ImportDefSegment@13..20
18+
Ident@13..20 "functor"
19+
Comma@20..21 ","
20+
Whitespace@21..22 " "
21+
ImportDefSegment@22..27
22+
Ident@22..27 "debug"
23+
RBrace@27..28 "}"
24+
Whitespace@28..30 "\n\n"
25+
TraitDef@30..131
26+
TraitKw@30..35 "trait"
27+
Whitespace@35..36 " "
28+
Ident@36..46 "TestTrait1"
29+
Whitespace@46..47 " "
30+
WhereKw@47..52 "where"
31+
Whitespace@52..57 "\n "
32+
SelfTypeVariable@57..94
33+
SelfKw@57..61 "self"
34+
Whitespace@61..62 " "
35+
Equals@62..63 "="
36+
Whitespace@63..64 " "
37+
TypeVariableTraitConstraint@64..94
38+
Path@64..94
39+
Ident@64..71 "functor"
40+
DoubleColon@71..73 "::"
41+
Ident@73..80 "Functor"
42+
Whitespace@80..81 " "
43+
Comment@81..89 "-- first"
44+
Whitespace@89..94 "\n "
45+
SelfTypeVariable@94..128
46+
SelfKw@94..98 "self"
47+
Whitespace@98..99 " "
48+
Equals@99..100 "="
49+
Whitespace@100..101 " "
50+
TypeVariableTraitConstraint@101..128
51+
Path@101..128
52+
Ident@101..106 "debug"
53+
DoubleColon@106..108 "::"
54+
Ident@108..113 "Debug"
55+
Whitespace@113..118 " "
56+
Comment@118..127 "-- second"
57+
Whitespace@127..128 "\n"
58+
EndKw@128..131 "end"

0 commit comments

Comments
 (0)