File tree Expand file tree Collapse file tree 8 files changed +48
-5
lines changed Expand file tree Collapse file tree 8 files changed +48
-5
lines changed Original file line number Diff line number Diff line change @@ -287,6 +287,7 @@ pub enum GenericKindField {
287
287
name
288
288
typ
289
289
unaliased_typ
290
+ indirections
290
291
}
291
292
292
293
// `foo.bar`
Original file line number Diff line number Diff line change @@ -1531,17 +1531,16 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type {
1531
1531
.name {
1532
1532
return ast.string_type
1533
1533
}
1534
- .unaliased_typ {
1535
- return ast.int_type
1536
- }
1537
- .typ {
1534
+ .unaliased_typ, .typ, .indirections {
1538
1535
return ast.int_type
1539
1536
}
1540
1537
else {
1541
1538
if node.field_name == 'name' {
1542
1539
return ast.string_type
1543
1540
} else if node.field_name == 'idx' {
1544
1541
return ast.int_type
1542
+ } else if node.field_name == 'indirections' {
1543
+ return ast.int_type
1545
1544
}
1546
1545
c.error ('invalid field `.${node.field_name} ` for type `${node.expr} `' ,
1547
1546
node.pos)
Original file line number Diff line number Diff line change @@ -268,6 +268,12 @@ fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
268
268
}
269
269
}
270
270
}
271
+ } else if left.expr is ast.TypeOf {
272
+ skip_state = if left.expr.typ.nr_muls () == right.val.i64 () {
273
+ ComptimeBranchSkipState.eval
274
+ } else {
275
+ ComptimeBranchSkipState.skip
276
+ }
271
277
}
272
278
} else if branch.cond.op in [.eq, .ne] && left is ast.SelectorExpr
273
279
&& right is ast.StringLiteral {
Original file line number Diff line number Diff line change @@ -3875,6 +3875,10 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
3875
3875
g.write (int (g.table.unaliased_type (g.unwrap_generic (node.name_type))).str ())
3876
3876
return
3877
3877
}
3878
+ .indirections {
3879
+ g.write (int (g.unwrap_generic (node.name_type).nr_muls ()).str ())
3880
+ return
3881
+ }
3878
3882
.unknown {
3879
3883
// ast.TypeOf of `typeof(string).idx` etc
3880
3884
if node.field_name == 'name' {
@@ -3893,6 +3897,14 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
3893
3897
// `typeof(expr).idx`
3894
3898
g.write (int (g.unwrap_generic (name_type)).str ())
3895
3899
return
3900
+ } else if node.field_name == 'indirections' {
3901
+ mut name_type := node.name_type
3902
+ if node.expr is ast.TypeOf {
3903
+ name_type = g.resolve_comptime_type (node.expr.expr, name_type)
3904
+ }
3905
+ // `typeof(expr).indirections`
3906
+ g.write (int (g.unwrap_generic (name_type).nr_muls ()).str ())
3907
+ return
3896
3908
}
3897
3909
g.error ('unknown generic field' , node.pos)
3898
3910
}
Original file line number Diff line number Diff line change @@ -469,6 +469,8 @@ fn (mut g Gen) get_expr_type(cond ast.Expr) ast.Type {
469
469
return g.unwrap_generic (cond.name_type)
470
470
} else if cond.gkind_field == .unaliased_typ {
471
471
return g.table.unaliased_type (g.unwrap_generic (cond.name_type))
472
+ } else if cond.gkind_field == .indirections {
473
+ return ast.int_type
472
474
} else {
473
475
name := '${cond.expr} .${cond.field_name} '
474
476
if name in g.comptime.type_map {
Original file line number Diff line number Diff line change @@ -3252,13 +3252,17 @@ fn (mut g JsGen) gen_selector_expr(it ast.SelectorExpr) {
3252
3252
g.write ('new int(' )
3253
3253
g.write ('${int(g.unwrap_generic(it.name_type))} ' )
3254
3254
g.write (')' )
3255
- g.write (')' )
3256
3255
return
3257
3256
}
3258
3257
.unaliased_typ {
3259
3258
g.write ('new int(' )
3260
3259
g.write ('${int(g.table.unaliased_type(g.unwrap_generic(it.name_type)))} ' )
3261
3260
g.write (')' )
3261
+ return
3262
+ }
3263
+ .indirections {
3264
+ g.write ('new int(' )
3265
+ g.write ('${int(g.unwrap_generic(it.name_type).nr_muls())} ' )
3262
3266
g.write (')' )
3263
3267
return
3264
3268
}
Original file line number Diff line number Diff line change @@ -2923,6 +2923,7 @@ fn (mut p Parser) name_expr() ast.Expr {
2923
2923
'name' { ast.GenericKindField.name }
2924
2924
'typ' { ast.GenericKindField.typ }
2925
2925
'unaliased_typ' { ast.GenericKindField.unaliased_typ }
2926
+ 'indirections' { ast.GenericKindField.indirections }
2926
2927
else { ast.GenericKindField.unknown }
2927
2928
}
2928
2929
pos.extend (p.tok.pos ())
Original file line number Diff line number Diff line change
1
+ fn indirections [T](val T) int {
2
+ return T.indirections
3
+ }
4
+
5
+ fn test_main () {
6
+ a := 0
7
+ assert typeof (a).indirections == 0
8
+ assert indirections (a) == 0
9
+ b := & a
10
+ assert typeof (b).indirections == 1
11
+ assert indirections (b) == 1
12
+ c := [1 ]
13
+ assert typeof (c).indirections == 0
14
+ assert indirections (c) == 0
15
+ d := & c
16
+ assert typeof (d).indirections == 1
17
+ assert indirections (d) == 1
18
+ }
You can’t perform that action at this time.
0 commit comments