From 15c437c6c4902cd43e0027f750ba59e8f22f47f9 Mon Sep 17 00:00:00 2001 From: Omar Tawfik <15987992+OmarTawfik@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:02:37 -0700 Subject: [PATCH] add support for Solidity `0.8.27` (#1096) Details: https://soliditylang.org/blog/2024/09/04/solidity-0.8.27-release-announcement/ --- .changeset/cool-jobs-know.md | 5 ++ .../inputs/language/src/definition.rs | 14 +++++- .../slang_solidity/generated/public_api.txt | 1 + .../src/generated/kinds/generated/mod.rs | 1 + .../src/generated/language/generated/mod.rs | 21 +++++++++ .../wit/interface/generated/kinds.wit | 1 + .../tests/src/cst_output/generated/mod.rs | 1 + .../generated/state_variable_definition.rs | 10 ++++ .../outputs/cargo/tests/src/generated/mod.rs | 3 +- .../napi-bindings/generated/index.d.ts | 1 + .../outputs/spec/generated/grammar.ebnf | 7 ++- .../public/01-file-structure/08-keywords.md | 6 +++ .../02-definitions/07-state-variables.md | 2 +- .../generated/public/supported-versions.md | 8 ++-- .../generated/0.8.27-failure.yml | 42 +++++++++++++++++ .../generated/0.8.27-failure.yml | 46 +++++++++++++++++++ .../generated/0.8.27-failure.yml | 36 +++++++++++++++ .../transient/generated/0.4.11-failure.yml | 25 ++++++++++ .../transient/generated/0.8.27-success.yml | 18 ++++++++ .../transient/input.sol | 1 + .../solc/src/commands/keyword_versioning.rs | 10 +--- .../testing/solc/src/utils/binaries.rs | 9 ++++ 22 files changed, 250 insertions(+), 18 deletions(-) create mode 100644 .changeset/cool-jobs-know.md create mode 100644 crates/solidity/outputs/cargo/tests/src/cst_output/generated/state_variable_definition.rs create mode 100644 crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_definition/generated/0.8.27-failure.yml create mode 100644 crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_with_attrs_definition/generated/0.8.27-failure.yml create mode 100644 crates/solidity/testing/snapshots/cst_output/ContractDefinition/missing_field_type/generated/0.8.27-failure.yml create mode 100644 crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.4.11-failure.yml create mode 100644 crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.8.27-success.yml create mode 100644 crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/input.sol diff --git a/.changeset/cool-jobs-know.md b/.changeset/cool-jobs-know.md new file mode 100644 index 0000000000..60faf87aa1 --- /dev/null +++ b/.changeset/cool-jobs-know.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/slang": patch +--- + +add support for Solidity `0.8.27`. diff --git a/crates/solidity/inputs/language/src/definition.rs b/crates/solidity/inputs/language/src/definition.rs index 4d4f4f3625..b5a8b44c8d 100644 --- a/crates/solidity/inputs/language/src/definition.rs +++ b/crates/solidity/inputs/language/src/definition.rs @@ -29,7 +29,7 @@ codegen_language_macros::compile!(Language( "0.6.12", "0.7.0", "0.7.1", "0.7.2", "0.7.3", "0.7.4", "0.7.5", "0.7.6", "0.8.0", "0.8.1", "0.8.2", "0.8.3", "0.8.4", "0.8.5", "0.8.6", "0.8.7", "0.8.8", "0.8.9", "0.8.10", "0.8.11", "0.8.12", "0.8.13", "0.8.14", "0.8.15", "0.8.16", "0.8.17", "0.8.18", "0.8.19", "0.8.20", - "0.8.21", "0.8.22", "0.8.23", "0.8.24", "0.8.25", "0.8.26" + "0.8.21", "0.8.22", "0.8.23", "0.8.24", "0.8.25", "0.8.26", "0.8.27" ], sections = [ Section( @@ -1422,6 +1422,15 @@ codegen_language_macros::compile!(Language( value = Atom("throw") )] ), + Keyword( + name = TransientKeyword, + identifier = Identifier, + definitions = [KeywordDefinition( + enabled = From("0.8.27"), + reserved = Never, + value = Atom("transient") + )] + ), Keyword( name = TrueKeyword, identifier = Identifier, @@ -2298,7 +2307,8 @@ codegen_language_macros::compile!(Language( EnumVariant(reference = InternalKeyword), EnumVariant(reference = PrivateKeyword), EnumVariant(reference = PublicKeyword), - EnumVariant(reference = ImmutableKeyword, enabled = From("0.6.5")) + EnumVariant(reference = ImmutableKeyword, enabled = From("0.6.5")), + EnumVariant(reference = TransientKeyword, enabled = From("0.8.27")) ] ) ] diff --git a/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt b/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt index 3e33ff0d9a..5e6a588d27 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt +++ b/crates/solidity/outputs/cargo/slang_solidity/generated/public_api.txt @@ -777,6 +777,7 @@ pub slang_solidity::kinds::TerminalKind::SwitchKeyword pub slang_solidity::kinds::TerminalKind::SzaboKeyword pub slang_solidity::kinds::TerminalKind::ThrowKeyword pub slang_solidity::kinds::TerminalKind::Tilde +pub slang_solidity::kinds::TerminalKind::TransientKeyword pub slang_solidity::kinds::TerminalKind::TrueKeyword pub slang_solidity::kinds::TerminalKind::TryKeyword pub slang_solidity::kinds::TerminalKind::TypeDefKeyword diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/kinds/generated/mod.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/kinds/generated/mod.rs index 27ac0944c9..5b4da611f2 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/kinds/generated/mod.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/kinds/generated/mod.rs @@ -587,6 +587,7 @@ pub enum TerminalKind { SzaboKeyword, ThrowKeyword, Tilde, + TransientKeyword, TrueKeyword, TryKeyword, TypeDefKeyword, diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/language/generated/mod.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/language/generated/mod.rs index 7ae68dba37..68b8066bf9 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/language/generated/mod.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/language/generated/mod.rs @@ -70,6 +70,7 @@ pub struct Language { pub(crate) version_is_at_least_0_8_22: bool, pub(crate) version_is_at_least_0_8_24: bool, pub(crate) version_is_at_least_0_8_25: bool, + pub(crate) version_is_at_least_0_8_27: bool, pub(crate) version: Version, } @@ -173,6 +174,7 @@ impl Language { Version::new(0, 8, 24), Version::new(0, 8, 25), Version::new(0, 8, 26), + Version::new(0, 8, 27), ]; pub const ROOT_KIND: NonterminalKind = NonterminalKind::SourceUnit; @@ -214,6 +216,7 @@ impl Language { version_is_at_least_0_8_22: Version::new(0, 8, 22) <= version, version_is_at_least_0_8_24: Version::new(0, 8, 24) <= version, version_is_at_least_0_8_25: Version::new(0, 8, 25) <= version, + version_is_at_least_0_8_27: Version::new(0, 8, 27) <= version, version, }) } else { @@ -4340,6 +4343,13 @@ impl Language { ); choice.consider(input, result)?; } + if self.version_is_at_least_0_8_27 { + let result = self.parse_terminal_with_trivia::( + input, + TerminalKind::TransientKeyword, + ); + choice.consider(input, result)?; + } choice.finish(input) }) .with_label(EdgeLabel::Variant) @@ -10763,6 +10773,17 @@ impl Lexer for Language { } } Some('r') => match input.next() { + Some('a') => { + if scan_chars!(input, 'n', 's', 'i', 'e', 'n', 't') { + if self.version_is_at_least_0_8_27 { + KeywordScan::Present(TerminalKind::TransientKeyword) + } else { + KeywordScan::Absent + } + } else { + KeywordScan::Absent + } + } Some('u') => { if scan_chars!(input, 'e') { KeywordScan::Reserved(TerminalKind::TrueKeyword) diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/kinds.wit b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/kinds.wit index 78d77d8288..dac56bba7b 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/kinds.wit +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/wit/interface/generated/kinds.wit @@ -528,6 +528,7 @@ interface kinds { %szabo-keyword, %throw-keyword, %tilde, + %transient-keyword, %true-keyword, %try-keyword, %type-def-keyword, diff --git a/crates/solidity/outputs/cargo/tests/src/cst_output/generated/mod.rs b/crates/solidity/outputs/cargo/tests/src/cst_output/generated/mod.rs index f8fa1b0e0e..cf0c0ac6c6 100644 --- a/crates/solidity/outputs/cargo/tests/src/cst_output/generated/mod.rs +++ b/crates/solidity/outputs/cargo/tests/src/cst_output/generated/mod.rs @@ -29,6 +29,7 @@ mod pragma_directive; mod receive_function_definition; mod return_statement; mod source_unit; +mod state_variable_definition; mod statements; mod string_literal; mod string_literals; diff --git a/crates/solidity/outputs/cargo/tests/src/cst_output/generated/state_variable_definition.rs b/crates/solidity/outputs/cargo/tests/src/cst_output/generated/state_variable_definition.rs new file mode 100644 index 0000000000..46e8a707d4 --- /dev/null +++ b/crates/solidity/outputs/cargo/tests/src/cst_output/generated/state_variable_definition.rs @@ -0,0 +1,10 @@ +// This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +use anyhow::Result; + +use crate::cst_output::runner::run; + +#[test] +fn transient() -> Result<()> { + run("StateVariableDefinition", "transient") +} diff --git a/crates/solidity/outputs/cargo/tests/src/generated/mod.rs b/crates/solidity/outputs/cargo/tests/src/generated/mod.rs index b3414e0a3f..c1409e5c84 100644 --- a/crates/solidity/outputs/cargo/tests/src/generated/mod.rs +++ b/crates/solidity/outputs/cargo/tests/src/generated/mod.rs @@ -2,7 +2,7 @@ use semver::Version; -pub const VERSION_BREAKS: [Version; 34] = [ +pub const VERSION_BREAKS: [Version; 35] = [ Version::new(0, 4, 11), Version::new(0, 4, 12), Version::new(0, 4, 14), @@ -37,4 +37,5 @@ pub const VERSION_BREAKS: [Version; 34] = [ Version::new(0, 8, 22), Version::new(0, 8, 24), Version::new(0, 8, 25), + Version::new(0, 8, 27), ]; diff --git a/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts b/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts index 32c12fc9d4..e6563d4b26 100644 --- a/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts +++ b/crates/solidity/outputs/npm/package/src/generated/napi-bindings/generated/index.d.ts @@ -529,6 +529,7 @@ export declare namespace kinds { SzaboKeyword = "SzaboKeyword", ThrowKeyword = "ThrowKeyword", Tilde = "Tilde", + TransientKeyword = "TransientKeyword", TrueKeyword = "TrueKeyword", TryKeyword = "TryKeyword", TypeDefKeyword = "TypeDefKeyword", diff --git a/crates/solidity/outputs/spec/generated/grammar.ebnf b/crates/solidity/outputs/spec/generated/grammar.ebnf index 41f5d7b84d..e9af140a9b 100644 --- a/crates/solidity/outputs/spec/generated/grammar.ebnf +++ b/crates/solidity/outputs/spec/generated/grammar.ebnf @@ -435,6 +435,10 @@ SZABO_KEYWORD = "szabo"; (* Deprecated in 0.5.0 *) THROW_KEYWORD = "throw"; +(* Introduced in 0.8.27 *) +(* Never reserved *) +TRANSIENT_KEYWORD = "transient"; + TRUE_KEYWORD = "true"; (* Introduced in 0.6.0 *) @@ -703,7 +707,8 @@ StateVariableAttribute = (* variant: *) OverrideSpecifier (* Introduced in 0.6.0 | (* variant: *) INTERNAL_KEYWORD | (* variant: *) PRIVATE_KEYWORD | (* variant: *) PUBLIC_KEYWORD - | (* variant: *) IMMUTABLE_KEYWORD; (* Introduced in 0.6.5 *) + | (* variant: *) IMMUTABLE_KEYWORD (* Introduced in 0.6.5 *) + | (* variant: *) TRANSIENT_KEYWORD; (* Introduced in 0.8.27 *) (* 2.8. Functions: *) diff --git a/crates/solidity/outputs/spec/generated/public/01-file-structure/08-keywords.md b/crates/solidity/outputs/spec/generated/public/01-file-structure/08-keywords.md index caa7701b96..ed446764d9 100644 --- a/crates/solidity/outputs/spec/generated/public/01-file-structure/08-keywords.md +++ b/crates/solidity/outputs/spec/generated/public/01-file-structure/08-keywords.md @@ -562,6 +562,12 @@
(* Deprecated in 0.5.0 *)
THROW_KEYWORD = "throw";
+```{ .ebnf #TransientKeyword } + +``` + +
(* Introduced in 0.8.27 *)
(* Never reserved *)
TRANSIENT_KEYWORD = "transient";
+ ```{ .ebnf #TrueKeyword } ``` diff --git a/crates/solidity/outputs/spec/generated/public/02-definitions/07-state-variables.md b/crates/solidity/outputs/spec/generated/public/02-definitions/07-state-variables.md index 6148270479..f1e7cd8177 100644 --- a/crates/solidity/outputs/spec/generated/public/02-definitions/07-state-variables.md +++ b/crates/solidity/outputs/spec/generated/public/02-definitions/07-state-variables.md @@ -26,6 +26,6 @@ ``` -
StateVariableAttribute = (* variant: *) OverrideSpecifier (* Introduced in 0.6.0 *)
| (* variant: *) CONSTANT_KEYWORD
| (* variant: *) INTERNAL_KEYWORD
| (* variant: *) PRIVATE_KEYWORD
| (* variant: *) PUBLIC_KEYWORD
| (* variant: *) IMMUTABLE_KEYWORD; (* Introduced in 0.6.5 *)
+
StateVariableAttribute = (* variant: *) OverrideSpecifier (* Introduced in 0.6.0 *)
| (* variant: *) CONSTANT_KEYWORD
| (* variant: *) INTERNAL_KEYWORD
| (* variant: *) PRIVATE_KEYWORD
| (* variant: *) PUBLIC_KEYWORD
| (* variant: *) IMMUTABLE_KEYWORD (* Introduced in 0.6.5 *)
| (* variant: *) TRANSIENT_KEYWORD; (* Introduced in 0.8.27 *)
--8<-- "crates/solidity/inputs/language/docs/02-definitions/07-state-variables.md" diff --git a/crates/solidity/outputs/spec/generated/public/supported-versions.md b/crates/solidity/outputs/spec/generated/public/supported-versions.md index c7a5c4c0e4..2d1860d30a 100644 --- a/crates/solidity/outputs/spec/generated/public/supported-versions.md +++ b/crates/solidity/outputs/spec/generated/public/supported-versions.md @@ -1,9 +1,9 @@ -This specification compiles information from 81 publicly released versions of Solidity: +This specification compiles information from 82 publicly released versions of Solidity: -`0.4.11` `0.4.12` `0.4.13` `0.4.14` `0.4.15` `0.4.16` `0.4.17` `0.4.18` `0.4.19` `0.4.20` `0.4.21` `0.4.22` `0.4.23` `0.4.24` `0.4.25` `0.4.26` `0.5.0` `0.5.1` `0.5.2` `0.5.3` `0.5.4` `0.5.5` `0.5.6` `0.5.7` `0.5.8` `0.5.9` `0.5.10` `0.5.11` `0.5.12` `0.5.13` `0.5.14` `0.5.15` `0.5.16` `0.5.17` `0.6.0` `0.6.1` `0.6.2` `0.6.3` `0.6.4` `0.6.5` `0.6.6` `0.6.7` `0.6.8` `0.6.9` `0.6.10` `0.6.11` `0.6.12` `0.7.0` `0.7.1` `0.7.2` `0.7.3` `0.7.4` `0.7.5` `0.7.6` `0.8.0` `0.8.1` `0.8.2` `0.8.3` `0.8.4` `0.8.5` `0.8.6` `0.8.7` `0.8.8` `0.8.9` `0.8.10` `0.8.11` `0.8.12` `0.8.13` `0.8.14` `0.8.15` `0.8.16` `0.8.17` `0.8.18` `0.8.19` `0.8.20` `0.8.21` `0.8.22` `0.8.23` `0.8.24` `0.8.25` `0.8.26` +`0.4.11` `0.4.12` `0.4.13` `0.4.14` `0.4.15` `0.4.16` `0.4.17` `0.4.18` `0.4.19` `0.4.20` `0.4.21` `0.4.22` `0.4.23` `0.4.24` `0.4.25` `0.4.26` `0.5.0` `0.5.1` `0.5.2` `0.5.3` `0.5.4` `0.5.5` `0.5.6` `0.5.7` `0.5.8` `0.5.9` `0.5.10` `0.5.11` `0.5.12` `0.5.13` `0.5.14` `0.5.15` `0.5.16` `0.5.17` `0.6.0` `0.6.1` `0.6.2` `0.6.3` `0.6.4` `0.6.5` `0.6.6` `0.6.7` `0.6.8` `0.6.9` `0.6.10` `0.6.11` `0.6.12` `0.7.0` `0.7.1` `0.7.2` `0.7.3` `0.7.4` `0.7.5` `0.7.6` `0.8.0` `0.8.1` `0.8.2` `0.8.3` `0.8.4` `0.8.5` `0.8.6` `0.8.7` `0.8.8` `0.8.9` `0.8.10` `0.8.11` `0.8.12` `0.8.13` `0.8.14` `0.8.15` `0.8.16` `0.8.17` `0.8.18` `0.8.19` `0.8.20` `0.8.21` `0.8.22` `0.8.23` `0.8.24` `0.8.25` `0.8.26` `0.8.27` -Among which, 34 versions have breaking changes: +Among which, 35 versions have breaking changes: -`0.4.11` `0.4.12` `0.4.14` `0.4.16` `0.4.21` `0.4.22` `0.4.25` `0.5.0` `0.5.3` `0.5.5` `0.5.8` `0.5.10` `0.5.12` `0.5.14` `0.6.0` `0.6.2` `0.6.5` `0.6.7` `0.6.8` `0.6.11` `0.7.0` `0.7.1` `0.7.4` `0.8.0` `0.8.4` `0.8.7` `0.8.8` `0.8.10` `0.8.13` `0.8.18` `0.8.19` `0.8.22` `0.8.24` `0.8.25` +`0.4.11` `0.4.12` `0.4.14` `0.4.16` `0.4.21` `0.4.22` `0.4.25` `0.5.0` `0.5.3` `0.5.5` `0.5.8` `0.5.10` `0.5.12` `0.5.14` `0.6.0` `0.6.2` `0.6.5` `0.6.7` `0.6.8` `0.6.11` `0.7.0` `0.7.1` `0.7.4` `0.8.0` `0.8.4` `0.8.7` `0.8.8` `0.8.10` `0.8.13` `0.8.18` `0.8.19` `0.8.22` `0.8.24` `0.8.25` `0.8.27` diff --git a/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_definition/generated/0.8.27-failure.yml b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_definition/generated/0.8.27-failure.yml new file mode 100644 index 0000000000..537fab7968 --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_definition/generated/0.8.27-failure.yml @@ -0,0 +1,42 @@ +# This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +Source: > + 1 │ contract Sample { │ 0..17 + 2 │ function () { │ 18..33 + 3 │ } │ 34..37 + 4 │ } │ 38..39 + +Errors: # 1 total + - > + Error: Expected ConstantKeyword or Identifier or ImmutableKeyword or InternalKeyword or OverrideKeyword or PrivateKeyword or PublicKeyword or TransientKeyword. + ╭─[crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_definition/input.sol:2:15] + │ + 2 │ ╭─▶ function () { + 3 │ ├─▶ } + │ │ + │ ╰───────── Error occurred here. + ───╯ + +Tree: + - (ContractDefinition): # "contract Sample {\n function () {\n }\n}" (0..39) + - (contract_keyword꞉ ContractKeyword): "contract" # (0..8) + - (leading_trivia꞉ Whitespace): " " # (8..9) + - (name꞉ Identifier): "Sample" # (9..15) + - (leading_trivia꞉ Whitespace): " " # (15..16) + - (open_brace꞉ OpenBrace): "{" # (16..17) + - (trailing_trivia꞉ EndOfLine): "\n" # (17..18) + - (members꞉ ContractMembers): # " function () " (18..32) + - (item꞉ ContractMember) ► (variant꞉ StateVariableDefinition): # " function () " (18..32) + - (type_name꞉ TypeName) ► (variant꞉ FunctionType): # " function ()" (18..31) + - (leading_trivia꞉ Whitespace): " " # (18..20) + - (function_keyword꞉ FunctionKeyword): "function" # (20..28) + - (parameters꞉ ParametersDeclaration): # " ()" (28..31) + - (leading_trivia꞉ Whitespace): " " # (28..29) + - (open_paren꞉ OpenParen): "(" # (29..30) + - (parameters꞉ Parameters): [] # (30..30) + - (close_paren꞉ CloseParen): ")" # (30..31) + - (attributes꞉ FunctionTypeAttributes): [] # (31..31) + - (attributes꞉ StateVariableAttributes): [] # (31..31) + - (leading_trivia꞉ Whitespace): " " # (31..32) + - (UNRECOGNIZED): "{\n }\n" # (32..38) + - (close_brace꞉ CloseBrace): "}" # (38..39) diff --git a/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_with_attrs_definition/generated/0.8.27-failure.yml b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_with_attrs_definition/generated/0.8.27-failure.yml new file mode 100644 index 0000000000..1455bfd1ff --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_with_attrs_definition/generated/0.8.27-failure.yml @@ -0,0 +1,46 @@ +# This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +Source: > + 1 │ contract Sample { │ 0..17 + 2 │ function() external payable {} │ 18..50 + 3 │ } │ 51..52 + +Errors: # 1 total + - > + Error: Expected ConstantKeyword or Identifier or ImmutableKeyword or InternalKeyword or OverrideKeyword or PrivateKeyword or PublicKeyword or TransientKeyword. + ╭─[crates/solidity/testing/snapshots/cst_output/ContractDefinition/member_unnamed_function_with_attrs_definition/input.sol:2:31] + │ + 2 │ function() external payable {} + │ ─┬─ + │ ╰─── Error occurred here. + ───╯ + +Tree: + - (ContractDefinition): # "contract Sample {\n function() external payable {}..." (0..53) + - (contract_keyword꞉ ContractKeyword): "contract" # (0..8) + - (leading_trivia꞉ Whitespace): " " # (8..9) + - (name꞉ Identifier): "Sample" # (9..15) + - (leading_trivia꞉ Whitespace): " " # (15..16) + - (open_brace꞉ OpenBrace): "{" # (16..17) + - (trailing_trivia꞉ EndOfLine): "\n" # (17..18) + - (members꞉ ContractMembers): # " function() external payable " (18..48) + - (item꞉ ContractMember) ► (variant꞉ StateVariableDefinition): # " function() external payable " (18..48) + - (type_name꞉ TypeName) ► (variant꞉ FunctionType): # " function() external payable" (18..47) + - (leading_trivia꞉ Whitespace): " " # (18..20) + - (function_keyword꞉ FunctionKeyword): "function" # (20..28) + - (parameters꞉ ParametersDeclaration): # "()" (28..30) + - (open_paren꞉ OpenParen): "(" # (28..29) + - (parameters꞉ Parameters): [] # (29..29) + - (close_paren꞉ CloseParen): ")" # (29..30) + - (attributes꞉ FunctionTypeAttributes): # " external payable" (30..47) + - (item꞉ FunctionTypeAttribute): # " external" (30..39) + - (leading_trivia꞉ Whitespace): " " # (30..31) + - (variant꞉ ExternalKeyword): "external" # (31..39) + - (item꞉ FunctionTypeAttribute): # " payable" (39..47) + - (leading_trivia꞉ Whitespace): " " # (39..40) + - (variant꞉ PayableKeyword): "payable" # (40..47) + - (attributes꞉ StateVariableAttributes): [] # (47..47) + - (leading_trivia꞉ Whitespace): " " # (47..48) + - (UNRECOGNIZED): "{}\n" # (48..51) + - (close_brace꞉ CloseBrace): "}" # (51..52) + - (trailing_trivia꞉ EndOfLine): "\n" # (52..53) diff --git a/crates/solidity/testing/snapshots/cst_output/ContractDefinition/missing_field_type/generated/0.8.27-failure.yml b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/missing_field_type/generated/0.8.27-failure.yml new file mode 100644 index 0000000000..f908fa2c5b --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/ContractDefinition/missing_field_type/generated/0.8.27-failure.yml @@ -0,0 +1,36 @@ +# This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +Source: > + 1 │ contract Test { │ 0..15 + 2 │ field; │ 16..24 + 3 │ } │ 25..26 + +Errors: # 1 total + - > + Error: Expected ConstantKeyword or Identifier or ImmutableKeyword or InternalKeyword or OverrideKeyword or PrivateKeyword or PublicKeyword or TransientKeyword. + ╭─[crates/solidity/testing/snapshots/cst_output/ContractDefinition/missing_field_type/input.sol:2:8] + │ + 2 │ field; + │ │ + │ ╰─ Error occurred here. + ───╯ + +Tree: + - (ContractDefinition): # "contract Test {\n field;\n}\n" (0..27) + - (contract_keyword꞉ ContractKeyword): "contract" # (0..8) + - (leading_trivia꞉ Whitespace): " " # (8..9) + - (name꞉ Identifier): "Test" # (9..13) + - (leading_trivia꞉ Whitespace): " " # (13..14) + - (open_brace꞉ OpenBrace): "{" # (14..15) + - (trailing_trivia꞉ EndOfLine): "\n" # (15..16) + - (members꞉ ContractMembers): # " field;\n" (16..25) + - (item꞉ ContractMember) ► (variant꞉ StateVariableDefinition): # " field;\n" (16..25) + - (type_name꞉ TypeName) ► (variant꞉ IdentifierPath): # " field" (16..23) + - (leading_trivia꞉ Whitespace): " " # (16..18) + - (item꞉ Identifier): "field" # (18..23) + - (attributes꞉ StateVariableAttributes): [] # (23..23) + - (MISSING): "" # (23..23) + - (semicolon꞉ Semicolon): ";" # (23..24) + - (trailing_trivia꞉ EndOfLine): "\n" # (24..25) + - (close_brace꞉ CloseBrace): "}" # (25..26) + - (trailing_trivia꞉ EndOfLine): "\n" # (26..27) diff --git a/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.4.11-failure.yml b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.4.11-failure.yml new file mode 100644 index 0000000000..b480f53bff --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.4.11-failure.yml @@ -0,0 +1,25 @@ +# This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +Source: > + 1 │ uint transient foo; │ 0..19 + +Errors: # 1 total + - > + Error: Expected Equal or Semicolon. + ╭─[crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/input.sol:1:16] + │ + 1 │ uint transient foo; + │ ─┬─ + │ ╰─── Error occurred here. + ───╯ + +Tree: + - (StateVariableDefinition): # "uint transient foo;\n" (0..20) + - (type_name꞉ TypeName) ► (variant꞉ ElementaryType) ► (variant꞉ UintKeyword): "uint" # (0..4) + - (attributes꞉ StateVariableAttributes): [] # (4..4) + - (leading_trivia꞉ Whitespace): " " # (4..5) + - (name꞉ Identifier): "transient" # (5..14) + - (leading_trivia꞉ Whitespace): " " # (14..15) + - (UNRECOGNIZED): "foo" # (15..18) + - (semicolon꞉ Semicolon): ";" # (18..19) + - (trailing_trivia꞉ EndOfLine): "\n" # (19..20) diff --git a/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.8.27-success.yml b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.8.27-success.yml new file mode 100644 index 0000000000..8f3be09163 --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/generated/0.8.27-success.yml @@ -0,0 +1,18 @@ +# This file is generated automatically by infrastructure scripts. Please don't edit by hand. + +Source: > + 1 │ uint transient foo; │ 0..19 + +Errors: [] + +Tree: + - (StateVariableDefinition): # "uint transient foo;\n" (0..20) + - (type_name꞉ TypeName) ► (variant꞉ ElementaryType) ► (variant꞉ UintKeyword): "uint" # (0..4) + - (attributes꞉ StateVariableAttributes): # " transient" (4..14) + - (item꞉ StateVariableAttribute): # " transient" (4..14) + - (leading_trivia꞉ Whitespace): " " # (4..5) + - (variant꞉ TransientKeyword): "transient" # (5..14) + - (leading_trivia꞉ Whitespace): " " # (14..15) + - (name꞉ Identifier): "foo" # (15..18) + - (semicolon꞉ Semicolon): ";" # (18..19) + - (trailing_trivia꞉ EndOfLine): "\n" # (19..20) diff --git a/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/input.sol b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/input.sol new file mode 100644 index 0000000000..45568ecb9e --- /dev/null +++ b/crates/solidity/testing/snapshots/cst_output/StateVariableDefinition/transient/input.sol @@ -0,0 +1 @@ +uint transient foo; diff --git a/crates/solidity/testing/solc/src/commands/keyword_versioning.rs b/crates/solidity/testing/solc/src/commands/keyword_versioning.rs index d06b31f9f6..b032bcf53d 100644 --- a/crates/solidity/testing/solc/src/commands/keyword_versioning.rs +++ b/crates/solidity/testing/solc/src/commands/keyword_versioning.rs @@ -254,17 +254,9 @@ impl TestCase { let output = match binary.run(&input) { Ok(output) => output, Err(error) => { - let error = format!("{error:#?}"); - if binary.version == Version::new(0, 4, 11) - && error.contains("Command failed with code 'UNKNOWN' and signal '11'") - { - // solc 0.4.11 SEGFAULTs when a keyword exists in an identifier position. - return false; - } - println!(); println!( - "Invoking solc failed:\n{error}\n\nInput:\n{input}", + "Invoking solc failed:\n{error:#?}\n\nInput:\n{input}", input = serde_json::to_string_pretty(&input).unwrap(), ); std::process::exit(1); diff --git a/crates/solidity/testing/solc/src/utils/binaries.rs b/crates/solidity/testing/solc/src/utils/binaries.rs index d7693a19d0..cef74ee2e2 100644 --- a/crates/solidity/testing/solc/src/utils/binaries.rs +++ b/crates/solidity/testing/solc/src/utils/binaries.rs @@ -37,6 +37,15 @@ impl Binary { let mut binaries = language .versions .iter() + .filter(|version| { + match version { + Version { major: 0, minor: 4, patch: 11, pre: _, build: _ } => { + progress_bar.println(format!("solc v{version} SEGFAULTs on a multitude of parse errors. Let's skip it for now.")); + false + } + _ => true, + } + }) .par_bridge() .map(|version| { let local_path = binaries_dir.join(version.to_string());