Skip to content

Commit

Permalink
Resolve types in get_implicit_precedence. (#5827)
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyalesokhin-starkware authored Jun 19, 2024
1 parent 4646ad8 commit 80c2f17
Show file tree
Hide file tree
Showing 26 changed files with 119 additions and 116 deletions.
3 changes: 0 additions & 3 deletions corelib/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,6 @@ pub mod boolean;

pub mod circuit;

/// TODO(ilya): Remove the following once implicits lookup is fixed.
use circuit::{AddMod, MulMod, RangeCheck96};

/// General purpose implicits.
pub extern type RangeCheck;
pub extern type SegmentArena;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ fn foo() {}
//! > function_body

//! > expected_diagnostics
error: Unknown type.
error: Type not found.
--> lib.cairo:1:23
#[implicit_precedence(MissingBuiltin1, MissingBuiltin2)]
^*************^
3 changes: 2 additions & 1 deletion crates/cairo-lang-semantic/src/items/extern_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,8 @@ pub fn priv_extern_function_declaration_data(
}
}

let (_, implicit_precedence_attr) = get_implicit_precedence(db, &mut diagnostics, &attributes);
let (_, implicit_precedence_attr) =
get_implicit_precedence(&mut diagnostics, &mut resolver, &attributes);
if let Some(attr) = implicit_precedence_attr {
diagnostics
.report(attr.stable_ptr.untyped(), ImplicitPrecedenceAttrForExternFunctionNotAllowed);
Expand Down
3 changes: 2 additions & 1 deletion crates/cairo-lang-semantic/src/items/free_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,8 @@ pub fn priv_free_function_declaration_data(

forbid_inline_always_with_impl_generic_param(&mut diagnostics, &generic_params, &inline_config);

let (implicit_precedence, _) = get_implicit_precedence(db, &mut diagnostics, &attributes);
let (implicit_precedence, _) =
get_implicit_precedence(&mut diagnostics, &mut resolver, &attributes);

// Check fully resolved.
let inference = &mut resolver.inference();
Expand Down
25 changes: 14 additions & 11 deletions crates/cairo-lang-semantic/src/items/function_with_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,19 @@ use cairo_lang_diagnostics::{DiagnosticAdded, Diagnostics, Maybe, ToMaybe};
use cairo_lang_proc_macros::DebugWithDb;
use cairo_lang_syntax::attribute::consts::{IMPLICIT_PRECEDENCE_ATTR, INLINE_ATTR};
use cairo_lang_syntax::attribute::structured::{Attribute, AttributeArg, AttributeArgVariant};
use cairo_lang_syntax::node::{ast, TypedStablePtr, TypedSyntaxNode};
use cairo_lang_syntax::node::{ast, TypedStablePtr};
use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
use cairo_lang_utils::Upcast;
use cairo_lang_utils::{try_extract_matches, Upcast};
use id_arena::Arena;
use itertools::Itertools;

use super::functions::InlineConfiguration;
use crate::corelib::try_get_core_ty_by_name;
use crate::db::SemanticGroup;
use crate::diagnostic::{SemanticDiagnosticKind, SemanticDiagnostics, SemanticDiagnosticsBuilder};
use crate::diagnostic::{
NotFoundItemType, SemanticDiagnosticKind, SemanticDiagnostics, SemanticDiagnosticsBuilder,
};
use crate::items::functions::ImplicitPrecedence;
use crate::resolve::ResolverData;
use crate::resolve::{ResolvedConcreteItem, Resolver, ResolverData};
use crate::{semantic, ExprId, PatternId, SemanticDiagnostic, TypeId};

// === Declaration ===
Expand Down Expand Up @@ -314,12 +315,10 @@ pub fn get_inline_config(
/// If there is no implicit precedence influencing attribute, then this function returns
/// [ImplicitPrecedence::UNSPECIFIED].
pub fn get_implicit_precedence<'a>(
db: &dyn SemanticGroup,
diagnostics: &mut SemanticDiagnostics,
resolver: &mut Resolver<'_>,
attributes: &'a [Attribute],
) -> (ImplicitPrecedence, Option<&'a Attribute>) {
let syntax_db = db.upcast();

let mut attributes = attributes.iter().rev().filter(|attr| attr.id == IMPLICIT_PRECEDENCE_ATTR);

// Pick the last attribute if any.
Expand All @@ -345,9 +344,13 @@ pub fn get_implicit_precedence<'a>(
));
};

let type_name = path.as_syntax_node().get_text_without_trivia(syntax_db);
try_get_core_ty_by_name(db, type_name.into(), vec![])
.map_err(|kind| diagnostics.report(value, kind))
resolver.resolve_concrete_path(diagnostics, path, NotFoundItemType::Type).and_then(
|resolved_item: crate::resolve::ResolvedConcreteItem| {
try_extract_matches!(resolved_item, ResolvedConcreteItem::Type).ok_or_else(
|| diagnostics.report(value, SemanticDiagnosticKind::UnknownType),
)
},
)
}

_ => Err(diagnostics
Expand Down
8 changes: 4 additions & 4 deletions crates/cairo-lang-semantic/src/items/imp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2038,6 +2038,10 @@ pub fn priv_impl_function_declaration_data(
&mut environment,
);

let attributes = function_syntax.attributes(syntax_db).structurize(syntax_db);
let (implicit_precedence, _) =
get_implicit_precedence(&mut diagnostics, &mut resolver, &attributes);

let inference = &mut resolver.inference();
// Check fully resolved.
inference.finalize(&mut diagnostics, function_syntax.stable_ptr().untyped());
Expand All @@ -2054,14 +2058,10 @@ pub fn priv_impl_function_declaration_data(
},
);

let attributes = function_syntax.attributes(syntax_db).structurize(syntax_db);

let inline_config = get_inline_config(db, &mut diagnostics, &attributes)?;

forbid_inline_always_with_impl_generic_param(&mut diagnostics, &generic_params, &inline_config);

let (implicit_precedence, _) = get_implicit_precedence(db, &mut diagnostics, &attributes);

let signature = inference.rewrite(signature).no_err();
let generic_params = inference.rewrite(generic_params).no_err();

Expand Down
5 changes: 3 additions & 2 deletions crates/cairo-lang-semantic/src/items/trt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1160,10 +1160,11 @@ pub fn priv_trait_function_declaration_data(
);

let attributes = function_syntax.attributes(syntax_db).structurize(syntax_db);
let resolver_data = Arc::new(resolver.data);

let inline_config = get_inline_config(db, &mut diagnostics, &attributes)?;
let (implicit_precedence, _) = get_implicit_precedence(db, &mut diagnostics, &attributes);
let (implicit_precedence, _) =
get_implicit_precedence(&mut diagnostics, &mut resolver, &attributes);
let resolver_data = Arc::new(resolver.data);

Ok(FunctionDeclarationData {
diagnostics: diagnostics.build(),
Expand Down
8 changes: 4 additions & 4 deletions crates/cairo-lang-starknet/src/plugin/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@ pub(super) const IMPLICIT_PRECEDENCE: &[&str] = &[
"Pedersen",
"RangeCheck",
"Bitwise",
"EcOp",
"core::ec::EcOp",
"Poseidon",
"SegmentArena",
"RangeCheck96",
"AddMod",
"MulMod",
"core::circuit::RangeCheck96",
"core::circuit::AddMod",
"core::circuit::MulMod",
"GasBuiltin",
"System",
];
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,7 @@ pub trait UnsafeNewContractStateTraitForMyImpl<
fn unsafe_new_contract_state() -> TContractState;
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__MyImpl__get<TContractState, impl X: HasComponent<TContractState>
, impl TContractStateDrop: Drop<TContractState>, impl UnsafeNewContractState: UnsafeNewContractStateTraitForMyImpl<TContractState>>(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
Expand All @@ -737,7 +737,7 @@ fn __wrapper__MyImpl__get<TContractState, impl X: HasComponent<TContractState>
core::array::ArrayTrait::span(@arr)
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__MyImpl__set<TContractState, impl X: HasComponent<TContractState>
, impl TContractStateDrop: Drop<TContractState>, impl UnsafeNewContractState: UnsafeNewContractStateTraitForMyImpl<TContractState>>(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ pub trait UnsafeNewContractStateTraitForMyImpl<
fn unsafe_new_contract_state() -> TContractState;
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__MyImpl__do_nothing<TContractState, impl X: HasComponent<TContractState>, +Drop<TContractState>, impl UnsafeNewContractState: UnsafeNewContractStateTraitForMyImpl<TContractState>>(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
core::internal::revoke_ap_tracking();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ use starknet::storage::{
#[cfg(target: 'test')]
pub const TEST_CLASS_HASH: felt252 = 0x2cd967636a47442d438bb2596f3c9848f0a831f916f4bb50d807e6eb90df576;

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__get_something(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
core::internal::revoke_ap_tracking();
Expand All @@ -162,7 +162,7 @@ fn __wrapper__get_something(mut data: Span::<felt252>) -> Span::<felt252> {
core::array::ArrayTrait::span(@arr)
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__set_something(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
core::internal::revoke_ap_tracking();
Expand All @@ -188,7 +188,7 @@ fn __wrapper__set_something(mut data: Span::<felt252>) -> Span::<felt252> {
core::array::ArrayTrait::span(@arr)
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__l1_handler_func(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
core::internal::revoke_ap_tracking();
Expand Down Expand Up @@ -217,7 +217,7 @@ fn __wrapper__l1_handler_func(mut data: Span::<felt252>) -> Span::<felt252> {
core::array::ArrayTrait::span(@arr)
}

#[implicit_precedence(Pedersen, RangeCheck, Bitwise, EcOp, Poseidon, SegmentArena, RangeCheck96, AddMod, MulMod, GasBuiltin, System)]
#[implicit_precedence(Pedersen, RangeCheck, Bitwise, core::ec::EcOp, Poseidon, SegmentArena, core::circuit::RangeCheck96, core::circuit::AddMod, core::circuit::MulMod, GasBuiltin, System)]
fn __wrapper__test_serde(mut data: Span::<felt252>) -> Span::<felt252> {
core::internal::require_implicit::<System>();
core::internal::revoke_ap_tracking();
Expand Down
Loading

0 comments on commit 80c2f17

Please sign in to comment.