@@ -13,6 +13,7 @@ pub enum ParamType {
13
13
Constant ,
14
14
}
15
15
pub type Parameter < ' src > = (
16
+ SourceSpan ,
16
17
Cow < ' src , str > ,
17
18
ParamType ,
18
19
BoxedAST < ' src > ,
@@ -59,7 +60,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
59
60
+ self
60
61
. params
61
62
. iter ( )
62
- . map ( |( _, _, ty, def) | ty. nodes ( ) + def. as_ref ( ) . map_or ( 0 , |x| x. nodes ( ) ) )
63
+ . map ( |( _, _, _ , ty, def) | ty. nodes ( ) + def. as_ref ( ) . map_or ( 0 , |x| x. nodes ( ) ) )
63
64
. sum :: < usize > ( )
64
65
+ 1
65
66
}
@@ -80,7 +81,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
80
81
let params = self
81
82
. params
82
83
. iter ( )
83
- . map ( |( _, pt, ty, _) | {
84
+ . map ( |( _, _ , pt, ty, _) | {
84
85
(
85
86
{
86
87
let mut val = ops:: impl_convert (
@@ -338,7 +339,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
338
339
. params
339
340
. iter ( )
340
341
. zip ( cloned)
341
- . filter_map ( |( ( _, _, _, d) , ( t, _) ) | {
342
+ . filter_map ( |( ( _, _ , _, _, d) , ( t, _) ) | {
342
343
d. as_ref ( ) . map ( |a| {
343
344
let old_const = ctx. is_const . replace ( true ) ;
344
345
let val = a. codegen ( ctx) . 0 ;
@@ -434,7 +435,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
434
435
. params
435
436
. iter ( )
436
437
. zip ( cloned)
437
- . filter_map ( |( ( _, _, _, d) , ( t, _) ) | {
438
+ . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | {
438
439
d. as_ref ( ) . map ( |a| {
439
440
let old_const = ctx. is_const . replace ( true ) ;
440
441
let val = a. codegen ( ctx) . 0 ;
@@ -474,7 +475,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
474
475
. params
475
476
. iter ( )
476
477
. zip ( cloned)
477
- . filter_map ( |( ( _, _, _, d) , ( t, _) ) | {
478
+ . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | {
478
479
d. as_ref ( ) . map ( |a| {
479
480
let old_const = ctx. is_const . replace ( true ) ;
480
481
let val = a. codegen ( ctx) . 0 ;
@@ -543,7 +544,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
543
544
let mut params = self
544
545
. params
545
546
. iter ( )
546
- . map ( |( _, pt, ty, _) | {
547
+ . map ( |( _, _ , pt, ty, _) | {
547
548
(
548
549
{
549
550
let mut val = ops:: impl_convert (
@@ -901,7 +902,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
901
902
) )
902
903
{
903
904
errs. push ( CobaltError :: InvalidSelfParam {
904
- loc : self . params [ 0 ] . 2 . loc ( ) ,
905
+ loc : self . params [ 0 ] . 3 . loc ( ) ,
905
906
self_t : s,
906
907
param : Some ( params[ 0 ] . 0 . to_string ( ) ) ,
907
908
} ) ;
@@ -960,7 +961,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
960
961
) )
961
962
{
962
963
errs. push ( CobaltError :: InvalidSelfParam {
963
- loc : self . params [ 0 ] . 2 . loc ( ) ,
964
+ loc : self . params [ 0 ] . 3 . loc ( ) ,
964
965
self_t : s,
965
966
param : Some ( params[ 0 ] . 0 . to_string ( ) ) ,
966
967
} ) ;
@@ -1068,7 +1069,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1068
1069
gv. set_linkage ( Private )
1069
1070
}
1070
1071
let cloned = params. clone ( ) ; // Rust doesn't like me using params in the following closure
1071
- let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1072
+ let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1072
1073
let old_const = ctx. is_const . replace ( true ) ;
1073
1074
let val = a. codegen_errs ( ctx, & mut errs) ;
1074
1075
let val = ops:: impl_convert ( a. loc ( ) , ( val, None ) , ( t. clone ( ) , None ) , ctx) ;
@@ -1096,12 +1097,14 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1096
1097
Type :: Reference ( Box :: new ( fty. clone ( ) ) )
1097
1098
) , VariableData :: with_vis ( self . loc , vs) ) ) ) . clone ( ) ;
1098
1099
if is_extern. is_none ( ) {
1100
+ let entry = ctx. context . append_basic_block ( f, "entry" ) ;
1101
+ ctx. builder . position_at_end ( entry) ;
1099
1102
let old_scope = ctx. push_scope ( & self . name ) ;
1100
1103
ctx. map_vars ( |v| Box :: new ( VarMap :: new ( Some ( v) ) ) ) ;
1101
1104
ctx. lex_scope . incr ( ) ;
1102
1105
{
1103
1106
let mut n = 0 ;
1104
- for ( ( name, pt) , ( ty, is_const) ) in self . params . iter ( ) . map ( |x| ( & x. 0 , x. 1 ) ) . zip ( params. iter ( ) ) {
1107
+ for ( ( loc , name, pt) , ( ty, is_const) ) in self . params . iter ( ) . map ( |x| ( x. 0 , & x. 1 , x . 2 ) ) . zip ( params. iter ( ) ) {
1105
1108
if name. is_empty ( ) {
1106
1109
if !is_const {
1107
1110
n += 1 ;
@@ -1119,7 +1122,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1119
1122
val. data_type = Type :: Mut ( Box :: new ( val. data_type ) ) ;
1120
1123
}
1121
1124
val. name = Some ( ( name. clone ( ) , ctx. lex_scope . get ( ) ) ) ;
1122
- ctx. with_vars ( |v| v. insert ( & DottedName :: local ( ( name. clone ( ) , unreachable_span ( ) ) ) , Symbol ( val, VariableData :: default ( ) ) ) ) . map_or ( ( ) , |_| ( ) ) ;
1125
+ let _ = ctx. with_vars ( |v| v. insert ( & DottedName :: local ( ( name. clone ( ) , unreachable_span ( ) ) ) , Symbol ( val, VariableData { loc : Some ( loc ) , .. VariableData :: default ( ) } ) ) ) ;
1123
1126
n += 1 ;
1124
1127
}
1125
1128
else {
@@ -1131,8 +1134,6 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1131
1134
}
1132
1135
}
1133
1136
}
1134
- let entry = ctx. context . append_basic_block ( f, "entry" ) ;
1135
- ctx. builder . position_at_end ( entry) ;
1136
1137
ctx. to_drop . borrow_mut ( ) . push ( Vec :: new ( ) ) ;
1137
1138
let body = self . body . codegen_errs ( ctx, & mut errs) ;
1138
1139
ctx. to_drop . borrow_mut ( ) . pop ( ) . unwrap ( ) . into_iter ( ) . for_each ( |v| v. ins_dtor ( ctx) ) ;
@@ -1183,7 +1184,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1183
1184
}
1184
1185
else {
1185
1186
let cloned = params. clone ( ) ; // Rust doesn't like me using params in the following closure
1186
- let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1187
+ let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1187
1188
let old_const = ctx. is_const . replace ( true ) ;
1188
1189
let val = a. codegen_errs ( ctx, & mut errs) ;
1189
1190
let val = ops:: impl_convert ( a. loc ( ) , ( val, None ) , ( t. clone ( ) , None ) , ctx) ;
@@ -1231,7 +1232,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1231
1232
gv. set_linkage ( Private )
1232
1233
}
1233
1234
let cloned = params. clone ( ) ; // Rust doesn't like me using params in the following closure
1234
- let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1235
+ let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _ , _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1235
1236
let old_const = ctx. is_const . replace ( true ) ;
1236
1237
let val = a. codegen_errs ( ctx, & mut errs) ;
1237
1238
let val = ops:: impl_convert ( a. loc ( ) , ( val, None ) , ( t. clone ( ) , None ) , ctx) ;
@@ -1259,12 +1260,14 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1259
1260
Type :: Reference ( Box :: new ( fty. clone ( ) ) )
1260
1261
) , VariableData :: with_vis ( self . loc , vs) ) ) ) . clone ( ) ;
1261
1262
if is_extern. is_none ( ) {
1263
+ let entry = ctx. context . append_basic_block ( f, "entry" ) ;
1264
+ ctx. builder . position_at_end ( entry) ;
1262
1265
let old_scope = ctx. push_scope ( & self . name ) ;
1263
1266
ctx. map_vars ( |v| Box :: new ( VarMap :: new ( Some ( v) ) ) ) ;
1264
1267
ctx. lex_scope . incr ( ) ;
1265
1268
{
1266
1269
let mut n = 0 ;
1267
- for ( ( name, pt) , ( ty, is_const) ) in self . params . iter ( ) . map ( |x| ( & x. 0 , x. 1 ) ) . zip ( params. iter ( ) ) {
1270
+ for ( ( loc , name, pt) , ( ty, is_const) ) in self . params . iter ( ) . map ( |x| ( x. 0 , & x. 1 , x . 2 ) ) . zip ( params. iter ( ) ) {
1268
1271
if name. is_empty ( ) {
1269
1272
if !is_const {
1270
1273
n += 1 ;
@@ -1282,7 +1285,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1282
1285
val. data_type = Type :: Mut ( Box :: new ( val. data_type ) ) ;
1283
1286
}
1284
1287
val. name = Some ( ( name. clone ( ) , ctx. lex_scope . get ( ) ) ) ;
1285
- ctx. with_vars ( |v| v. insert ( & DottedName :: local ( ( name. clone ( ) , unreachable_span ( ) ) ) , Symbol ( val, VariableData :: default ( ) ) ) ) . map_or ( ( ) , |_| ( ) ) ;
1288
+ let _ = ctx. with_vars ( |v| v. insert ( & DottedName :: local ( ( name. clone ( ) , unreachable_span ( ) ) ) , Symbol ( val, VariableData { loc : Some ( loc ) , .. VariableData :: default ( ) } ) ) ) ;
1286
1289
n += 1 ;
1287
1290
}
1288
1291
else {
@@ -1294,8 +1297,6 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1294
1297
}
1295
1298
}
1296
1299
}
1297
- let entry = ctx. context . append_basic_block ( f, "entry" ) ;
1298
- ctx. builder . position_at_end ( entry) ;
1299
1300
ctx. to_drop . borrow_mut ( ) . push ( Vec :: new ( ) ) ;
1300
1301
self . body . codegen_errs ( ctx, & mut errs) ;
1301
1302
ctx. to_drop . borrow_mut ( ) . pop ( ) . unwrap ( ) . into_iter ( ) . for_each ( |v| v. ins_dtor ( ctx) ) ;
@@ -1346,7 +1347,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1346
1347
}
1347
1348
else {
1348
1349
let cloned = params. clone ( ) ; // Rust doesn't like me using params in the following closure
1349
- let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1350
+ let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1350
1351
let old_const = ctx. is_const . replace ( true ) ;
1351
1352
let val = a. codegen_errs ( ctx, & mut errs) ;
1352
1353
let val = ops:: impl_convert ( a. loc ( ) , ( val, None ) , ( t. clone ( ) , None ) , ctx) ;
@@ -1377,7 +1378,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1377
1378
}
1378
1379
else {
1379
1380
let cloned = params. clone ( ) ; // Rust doesn't like me using params in the following closure
1380
- let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1381
+ let defaults = self . params . iter ( ) . zip ( cloned) . filter_map ( |( ( _, _, _, _ , d) , ( t, _) ) | d. as_ref ( ) . map ( |a| {
1381
1382
let old_const = ctx. is_const . replace ( true ) ;
1382
1383
let val = a. codegen_errs ( ctx, & mut errs) ;
1383
1384
let val = ops:: impl_convert ( a. loc ( ) , ( val, None ) , ( t. clone ( ) , None ) , ctx) ;
@@ -1465,7 +1466,7 @@ impl<'src> AST<'src> for FnDefAST<'src> {
1465
1466
pre. pop ( ) ;
1466
1467
writeln ! ( f, "{pre}├── parameters:" ) ?;
1467
1468
pre. push ( false ) ;
1468
- for ( n, ( param, param_ty, ty, default) ) in self . params . iter ( ) . enumerate ( ) {
1469
+ for ( n, ( _ , param, param_ty, ty, default) ) in self . params . iter ( ) . enumerate ( ) {
1469
1470
writeln ! (
1470
1471
f,
1471
1472
"{pre}{}{}{}" ,
0 commit comments