Skip to content

Commit 408e517

Browse files
committed
fix: range of token
1 parent 57cfa2c commit 408e517

File tree

6 files changed

+79
-78
lines changed

6 files changed

+79
-78
lines changed

src/ast/node/function.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl Node for FuncDefNode {
3737
format_res.push_str(&doc_str);
3838
format_res.push_str(&prefix.repeat(tabs));
3939
format_res.push_str("fn ");
40-
format_res.push_str(&self.typenode.id.split("::").last().unwrap());
40+
format_res.push_str(&self.typenode.id.name.split("::").last().unwrap());
4141
format_res.push_str("(");
4242
format_res.push_str(&params_print);
4343
format_res.push_str(") ");
@@ -62,7 +62,7 @@ impl Node for FuncDefNode {
6262
tab(tabs, line.clone(), end);
6363
println!("FuncDefNode");
6464
tab(tabs + 1, line.clone(), false);
65-
println!("id: {}", self.typenode.id);
65+
println!("id: {}", self.typenode.id.name);
6666
for c in self.typenode.doc.iter() {
6767
c.print(tabs + 1, false, line.clone());
6868
}
@@ -83,7 +83,7 @@ impl Node for FuncDefNode {
8383
let mut para_pltypes = Vec::new();
8484
let mut para_names = Vec::new();
8585
let mut param_ditypes = Vec::new();
86-
ctx.push_semantic_token(self.typenode.range, SemanticTokenType::FUNCTION, 0);
86+
ctx.push_semantic_token(self.typenode.id.range, SemanticTokenType::FUNCTION, 0);
8787
for para in self.typenode.paralist.iter() {
8888
ctx.push_semantic_token(para.id.range, SemanticTokenType::PARAMETER, 0);
8989
ctx.push_semantic_token(para.tp.range(), SemanticTokenType::TYPE, 0);
@@ -105,7 +105,7 @@ impl Node for FuncDefNode {
105105
}
106106
}
107107
ctx.push_semantic_token(self.typenode.ret.range(), SemanticTokenType::TYPE, 0);
108-
let res = ctx.get_type(self.typenode.id.as_str(), self.range);
108+
let res = ctx.get_type(self.typenode.id.name.as_str(), self.range);
109109
if res.is_err() {
110110
let diag = res.unwrap_err();
111111
ctx.add_diag(diag.clone());
@@ -121,7 +121,7 @@ impl Node for FuncDefNode {
121121
);
122122
let subprogram = ctx.dibuilder.create_function(
123123
ctx.diunit.get_file().as_debug_info_scope(),
124-
self.typenode.id.as_str(),
124+
self.typenode.id.name.as_str(),
125125
None,
126126
ctx.diunit.get_file(),
127127
self.range.start.line as u32,
@@ -220,7 +220,7 @@ impl Node for FuncDefNode {
220220
}
221221
// emit body
222222
ctx.builder.unset_current_debug_location();
223-
if self.typenode.id == "main" {
223+
if self.typenode.id.name == "main" {
224224
if let Some(inst) = allocab.get_first_instruction() {
225225
ctx.builder.position_at(allocab, &inst);
226226
ctx.nodebug_builder.position_at(allocab, &inst);
@@ -347,7 +347,7 @@ impl Node for FuncCallNode {
347347
#[range]
348348
#[derive(Clone, PartialEq, Eq, Debug)]
349349
pub struct FuncTypeNode {
350-
pub id: String,
350+
pub id: Box<VarNode>,
351351
pub paralist: Vec<Box<TypedIdentifierNode>>,
352352
pub ret: Box<TypeNodeEnum>,
353353
pub doc: Vec<Box<NodeEnum>>,
@@ -358,7 +358,7 @@ impl FuncTypeNode {
358358
&'a mut self,
359359
ctx: &mut crate::ast::ctx::Ctx<'a, 'ctx>,
360360
) -> Result<FunctionValue<'ctx>, PLDiag> {
361-
if let Ok(_) = ctx.get_type(self.id.as_str(), self.range) {
361+
if let Ok(_) = ctx.get_type(&self.id.name.as_str(), self.range) {
362362
return Err(ctx.add_err(self.range, ErrorCode::REDEFINE_SYMBOL));
363363
}
364364
let mut param_pltypes = Vec::new();
@@ -386,32 +386,33 @@ impl FuncTypeNode {
386386
}
387387
let refs = vec![];
388388
let ftp = FNType {
389-
name: self.id.clone(),
389+
name: self.id.name.clone(),
390390
ret_pltype: Box::new(self.ret.get_type(ctx)?),
391391
param_pltypes,
392392
param_name,
393393
range: self.range,
394394
refs: Rc::new(RefCell::new(refs)),
395395
doc: self.doc.clone(),
396396
llvmname: if self.declare {
397-
self.id.clone()
397+
self.id.name.clone()
398398
} else {
399-
ctx.plmod.get_full_name(&self.id)
399+
ctx.plmod.get_full_name(&self.id.name)
400400
},
401401
method: receiver.is_some(),
402402
};
403403
if let Some(mut receiver) = receiver {
404-
receiver
405-
.methods
406-
.insert(self.id.split("::").last().unwrap().to_string(), ftp.clone());
404+
receiver.methods.insert(
405+
self.id.name.split("::").last().unwrap().to_string(),
406+
ftp.clone(),
407+
);
407408
receivertp
408409
.unwrap()
409410
.replace_type(ctx, PLType::STRUCT(receiver));
410411
}
411412
let res = ftp.get_or_insert_fn(ctx);
412413
let pltype = PLType::FN(ftp);
413414
ctx.set_if_refs_tp(&pltype, self.range);
414-
ctx.add_type(self.id.clone(), pltype.clone(), self.range)?;
415+
ctx.add_type(self.id.name.clone(), pltype.clone(), self.range)?;
415416
ctx.add_doc_symbols(pltype);
416417
Ok(res)
417418
}

src/ast/node/types.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ impl TypedIdentifierNode {
184184
#[derive(Clone, PartialEq, Eq, Debug)]
185185
pub struct StructDefNode {
186186
pub doc: Vec<Box<NodeEnum>>,
187-
pub id: String,
187+
pub id: Box<VarNode>,
188188
pub fields: Vec<(Box<TypedIdentifierNode>, bool)>,
189189
}
190190

@@ -199,7 +199,7 @@ impl Node for StructDefNode {
199199
format_res.push_str(&doc_str);
200200
format_res.push_str(&prefix.repeat(tabs));
201201
format_res.push_str("struct ");
202-
format_res.push_str(&self.id);
202+
format_res.push_str(&self.id.name);
203203
format_res.push_str(" {");
204204
for (field, _i) in &self.fields {
205205
format_res.push_str(&field.format(tabs + 1, prefix));
@@ -215,7 +215,7 @@ impl Node for StructDefNode {
215215
tab(tabs, line.clone(), end);
216216
println!("StructDefNode");
217217
tab(tabs + 1, line.clone(), false);
218-
println!("id: {}", self.id);
218+
println!("id: {}", self.id.name);
219219
for c in self.doc.iter() {
220220
c.print(tabs + 1, false, line.clone());
221221
}
@@ -230,7 +230,7 @@ impl Node for StructDefNode {
230230
for c in self.doc.iter() {
231231
ctx.push_semantic_token(c.range(), SemanticTokenType::COMMENT, 0);
232232
}
233-
ctx.push_semantic_token(self.range, SemanticTokenType::STRUCT, 0);
233+
ctx.push_semantic_token(self.id.range, SemanticTokenType::STRUCT, 0);
234234
for (field, has_semi) in self.fields.iter() {
235235
ctx.push_semantic_token(field.id.range, SemanticTokenType::PROPERTY, 0);
236236
field.tp.emit_highlight(ctx);
@@ -248,7 +248,7 @@ impl Node for StructDefNode {
248248
impl StructDefNode {
249249
pub fn add_to_symbols<'a, 'ctx>(&'a self, ctx: &mut Ctx<'a, 'ctx>) {
250250
let stu = PLType::STRUCT(STType {
251-
name: self.id.clone(),
251+
name: self.id.name.clone(),
252252
path: ctx.plmod.path.clone(),
253253
fields: FxHashMap::default(),
254254
ordered_fields: vec![],
@@ -258,15 +258,11 @@ impl StructDefNode {
258258
methods: FxHashMap::default(),
259259
});
260260
ctx.context
261-
.opaque_struct_type(&ctx.plmod.get_full_name(&self.id));
262-
_ = ctx.add_type(self.id.clone(), stu, self.range);
261+
.opaque_struct_type(&ctx.plmod.get_full_name(&self.id.name));
262+
_ = ctx.add_type(self.id.name.clone(), stu, self.range);
263263
}
264264

265265
pub fn emit_struct_def<'a, 'ctx>(&'a self, ctx: &mut Ctx<'a, 'ctx>) -> Result<(), PLDiag> {
266-
// if ctx.get_type(self.id.as_str(), self.range).is_ok() {
267-
// ctx.add_err(self.range, ErrorCode::REDEFINE_SYMBOL);
268-
// return Ok(());
269-
// }
270266
let mut fields = FxHashMap::<String, Field>::default();
271267
let mut order_fields = Vec::<Field>::new();
272268
let mut i = 0;
@@ -296,7 +292,7 @@ impl StructDefNode {
296292

297293
i = i + 1;
298294
}
299-
let name = self.id.as_str();
295+
let name = self.id.name.as_str();
300296
let st = ctx
301297
.module
302298
.get_struct_type(&ctx.plmod.get_full_name(name))

src/nomparser/function.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,24 @@ pub fn function_def(input: Span) -> IResult<Span, Box<TopLevel>> {
6464
tag_token(TokenType::RPAREN),
6565
type_name,
6666
alt((
67-
map_res(statement_block, |b| Ok::<_, Error>(Some(b))),
68-
map_res(tag_token(TokenType::SEMI), |_| Ok::<_, Error>(None)),
67+
map_res(statement_block, |b| {
68+
Ok::<_, Error>((Some(b.clone()), b.range))
69+
}),
70+
map_res(tag_token(TokenType::SEMI), |(_, range)| {
71+
Ok::<_, Error>((None, range))
72+
}),
6973
)),
7074
)),
71-
|(doc, _, id, _, paras, _, ret, body)| {
75+
|(doc, (_, start), id, _, paras, _, ret, (body, end))| {
7276
let mut paralist = vec![];
73-
let range = id.range;
77+
let range = start.start.to(end.end);
7478
if let Some(para) = paras {
7579
paralist.push(para.0);
7680
paralist.extend(para.1);
7781
}
7882
let node = FuncDefNode {
7983
typenode: FuncTypeNode {
80-
id: id.name,
84+
id,
8185
paralist,
8286
ret,
8387
range,

src/nomparser/program.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub fn program(input: Span) -> IResult<Span, Box<NodeEnum>> {
5959
let imname = im.target.format(0, "");
6060
let target = *im.target.clone();
6161
for mth in im.methods.iter_mut() {
62-
mth.typenode.id = format!("|{}::{}", imname, mth.typenode.id);
62+
mth.typenode.id.name = format!("|{}::{}", imname, mth.typenode.id.name);
6363
mth.typenode.paralist.insert(
6464
0,
6565
Box::new(TypedIdentifierNode {

src/nomparser/statement.rs

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use nom::{
55
bytes::complete::tag,
66
combinator::{map_res, opt, recognize},
77
multi::many0,
8-
sequence::{delimited, pair, preceded, terminated, tuple},
8+
sequence::{delimited, pair, terminated, tuple},
99
IResult,
1010
};
1111
use nom_locate::LocatedSpan;
@@ -45,27 +45,22 @@ fn empty_statement(input: Span) -> IResult<Span, Box<NodeEnum>> {
4545
}"
4646
)]
4747
pub fn statement_block(input: Span) -> IResult<Span, StatementsNode> {
48-
delspace(delimited(
49-
del_newline_or_space!(tag_token(TokenType::LBRACE)),
50-
statements,
51-
del_newline_or_space!(tag_token(TokenType::RBRACE)),
48+
delspace(map_res(
49+
tuple((
50+
del_newline_or_space!(tag_token(TokenType::LBRACE)),
51+
many0(del_newline_or_space!(statement)),
52+
del_newline_or_space!(tag_token(TokenType::RBRACE)),
53+
)),
54+
|((_, start), v, (_, end))| {
55+
let range = start.start.to(end.end);
56+
Ok::<_, Error>(StatementsNode {
57+
statements: v,
58+
range,
59+
})
60+
},
5261
))(input)
5362
}
5463

55-
fn statements(input: Span) -> IResult<Span, StatementsNode> {
56-
map_res(many0(del_newline_or_space!(statement)), |v| {
57-
let mut range = Range::new(input, input);
58-
let la = v.last();
59-
if let Some(la) = la {
60-
range = range.start.to(la.range().end);
61-
}
62-
Ok::<_, Error>(StatementsNode {
63-
statements: v,
64-
range,
65-
})
66-
})(input)
67-
}
68-
6964
/// ```ebnf
7065
/// statement =
7166
/// | new_variable newline
@@ -102,29 +97,34 @@ fn statement(input: Span) -> IResult<Span, Box<NodeEnum>> {
10297

10398
#[test_parser("let a = 1")]
10499
pub fn new_variable(input: Span) -> IResult<Span, Box<NodeEnum>> {
105-
delspace(preceded(
106-
tag_token(TokenType::LET),
107-
map_res(
108-
tuple((
109-
identifier,
110-
opt(pair(tag_token(TokenType::COLON), type_name)),
111-
opt(pair(tag_token(TokenType::ASSIGN), logic_exp)),
112-
)),
113-
|(a, tp, v)| {
114-
let range = a.range();
115-
let tp = tp.map(|(_, tp)| tp);
116-
let exp = v.map(|(_, exp)| exp);
117-
res_enum(
118-
DefNode {
119-
var: *a,
120-
tp,
121-
exp,
122-
range,
123-
}
124-
.into(),
125-
)
126-
},
127-
),
100+
delspace(map_res(
101+
tuple((
102+
tag_token(TokenType::LET),
103+
identifier,
104+
opt(pair(tag_token(TokenType::COLON), type_name)),
105+
opt(pair(tag_token(TokenType::ASSIGN), logic_exp)),
106+
)),
107+
|((_, start), a, tp, v)| {
108+
let mut end = a.range.end;
109+
if tp.is_some() {
110+
end = tp.as_ref().unwrap().1.range().end;
111+
}
112+
if v.is_some() {
113+
end = v.as_ref().unwrap().1.range().end;
114+
}
115+
let range = start.start.to(end);
116+
let tp = tp.map(|(_, tp)| tp);
117+
let exp = v.map(|(_, exp)| exp);
118+
res_enum(
119+
DefNode {
120+
var: *a,
121+
tp,
122+
exp,
123+
range,
124+
}
125+
.into(),
126+
)
127+
},
128128
))(input)
129129
}
130130

src/nomparser/structure.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ pub fn struct_def(input: Span) -> IResult<Span, Box<TopLevel>> {
3939
))),
4040
del_newline_or_space!(tag_token(TokenType::RBRACE)),
4141
)),
42-
|(doc, _, id, _, fields, _)| {
43-
let range = id.range;
42+
|(doc, (_, start), id, _, fields, (_, end))| {
43+
let range = start.start.to(end.end);
4444
let mut fieldlist = vec![];
4545
for mut f in fields {
4646
f.0.doc = None;
@@ -53,7 +53,7 @@ pub fn struct_def(input: Span) -> IResult<Span, Box<TopLevel>> {
5353
}
5454
Ok::<_, Error>(Box::new(TopLevel::StructDef(StructDefNode {
5555
doc,
56-
id: id.name,
56+
id,
5757
fields: fieldlist,
5858
range,
5959
})))

0 commit comments

Comments
 (0)