Skip to content

Commit b511eba

Browse files
committed
fix: deconstruct assignment doesn't work on tuple
this commit disabled most of implicit cast logic to ensure the type inference logic is working as expected
1 parent f287dbc commit b511eba

File tree

11 files changed

+164
-57
lines changed

11 files changed

+164
-57
lines changed

src/ast/expects/trait_diag.pi.expect

Lines changed: 75 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,61 @@
3131
source: None,
3232
range: Range {
3333
start: Pos {
34-
line: 173,
34+
line: 174,
3535
column: 15,
36-
offset: 2475,
36+
offset: 2526,
3737
},
3838
end: Pos {
39-
line: 173,
39+
line: 174,
4040
column: 17,
41-
offset: 2477,
41+
offset: 2528,
42+
},
43+
},
44+
},
45+
},
46+
PLDiag {
47+
raw: PLDiagRaw {
48+
code: Err(
49+
TYPE_MISMATCH,
50+
),
51+
help: None,
52+
labels: [
53+
PLLabel {
54+
file: u!(""),
55+
txt: Some(
56+
(
57+
u!("expected type {}, real type {}"),
58+
[
59+
u!("**A"),
60+
u!("TestTrait"),
61+
],
62+
),
63+
),
64+
range: Range {
65+
start: Pos {
66+
line: 125,
67+
column: 5,
68+
offset: 1875,
69+
},
70+
end: Pos {
71+
line: 125,
72+
column: 7,
73+
offset: 1877,
74+
},
75+
},
76+
},
77+
],
78+
source: None,
79+
range: Range {
80+
start: Pos {
81+
line: 125,
82+
column: 5,
83+
offset: 1875,
84+
},
85+
end: Pos {
86+
line: 125,
87+
column: 7,
88+
offset: 1877,
4289
},
4390
},
4491
},
@@ -200,29 +247,29 @@
200247
),
201248
range: Range {
202249
start: Pos {
203-
line: 177,
250+
line: 178,
204251
column: 6,
205-
offset: 2488,
252+
offset: 2539,
206253
},
207254
end: Pos {
208-
line: 177,
255+
line: 178,
209256
column: 7,
210-
offset: 2489,
257+
offset: 2540,
211258
},
212259
},
213260
},
214261
],
215262
source: None,
216263
range: Range {
217264
start: Pos {
218-
line: 177,
265+
line: 178,
219266
column: 6,
220-
offset: 2488,
267+
offset: 2539,
221268
},
222269
end: Pos {
223-
line: 177,
270+
line: 178,
224271
column: 7,
225-
offset: 2489,
272+
offset: 2540,
226273
},
227274
},
228275
},
@@ -323,12 +370,12 @@
323370
start: Pos {
324371
line: 105,
325372
column: 21,
326-
offset: 1334,
373+
offset: 1373,
327374
},
328375
end: Pos {
329376
line: 105,
330377
column: 21,
331-
offset: 1334,
378+
offset: 1373,
332379
},
333380
},
334381
},
@@ -346,12 +393,12 @@
346393
start: Pos {
347394
line: 105,
348395
column: 20,
349-
offset: 1333,
396+
offset: 1372,
350397
},
351398
end: Pos {
352399
line: 105,
353400
column: 21,
354-
offset: 1334,
401+
offset: 1373,
355402
},
356403
},
357404
},
@@ -369,12 +416,12 @@
369416
start: Pos {
370417
line: 105,
371418
column: 14,
372-
offset: 1327,
419+
offset: 1366,
373420
},
374421
end: Pos {
375422
line: 105,
376423
column: 16,
377-
offset: 1329,
424+
offset: 1368,
378425
},
379426
},
380427
},
@@ -384,12 +431,12 @@
384431
start: Pos {
385432
line: 105,
386433
column: 14,
387-
offset: 1327,
434+
offset: 1366,
388435
},
389436
end: Pos {
390437
line: 105,
391438
column: 21,
392-
offset: 1334,
439+
offset: 1373,
393440
},
394441
},
395442
},
@@ -485,12 +532,12 @@
485532
start: Pos {
486533
line: 124,
487534
column: 9,
488-
offset: 1811,
535+
offset: 1850,
489536
},
490537
end: Pos {
491538
line: 124,
492539
column: 17,
493-
offset: 1819,
540+
offset: 1858,
494541
},
495542
},
496543
},
@@ -500,12 +547,12 @@
500547
start: Pos {
501548
line: 124,
502549
column: 9,
503-
offset: 1811,
550+
offset: 1850,
504551
},
505552
end: Pos {
506553
line: 124,
507554
column: 17,
508-
offset: 1819,
555+
offset: 1858,
509556
},
510557
},
511558
},
@@ -531,12 +578,12 @@
531578
start: Pos {
532579
line: 124,
533580
column: 9,
534-
offset: 1811,
581+
offset: 1850,
535582
},
536583
end: Pos {
537584
line: 124,
538585
column: 17,
539-
offset: 1819,
586+
offset: 1858,
540587
},
541588
},
542589
},
@@ -546,12 +593,12 @@
546593
start: Pos {
547594
line: 124,
548595
column: 9,
549-
offset: 1811,
596+
offset: 1850,
550597
},
551598
end: Pos {
552599
line: 124,
553600
column: 17,
554-
offset: 1819,
601+
offset: 1858,
555602
},
556603
},
557604
},

src/ast/node/cast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl<'a, 'ctx> Ctx<'a> {
142142
.add_to_ctx(self))
143143
}
144144
}
145-
(PLType::Trait(t), target_ty) => {
145+
(PLType::Trait(t), target_ty) if !matches!(target_ty, PLType::Trait(_)) => {
146146
if node.tail.is_none() {
147147
let pos = node.target_type.range().end;
148148
let end_range = Range {

src/ast/node/statement.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,35 @@ fn handle_deconstruct<'a, 'b>(
317317
.borrow_mut()
318318
.set_modifier(semantic_idx, modifier_set!(CAPTURED));
319319
}
320+
ctx.send_if_go_to_def(var.range, s.get_data_ref().range, ctx.plmod.path);
321+
s.get_data_ref()
322+
.refs
323+
.as_ref()
324+
.map(|refs| {
325+
ctx.set_local_refs(refs.clone(), var.range);
326+
})
327+
.or_else(|| {
328+
ctx.set_glob_refs(ctx.plmod.get_full_name(var.name), var.range);
329+
Some(())
330+
});
331+
if !is_def {
332+
let ty = s.get_data_ref().pltype.clone();
333+
if get_type_deep(pltype.clone()) != get_type_deep(ty.clone()) {
334+
return Err(var
335+
.range()
336+
.new_err(ErrorCode::TYPE_MISMATCH)
337+
.add_label(
338+
var.range(),
339+
ctx.get_file(),
340+
format_label!(
341+
"expected type {}, real type {}",
342+
pltype.borrow().get_name(),
343+
ty.borrow().get_name()
344+
),
345+
)
346+
.add_to_ctx(ctx));
347+
}
348+
}
320349
s.get_data_ref().value
321350
} else {
322351
return Err(var
@@ -331,6 +360,7 @@ fn handle_deconstruct<'a, 'b>(
331360
} else {
332361
ptr2value
333362
};
363+
334364
builder.build_store(
335365
ptr2value,
336366
ctx.try_load2var(range, exp, builder, &pltype.borrow())?,

src/inference/mod.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ impl<'ctx> InferenceCtx<'ctx> {
561561
ty = new_ty;
562562
}
563563
let defvar = &mut *d.var;
564-
self.def_inference(defvar, ty, ctx, builder);
564+
self.deconstruct_inference(defvar, ty, ctx, builder, true);
565565
}
566566
NodeEnum::Global(g) => {
567567
let ty = self.inference(&mut g.exp, ctx, builder);
@@ -582,7 +582,7 @@ impl<'ctx> InferenceCtx<'ctx> {
582582
}
583583
crate::ast::node::statement::AssignVar::Raw(d) => {
584584
let defvar = &mut *d;
585-
self.def_inference(defvar, ty, ctx, builder);
585+
self.deconstruct_inference(defvar, ty, ctx, builder, false);
586586
}
587587
}
588588
}
@@ -1300,23 +1300,29 @@ impl<'ctx> InferenceCtx<'ctx> {
13001300
}
13011301
}
13021302

1303-
fn def_inference<'a, 'b>(
1303+
fn deconstruct_inference<'a, 'b>(
13041304
&mut self,
13051305
defvar: &mut DefVar,
13061306
ty: SymbolType,
13071307
ctx: &'b mut Ctx<'a>,
13081308
builder: &'b BuilderEnum<'a, '_>,
1309+
def: bool,
13091310
) {
1311+
let f = if def {
1312+
Self::id_inference
1313+
} else {
1314+
Self::exist_id_inference
1315+
};
13101316
match defvar {
13111317
DefVar::Identifier(v) => {
1312-
self.id_inference(&ty, ctx, builder, v);
1318+
f(self, &ty, ctx, builder, v);
13131319
}
13141320
DefVar::TupleDeconstruct(t) => {
13151321
for (i, var) in t.var.iter_mut().enumerate() {
13161322
let ty =
13171323
self.symbol_field_symbol(ty.clone(), ctx, i.to_string().into(), builder);
13181324
if let Some(ty) = ty {
1319-
self.def_inference(&mut *var, ty, ctx, builder)
1325+
self.deconstruct_inference(&mut *var, ty, ctx, builder, def)
13201326
}
13211327
}
13221328
}
@@ -1326,13 +1332,13 @@ impl<'ctx> InferenceCtx<'ctx> {
13261332
crate::ast::node::statement::StructFieldDeconstructEnum::Var(v) => {
13271333
let ty = self.symbol_field_symbol(ty.clone(), ctx, v.name, builder);
13281334
if let Some(ty) = ty {
1329-
self.id_inference(&ty, ctx, builder, v);
1335+
f(self, &ty, ctx, builder, v);
13301336
}
13311337
}
13321338
crate::ast::node::statement::StructFieldDeconstructEnum::Taged(k, var) => {
13331339
let ty = self.symbol_field_symbol(ty.clone(), ctx, k.name, builder);
13341340
if let Some(ty) = ty {
1335-
self.def_inference(&mut *var, ty, ctx, builder)
1341+
self.deconstruct_inference(&mut *var, ty, ctx, builder, def)
13361342
}
13371343
}
13381344
};
@@ -1353,6 +1359,21 @@ impl<'ctx> InferenceCtx<'ctx> {
13531359
v.id = Some(id);
13541360
self.add_symbol(v.name, id);
13551361
}
1362+
fn exist_id_inference<'a, 'b>(
1363+
&mut self,
1364+
ty: &SymbolType,
1365+
ctx: &'b mut Ctx<'a>,
1366+
builder: &'b BuilderEnum<'a, '_>,
1367+
v: &mut crate::ast::node::primary::VarNode,
1368+
) {
1369+
let id = self.new_key();
1370+
self.unify(id, ty.clone(), ctx, builder);
1371+
v.id = Some(id);
1372+
self.get_symbol(v.name).map(|id2| {
1373+
self.unify(id2, SymbolType::Var(id), ctx, builder);
1374+
// self.unify_two_symbol(SymbolType::Var(id2), SymbolType::Var(id), ctx, builder);
1375+
});
1376+
}
13561377

13571378
fn symbol_field_symbol<'a, 'b>(
13581379
&mut self,
@@ -1378,9 +1399,6 @@ impl<'ctx> InferenceCtx<'ctx> {
13781399
}
13791400
}
13801401
TyInfer::Generic((tys, GenericTy::St(st))) => {
1381-
// if f == "get" {
1382-
// eprintln!("{:?}", f);
1383-
// }
13841402
let mut generic_map = FxHashMap::default();
13851403
st.generic_map.iter().enumerate().for_each(|(i, (k, _))| {
13861404
generic_map.insert(*k, tys[i]);

src/nomparser/statement.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,18 @@ pub fn assignment(input: Span) -> IResult<Span, Box<NodeEnum>> {
197197
delspace(map_res(
198198
tuple((
199199
alt((
200-
map(pointer_exp, AssignVar::Pointer),
201-
map(deconstruct, AssignVar::Raw),
200+
terminated(
201+
map(deconstruct, AssignVar::Raw),
202+
tag_token_symbol_ex(TokenType::ASSIGN),
203+
),
204+
terminated(
205+
map(pointer_exp, AssignVar::Pointer),
206+
tag_token_symbol_ex(TokenType::ASSIGN),
207+
),
202208
)),
203-
tag_token_symbol(TokenType::ASSIGN),
204209
general_exp,
205210
)),
206-
|(left, _op, right)| {
211+
|(left, right)| {
207212
let range = left.range().start.to(right.range().end);
208213
res_enum(
209214
AssignNode {

0 commit comments

Comments
 (0)