diff --git a/crates/solidity/inputs/language/bindings/rules.msgb b/crates/solidity/inputs/language/bindings/rules.msgb index 142dbdfab..6f3455ae8 100644 --- a/crates/solidity/inputs/language/bindings/rules.msgb +++ b/crates/solidity/inputs/language/bindings/rules.msgb @@ -163,16 +163,23 @@ attribute symbol_reference = symbol => type = "push_symbol", symbol = symbol, i ;; the source unit) edge @type_name.left -> @contract.parent_scope + ;; Make base members accesible as our own members node member attr (member) push_symbol = "." node typeof attr (typeof) push_symbol = "@typeof" - ;; Make base members accesible in our lexical scope - edge @contract.lexical_scope -> member + edge @contract.members -> member edge member -> typeof edge typeof -> @type_name.right + + ;; Make base contract defs (eg. enums and structs) accessible as our own + node type_member + attr (type_member) push_symbol = "." + + edge @contract.type_members -> type_member + edge type_member -> @type_name.right } @interface [InterfaceDefinition @name name: [Identifier]] { diff --git a/crates/solidity/outputs/cargo/slang_solidity/src/generated/bindings/generated/binding_rules.rs b/crates/solidity/outputs/cargo/slang_solidity/src/generated/bindings/generated/binding_rules.rs index abfe0766a..f9935f153 100644 --- a/crates/solidity/outputs/cargo/slang_solidity/src/generated/bindings/generated/binding_rules.rs +++ b/crates/solidity/outputs/cargo/slang_solidity/src/generated/bindings/generated/binding_rules.rs @@ -168,16 +168,23 @@ attribute symbol_reference = symbol => type = "push_symbol", symbol = symbol, i ;; the source unit) edge @type_name.left -> @contract.parent_scope + ;; Make base members accesible as our own members node member attr (member) push_symbol = "." node typeof attr (typeof) push_symbol = "@typeof" - ;; Make base members accesible in our lexical scope - edge @contract.lexical_scope -> member + edge @contract.members -> member edge member -> typeof edge typeof -> @type_name.right + + ;; Make base contract defs (eg. enums and structs) accessible as our own + node type_member + attr (type_member) push_symbol = "." + + edge @contract.type_members -> type_member + edge type_member -> @type_name.right } @interface [InterfaceDefinition @name name: [Identifier]] { diff --git a/crates/solidity/outputs/cargo/tests/src/bindings_assertions/generated/contracts.rs b/crates/solidity/outputs/cargo/tests/src/bindings_assertions/generated/contracts.rs index c61faf954..aedc24d59 100644 --- a/crates/solidity/outputs/cargo/tests/src/bindings_assertions/generated/contracts.rs +++ b/crates/solidity/outputs/cargo/tests/src/bindings_assertions/generated/contracts.rs @@ -4,6 +4,11 @@ use anyhow::Result; use crate::bindings_assertions::runner::run; +#[test] +fn inheritance() -> Result<()> { + run("contracts", "inheritance") +} + #[test] fn visibility() -> Result<()> { run("contracts", "visibility") diff --git a/crates/solidity/testing/snapshots/bindings_assertions/contracts/inheritance.sol b/crates/solidity/testing/snapshots/bindings_assertions/contracts/inheritance.sol new file mode 100644 index 000000000..fe9afbf55 --- /dev/null +++ b/crates/solidity/testing/snapshots/bindings_assertions/contracts/inheritance.sol @@ -0,0 +1,43 @@ +contract B1 { + // ^def:1 + function b1_func() returns (int) { + // ^def:2 + return 1; + } +} + +contract B2 { + // ^def:3 + enum E { E1, E2 } + // ^def:7 + function b2_func() returns (int) { + // ^def:4 + return 2; + } +} + +contract C is B1 { + // ^def:5 + // ^ref:1 + E e_at_c; + //