Skip to content

Commit

Permalink
feat: Sync from noir (#8093)
Browse files Browse the repository at this point in the history
Automated pull of development from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
fix: (LSP) only add cached files relevant to workspace
(noir-lang/noir#5775)
chore: make spans non-optional on `UnresolvedType`
(noir-lang/noir#5773)
END_COMMIT_OVERRIDE

---------

Co-authored-by: Ary Borenszweig <[email protected]>
  • Loading branch information
AztecBot and asterite authored Aug 21, 2024
1 parent d86577c commit 2d70215
Show file tree
Hide file tree
Showing 26 changed files with 142 additions and 163 deletions.
2 changes: 1 addition & 1 deletion .noir-sync-commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
090501dfaf7c569b1aa944856bf68ad663572ae4
1958a7932642e2fa556a903a3186b142a70e3e48
6 changes: 3 additions & 3 deletions noir/noir-repo/aztec_macros/src/transforms/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ fn create_inputs(ty: &str) -> Param {
let path_snippet = ty.to_case(Case::Snake); // e.g. private_context_inputs
let type_path = chained_dep!("aztec", "context", "inputs", &path_snippet, ty);

let context_type = make_type(UnresolvedTypeData::Named(type_path, vec![], true));
let context_type = make_type(UnresolvedTypeData::Named(type_path, Default::default(), true));
let visibility = Visibility::Private;

Param { pattern: context_pattern, typ: context_type, visibility, span: Span::default() }
Expand Down Expand Up @@ -396,7 +396,7 @@ fn serialize_to_hasher(
Signedness::Unsigned,
ast::IntegerBitSize::ThirtyTwo,
),
span: None,
span: Span::default(),
},
hasher_name,
))
Expand Down Expand Up @@ -595,7 +595,7 @@ fn abstract_return_values(func: &NoirFunction) -> Result<Option<Vec<Statement>>,
serialize_to_hasher(&ident(return_value_name), &current_return_type, hasher_name)
.ok_or_else(|| AztecMacroError::UnsupportedFunctionReturnType {
typ: current_return_type.clone(),
span: func.return_type().span.unwrap_or_default(),
span: func.return_type().span,
})?;

replacement_statements.extend(serialization_statements);
Expand Down
59 changes: 30 additions & 29 deletions noir/noir-repo/aztec_macros/src/transforms/note_interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ pub fn generate_note_interface_impl(
note_struct.name.0.contents
)),
})?;
let note_interface_impl_span: Option<Span> =
if empty_spans { None } else { trait_impl.object_type.span };
let note_interface_impl_span =
if empty_spans { Span::default() } else { trait_impl.object_type.span };

// Look for the note struct implementation, generate a default one if it doesn't exist (in order to append methods to it)
let existing_impl = module.impls.iter_mut().find(|r#impl| match &r#impl.object_type.typ {
UnresolvedTypeData::Named(path, _, _) => path.last_ident().eq(&note_struct.name),
Expand Down Expand Up @@ -94,7 +95,7 @@ pub fn generate_note_interface_impl(
Ok(val.to_string())
}
_ => Err(AztecMacroError::CouldNotImplementNoteInterface {
span: trait_impl.object_type.span,
span: Some(trait_impl.object_type.span),
secondary_message: Some(format!(
"NoteInterface must be generic over NOTE_LEN and NOTE_BYTES_LEN: {}",
note_type
Expand Down Expand Up @@ -231,7 +232,7 @@ fn generate_note_to_be_bytes(
note_type: &String,
byte_length: &str,
serialized_length: &str,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source = format!(
Expand Down Expand Up @@ -268,21 +269,21 @@ fn generate_note_to_be_bytes(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn to_be_bytes). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}

fn generate_note_get_header(
note_type: &String,
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source = format!(
Expand All @@ -300,21 +301,21 @@ fn generate_note_get_header(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn get_header). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}

fn generate_note_set_header(
note_type: &String,
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source = format!(
Expand All @@ -331,13 +332,13 @@ fn generate_note_set_header(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn set_header). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand All @@ -346,7 +347,7 @@ fn generate_note_set_header(
// of the conversion of the characters in the note's struct name to unsigned integers.
fn generate_get_note_type_id(
note_type_id: u32,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
// TODO(#7165): replace {} with dep::aztec::protocol_types::abis::note_selector::compute_note_selector(\"{}\") in the function source below
Expand All @@ -365,13 +366,13 @@ fn generate_get_note_type_id(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn get_note_type_id). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand All @@ -389,7 +390,7 @@ fn generate_note_properties_struct(
note_type: &str,
note_fields: &[(String, String)],
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirStruct, AztecMacroError> {
let struct_source =
Expand All @@ -400,7 +401,7 @@ fn generate_note_properties_struct(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some(format!("Failed to parse Noir macro code (struct {}Properties). This is either a bug in the compiler or the Noir macro code", note_type)),
span: impl_span
span: Some(impl_span)
});
}

Expand All @@ -423,7 +424,7 @@ fn generate_note_deserialize_content(
note_fields: &[(String, String)],
note_serialize_len: &String,
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source = generate_note_deserialize_content_source(
Expand All @@ -438,13 +439,13 @@ fn generate_note_deserialize_content(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn deserialize_content). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand All @@ -461,7 +462,7 @@ fn generate_note_serialize_content(
note_fields: &[(String, String)],
note_serialize_len: &String,
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source = generate_note_serialize_content_source(
Expand All @@ -476,13 +477,13 @@ fn generate_note_serialize_content(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn serialize_content). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}

let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand All @@ -492,7 +493,7 @@ fn generate_note_properties_fn(
note_type: &str,
note_fields: &[(String, String)],
note_header_field_name: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
let function_source =
Expand All @@ -502,12 +503,12 @@ fn generate_note_properties_fn(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn properties). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}
let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand All @@ -519,7 +520,7 @@ fn generate_note_properties_fn(
//
fn generate_compute_note_hiding_point(
note_type: &String,
impl_span: Option<Span>,
impl_span: Span,
empty_spans: bool,
) -> Result<NoirFunction, AztecMacroError> {
// TODO(#7771): update this to do only 1 MSM call
Expand All @@ -541,12 +542,12 @@ fn generate_compute_note_hiding_point(
dbg!(errors);
return Err(AztecMacroError::CouldNotImplementNoteInterface {
secondary_message: Some("Failed to parse Noir macro code (fn compute_note_hiding_point). This is either a bug in the compiler or the Noir macro code".to_string()),
span: impl_span
span: Some(impl_span)
});
}
let mut function_ast = function_ast.into_sorted();
let mut noir_fn = function_ast.functions.remove(0);
noir_fn.def.span = impl_span.unwrap_or_default();
noir_fn.def.span = impl_span;
noir_fn.def.visibility = ItemVisibility::Public;
Ok(noir_fn)
}
Expand Down
2 changes: 1 addition & 1 deletion noir/noir-repo/aztec_macros/src/transforms/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ pub fn generate_storage_implementation(
vec![generic_context_type.clone()],
true,
),
span: Some(Span::default()),
span: Span::default(),
},
type_span: Span::default(),
generics: vec![generic_context_ident.into()],
Expand Down
9 changes: 3 additions & 6 deletions noir/noir-repo/aztec_macros/src/utils/ast_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,14 @@ pub fn assignment_with_type(
}

pub fn return_type(path: Path) -> FunctionReturnType {
let ty = make_type(UnresolvedTypeData::Named(path, vec![], true));
let ty = make_type(UnresolvedTypeData::Named(path, Default::default(), true));
FunctionReturnType::Ty(ty)
}

pub fn lambda(parameters: Vec<(Pattern, UnresolvedType)>, body: Expression) -> Expression {
expression(ExpressionKind::Lambda(Box::new(Lambda {
parameters,
return_type: UnresolvedType {
typ: UnresolvedTypeData::Unspecified,
span: Some(Span::default()),
},
return_type: UnresolvedType { typ: UnresolvedTypeData::Unspecified, span: Span::default() },
body,
})))
}
Expand Down Expand Up @@ -179,7 +176,7 @@ pub fn cast(lhs: Expression, ty: UnresolvedTypeData) -> Expression {
}

pub fn make_type(typ: UnresolvedTypeData) -> UnresolvedType {
UnresolvedType { typ, span: Some(Span::default()) }
UnresolvedType { typ, span: Span::default() }
}

pub fn index_array(array: Ident, index: &str) -> Expression {
Expand Down
8 changes: 3 additions & 5 deletions noir/noir-repo/compiler/noirc_frontend/src/ast/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,7 @@ impl UnresolvedGeneric {
pub fn span(&self) -> Span {
match self {
UnresolvedGeneric::Variable(ident) => ident.0.span(),
UnresolvedGeneric::Numeric { ident, typ } => {
ident.0.span().merge(typ.span.unwrap_or_default())
}
UnresolvedGeneric::Numeric { ident, typ } => ident.0.span().merge(typ.span),
UnresolvedGeneric::Resolved(_, span) => *span,
}
}
Expand Down Expand Up @@ -791,7 +789,7 @@ impl FunctionDefinition {
visibility: Visibility::Private,
pattern: Pattern::Identifier(ident.clone()),
typ: unresolved_type.clone(),
span: ident.span().merge(unresolved_type.span.unwrap()),
span: ident.span().merge(unresolved_type.span),
})
.collect();

Expand Down Expand Up @@ -848,7 +846,7 @@ impl FunctionReturnType {
pub fn get_type(&self) -> Cow<UnresolvedType> {
match self {
FunctionReturnType::Default(span) => {
Cow::Owned(UnresolvedType { typ: UnresolvedTypeData::Unit, span: Some(*span) })
Cow::Owned(UnresolvedType { typ: UnresolvedTypeData::Unit, span: *span })
}
FunctionReturnType::Ty(typ) => Cow::Borrowed(typ),
}
Expand Down
4 changes: 1 addition & 3 deletions noir/noir-repo/compiler/noirc_frontend/src/ast/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,7 @@ impl NoirFunction {

pub fn return_type(&self) -> UnresolvedType {
match &self.def.return_type {
FunctionReturnType::Default(_) => {
UnresolvedType::without_span(UnresolvedTypeData::Unit)
}
FunctionReturnType::Default(span) => UnresolvedTypeData::Unit.with_span(*span),
FunctionReturnType::Ty(ty) => ty.clone(),
}
}
Expand Down
18 changes: 3 additions & 15 deletions noir/noir-repo/compiler/noirc_frontend/src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,7 @@ pub enum UnresolvedTypeData {
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct UnresolvedType {
pub typ: UnresolvedTypeData,

// The span is None in the cases where the User omitted a type:
// fn Foo() {} --- return type is UnresolvedType::Unit without a span
// let x = 100; --- type is UnresolvedType::Unspecified without a span
pub span: Option<Span>,
pub span: Span,
}

/// Type wrapper for a member access
Expand Down Expand Up @@ -184,7 +180,7 @@ pub enum UnresolvedTypeExpression {

impl Recoverable for UnresolvedType {
fn error(span: Span) -> Self {
UnresolvedType { typ: UnresolvedTypeData::Error, span: Some(span) }
UnresolvedType { typ: UnresolvedTypeData::Error, span }
}
}

Expand Down Expand Up @@ -280,14 +276,6 @@ impl UnresolvedType {
}
}

pub fn without_span(typ: UnresolvedTypeData) -> UnresolvedType {
UnresolvedType { typ, span: None }
}

pub fn unspecified() -> UnresolvedType {
UnresolvedType { typ: UnresolvedTypeData::Unspecified, span: None }
}

pub(crate) fn is_type_expression(&self) -> bool {
matches!(&self.typ, UnresolvedTypeData::Expression(_))
}
Expand All @@ -309,7 +297,7 @@ impl UnresolvedTypeData {
}

pub fn with_span(&self, span: Span) -> UnresolvedType {
UnresolvedType { typ: self.clone(), span: Some(span) }
UnresolvedType { typ: self.clone(), span }
}
}

Expand Down
Loading

0 comments on commit 2d70215

Please sign in to comment.