Skip to content

Commit

Permalink
Refactored and added allow features into all relevant Resolver::new (
Browse files Browse the repository at this point in the history
  • Loading branch information
orizi committed May 27, 2024
1 parent 9d84c52 commit 448c234
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 33 deletions.
48 changes: 46 additions & 2 deletions crates/cairo-lang-semantic/src/diagnostic_test_data/tests
Original file line number Diff line number Diff line change
Expand Up @@ -535,16 +535,60 @@ fn deprecated_function_no_note() -> felt252 {
0
}

#[unstable(feature: "unstable-trait")]
trait UnstableTrait;

impl BadUnstableImpl of UnstableTrait;

#[feature("unstable-trait")]
impl AllowedUnstableImpl of UnstableTrait;

#[unstable(feature: "unstable-member")]
struct DisallowedType {}

struct BadStructMember {
member: DisallowedType,
}

#[feature("unstable-member")]
struct AllowedStructMember {
member: DisallowedType,
}

enum BadEnumVariant {
variant: DisallowedType,
}

#[feature("unstable-member")]
enum AllowedEnumMember {
variant: DisallowedType,
}

//! > function_body

//! > expected_diagnostics
error: Usage of unstable feature `"unstable-trait"` with no `#[feature("unstable-trait")]` attribute.
--> lib.cairo:14:25
impl BadUnstableImpl of UnstableTrait;
^***********^

error: Usage of unstable feature `"unstable-member"` with no `#[feature("unstable-member")]` attribute.
--> lib.cairo:23:13
member: DisallowedType,
^************^

error: Usage of unstable feature `"unstable-member"` with no `#[feature("unstable-member")]` attribute.
--> lib.cairo:32:14
variant: DisallowedType,
^************^

error: Usage of deprecated feature `"deprecated"` with no `#[feature("deprecated")]` attribute. Note: "Some reason"
--> lib.cairo:12:15
--> lib.cairo:41:15
let _fail = deprecated_function_with_note();
^***************************^

error: Usage of deprecated feature `"deprecated"` with no `#[feature("deprecated")]` attribute.
--> lib.cairo:15:15
--> lib.cairo:44:15
let _fail = deprecated_function_no_note();
^*************************^

Expand Down
7 changes: 1 addition & 6 deletions crates/cairo-lang-semantic/src/items/constant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ use itertools::Itertools;
use num_bigint::BigInt;
use num_traits::{Num, ToPrimitive, Zero};

use super::feature_kind::extract_allowed_features;
use super::functions::{GenericFunctionId, GenericFunctionWithBodyId};
use super::structure::SemanticStructEx;
use crate::corelib::{
Expand Down Expand Up @@ -182,11 +181,7 @@ pub fn constant_semantic_data_helper(
}
None => Resolver::new(db, element_id.module_file_id(db.upcast()), inference_id),
};

// TODO(TomerStarkware): check if we should clone the allowed features instead of overiting
// them.
resolver.data.allowed_features =
extract_allowed_features(db.upcast(), element_id, constant_ast, &mut diagnostics);
resolver.set_allowed_features(element_id, constant_ast, &mut diagnostics);

let constant_type = resolve_type(
db,
Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-semantic/src/items/enm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ pub fn enum_generic_params_data(
let inference_id =
InferenceId::LookupItemGenerics(LookupItemId::ModuleItem(ModuleItemId::Enum(enum_id)));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&enum_id, &enum_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down
9 changes: 2 additions & 7 deletions crates/cairo-lang-semantic/src/items/extern_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use cairo_lang_syntax::attribute::structured::AttributeListStructurize;
use cairo_lang_syntax::node::{TypedStablePtr, TypedSyntaxNode};
use cairo_lang_utils::extract_matches;

use super::feature_kind::extract_allowed_features;
use super::function_with_body::get_inline_config;
use super::functions::{FunctionDeclarationData, GenericFunctionId, InlineConfiguration};
use super::generics::{semantic_generic_params, GenericParamsData};
Expand Down Expand Up @@ -80,6 +79,7 @@ pub fn extern_function_declaration_generic_params_data(
ModuleItemId::ExternFunction(extern_function_id),
));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&extern_function_id, &extern_function_syntax, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down Expand Up @@ -151,12 +151,7 @@ pub fn priv_extern_function_declaration_data(
(*generic_params_data.resolver_data).clone_with_inference_id(db, inference_id),
);
diagnostics.extend(generic_params_data.diagnostics);
resolver.data.allowed_features = extract_allowed_features(
db.upcast(),
&extern_function_id,
&extern_function_syntax,
&mut diagnostics,
);
resolver.set_allowed_features(&extern_function_id, &extern_function_syntax, &mut diagnostics);

let mut environment = Environment::empty();
let signature_syntax = declaration.signature(syntax_db);
Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-semantic/src/items/extern_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ pub fn extern_type_declaration_generic_params_data(
ModuleItemId::ExternType(extern_type_id),
));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&extern_type_id, &extern_type_syntax, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down
8 changes: 1 addition & 7 deletions crates/cairo-lang-semantic/src/items/free_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use cairo_lang_syntax::attribute::structured::AttributeListStructurize;
use cairo_lang_syntax::node::{TypedStablePtr, TypedSyntaxNode};
use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;

use super::feature_kind::extract_allowed_features;
use super::function_with_body::{get_inline_config, FunctionBody, FunctionBodyData};
use super::functions::{
forbid_inline_always_with_impl_generic_param, FunctionDeclarationData, InlineConfiguration,
Expand Down Expand Up @@ -91,6 +90,7 @@ pub fn free_function_generic_params_data(
ModuleItemId::FreeFunction(free_function_id),
));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&free_function_id, &free_function_syntax, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down Expand Up @@ -145,12 +145,6 @@ pub fn priv_free_function_declaration_data(
(*generic_params_data.resolver_data).clone_with_inference_id(db, inference_id),
);
diagnostics.extend(generic_params_data.diagnostics);
resolver.data.allowed_features = extract_allowed_features(
db.upcast(),
&free_function_id,
&free_function_syntax,
&mut diagnostics,
);

let mut environment = Environment::empty();

Expand Down
7 changes: 4 additions & 3 deletions crates/cairo-lang-semantic/src/items/imp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ use super::constant::{
constant_semantic_data_cycle_helper, constant_semantic_data_helper, ConstValue, ConstantData,
};
use super::enm::SemanticEnumEx;
use super::feature_kind::extract_allowed_features;
use super::function_with_body::{get_inline_config, FunctionBody, FunctionBodyData};
use super::functions::{
forbid_inline_always_with_impl_generic_param, FunctionDeclarationData, InlineConfiguration,
Expand Down Expand Up @@ -267,6 +266,7 @@ pub fn impl_def_generic_params_data(
InferenceId::LookupItemGenerics(LookupItemId::ModuleItem(ModuleItemId::Impl(impl_def_id)));

let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&impl_def_id, &impl_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down Expand Up @@ -353,6 +353,7 @@ pub fn impl_def_trait(db: &dyn SemanticGroup, impl_def_id: ImplDefId) -> Maybe<T
let inference_id = InferenceId::ImplDefTrait(impl_def_id);

let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&impl_def_id, &impl_ast, &mut diagnostics);

let trait_path_syntax = impl_ast.trait_path(db.upcast());

Expand Down Expand Up @@ -425,6 +426,7 @@ pub fn priv_impl_declaration_data_inner(
db,
(*generic_params_data.resolver_data).clone_with_inference_id(db, inference_id),
);
resolver.set_allowed_features(&impl_def_id, &impl_ast, &mut diagnostics);
diagnostics.extend(generic_params_data.diagnostics);
let trait_path_syntax = impl_ast.trait_path(syntax_db);

Expand Down Expand Up @@ -1823,8 +1825,7 @@ pub fn priv_impl_function_declaration_data(
(*generic_params_data.resolver_data).clone_with_inference_id(db, inference_id),
);
diagnostics.extend(generic_params_data.diagnostics);
resolver.data.allowed_features =
extract_allowed_features(db.upcast(), &impl_function_id, function_syntax, &mut diagnostics);
resolver.set_allowed_features(&impl_function_id, function_syntax, &mut diagnostics);

let signature_syntax = declaration.signature(syntax_db);

Expand Down
2 changes: 2 additions & 0 deletions crates/cairo-lang-semantic/src/items/impl_alias.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ pub fn impl_alias_generic_params_data(
ModuleItemId::ImplAlias(impl_alias_id),
));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&impl_alias_id, &impl_alias_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down Expand Up @@ -203,6 +204,7 @@ pub fn impl_alias_impl_def(db: &dyn SemanticGroup, impl_alias_id: ImplAliasId) -
let inference_id = InferenceId::ImplAliasImplDef(impl_alias_id);

let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&impl_alias_id, &impl_alias_ast, &mut diagnostics);

let impl_path_syntax = impl_alias_ast.impl_path(db.upcast());

Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-semantic/src/items/structure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ pub fn struct_generic_params_data(
let inference_id =
InferenceId::LookupItemGenerics(LookupItemId::ModuleItem(ModuleItemId::Struct(struct_id)));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&struct_id, &struct_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down
9 changes: 2 additions & 7 deletions crates/cairo-lang-semantic/src/items/trt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
use cairo_lang_utils::{define_short_id, Intern, LookupIntern};
use smol_str::SmolStr;

use super::feature_kind::extract_allowed_features;
use super::function_with_body::{get_implicit_precedence, get_inline_config, FunctionBodyData};
use super::functions::{FunctionDeclarationData, ImplicitPrecedence, InlineConfiguration};
use super::generics::{semantic_generic_params, GenericParamsData};
Expand Down Expand Up @@ -305,6 +304,7 @@ pub fn trait_generic_params_data(
let inference_id =
InferenceId::LookupItemGenerics(LookupItemId::ModuleItem(ModuleItemId::Trait(trait_id)));
let mut resolver = Resolver::new(db, module_file_id, inference_id);
resolver.set_allowed_features(&trait_id, &trait_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down Expand Up @@ -966,12 +966,7 @@ pub fn priv_trait_function_declaration_data(
(*function_generic_params_data.resolver_data).clone_with_inference_id(db, inference_id),
);
diagnostics.extend(function_generic_params_data.diagnostics);
resolver.data.allowed_features = extract_allowed_features(
db.upcast(),
&trait_function_id,
function_syntax,
&mut diagnostics,
);
resolver.set_allowed_features(&trait_function_id, function_syntax, &mut diagnostics);
let signature_syntax = declaration_syntax.signature(syntax_db);
let mut environment = Environment::empty();
let signature = semantic::Signature::from_ast(
Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-semantic/src/items/type_aliases.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ pub fn type_alias_generic_params_data_helper(
}
None => Resolver::new(db, module_file_id, inference_id),
};
resolver.set_allowed_features(&lookup_item_id, type_alias_ast, &mut diagnostics);
let generic_params = semantic_generic_params(
db,
&mut diagnostics,
Expand Down
16 changes: 15 additions & 1 deletion crates/cairo-lang-semantic/src/resolve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub use item::{ResolvedConcreteItem, ResolvedGenericItem};
use itertools::Itertools;
use smol_str::SmolStr;
use syntax::node::db::SyntaxGroup;
use syntax::node::helpers::QueryAttrs;
use syntax::node::TypedStablePtr;

use crate::corelib::{core_submodule, get_submodule};
Expand All @@ -35,7 +36,7 @@ use crate::expr::inference::infers::InferenceEmbeddings;
use crate::expr::inference::{Inference, InferenceData, InferenceId};
use crate::items::constant::{resolve_const_expr_and_evaluate, ConstValue};
use crate::items::enm::SemanticEnumEx;
use crate::items::feature_kind::FeatureKind;
use crate::items::feature_kind::{extract_allowed_features, FeatureKind};
use crate::items::functions::{GenericFunctionId, ImplGenericFunctionId};
use crate::items::generics::generic_params_to_args;
use crate::items::imp::{ConcreteImplId, ConcreteImplLongId, ImplId, ImplLookupContext};
Expand Down Expand Up @@ -159,6 +160,19 @@ impl DerefMut for Resolver<'_> {
&mut self.data
}
}
impl Resolver<'_> {
/// Extracts the allowed node from the syntax, and sets it as the allowed features of the
/// resolver.
pub fn set_allowed_features(
&mut self,
element_id: &impl LanguageElementId,
syntax: &impl QueryAttrs,
diagnostics: &mut SemanticDiagnostics,
) {
self.allowed_features =
extract_allowed_features(self.db.upcast(), element_id, syntax, diagnostics);
}
}

/// A trait for things that can be interpreted as a path of segments.
pub trait AsSegments {
Expand Down

0 comments on commit 448c234

Please sign in to comment.