Skip to content

Commit b0972d9

Browse files
authored
Merge branch 'master' into bitzoic-unix
2 parents 2fa8f65 + 2d0021c commit b0972d9

File tree

24 files changed

+538
-191
lines changed

24 files changed

+538
-191
lines changed

sway-core/src/control_flow_analysis/dead_code_analysis.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2516,10 +2516,12 @@ fn connect_type_id<'eng: 'cfg, 'cfg>(
25162516
graph.add_edge(entry_node, enum_idx, "".into());
25172517
}
25182518
for p in &decl.generic_parameters {
2519-
let p = p
2520-
.as_type_parameter()
2521-
.expect("only works with type parameters");
2522-
connect_type_id(engines, p.type_id, graph, entry_node)?;
2519+
match p {
2520+
crate::TypeParameter::Type(p) => {
2521+
connect_type_id(engines, p.type_id, graph, entry_node)?;
2522+
}
2523+
crate::TypeParameter::Const(_) => {}
2524+
}
25232525
}
25242526
}
25252527
TypeInfo::Struct(decl_ref) => {

sway-core/src/ir_generation.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,14 @@ impl CompiledFunctionCache {
7575
let new_callee = match item {
7676
Some(func) => func,
7777
None => {
78+
let name = Ident::new(Span::from_string(format!(
79+
"{}_{}",
80+
decl.name,
81+
context.get_unique_symbol_id()
82+
)));
7883
let callee_fn_decl = ty::TyFunctionDecl {
7984
type_parameters: Vec::new(),
80-
name: Ident::new(Span::from_string(format!(
81-
"{}_{}",
82-
decl.name,
83-
context.get_unique_symbol_id()
84-
))),
85+
name,
8586
parameters: decl.parameters.clone(),
8687
..decl.clone()
8788
};

sway-core/src/ir_generation/types.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ pub(super) fn create_tagged_union_type(
2222
// getting one here anyway. They don't need to be a tagged union either.
2323
let field_types: Vec<_> = variants
2424
.iter()
25-
.map(|tev| {
25+
.map(|variant| {
2626
convert_resolved_typeid_no_span(
2727
type_engine,
2828
decl_engine,
2929
context,
30-
tev.type_argument.type_id(),
30+
variant.type_argument.type_id(),
3131
)
3232
})
3333
.collect::<Result<Vec<_>, CompileError>>()?;

sway-core/src/language/ty/ast_node.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{
1010
type_system::*,
1111
types::*,
1212
};
13+
use ast_elements::type_parameter::ConstGenericExpr;
1314
use serde::{Deserialize, Serialize};
1415
use std::{
1516
fmt::{self, Debug},
@@ -148,9 +149,24 @@ impl MaterializeConstGenerics for TyAstNode {
148149
value: &TyExpression,
149150
) -> Result<(), ErrorEmitted> {
150151
match &mut self.content {
151-
TyAstNodeContent::Declaration(TyDecl::VariableDecl(decl)) => decl
152-
.body
153-
.materialize_const_generics(engines, handler, name, value),
152+
TyAstNodeContent::Declaration(TyDecl::VariableDecl(decl)) => {
153+
decl.body
154+
.materialize_const_generics(engines, handler, name, value)?;
155+
decl.return_type
156+
.materialize_const_generics(engines, handler, name, value)?;
157+
match &mut decl.type_ascription {
158+
GenericArgument::Type(arg) => arg
159+
.type_id
160+
.materialize_const_generics(engines, handler, name, value)?,
161+
GenericArgument::Const(arg) => {
162+
if matches!(&arg.expr, ConstGenericExpr::AmbiguousVariableExpression { ident } if ident.as_str() == name)
163+
{
164+
arg.expr = ConstGenericExpr::from_ty_expression(handler, value)?;
165+
}
166+
}
167+
}
168+
Ok(())
169+
}
154170
TyAstNodeContent::Expression(expr) => {
155171
expr.materialize_const_generics(engines, handler, name, value)
156172
}

sway-core/src/language/ty/declaration/enum.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
transform,
77
type_system::*,
88
};
9+
use ast_elements::type_parameter::ConstGenericExpr;
910
use monomorphization::MonomorphizeHelper;
1011
use serde::{Deserialize, Serialize};
1112
use std::{
@@ -107,11 +108,31 @@ impl MonomorphizeHelper for TyEnumDecl {
107108
impl MaterializeConstGenerics for TyEnumDecl {
108109
fn materialize_const_generics(
109110
&mut self,
110-
_engines: &Engines,
111-
_handler: &Handler,
112-
_name: &str,
113-
_value: &crate::language::ty::TyExpression,
111+
engines: &Engines,
112+
handler: &Handler,
113+
name: &str,
114+
value: &crate::language::ty::TyExpression,
114115
) -> Result<(), ErrorEmitted> {
116+
for p in self.generic_parameters.iter_mut() {
117+
match p {
118+
TypeParameter::Const(p) if p.name.as_str() == name => {
119+
p.expr = Some(ConstGenericExpr::from_ty_expression(handler, value)?);
120+
}
121+
TypeParameter::Type(p) => {
122+
p.type_id
123+
.materialize_const_generics(engines, handler, name, value)?;
124+
}
125+
_ => {}
126+
}
127+
}
128+
129+
for variant in self.variants.iter_mut() {
130+
variant
131+
.type_argument
132+
.type_id_mut()
133+
.materialize_const_generics(engines, handler, name, value)?;
134+
}
135+
115136
Ok(())
116137
}
117138
}

sway-core/src/language/ty/declaration/function.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,9 @@ impl TyFunctionSig {
793793
TyFunctionSigTypeParameter::Const(p) => {
794794
match p {
795795
ConstGenericExpr::Literal { val, .. } => val.to_string(),
796-
ConstGenericExpr::AmbiguousVariableExpression { .. } => todo!(),
796+
ConstGenericExpr::AmbiguousVariableExpression { ident } => {
797+
ident.as_str().to_string()
798+
}
797799
}
798800
}
799801
})

sway-core/src/language/ty/declaration/struct.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,27 @@ impl MonomorphizeHelper for TyStructDecl {
101101
impl MaterializeConstGenerics for TyStructDecl {
102102
fn materialize_const_generics(
103103
&mut self,
104-
_engines: &Engines,
105-
_handler: &Handler,
106-
_name: &str,
107-
_value: &crate::language::ty::TyExpression,
104+
engines: &Engines,
105+
handler: &Handler,
106+
name: &str,
107+
value: &crate::language::ty::TyExpression,
108108
) -> Result<(), ErrorEmitted> {
109109
for p in self.generic_parameters.iter_mut() {
110110
match p {
111-
TypeParameter::Const(p) if p.name.as_str() == _name => {
112-
p.expr = Some(ConstGenericExpr::from_ty_expression(_handler, _value)?);
111+
TypeParameter::Const(p) if p.name.as_str() == name => {
112+
p.expr = Some(ConstGenericExpr::from_ty_expression(handler, value)?);
113113
}
114114
_ => {}
115115
}
116116
}
117+
118+
for field in self.fields.iter_mut() {
119+
field
120+
.type_argument
121+
.type_id_mut()
122+
.materialize_const_generics(engines, handler, name, value)?;
123+
}
124+
117125
Ok(())
118126
}
119127
}

sway-core/src/language/ty/expression/expression.rs

Lines changed: 71 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,12 @@ impl CollectTypesMetadata for TyExpression {
313313
} => {
314314
let enum_decl = decl_engine.get_enum(enum_ref);
315315
for p in enum_decl.generic_parameters.iter() {
316-
let p = p
317-
.as_type_parameter()
318-
.expect("only works for type parameters");
319-
ctx.call_site_insert(p.type_id, call_path_binding.inner.suffix.span())
316+
match p {
317+
TypeParameter::Type(p) => {
318+
ctx.call_site_insert(p.type_id, call_path_binding.inner.suffix.span())
319+
}
320+
TypeParameter::Const(_) => {}
321+
}
320322
}
321323
if let Some(contents) = contents {
322324
res.append(&mut contents.collect_types_metadata(handler, ctx)?);
@@ -330,10 +332,12 @@ impl CollectTypesMetadata for TyExpression {
330332
);
331333
}
332334
for p in enum_decl.generic_parameters.iter() {
333-
let p = p
334-
.as_type_parameter()
335-
.expect("only works for type parameters");
336-
res.append(&mut p.type_id.collect_types_metadata(handler, ctx)?);
335+
match p {
336+
TypeParameter::Type(p) => {
337+
res.append(&mut p.type_id.collect_types_metadata(handler, ctx)?);
338+
}
339+
TypeParameter::Const(_) => {}
340+
}
337341
}
338342
}
339343
AbiCast { address, .. } => {
@@ -488,6 +492,65 @@ impl MaterializeConstGenerics for TyExpression {
488492
TyExpressionVariant::Deref(r) => {
489493
r.materialize_const_generics(engines, handler, name, value)
490494
}
495+
TyExpressionVariant::MatchExp { desugared, .. } => {
496+
desugared.materialize_const_generics(engines, handler, name, value)
497+
}
498+
TyExpressionVariant::EnumInstantiation { contents, .. } => {
499+
if let Some(contents) = contents.as_mut() {
500+
contents.materialize_const_generics(engines, handler, name, value)?;
501+
}
502+
Ok(())
503+
}
504+
TyExpressionVariant::EnumTag { exp } => {
505+
exp.materialize_const_generics(engines, handler, name, value)
506+
}
507+
TyExpressionVariant::Tuple { fields } => {
508+
for f in fields {
509+
f.materialize_const_generics(engines, handler, name, value)?;
510+
}
511+
Ok(())
512+
}
513+
TyExpressionVariant::TupleElemAccess {
514+
prefix,
515+
resolved_type_of_parent,
516+
..
517+
} => {
518+
prefix.materialize_const_generics(engines, handler, name, value)?;
519+
resolved_type_of_parent
520+
.materialize_const_generics(engines, handler, name, value)?;
521+
Ok(())
522+
}
523+
TyExpressionVariant::LazyOperator { lhs, rhs, .. } => {
524+
lhs.materialize_const_generics(engines, handler, name, value)?;
525+
rhs.materialize_const_generics(engines, handler, name, value)
526+
}
527+
TyExpressionVariant::AsmExpression { registers, .. } => {
528+
for r in registers.iter_mut() {
529+
if let Some(init) = r.initializer.as_mut() {
530+
init.materialize_const_generics(engines, handler, name, value)?;
531+
}
532+
}
533+
Ok(())
534+
}
535+
TyExpressionVariant::ConstantExpression { .. } => Ok(()),
536+
TyExpressionVariant::StructExpression { fields, .. } => {
537+
for f in fields {
538+
f.value
539+
.materialize_const_generics(engines, handler, name, value)?;
540+
}
541+
Ok(())
542+
}
543+
TyExpressionVariant::StructFieldAccess {
544+
prefix,
545+
resolved_type_of_parent,
546+
..
547+
} => {
548+
prefix.materialize_const_generics(engines, handler, name, value)?;
549+
resolved_type_of_parent.materialize_const_generics(engines, handler, name, value)
550+
}
551+
TyExpressionVariant::UnsafeDowncast { exp, .. } => {
552+
exp.materialize_const_generics(engines, handler, name, value)
553+
}
491554
_ => Err(handler.emit_err(
492555
sway_error::error::CompileError::ConstGenericNotSupportedHere {
493556
span: self.span.clone(),

sway-core/src/semantic_analysis/ast_node/code_block.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ impl ty::TyCodeBlock {
7575
Ok(())
7676
})?;
7777

78-
ctx.engines.te().reapply_unifications(ctx.engines());
78+
ctx.engines.te().reapply_unifications(ctx.engines(), 0);
7979

8080
ctx.by_ref()
8181
.scoped(handler, Some(code_block.span()), |ctx| {

sway-core/src/semantic_analysis/ast_node/declaration/auto_impl/abi_encoding.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,24 @@ where
3131
type_parameters: &[TypeParameter],
3232
body: String,
3333
) -> String {
34+
let type_parameters_declaration_expanded =
35+
self.generate_type_parameters_declaration_code(type_parameters, true);
3436
let type_parameters_declaration =
35-
self.generate_type_parameters_declaration_code(type_parameters);
37+
self.generate_type_parameters_declaration_code(type_parameters, false);
3638
let type_parameters_constraints =
3739
self.generate_type_parameters_constraints_code(type_parameters, Some("AbiEncode"));
3840

3941
let name = name.as_raw_ident_str();
4042

4143
if body.is_empty() {
42-
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration} AbiEncode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
44+
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration_expanded} AbiEncode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
4345
#[allow(dead_code, deprecated)]
4446
fn abi_encode(self, buffer: Buffer) -> Buffer {{
4547
buffer
4648
}}
4749
}}")
4850
} else {
49-
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration} AbiEncode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
51+
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration_expanded} AbiEncode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
5052
#[allow(dead_code, deprecated)]
5153
fn abi_encode(self, buffer: Buffer) -> Buffer {{
5254
{body}
@@ -62,22 +64,24 @@ where
6264
type_parameters: &[TypeParameter],
6365
body: String,
6466
) -> String {
67+
let type_parameters_declaration_expanded =
68+
self.generate_type_parameters_declaration_code(type_parameters, true);
6569
let type_parameters_declaration =
66-
self.generate_type_parameters_declaration_code(type_parameters);
70+
self.generate_type_parameters_declaration_code(type_parameters, false);
6771
let type_parameters_constraints =
6872
self.generate_type_parameters_constraints_code(type_parameters, Some("AbiDecode"));
6973

7074
let name = name.as_raw_ident_str();
7175

7276
if body == "Self { }" {
73-
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration} AbiDecode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
77+
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration_expanded} AbiDecode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
7478
#[allow(dead_code, deprecated)]
7579
fn abi_decode(ref mut _buffer: BufferReader) -> Self {{
7680
{body}
7781
}}
7882
}}")
7983
} else {
80-
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration} AbiDecode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
84+
format!("#[allow(dead_code, deprecated)] impl{type_parameters_declaration_expanded} AbiDecode for {name}{type_parameters_declaration}{type_parameters_constraints} {{
8185
#[allow(dead_code, deprecated)]
8286
fn abi_decode(ref mut buffer: BufferReader) -> Self {{
8387
{body}

0 commit comments

Comments
 (0)