diff --git a/Cargo.lock b/Cargo.lock index a5ab368caa..fd7cab7a36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2511,6 +2511,7 @@ dependencies = [ name = "language_v2_tests" version = "1.3.5" dependencies = [ + "indexmap", "infra_utils", "language_v2_definition", "language_v2_macros", diff --git a/crates/codegen/generator/src/lib.rs b/crates/codegen/generator/src/lib.rs index 8b1f0371e4..96def7bedd 100644 --- a/crates/codegen/generator/src/lib.rs +++ b/crates/codegen/generator/src/lib.rs @@ -15,7 +15,7 @@ use indexmap::IndexSet; use infra_utils::cargo::CargoWorkspace; use ir::builders::{build_ir_models, GenericModel}; use language_definition::model::Language; -use language_v2_definition::model::Language as LanguageV2; +use language_v2_definition::model::{Identifier, Language as LanguageV2}; use semver::Version; use serde::Serialize; @@ -82,6 +82,7 @@ impl RuntimeModelV2 { pub struct LanguageModelV2 { name: String, versions: IndexSet, + evm_targets: IndexSet, built_ins: Vec, } @@ -90,6 +91,7 @@ impl LanguageModelV2 { Self { name: language.name.to_string(), versions: language.versions.clone(), + evm_targets: language.evm_targets.clone(), built_ins: codegen_v2_semantic::built_ins::build_built_ins_model(language), } } diff --git a/crates/language-v2/definition/src/compiler/analysis/mod.rs b/crates/language-v2/definition/src/compiler/analysis/mod.rs index 7db2fe6525..ba8f0cb4b3 100644 --- a/crates/language-v2/definition/src/compiler/analysis/mod.rs +++ b/crates/language-v2/definition/src/compiler/analysis/mod.rs @@ -1,5 +1,5 @@ mod p1_definitions; -mod p2_version_specifiers; +mod p2_specifiers; mod p3_references; mod p4_unreachable_items; mod p5_unused_versions; @@ -44,8 +44,8 @@ impl Analysis { for pass in &[ // This pass creates `ItemMetadata` definitions for all language `Item` entries, and verifies they are correct/unique. p1_definitions::run, - // This pass checks all version ranges in the grammar for correctness. - p2_version_specifiers::run, + // This pass checks all version ranges (`enabled`) and EVM target ranges (`evm_enabled`) in the grammar for correctness. + p2_specifiers::run, // This pass collects all references between items, making sure they conform to their enabled version ranges. p3_references::run, // This pass makes sure all items are reachable from the grammar root. diff --git a/crates/language-v2/definition/src/compiler/analysis/p2_version_specifiers/mod.rs b/crates/language-v2/definition/src/compiler/analysis/p2_specifiers/mod.rs similarity index 61% rename from crates/language-v2/definition/src/compiler/analysis/p2_version_specifiers/mod.rs rename to crates/language-v2/definition/src/compiler/analysis/p2_specifiers/mod.rs index 879a083f62..50ae4fd69f 100644 --- a/crates/language-v2/definition/src/compiler/analysis/p2_version_specifiers/mod.rs +++ b/crates/language-v2/definition/src/compiler/analysis/p2_specifiers/mod.rs @@ -2,21 +2,27 @@ use std::fmt::Debug; use std::rc::Rc; use indexmap::IndexMap; +use inflector::Inflector; use semver::Version; use crate::compiler::analysis::Analysis; use crate::internals::Spanned; use crate::model::{ Identifier, SpannedBuiltInContext, SpannedBuiltInDefinition, SpannedBuiltInScope, - SpannedEnumItem, SpannedEnumVariant, SpannedField, SpannedFragmentItem, SpannedItem, - SpannedKeywordItem, SpannedPrecedenceExpression, SpannedPrecedenceItem, - SpannedPrecedenceOperator, SpannedPrimaryExpression, SpannedRepeatedItem, SpannedSeparatedItem, - SpannedStructItem, SpannedTokenItem, SpannedVersionSpecifier, + SpannedEnumItem, SpannedEnumVariant, SpannedEvmTargetSpecifier, SpannedField, + SpannedFragmentItem, SpannedItem, SpannedKeywordItem, SpannedPrecedenceExpression, + SpannedPrecedenceItem, SpannedPrecedenceOperator, SpannedPrimaryExpression, + SpannedRepeatedItem, SpannedSeparatedItem, SpannedStructItem, SpannedTokenItem, + SpannedVersionSpecifier, }; pub(crate) fn run(analysis: &mut Analysis) { let language = Rc::clone(&analysis.language); + for evm_target in &language.evm_targets { + check_evm_target_definition(analysis, evm_target); + } + for item in language.items() { check_item(analysis, item); } @@ -26,6 +32,18 @@ pub(crate) fn run(analysis: &mut Analysis) { } } +fn check_evm_target_definition(analysis: &mut Analysis, evm_target: &Spanned) { + let actual = evm_target.as_str(); + let expected = actual.to_pascal_case(); + + if actual != expected.as_str() { + analysis.errors.add( + evm_target, + &EvmTargetErrors::IncorrectCase(evm_target, expected), + ); + } +} + fn check_item(analysis: &mut Analysis, item: &SpannedItem) { match item { SpannedItem::Struct { item } => { @@ -222,10 +240,12 @@ fn check_built_in_definition(analysis: &mut Analysis, definition: &SpannedBuiltI let SpannedBuiltInDefinition { name: _, enabled, + evm_enabled, internal_parameter: _, } = definition; check_version_specifier(analysis, enabled.as_ref()); + check_evm_target_specifier(analysis, evm_enabled.as_ref()); } fn check_version_specifier( @@ -240,36 +260,44 @@ fn check_version_specifier( match &**specifier { SpannedVersionSpecifier::Always => { - analysis.errors.add(specifier, &Errors::RedundantAlways); + analysis + .errors + .add(specifier, &VersionErrors::RedundantAlways); } SpannedVersionSpecifier::Never => {} SpannedVersionSpecifier::From { from } => { check_version(analysis, from); - if **from == *first_version { - analysis.errors.add(from, &Errors::RedundantFrom(from)); + if *from == first_version { + analysis + .errors + .add(from, &VersionErrors::RedundantFrom(from)); } } SpannedVersionSpecifier::Till { till } => { check_version(analysis, till); - if **till == *first_version { - analysis.errors.add(till, &Errors::RedundantTill(till)); + if *till == first_version { + analysis + .errors + .add(till, &VersionErrors::RedundantTill(till)); } } SpannedVersionSpecifier::Range { from, till } => { if from >= till { analysis .errors - .add(from, &Errors::UnorderedVersionPair(from, till)); + .add(from, &VersionErrors::UnorderedVersionPair(from, till)); return; } check_version(analysis, from); check_version(analysis, till); - if **from == *first_version { - analysis.errors.add(from, &Errors::RedundantRangeFrom(from)); + if *from == first_version { + analysis + .errors + .add(from, &VersionErrors::RedundantRangeFrom(from)); } } } @@ -279,12 +307,79 @@ fn check_version(analysis: &mut Analysis, version: &Spanned) { if !analysis.language.versions.contains(version) { analysis .errors - .add(version, &Errors::VersionNotFound(version)); + .add(version, &VersionErrors::VersionNotFound(version)); + } +} + +fn check_evm_target_specifier( + analysis: &mut Analysis, + specifier: Option<&Spanned>, +) { + let Some(specifier) = specifier else { + return; + }; + + let first_evm_target = analysis.language.evm_targets.first().unwrap().clone(); + + match &**specifier { + SpannedEvmTargetSpecifier::Always => { + analysis + .errors + .add(specifier, &EvmTargetErrors::RedundantAlways); + } + SpannedEvmTargetSpecifier::From { from } => { + check_evm_target(analysis, from); + + if *from == first_evm_target { + analysis + .errors + .add(from, &EvmTargetErrors::RedundantFrom(from)); + } + } + SpannedEvmTargetSpecifier::Till { till } => { + check_evm_target(analysis, till); + + if *till == first_evm_target { + analysis + .errors + .add(till, &EvmTargetErrors::RedundantTill(till)); + } + } + SpannedEvmTargetSpecifier::Range { from, till } => { + if let (Some(from_index), Some(till_index)) = ( + analysis.language.evm_targets.get_index_of(from), + analysis.language.evm_targets.get_index_of(till), + ) { + if from_index >= till_index { + analysis + .errors + .add(from, &EvmTargetErrors::UnorderedEvmTargetPair(from, till)); + return; + } + } + + check_evm_target(analysis, from); + check_evm_target(analysis, till); + + if *from == first_evm_target { + analysis + .errors + .add(from, &EvmTargetErrors::RedundantRangeFrom(from)); + } + } + } +} + +fn check_evm_target(analysis: &mut Analysis, evm_target: &Spanned) { + if !analysis.language.evm_targets.contains(evm_target) { + analysis + .errors + .add(evm_target, &EvmTargetErrors::EvmTargetNotFound(evm_target)); } } #[derive(thiserror::Error, Debug)] -enum Errors<'err> { +enum VersionErrors<'err> { #[error("Version '{0}' does not exist in the language definition.")] VersionNotFound(&'err Version), #[error("Version '{0}' must be less than corresponding version '{1}'.")] @@ -302,3 +397,25 @@ enum Errors<'err> { )] RedundantRangeFrom(&'err Version), } + +#[derive(thiserror::Error, Debug)] +enum EvmTargetErrors<'err> { + #[error("EVM target '{0}' does not exist in the language definition.")] + EvmTargetNotFound(&'err Identifier), + #[error("EVM target '{0}' must use PascalCase spelling ('{1}').")] + IncorrectCase(&'err Identifier, String), + #[error("EVM target '{0}' must precede corresponding EVM target '{1}'.")] + UnorderedEvmTargetPair(&'err Identifier, &'err Identifier), + #[error( + "Explicit 'Always' is redundant, since it is the default when 'evm_enabled' is not specified." + )] + RedundantAlways, + #[error("'From' with the first supported EVM target '{0}' is equivalent to 'Always', and can be removed.")] + RedundantFrom(&'err Identifier), + #[error("'Till' with the first supported EVM target '{0}' produces an empty range, disabling the built-in on every EVM target.")] + RedundantTill(&'err Identifier), + #[error( + "'Range' starting from the first supported EVM target '{0}' can be simplified to 'Till'." + )] + RedundantRangeFrom(&'err Identifier), +} diff --git a/crates/language-v2/definition/src/model/built_ins.rs b/crates/language-v2/definition/src/model/built_ins.rs index 9a5ee66e4b..a45f42e9bb 100644 --- a/crates/language-v2/definition/src/model/built_ins.rs +++ b/crates/language-v2/definition/src/model/built_ins.rs @@ -1,7 +1,7 @@ use language_v2_internal_macros::{derive_spanned_type, ParseInputTokens, WriteOutputTokens}; use serde::{Deserialize, Serialize}; -use crate::model::{Code, Identifier, VersionSpecifier}; +use crate::model::{Code, EvmTargetSpecifier, Identifier, VersionSpecifier}; #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] #[derive_spanned_type(Clone, Debug, ParseInputTokens, WriteOutputTokens)] @@ -26,6 +26,10 @@ pub struct BuiltInDefinition { #[serde(skip_serializing_if = "Option::is_none")] pub enabled: Option, + /// The EVM target range this built-in is available. + #[serde(skip_serializing_if = "Option::is_none")] + pub evm_enabled: Option, + /// A verbatim Rust type to use in the definition of the variant in the /// internal enum if required for correct resolution or typing. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/crates/language-v2/definition/src/model/manifest.rs b/crates/language-v2/definition/src/model/manifest.rs index 85e30c80ed..90f81cf009 100644 --- a/crates/language-v2/definition/src/model/manifest.rs +++ b/crates/language-v2/definition/src/model/manifest.rs @@ -18,6 +18,9 @@ pub struct Language { /// The supported versions of the language pub versions: IndexSet, + /// The supported targets of the EVM + pub evm_targets: IndexSet, + /// The lexical contexts of the language, splitting grammar elements based /// on which lexer can recognize their terminals. pub contexts: Vec, diff --git a/crates/language-v2/definition/src/model/utils/evm_target_specifier.rs b/crates/language-v2/definition/src/model/utils/evm_target_specifier.rs new file mode 100644 index 0000000000..d519a807f1 --- /dev/null +++ b/crates/language-v2/definition/src/model/utils/evm_target_specifier.rs @@ -0,0 +1,22 @@ +use language_v2_internal_macros::{derive_spanned_type, ParseInputTokens, WriteOutputTokens}; +use serde::{Deserialize, Serialize}; + +use crate::model::Identifier; + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[derive_spanned_type(Clone, Debug, ParseInputTokens, WriteOutputTokens)] +#[serde(tag = "type")] +pub enum EvmTargetSpecifier { + #[default] + Always, + From { + from: Identifier, + }, + Till { + till: Identifier, + }, + Range { + from: Identifier, + till: Identifier, + }, +} diff --git a/crates/language-v2/definition/src/model/utils/mod.rs b/crates/language-v2/definition/src/model/utils/mod.rs index 380eef6b2f..49798e63f0 100644 --- a/crates/language-v2/definition/src/model/utils/mod.rs +++ b/crates/language-v2/definition/src/model/utils/mod.rs @@ -1,9 +1,11 @@ mod code; +mod evm_target_specifier; mod identifier; mod parser_options; mod version_specifier; pub use code::*; +pub use evm_target_specifier::*; pub use identifier::*; pub use parser_options::*; pub use version_specifier::*; diff --git a/crates/language-v2/internal_macros/src/derive/spanned.rs b/crates/language-v2/internal_macros/src/derive/spanned.rs index 9b9903beb9..b98021c949 100644 --- a/crates/language-v2/internal_macros/src/derive/spanned.rs +++ b/crates/language-v2/internal_macros/src/derive/spanned.rs @@ -143,7 +143,7 @@ fn get_spanned_type(input: Type) -> Type { // These are model Types that have a derived 'SpannedXXX' type. // Let's use that instead, but also wrap it in 'Spanned' because we want to capture its complete span for validation: - "OperatorModel" | "VersionSpecifier" | "ParserOptions" => { + "OperatorModel" | "VersionSpecifier" | "EvmTargetSpecifier" | "ParserOptions" => { let spanned_type = format_ident!("{}", add_spanned_prefix(type_name)); parse_quote! { crate::internals::Spanned diff --git a/crates/language-v2/tests/Cargo.toml b/crates/language-v2/tests/Cargo.toml index 8b863b75ce..00fc865354 100644 --- a/crates/language-v2/tests/Cargo.toml +++ b/crates/language-v2/tests/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true publish = false [dev-dependencies] +indexmap = { workspace = true } infra_utils = { workspace = true } language_v2_definition = { workspace = true } language_v2_macros = { workspace = true } diff --git a/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.rs index 3e090c44ee..71f0078c02 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.stderr index 8c44086d2f..5bf94c9e89 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/code_string_literal/test.stderr @@ -1,5 +1,5 @@ error: expected identifier - --> src/fail/p0_parsing/code_string_literal/test.rs:17:83 + --> src/fail/p0_parsing/code_string_literal/test.rs:18:83 | -17 | parser_options = ParserOptions(inline = false, verbatim = "raw string not accepted") +18 | parser_options = ParserOptions(inline = false, verbatim = "raw string not accepted") | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.rs index f26ffafaa3..bf4a233405 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.stderr index 2c1ab246c7..b7ec6edadc 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/code_wrong_ident/test.stderr @@ -1,5 +1,5 @@ error: Expected `Code(...)` DSL node. - --> src/fail/p0_parsing/code_wrong_ident/test.rs:17:83 + --> src/fail/p0_parsing/code_wrong_ident/test.rs:18:83 | -17 | parser_options = ParserOptions(inline = false, verbatim = NotCode(body)) +18 | parser_options = ParserOptions(inline = false, verbatim = NotCode(body)) | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.rs index d555b80d1a..4c2e2a8871 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.stderr index d52e271ea5..ae9326bf18 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.stderr @@ -1,5 +1,5 @@ error: Duplicate map key. - --> src/fail/p0_parsing/duplicate_map_key/test.rs:18:29 + --> src/fail/p0_parsing/duplicate_map_key/test.rs:19:29 | -18 | ... field_1 = Required(Baz), +19 | ... field_1 = Required(Baz), | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_set_entry/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_set_entry/test.rs index 453eda61d4..4821987884 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/duplicate_set_entry/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/duplicate_set_entry/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "1.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.rs index 7284e1d8d9..af457d29f2 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.stderr index ece5b10753..25acb3b124 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.stderr @@ -1,5 +1,5 @@ error: Expected a non-empty string. - --> src/fail/p0_parsing/empty_string/test.rs:13:59 + --> src/fail/p0_parsing/empty_string/test.rs:14:59 | -13 | items = [Token(name = Bar, scanner = Atom(""))] +14 | items = [Token(name = Bar, scanner = Atom(""))] | ^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.rs index fe14b30237..703cc58ffa 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0", "4.0.0", "5.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.stderr index 7eab5597cf..8bc6c969b2 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/missing_field/test.stderr @@ -1,5 +1,5 @@ error: Expected field: 'title'. - --> src/fail/p0_parsing/missing_field/test.rs:11:13 + --> src/fail/p0_parsing/missing_field/test.rs:12:13 | -11 | topics = [] +12 | topics = [] | ^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.rs index af94b3ae5d..dc86aee3a0 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.stderr index ac47a437a7..05536a283c 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_field/test.stderr @@ -1,5 +1,5 @@ error: unexpected token, expected `)` - --> src/fail/p0_parsing/unrecognized_field/test.rs:14:17 + --> src/fail/p0_parsing/unrecognized_field/test.rs:15:17 | -14 | unrecognized_field = true +15 | unrecognized_field = true | ^^^^^^^^^^^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.rs b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.rs index 1f0f0742d2..2bd6571f01 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.rs +++ b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar1, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.stderr b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.stderr index c07971f657..e98190214d 100644 --- a/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.stderr +++ b/crates/language-v2/tests/src/fail/p0_parsing/unrecognized_variant/test.stderr @@ -1,5 +1,5 @@ error: Expected a variant: 'Struct' or 'Enum' or 'Repeated' or 'Separated' or 'Precedence' or 'Trivia' or 'Keyword' or 'Token' or 'Fragment' - --> src/fail/p0_parsing/unrecognized_variant/test.rs:19:53 + --> src/fail/p0_parsing/unrecognized_variant/test.rs:20:53 | -19 | Topic(title = "Topic Two", items = [Unrecognized(true)]) +20 | Topic(title = "Topic Two", items = [Unrecognized(true)]) | ^^^^^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.rs b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.rs index f0ef59cf8c..2810c53551 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.rs +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.stderr b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.stderr index 63de80619c..ecbdbaf693 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.stderr +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_builtin_name/test.stderr @@ -1,5 +1,5 @@ error: A built-in definition with the name 'Baz' already exists. - --> src/fail/p1_definitions/duplicate_builtin_name/test.rs:26:57 + --> src/fail/p1_definitions/duplicate_builtin_name/test.rs:27:57 | -26 | definitions = [BuiltInDefinition(name = Baz)] +27 | definitions = [BuiltInDefinition(name = Baz)] | ^^^ diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.rs b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.rs index 65ae1a408a..2602cb5d20 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.rs +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.stderr b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.stderr index 4718217daa..61eb0bb39e 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.stderr +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_expression_name/test.stderr @@ -1,5 +1,5 @@ error: An expression with the name 'Expression1' already exists. - --> src/fail/p1_definitions/duplicate_expression_name/test.rs:32:40 + --> src/fail/p1_definitions/duplicate_expression_name/test.rs:33:40 | -32 | ... name = Expression1, +33 | ... name = Expression1, | ^^^^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.rs b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.rs index a67f008a1c..ca58525684 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.rs +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar1, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.stderr b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.stderr index cc1c5a3772..5917ad7390 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.stderr +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_item_name/test.stderr @@ -1,5 +1,5 @@ error: An item with the name 'Bar1' already exists. - --> src/fail/p1_definitions/duplicate_item_name/test.rs:15:35 + --> src/fail/p1_definitions/duplicate_item_name/test.rs:16:35 | -15 | Struct(name = Bar1, fields = (field = Required(Bar2))), +16 | Struct(name = Bar1, fields = (field = Required(Bar2))), | ^^^^ diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.rs b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.rs index b74950fbde..2131fb4cb2 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.rs +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.stderr b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.stderr index ba9c24effa..5fba662f1a 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.stderr +++ b/crates/language-v2/tests/src/fail/p1_definitions/duplicate_variant_name/test.stderr @@ -1,5 +1,5 @@ error: A variant referencing 'Baz1' already exists. - --> src/fail/p1_definitions/duplicate_variant_name/test.rs:19:53 + --> src/fail/p1_definitions/duplicate_variant_name/test.rs:20:53 | -19 | ... EnumVariant(reference = Baz1) +20 | ... EnumVariant(reference = Baz1) | ^^^^ diff --git a/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.rs b/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.rs index 647c72c8e9..46aab640fa 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.rs +++ b/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.stderr b/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.stderr index a92df9a344..7c0658ecc0 100644 --- a/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.stderr +++ b/crates/language-v2/tests/src/fail/p1_definitions/operator_mismatch/test.stderr @@ -1,5 +1,5 @@ error: All operators under the same expression must have the same model and type. - --> src/fail/p1_definitions/operator_mismatch/test.rs:17:36 + --> src/fail/p1_definitions/operator_mismatch/test.rs:18:36 | -17 | ... name = Foo, +18 | ... name = Foo, | ^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.rs new file mode 100644 index 0000000000..c0dd7703bc --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = From(Shanghai))] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.stderr new file mode 100644 index 0000000000..2bf5d7ebbd --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_not_found/test.stderr @@ -0,0 +1,5 @@ +error: EVM target 'Shanghai' does not exist in the language definition. + --> src/fail/p2_specifiers/evm_target_not_found/test.rs:25:83 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = From(Shanghai))] + | ^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.rs new file mode 100644 index 0000000000..2a35f05ee4 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Always)] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.stderr new file mode 100644 index 0000000000..b3d946ef13 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_always/test.stderr @@ -0,0 +1,5 @@ +error: Explicit 'Always' is redundant, since it is the default when 'evm_enabled' is not specified. + --> src/fail/p2_specifiers/evm_target_redundant_always/test.rs:25:78 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Always)] + | ^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.rs new file mode 100644 index 0000000000..56508bada2 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = From(Frontier))] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.stderr new file mode 100644 index 0000000000..d407cd69cd --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_from/test.stderr @@ -0,0 +1,5 @@ +error: 'From' with the first supported EVM target 'Frontier' is equivalent to 'Always', and can be removed. + --> src/fail/p2_specifiers/evm_target_redundant_from/test.rs:25:83 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = From(Frontier))] + | ^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.rs new file mode 100644 index 0000000000..a63fef2516 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Range(from = Frontier, till = Cancun))] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.stderr new file mode 100644 index 0000000000..a776e2a108 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_range_from/test.stderr @@ -0,0 +1,5 @@ +error: 'Range' starting from the first supported EVM target 'Frontier' can be simplified to 'Till'. + --> src/fail/p2_specifiers/evm_target_redundant_range_from/test.rs:25:91 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Range(from = Frontier, till = Cancun))] + | ^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.rs new file mode 100644 index 0000000000..92a35b345c --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Till(Frontier))] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.stderr new file mode 100644 index 0000000000..9ebed1f3f0 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_redundant_till/test.stderr @@ -0,0 +1,5 @@ +error: 'Till' with the first supported EVM target 'Frontier' produces an empty range, disabling the built-in on every EVM target. + --> src/fail/p2_specifiers/evm_target_redundant_till/test.rs:25:83 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Till(Frontier))] + | ^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.rs new file mode 100644 index 0000000000..4b50115ba2 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, Cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Range(from = Cancun, till = Homestead))] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.stderr new file mode 100644 index 0000000000..822e996830 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_unordered_pair/test.stderr @@ -0,0 +1,5 @@ +error: EVM target 'Cancun' must precede corresponding EVM target 'Homestead'. + --> src/fail/p2_specifiers/evm_target_unordered_pair/test.rs:25:91 + | +25 | definitions = [BuiltInDefinition(name = MyBuiltIn, evm_enabled = Range(from = Cancun, till = Homestead))] + | ^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.rs new file mode 100644 index 0000000000..177b9399da --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.rs @@ -0,0 +1,30 @@ +#![allow(unused_crate_dependencies)] + +language_v2_macros::compile!(Language( + name = Foo, + root_item = One, + versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [Frontier, Homestead, cancun], + contexts = [LexicalContext( + name = Foo, + sections = [Section( + title = "Section One", + topics = [Topic( + title = "Topic One", + items = [ + Struct(name = One, fields = (field_1 = Required(Two))), + Token(name = Two, scanner = Atom("two")) + ] + )] + )] + )], + built_ins = [BuiltInContext( + name = Globals, + scopes = [BuiltInScope( + name = Global, + definitions = [BuiltInDefinition(name = MyBuiltIn)] + )] + )] +)); + +fn main() {} diff --git a/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.stderr new file mode 100644 index 0000000000..72fe266af9 --- /dev/null +++ b/crates/language-v2/tests/src/fail/p2_specifiers/evm_target_wrong_case/test.stderr @@ -0,0 +1,5 @@ +error: EVM target 'cancun' must use PascalCase spelling ('Cancun'). + --> src/fail/p2_specifiers/evm_target_wrong_case/test.rs:7:41 + | +7 | evm_targets = [Frontier, Homestead, cancun], + | ^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.rs index 76ccaf7043..f0340e8667 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.stderr similarity index 57% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.stderr index d7f6e2dba3..92c9e6e459 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/version_not_found/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_not_found/test.stderr @@ -1,5 +1,5 @@ error: Version '3.0.0' does not exist in the language definition. - --> src/fail/p2_version_specifiers/version_not_found/test.rs:17:80 + --> src/fail/p2_specifiers/version_not_found/test.rs:18:80 | -17 | ... field_1 = Optional(reference = Two, enabled = From("3.0.0")), +18 | ... field_1 = Optional(reference = Two, enabled = From("3.0.0")), | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.rs index 82d88aa6ed..bd88bc1ae6 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.stderr similarity index 61% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.stderr index f505eb6c17..8806678a91 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_always/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_always/test.stderr @@ -1,5 +1,5 @@ error: Explicit 'Always' is redundant, since it is the default when 'enabled' is not specified. - --> src/fail/p2_version_specifiers/redundant_always/test.rs:17:75 + --> src/fail/p2_specifiers/version_redundant_always/test.rs:18:75 | -17 | ... field_1 = Optional(reference = Two, enabled = Always), +18 | ... field_1 = Optional(reference = Two, enabled = Always), | ^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.rs index e8b9fbcf10..a73110d87a 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.stderr similarity index 63% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.stderr index e57f32bf02..b54cb6cf68 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_from/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_from/test.stderr @@ -1,5 +1,5 @@ error: 'From' with the first supported version '1.0.0' is equivalent to 'Always', and can be removed. - --> src/fail/p2_version_specifiers/redundant_from/test.rs:17:80 + --> src/fail/p2_specifiers/version_redundant_from/test.rs:18:80 | -17 | ... field_1 = Optional(reference = Two, enabled = From("1.0.0")), +18 | ... field_1 = Optional(reference = Two, enabled = From("1.0.0")), | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.rs index 4e91b1bd91..0947c76555 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.stderr similarity index 55% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.stderr index a7596bd43a..f0aba2d18e 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_range_from/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_range_from/test.stderr @@ -1,5 +1,5 @@ error: 'Range' starting from the first supported version '1.0.0' can be simplified to 'Till'. - --> src/fail/p2_version_specifiers/redundant_range_from/test.rs:19:56 + --> src/fail/p2_specifiers/version_redundant_range_from/test.rs:20:56 | -19 | ... enabled = Range(from = "1.0.0", till = "2.0.0") +20 | ... enabled = Range(from = "1.0.0", till = "2.0.0") | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.rs index ddc86fb87f..bb0dc9333a 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.stderr similarity index 60% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.stderr index 987fbd3d12..a65f873fcd 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/redundant_till/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_redundant_till/test.stderr @@ -1,5 +1,5 @@ error: 'Till' with the first supported version '1.0.0' is equivalent to 'Never'. - --> src/fail/p2_version_specifiers/redundant_till/test.rs:17:80 + --> src/fail/p2_specifiers/version_redundant_till/test.rs:18:80 | -17 | ... field_1 = Optional(reference = Two, enabled = Till("1.0.0")), +18 | ... field_1 = Optional(reference = Two, enabled = Till("1.0.0")), | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.rs b/crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.rs similarity index 97% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.rs rename to crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.rs index 2c538dbde0..823da55eb6 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.rs +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.stderr b/crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.stderr similarity index 51% rename from crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.stderr rename to crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.stderr index 0b8166baa6..94a5a75e15 100644 --- a/crates/language-v2/tests/src/fail/p2_version_specifiers/unordered_version_pair/test.stderr +++ b/crates/language-v2/tests/src/fail/p2_specifiers/version_unordered_pair/test.stderr @@ -1,5 +1,5 @@ error: Version '3.0.0' must be less than corresponding version '2.0.0'. - --> src/fail/p2_version_specifiers/unordered_version_pair/test.rs:19:56 + --> src/fail/p2_specifiers/version_unordered_pair/test.rs:20:56 | -19 | ... enabled = Range(from = "3.0.0", till = "2.0.0") +20 | ... enabled = Range(from = "3.0.0", till = "2.0.0") | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.rs b/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.rs index b779440c4a..9f5b7e8aac 100644 --- a/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [ LexicalContext( name = ContextA, diff --git a/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.stderr b/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.stderr index dd4b3725be..6fbaa1e64b 100644 --- a/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/cross_context_reference/test.stderr @@ -1,5 +1,5 @@ error: Reference 'Two' is in context 'ContextA', but expected context 'ContextB'. - --> src/fail/p3_references/cross_context_reference/test.rs:28:75 + --> src/fail/p3_references/cross_context_reference/test.rs:29:75 | -28 | Struct(name = Three, fields = (field_1 = Required(Two))), +29 | Struct(name = Three, fields = (field_1 = Required(Two))), | ^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.rs b/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.rs index e4e21580f0..07b15b7016 100644 --- a/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0", "4.0.0", "5.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.stderr b/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.stderr index d52eab07b9..ab33f37c92 100644 --- a/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/disabled_too_late/test.stderr @@ -1,5 +1,5 @@ error: Parent scope is only enabled in '2.0.0..3.0.0'. - --> src/fail/p3_references/disabled_too_late/test.rs:27:83 + --> src/fail/p3_references/disabled_too_late/test.rs:28:83 | -27 | fields = (field_1 = Optional(reference = Three, enabled = Till("4.0.0"))) +28 | fields = (field_1 = Optional(reference = Three, enabled = Till("4.0.0"))) | ^^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.rs b/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.rs index 7f44ce197f..6232cb57a4 100644 --- a/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0", "2.0.0", "3.0.0", "4.0.0", "5.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.stderr b/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.stderr index 355cf29b74..6854ccb752 100644 --- a/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/enabled_too_early/test.stderr @@ -1,5 +1,5 @@ error: Parent scope is only enabled in '3.0.0..4.0.0'. - --> src/fail/p3_references/enabled_too_early/test.rs:27:83 + --> src/fail/p3_references/enabled_too_early/test.rs:28:83 | -27 | fields = (field_1 = Optional(reference = Three, enabled = From("2.0.0"))) +28 | fields = (field_1 = Optional(reference = Three, enabled = From("2.0.0"))) | ^^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.rs b/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.rs index 7bcd183fb9..4c45069ad5 100644 --- a/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.stderr b/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.stderr index 55a5ab9923..b21e47d35c 100644 --- a/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/invalid_filter/test.stderr @@ -1,5 +1,5 @@ error: Reference 'Baz' of kind 'Fragment' is not valid. Expected: [Struct, Enum, Repeated, Separated, Precedence, Keyword, Token] - --> src/fail/p3_references/invalid_filter/test.rs:14:67 + --> src/fail/p3_references/invalid_filter/test.rs:15:67 | -14 | Struct(name = Bar, fields = (field = Required(Baz))), +15 | Struct(name = Bar, fields = (field = Required(Baz))), | ^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.rs b/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.rs index 2e213d5b54..3ee5e9a13e 100644 --- a/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.stderr b/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.stderr index 8702f01285..396187d773 100644 --- a/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/invalid_version/test.stderr @@ -1,17 +1,17 @@ error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '3.0.0..MAX'. - --> src/fail/p3_references/invalid_version/test.rs:19:45 + --> src/fail/p3_references/invalid_version/test.rs:20:45 | -19 | ... reference = Baz, +20 | ... reference = Baz, | ^^^ error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '1.0.0..2.0.0'. - --> src/fail/p3_references/invalid_version/test.rs:24:45 + --> src/fail/p3_references/invalid_version/test.rs:25:45 | -24 | ... reference = Baz, +25 | ... reference = Baz, | ^^^ error: Reference 'Baz' is only defined in '2.0.0..3.0.0', but not in '1.0.0..2.0.0 | 3.0.0..MAX'. - --> src/fail/p3_references/invalid_version/test.rs:29:45 + --> src/fail/p3_references/invalid_version/test.rs:30:45 | -29 | ... reference = Baz +30 | ... reference = Baz | ^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.rs b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.rs index c9c4e156e8..d83966e500 100644 --- a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [ LexicalContext( name = ContextA, diff --git a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.stderr b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.stderr index 33c353bd1e..79a2a8d19a 100644 --- a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_not_keyword/test.stderr @@ -1,5 +1,5 @@ error: Reference 'Two' of kind 'Token' is not valid. Expected: [Keyword] - --> src/fail/p3_references/lexical_context_switch_not_keyword/test.rs:18:56 + --> src/fail/p3_references/lexical_context_switch_not_keyword/test.rs:19:56 | -18 | ... fields = (entry = Required(Two), field_1 = Required(Three)) +19 | ... fields = (entry = Required(Two), field_1 = Required(Three)) | ^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.rs b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.rs index 6b60c0acea..2884a888eb 100644 --- a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [ LexicalContext( name = ContextA, diff --git a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.stderr b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.stderr index fd9631bf19..df372d3a0e 100644 --- a/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/lexical_context_switch_optional/test.stderr @@ -1,5 +1,5 @@ error: First field in a context switch cannot be optional. - --> src/fail/p3_references/lexical_context_switch_optional/test.rs:19:62 + --> src/fail/p3_references/lexical_context_switch_optional/test.rs:20:62 | -19 | ... entry = Optional(reference = Two), +20 | ... entry = Optional(reference = Two), | ^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.rs b/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.rs index cc3c078269..a45241636f 100644 --- a/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.stderr b/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.stderr index 62f2c996ce..14ff268523 100644 --- a/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/unknown_reference/test.stderr @@ -1,5 +1,5 @@ error: Reference to unknown item 'Unknown'. - --> src/fail/p3_references/unknown_reference/test.rs:16:79 + --> src/fail/p3_references/unknown_reference/test.rs:17:79 | -16 | fields = (field_1 = Required(Baz), field_2 = Required(Unknown)) +17 | fields = (field_1 = Required(Baz), field_2 = Required(Unknown)) | ^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.rs b/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.rs index bbe647f031..c6f3203faf 100644 --- a/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = ContextA, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.stderr b/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.stderr index 24bd05acd6..a6566b43cd 100644 --- a/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/unnecessary_lexical_context_switch/test.stderr @@ -1,5 +1,5 @@ error: Unnecessary switch to the same lexical context. - --> src/fail/p3_references/unnecessary_lexical_context_switch/test.rs:16:50 + --> src/fail/p3_references/unnecessary_lexical_context_switch/test.rs:17:50 | -16 | switch_lexical_context = ContextA, +17 | switch_lexical_context = ContextA, | ^^^^^^^^ diff --git a/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.rs b/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.rs index 2e8ddd9126..29076d3d70 100644 --- a/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.rs +++ b/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = One, versions = ["1.0.0"], + evm_targets = [], contexts = [ LexicalContext( name = ContextA, diff --git a/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.stderr b/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.stderr index 8773dd20ee..7c2cf82412 100644 --- a/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.stderr +++ b/crates/language-v2/tests/src/fail/p3_references/wrong_lexical_context/test.stderr @@ -1,5 +1,5 @@ error: Reference 'Three' is in context 'ContextA', but expected context 'ContextB'. - --> src/fail/p3_references/wrong_lexical_context/test.rs:18:81 + --> src/fail/p3_references/wrong_lexical_context/test.rs:19:81 | -18 | ... fields = (entry = Required(Two), field_1 = Required(Three)) +19 | ... fields = (entry = Required(Two), field_1 = Required(Three)) | ^^^^^ diff --git a/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.rs b/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.rs index 856d47f446..c63d148ad9 100644 --- a/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.rs +++ b/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar1, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.stderr b/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.stderr index 5ffd1b77f9..aed1ca6b07 100644 --- a/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.stderr +++ b/crates/language-v2/tests/src/fail/p4_unreachabe_items/unreachable/test.stderr @@ -1,11 +1,11 @@ error: Item 'Baz1' is not reachable from grammar root. - --> src/fail/p4_unreachabe_items/unreachable/test.rs:18:35 + --> src/fail/p4_unreachabe_items/unreachable/test.rs:19:35 | -18 | Struct(name = Baz1, fields = (field = Required(Baz2))), +19 | Struct(name = Baz1, fields = (field = Required(Baz2))), | ^^^^ error: Item 'Baz2' is not reachable from grammar root. - --> src/fail/p4_unreachabe_items/unreachable/test.rs:19:35 + --> src/fail/p4_unreachabe_items/unreachable/test.rs:20:35 | -19 | Struct(name = Baz2, fields = (field = Required(Baz1))) +20 | Struct(name = Baz2, fields = (field = Required(Baz1))) | ^^^^ diff --git a/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.rs b/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.rs index 3fadaaefa5..9bbd54af59 100644 --- a/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.rs +++ b/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = Foo, root_item = Bar, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Foo, sections = [Section( diff --git a/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.stderr b/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.stderr index 0254c93ab8..53e76c1d51 100644 --- a/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.stderr +++ b/crates/language-v2/tests/src/fail/p5_unused_versions/unused_version/test.stderr @@ -1,5 +1,5 @@ error: Item 'Baz' is not used in versions: 1.0.0..2.0.0 - --> src/fail/p5_unused_versions/unused_version/test.rs:18:34 + --> src/fail/p5_unused_versions/unused_version/test.rs:19:34 | -18 | Token(name = Baz, scanner = Atom("baz")) +19 | Token(name = Baz, scanner = Atom("baz")) | ^^^ diff --git a/crates/language-v2/tests/src/pass/code.rs b/crates/language-v2/tests/src/pass/code.rs index c5e910fe14..6b783067aa 100644 --- a/crates/language-v2/tests/src/pass/code.rs +++ b/crates/language-v2/tests/src/pass/code.rs @@ -4,6 +4,7 @@ language_v2_macros::compile!(Language( name = CodeTest, root_item = Foo, versions = ["1.0.0"], + evm_targets = [], contexts = [LexicalContext( name = CodeTest, sections = [Section( diff --git a/crates/language-v2/tests/src/pass/tiny_language.rs b/crates/language-v2/tests/src/pass/tiny_language.rs index d7b287cff8..1e011ab1fb 100644 --- a/crates/language-v2/tests/src/pass/tiny_language.rs +++ b/crates/language-v2/tests/src/pass/tiny_language.rs @@ -1,3 +1,4 @@ +use indexmap::IndexSet; use language_v2_definition::model::{ Field, Item, Language, LexicalContext, Section, StructItem, TokenItem, TokenScanner, Topic, }; @@ -7,6 +8,7 @@ language_v2_macros::compile!(Language( name = Tiny, root_item = Foo, versions = ["1.0.0", "2.0.0", "3.0.0"], + evm_targets = [], contexts = [LexicalContext( name = Tiny, sections = [Section( @@ -44,6 +46,7 @@ fn definition() { Version::parse("3.0.0").unwrap(), ] .into(), + evm_targets: IndexSet::default(), contexts: vec![LexicalContext { name: "Tiny".into(), identifier_token: None, diff --git a/crates/solidity-v2/inputs/language/src/definition.rs b/crates/solidity-v2/inputs/language/src/definition.rs index 463d697d6c..8d6aa79aab 100644 --- a/crates/solidity-v2/inputs/language/src/definition.rs +++ b/crates/solidity-v2/inputs/language/src/definition.rs @@ -9,6 +9,10 @@ language_v2_macros::compile!(Language( "0.8.20", "0.8.21", "0.8.22", "0.8.23", "0.8.24", "0.8.25", "0.8.26", "0.8.27", "0.8.28", "0.8.29", "0.8.30", "0.8.31", "0.8.32", "0.8.33", "0.8.34", "0.8.35" ], + evm_targets = [ + Frontier, Homestead, TangerineWhistle, SpuriousDragon, Byzantium, Constantinople, Petersburg, + Istanbul, Berlin, London, Paris, Shanghai, Cancun, Prague, Osaka + ], contexts = [ LexicalContext( name = Pragma, @@ -4474,7 +4478,11 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = Abi), BuiltInDefinition(name = Addmod), BuiltInDefinition(name = Assert), - BuiltInDefinition(name = Blobhash, enabled = From("0.8.24")), + BuiltInDefinition( + name = Blobhash, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), BuiltInDefinition(name = Block), BuiltInDefinition(name = Blockhash), BuiltInDefinition(name = Ecrecover), @@ -4505,14 +4513,26 @@ IdentifierPathTailElements: Vec = { BuiltInScope( name = Block, definitions = [ - BuiltInDefinition(name = BlockBasefee, enabled = From("0.8.7")), - BuiltInDefinition(name = BlockBlobbasefee, enabled = From("0.8.24")), - BuiltInDefinition(name = BlockChainid), + BuiltInDefinition( + name = BlockBasefee, + enabled = From("0.8.7"), + evm_enabled = From(London) + ), + BuiltInDefinition( + name = BlockBlobbasefee, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), + BuiltInDefinition(name = BlockChainid, evm_enabled = From(Istanbul)), BuiltInDefinition(name = BlockCoinbase), - BuiltInDefinition(name = BlockDifficulty), + BuiltInDefinition(name = BlockDifficulty, evm_enabled = Till(Paris)), BuiltInDefinition(name = BlockGaslimit), BuiltInDefinition(name = BlockNumber), - BuiltInDefinition(name = BlockPrevrandao, enabled = From("0.8.18")), + BuiltInDefinition( + name = BlockPrevrandao, + enabled = From("0.8.18"), + evm_enabled = From(Paris) + ), BuiltInDefinition(name = BlockTimestamp) ] ), @@ -4540,10 +4560,10 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = AddressCall), BuiltInDefinition(name = AddressCallcode), BuiltInDefinition(name = AddressCode), - BuiltInDefinition(name = AddressCodehash), - BuiltInDefinition(name = AddressDelegatecall), + BuiltInDefinition(name = AddressCodehash, evm_enabled = From(Constantinople)), + BuiltInDefinition(name = AddressDelegatecall, evm_enabled = From(Homestead)), BuiltInDefinition(name = AddressSend), - BuiltInDefinition(name = AddressStaticcall), + BuiltInDefinition(name = AddressStaticcall, evm_enabled = From(Byzantium)), BuiltInDefinition(name = AddressTransfer) ] ), @@ -4611,9 +4631,21 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = YulAddress), BuiltInDefinition(name = YulAnd), BuiltInDefinition(name = YulBalance), - BuiltInDefinition(name = YulBasefee, enabled = From("0.8.7")), - BuiltInDefinition(name = YulBlobbasefee, enabled = From("0.8.24")), - BuiltInDefinition(name = YulBlobhash, enabled = From("0.8.24")), + BuiltInDefinition( + name = YulBasefee, + enabled = From("0.8.7"), + evm_enabled = From(London) + ), + BuiltInDefinition( + name = YulBlobbasefee, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), + BuiltInDefinition( + name = YulBlobhash, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), BuiltInDefinition(name = YulBlockhash), BuiltInDefinition(name = YulByte), BuiltInDefinition(name = YulCall), @@ -4623,20 +4655,28 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = YulCalldatasize), BuiltInDefinition(name = YulCaller), BuiltInDefinition(name = YulCallvalue), - BuiltInDefinition(name = YulChainid), - BuiltInDefinition(name = YulClz, enabled = From("0.8.31")), + BuiltInDefinition(name = YulChainid, evm_enabled = From(Istanbul)), + BuiltInDefinition( + name = YulClz, + enabled = From("0.8.31"), + evm_enabled = From(Osaka) + ), BuiltInDefinition(name = YulCodecopy), BuiltInDefinition(name = YulCodesize), BuiltInDefinition(name = YulCoinbase), BuiltInDefinition(name = YulCreate), - BuiltInDefinition(name = YulCreate2), + BuiltInDefinition(name = YulCreate2, evm_enabled = From(Constantinople)), BuiltInDefinition(name = YulDelegatecall), - BuiltInDefinition(name = YulDifficulty, enabled = Till("0.8.18")), + BuiltInDefinition( + name = YulDifficulty, + enabled = Till("0.8.18"), + evm_enabled = Till(Paris) + ), BuiltInDefinition(name = YulDiv), BuiltInDefinition(name = YulEq), BuiltInDefinition(name = YulExp), BuiltInDefinition(name = YulExtcodecopy), - BuiltInDefinition(name = YulExtcodehash), + BuiltInDefinition(name = YulExtcodehash, evm_enabled = From(Constantinople)), BuiltInDefinition(name = YulExtcodesize), BuiltInDefinition(name = YulGas), BuiltInDefinition(name = YulGaslimit), @@ -4647,7 +4687,11 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = YulKeccak256), BuiltInDefinition(name = YulLog, internal_parameter = Code(u8)), BuiltInDefinition(name = YulLt), - BuiltInDefinition(name = YulMcopy, enabled = From("0.8.24")), + BuiltInDefinition( + name = YulMcopy, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), BuiltInDefinition(name = YulMload), BuiltInDefinition(name = YulMod), BuiltInDefinition(name = YulMsize), @@ -4660,29 +4704,41 @@ IdentifierPathTailElements: Vec = { BuiltInDefinition(name = YulOr), BuiltInDefinition(name = YulOrigin), BuiltInDefinition(name = YulPop), - BuiltInDefinition(name = YulPrevrandao, enabled = From("0.8.18")), + BuiltInDefinition( + name = YulPrevrandao, + enabled = From("0.8.18"), + evm_enabled = From(Paris) + ), BuiltInDefinition(name = YulReturn), - BuiltInDefinition(name = YulReturndatacopy), - BuiltInDefinition(name = YulReturndatasize), + BuiltInDefinition(name = YulReturndatacopy, evm_enabled = From(Byzantium)), + BuiltInDefinition(name = YulReturndatasize, evm_enabled = From(Byzantium)), BuiltInDefinition(name = YulRevert), - BuiltInDefinition(name = YulSar), + BuiltInDefinition(name = YulSar, evm_enabled = From(Constantinople)), BuiltInDefinition(name = YulSdiv), - BuiltInDefinition(name = YulSelfbalance), + BuiltInDefinition(name = YulSelfbalance, evm_enabled = From(Istanbul)), BuiltInDefinition(name = YulSelfdestruct), BuiltInDefinition(name = YulSgt), - BuiltInDefinition(name = YulShl), - BuiltInDefinition(name = YulShr), + BuiltInDefinition(name = YulShl, evm_enabled = From(Constantinople)), + BuiltInDefinition(name = YulShr, evm_enabled = From(Constantinople)), BuiltInDefinition(name = YulSignextend), BuiltInDefinition(name = YulSload), BuiltInDefinition(name = YulSlt), BuiltInDefinition(name = YulSmod), BuiltInDefinition(name = YulSstore), - BuiltInDefinition(name = YulStaticcall), + BuiltInDefinition(name = YulStaticcall, evm_enabled = From(Byzantium)), BuiltInDefinition(name = YulStop), BuiltInDefinition(name = YulSub), BuiltInDefinition(name = YulTimestamp), - BuiltInDefinition(name = YulTload, enabled = From("0.8.24")), - BuiltInDefinition(name = YulTstore, enabled = From("0.8.24")), + BuiltInDefinition( + name = YulTload, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), + BuiltInDefinition( + name = YulTstore, + enabled = From("0.8.24"), + evm_enabled = From(Cancun) + ), BuiltInDefinition(name = YulXor) ] ), diff --git a/crates/solidity-v2/outputs/cargo/common/generated/public_api.txt b/crates/solidity-v2/outputs/cargo/common/generated/public_api.txt index cb5b36d9c7..c51081f10e 100644 --- a/crates/solidity-v2/outputs/cargo/common/generated/public_api.txt +++ b/crates/solidity-v2/outputs/cargo/common/generated/public_api.txt @@ -752,6 +752,81 @@ impl slang_solidity_v2_common::diagnostics::DiagnosticExtensions for slang_solid pub fn slang_solidity_v2_common::diagnostics::kinds::type_system::TypeSystemDiagnosticKind::code(&self) -> &'static str pub fn slang_solidity_v2_common::diagnostics::kinds::type_system::TypeSystemDiagnosticKind::message(&self) -> alloc::string::String pub fn slang_solidity_v2_common::diagnostics::kinds::type_system::TypeSystemDiagnosticKind::severity(&self) -> slang_solidity_v2_common::diagnostics::DiagnosticSeverity +pub mod slang_solidity_v2_common::evm_targets +pub enum slang_solidity_v2_common::evm_targets::EvmTarget +pub slang_solidity_v2_common::evm_targets::EvmTarget::Berlin = 8 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Byzantium = 4 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Cancun = 12 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Constantinople = 5 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Frontier = 0 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Homestead = 1 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Istanbul = 7 +pub slang_solidity_v2_common::evm_targets::EvmTarget::London = 9 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Osaka = 14 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Paris = 10 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Petersburg = 6 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Prague = 13 +pub slang_solidity_v2_common::evm_targets::EvmTarget::Shanghai = 11 +pub slang_solidity_v2_common::evm_targets::EvmTarget::SpuriousDragon = 3 +pub slang_solidity_v2_common::evm_targets::EvmTarget::TangerineWhistle = 2 +impl slang_solidity_v2_common::evm_targets::EvmTarget +pub const slang_solidity_v2_common::evm_targets::EvmTarget::ALL: &'static [slang_solidity_v2_common::evm_targets::EvmTarget; 15] +pub const slang_solidity_v2_common::evm_targets::EvmTarget::EARLIEST: Self +pub const slang_solidity_v2_common::evm_targets::EvmTarget::LATEST: Self +impl core::clone::Clone for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::clone(&self) -> slang_solidity_v2_common::evm_targets::EvmTarget +impl core::cmp::Eq for slang_solidity_v2_common::evm_targets::EvmTarget +impl core::cmp::Ord for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::cmp(&self, other: &slang_solidity_v2_common::evm_targets::EvmTarget) -> core::cmp::Ordering +impl core::cmp::PartialEq for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::eq(&self, other: &slang_solidity_v2_common::evm_targets::EvmTarget) -> bool +impl core::cmp::PartialOrd for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::partial_cmp(&self, other: &slang_solidity_v2_common::evm_targets::EvmTarget) -> core::option::Option +impl core::fmt::Debug for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::fmt::Display for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Copy for slang_solidity_v2_common::evm_targets::EvmTarget +impl core::marker::StructuralPartialEq for slang_solidity_v2_common::evm_targets::EvmTarget +impl core::str::traits::FromStr for slang_solidity_v2_common::evm_targets::EvmTarget +pub type slang_solidity_v2_common::evm_targets::EvmTarget::Err = slang_solidity_v2_common::evm_targets::FromStrError +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::from_str(value: &str) -> core::result::Result +impl serde_core::ser::Serialize for slang_solidity_v2_common::evm_targets::EvmTarget +pub fn slang_solidity_v2_common::evm_targets::EvmTarget::serialize<__S>(&self, __serializer: __S) -> core::result::Result<<__S as serde_core::ser::Serializer>::Ok, <__S as serde_core::ser::Serializer>::Error> where __S: serde_core::ser::Serializer +pub enum slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::From +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::From::from: slang_solidity_v2_common::evm_targets::EvmTarget +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::Range +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::Range::from: slang_solidity_v2_common::evm_targets::EvmTarget +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::Range::till: slang_solidity_v2_common::evm_targets::EvmTarget +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::Till +pub slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::Till::till: slang_solidity_v2_common::evm_targets::EvmTarget +impl slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::contains(&self, other: slang_solidity_v2_common::evm_targets::EvmTarget) -> bool +impl slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub const fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::from(from: slang_solidity_v2_common::evm_targets::EvmTarget) -> Self +pub const fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::range(from: slang_solidity_v2_common::evm_targets::EvmTarget, till: slang_solidity_v2_common::evm_targets::EvmTarget) -> Self +pub const fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::till(till: slang_solidity_v2_common::evm_targets::EvmTarget) -> Self +impl core::clone::Clone for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::clone(&self) -> slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +impl core::cmp::Eq for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +impl core::cmp::PartialEq for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::eq(&self, other: &slang_solidity_v2_common::evm_targets::EvmTargetSpecifier) -> bool +impl core::fmt::Debug for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::StructuralPartialEq for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +impl serde_core::ser::Serialize for slang_solidity_v2_common::evm_targets::EvmTargetSpecifier +pub fn slang_solidity_v2_common::evm_targets::EvmTargetSpecifier::serialize<__S>(&self, __serializer: __S) -> core::result::Result<<__S as serde_core::ser::Serializer>::Ok, <__S as serde_core::ser::Serializer>::Error> where __S: serde_core::ser::Serializer +pub enum slang_solidity_v2_common::evm_targets::FromStrError +pub slang_solidity_v2_common::evm_targets::FromStrError::UnrecognizedEvmTarget +impl core::cmp::PartialEq for slang_solidity_v2_common::evm_targets::FromStrError +pub fn slang_solidity_v2_common::evm_targets::FromStrError::eq(&self, other: &slang_solidity_v2_common::evm_targets::FromStrError) -> bool +impl core::error::Error for slang_solidity_v2_common::evm_targets::FromStrError +impl core::fmt::Debug for slang_solidity_v2_common::evm_targets::FromStrError +pub fn slang_solidity_v2_common::evm_targets::FromStrError::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::fmt::Display for slang_solidity_v2_common::evm_targets::FromStrError +pub fn slang_solidity_v2_common::evm_targets::FromStrError::fmt(&self, __formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::StructuralPartialEq for slang_solidity_v2_common::evm_targets::FromStrError pub mod slang_solidity_v2_common::nodes #[repr(transparent)] pub struct slang_solidity_v2_common::nodes::NodeId(_) impl core::clone::Clone for slang_solidity_v2_common::nodes::NodeId @@ -1064,7 +1139,7 @@ pub slang_solidity_v2_common::versions::LanguageVersion::V0_8_7 pub slang_solidity_v2_common::versions::LanguageVersion::V0_8_8 pub slang_solidity_v2_common::versions::LanguageVersion::V0_8_9 impl slang_solidity_v2_common::versions::LanguageVersion -pub const slang_solidity_v2_common::versions::LanguageVersion::ALL: &'static [slang_solidity_v2_common::versions::LanguageVersion] +pub const slang_solidity_v2_common::versions::LanguageVersion::ALL: &'static [slang_solidity_v2_common::versions::LanguageVersion; 36] pub const slang_solidity_v2_common::versions::LanguageVersion::EARLIEST: Self pub const slang_solidity_v2_common::versions::LanguageVersion::LATEST: Self impl core::clone::Clone for slang_solidity_v2_common::versions::LanguageVersion @@ -1099,6 +1174,10 @@ pub slang_solidity_v2_common::versions::LanguageVersionSpecifier::Till pub slang_solidity_v2_common::versions::LanguageVersionSpecifier::Till::till: slang_solidity_v2_common::versions::LanguageVersion impl slang_solidity_v2_common::versions::LanguageVersionSpecifier pub fn slang_solidity_v2_common::versions::LanguageVersionSpecifier::contains(&self, other: slang_solidity_v2_common::versions::LanguageVersion) -> bool +impl slang_solidity_v2_common::versions::LanguageVersionSpecifier +pub const fn slang_solidity_v2_common::versions::LanguageVersionSpecifier::from(from: slang_solidity_v2_common::versions::LanguageVersion) -> Self +pub const fn slang_solidity_v2_common::versions::LanguageVersionSpecifier::range(from: slang_solidity_v2_common::versions::LanguageVersion, till: slang_solidity_v2_common::versions::LanguageVersion) -> Self +pub const fn slang_solidity_v2_common::versions::LanguageVersionSpecifier::till(till: slang_solidity_v2_common::versions::LanguageVersion) -> Self impl core::clone::Clone for slang_solidity_v2_common::versions::LanguageVersionSpecifier pub fn slang_solidity_v2_common::versions::LanguageVersionSpecifier::clone(&self) -> slang_solidity_v2_common::versions::LanguageVersionSpecifier impl core::cmp::Eq for slang_solidity_v2_common::versions::LanguageVersionSpecifier diff --git a/crates/solidity-v2/outputs/cargo/common/src/evm_targets/mod.rs b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/mod.rs new file mode 100644 index 0000000000..6deb8b4f57 --- /dev/null +++ b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/mod.rs @@ -0,0 +1,6 @@ +mod specifier; +#[path = "target.generated.rs"] +mod target; + +pub use specifier::EvmTargetSpecifier; +pub use target::{EvmTarget, FromStrError}; diff --git a/crates/solidity-v2/outputs/cargo/common/src/evm_targets/specifier.rs b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/specifier.rs new file mode 100644 index 0000000000..09753b9cb6 --- /dev/null +++ b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/specifier.rs @@ -0,0 +1,37 @@ +use serde::Serialize; + +use crate::evm_targets::EvmTarget; + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +pub enum EvmTargetSpecifier { + From { from: EvmTarget }, + Till { till: EvmTarget }, + Range { from: EvmTarget, till: EvmTarget }, +} + +impl EvmTargetSpecifier { + #[inline] + pub const fn from(from: EvmTarget) -> Self { + Self::From { from } + } + + #[inline] + pub const fn till(till: EvmTarget) -> Self { + Self::Till { till } + } + + #[inline] + pub const fn range(from: EvmTarget, till: EvmTarget) -> Self { + Self::Range { from, till } + } +} + +impl EvmTargetSpecifier { + pub fn contains(&self, other: EvmTarget) -> bool { + match self { + Self::From { from } => *from <= other, + Self::Till { till } => other < *till, + Self::Range { from, till } => *from <= other && other < *till, + } + } +} diff --git a/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.generated.rs b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.generated.rs new file mode 100644 index 0000000000..574de6ca3b --- /dev/null +++ b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.generated.rs @@ -0,0 +1,107 @@ +// This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +use std::fmt::{Display, Formatter}; +use std::str::FromStr; + +use serde::Serialize; +use thiserror::Error; + +/// All supported EVM targets of `Solidity`, in chronological order. +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)] +pub enum EvmTarget { + Frontier = 0, + Homestead = 1, + TangerineWhistle = 2, + SpuriousDragon = 3, + Byzantium = 4, + Constantinople = 5, + Petersburg = 6, + Istanbul = 7, + Berlin = 8, + London = 9, + Paris = 10, + Shanghai = 11, + Cancun = 12, + Prague = 13, + Osaka = 14, +} + +impl EvmTarget { + /// The earliest supported EVM target of `Solidity`. + pub const EARLIEST: Self = Self::Frontier; + + /// The latest supported EVM target of `Solidity`. + pub const LATEST: Self = Self::Osaka; + + /// All supported EVM targets of `Solidity`, in order. + pub const ALL: &'static [EvmTarget; 15] = &[ + EvmTarget::Frontier, + EvmTarget::Homestead, + EvmTarget::TangerineWhistle, + EvmTarget::SpuriousDragon, + EvmTarget::Byzantium, + EvmTarget::Constantinople, + EvmTarget::Petersburg, + EvmTarget::Istanbul, + EvmTarget::Berlin, + EvmTarget::London, + EvmTarget::Paris, + EvmTarget::Shanghai, + EvmTarget::Cancun, + EvmTarget::Prague, + EvmTarget::Osaka, + ]; +} + +impl Display for EvmTarget { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + EvmTarget::Frontier => write!(f, "Frontier"), + EvmTarget::Homestead => write!(f, "Homestead"), + EvmTarget::TangerineWhistle => write!(f, "TangerineWhistle"), + EvmTarget::SpuriousDragon => write!(f, "SpuriousDragon"), + EvmTarget::Byzantium => write!(f, "Byzantium"), + EvmTarget::Constantinople => write!(f, "Constantinople"), + EvmTarget::Petersburg => write!(f, "Petersburg"), + EvmTarget::Istanbul => write!(f, "Istanbul"), + EvmTarget::Berlin => write!(f, "Berlin"), + EvmTarget::London => write!(f, "London"), + EvmTarget::Paris => write!(f, "Paris"), + EvmTarget::Shanghai => write!(f, "Shanghai"), + EvmTarget::Cancun => write!(f, "Cancun"), + EvmTarget::Prague => write!(f, "Prague"), + EvmTarget::Osaka => write!(f, "Osaka"), + } + } +} + +#[derive(Debug, Error, PartialEq)] +pub enum FromStrError { + #[error("Provided value is not recognized as a supported EVM target.")] + UnrecognizedEvmTarget, +} + +impl FromStr for EvmTarget { + type Err = FromStrError; + + fn from_str(value: &str) -> Result { + match value { + "Frontier" => Ok(EvmTarget::Frontier), + "Homestead" => Ok(EvmTarget::Homestead), + "TangerineWhistle" => Ok(EvmTarget::TangerineWhistle), + "SpuriousDragon" => Ok(EvmTarget::SpuriousDragon), + "Byzantium" => Ok(EvmTarget::Byzantium), + "Constantinople" => Ok(EvmTarget::Constantinople), + "Petersburg" => Ok(EvmTarget::Petersburg), + "Istanbul" => Ok(EvmTarget::Istanbul), + "Berlin" => Ok(EvmTarget::Berlin), + "London" => Ok(EvmTarget::London), + "Paris" => Ok(EvmTarget::Paris), + "Shanghai" => Ok(EvmTarget::Shanghai), + "Cancun" => Ok(EvmTarget::Cancun), + "Prague" => Ok(EvmTarget::Prague), + "Osaka" => Ok(EvmTarget::Osaka), + _ => Err(FromStrError::UnrecognizedEvmTarget), + } + } +} diff --git a/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.rs.jinja2 b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.rs.jinja2 new file mode 100644 index 0000000000..d79ffe9042 --- /dev/null +++ b/crates/solidity-v2/outputs/cargo/common/src/evm_targets/target.rs.jinja2 @@ -0,0 +1,57 @@ +use std::fmt::{Display, Formatter}; +use std::str::FromStr; + +use serde::Serialize; +use thiserror::Error; + +/// All supported EVM targets of `{{ model.language.name }}`, in chronological order. +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)] +pub enum EvmTarget { + {% for evm_target in model.language.evm_targets %} + {{ evm_target }} = {{ loop.index0 }}, + {%- endfor -%} +} + +impl EvmTarget { + /// The earliest supported EVM target of `{{ model.language.name }}`. + pub const EARLIEST: Self = Self::{{ model.language.evm_targets | first }}; + + /// The latest supported EVM target of `{{ model.language.name }}`. + pub const LATEST: Self = Self::{{ model.language.evm_targets | last }}; + + /// All supported EVM targets of `{{ model.language.name }}`, in order. + pub const ALL: &'static [EvmTarget; {{ model.language.evm_targets | length }}] = &[ + {%- for evm_target in model.language.evm_targets %} + EvmTarget::{{ evm_target }}, + {%- endfor %} + ]; +} + +impl Display for EvmTarget { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + {%- for evm_target in model.language.evm_targets %} + EvmTarget::{{ evm_target }} => write!(f, "{{ evm_target }}"), + {%- endfor %} + } + } +} + +#[derive(Debug, Error, PartialEq)] +pub enum FromStrError { + #[error("Provided value is not recognized as a supported EVM target.")] + UnrecognizedEvmTarget, +} + +impl FromStr for EvmTarget { + type Err = FromStrError; + + fn from_str(value: &str) -> Result { + match value { + {%- for evm_target in model.language.evm_targets %} + "{{ evm_target }}" => Ok(EvmTarget::{{ evm_target }}), + {%- endfor %} + _ => Err(FromStrError::UnrecognizedEvmTarget), + } + } +} diff --git a/crates/solidity-v2/outputs/cargo/common/src/lib.rs b/crates/solidity-v2/outputs/cargo/common/src/lib.rs index e6aaabc20d..74414d6f42 100644 --- a/crates/solidity-v2/outputs/cargo/common/src/lib.rs +++ b/crates/solidity-v2/outputs/cargo/common/src/lib.rs @@ -1,5 +1,6 @@ pub mod built_ins; pub mod diagnostics; +pub mod evm_targets; pub mod nodes; pub mod terminals; pub mod utils; diff --git a/crates/solidity-v2/outputs/cargo/common/src/versions/specifier.rs b/crates/solidity-v2/outputs/cargo/common/src/versions/specifier.rs index aea14627e8..78243ad3b6 100644 --- a/crates/solidity-v2/outputs/cargo/common/src/versions/specifier.rs +++ b/crates/solidity-v2/outputs/cargo/common/src/versions/specifier.rs @@ -16,12 +16,29 @@ pub enum LanguageVersionSpecifier { }, } +impl LanguageVersionSpecifier { + #[inline] + pub const fn from(from: LanguageVersion) -> Self { + Self::From { from } + } + + #[inline] + pub const fn till(till: LanguageVersion) -> Self { + Self::Till { till } + } + + #[inline] + pub const fn range(from: LanguageVersion, till: LanguageVersion) -> Self { + Self::Range { from, till } + } +} + impl LanguageVersionSpecifier { pub fn contains(&self, other: LanguageVersion) -> bool { match self { - LanguageVersionSpecifier::From { from } => other >= *from, - LanguageVersionSpecifier::Till { till } => other < *till, - LanguageVersionSpecifier::Range { from, till } => other >= *from && other < *till, + Self::From { from } => *from <= other, + Self::Till { till } => other < *till, + Self::Range { from, till } => *from <= other && other < *till, } } } diff --git a/crates/solidity-v2/outputs/cargo/common/src/versions/version.generated.rs b/crates/solidity-v2/outputs/cargo/common/src/versions/version.generated.rs index cb93d1c148..35157d53b2 100644 --- a/crates/solidity-v2/outputs/cargo/common/src/versions/version.generated.rs +++ b/crates/solidity-v2/outputs/cargo/common/src/versions/version.generated.rs @@ -56,7 +56,7 @@ impl LanguageVersion { pub const LATEST: Self = Self::V0_8_35; /// All supported versions of `Solidity`, in order. - pub const ALL: &'static [LanguageVersion] = &[ + pub const ALL: &'static [LanguageVersion; 36] = &[ LanguageVersion::V0_8_0, LanguageVersion::V0_8_1, LanguageVersion::V0_8_2, diff --git a/crates/solidity-v2/outputs/cargo/common/src/versions/version.rs.jinja2 b/crates/solidity-v2/outputs/cargo/common/src/versions/version.rs.jinja2 index 0cb188c420..260358009d 100644 --- a/crates/solidity-v2/outputs/cargo/common/src/versions/version.rs.jinja2 +++ b/crates/solidity-v2/outputs/cargo/common/src/versions/version.rs.jinja2 @@ -21,7 +21,7 @@ impl LanguageVersion { pub const LATEST: Self = Self::V{{ model.language.versions | last | split(pat=".") | join(sep="_") }}; /// All supported versions of `{{ model.language.name }}`, in order. - pub const ALL: &'static [LanguageVersion] = &[ + pub const ALL: &'static [LanguageVersion; {{ model.language.versions | length }}] = &[ {%- for version in model.language.versions %} LanguageVersion::V{{ version | split(pat=".") | join(sep="_") }}, {%- endfor %}