Remove interface from inheritance graph.

pull/2153/head
Alexis 8 months ago
parent 4164039011
commit 20fa97cbac
No known key found for this signature in database
  1. 6
      slither/__main__.py
  2. 17
      slither/printers/inheritance/inheritance_graph.py
  3. 2
      slither/slither.py
  4. 16
      tests/e2e/printers/test_data/test_contract_names/C.sol
  5. 12
      tests/e2e/printers/test_printers.py

@ -336,10 +336,10 @@ def parse_args(
)
group_printer.add_argument(
"--exclude-interfaces",
help= "Exclude interfaces from inheritance-graph printer",
"--include-interfaces",
help="Include interfaces from inheritance-graph printer",
action="store_true",
dest="exclude_interfaces",
dest="include_interfaces",
default=False,
)

@ -98,8 +98,14 @@ class PrinterInheritanceGraph(AbstractPrinter):
"""
ret = ""
# Remove contracts that have "mock" in the name and if --exclude-interface removes inherited interfaces
inheritance = [i for i in contract.immediate_inheritance if "mock" not in i.name.lower() and (not self.slither.exclude_interfaces or self.slither.exclude_interfaces and not i.is_interface)]
# Remove contracts that have "mock" in the name and if --include-interfaces in False (default)
# removes inherited interfaces
inheritance = [
i
for i in contract.immediate_inheritance
if "mock" not in i.name.lower()
and (not i.is_interface or self.slither.include_interfaces)
]
# Add arrows (number them if there is more than one path so we know order of declaration for inheritance).
if len(inheritance) == 1:
@ -116,6 +122,7 @@ class PrinterInheritanceGraph(AbstractPrinter):
for f in contract.functions
if not f.is_constructor
and not f.is_constructor_variables
and not f.is_virtual
and f.contract_declarer == contract
and f.visibility in visibilities
]
@ -198,7 +205,11 @@ class PrinterInheritanceGraph(AbstractPrinter):
content = 'digraph "" {\n'
for c in self.contracts:
if c.is_top_level or "mock" in c.name.lower() or c.is_library or (self.slither.exclude_interfaces and c.is_interface):
if (
"mock" in c.name.lower()
or c.is_library
or (c.is_interface and not self.slither.include_interfaces)
):
continue
content += self._summary(c) + "\n"
content += "}"

@ -197,7 +197,7 @@ class Slither(
self.skip_data_dependency = True
# Used in inheritance-graph printer
self.exclude_interfaces = kwargs.get("exclude_interfaces", False)
self.include_interfaces = kwargs.get("include_interfaces", False)
self._init_parsing_and_analyses(kwargs.get("skip_analyze", False))

@ -1,7 +1,21 @@
import "./A.sol";
contract C is A {
interface MyInterfaceX {
function count() external view returns (uint256);
function increment() external;
}
contract C is A, MyInterfaceX {
function c_main() public pure {
a_main();
}
function count() external view override returns (uint256){
return 1;
}
function increment() external override {
}
}

@ -34,3 +34,15 @@ def test_inheritance_printer(solc_binary_path) -> None:
assert counter["B -> A"] == 2
assert counter["C -> A"] == 1
# Lets also test the include/exclude interface behavior
# Check that the interface is not included
assert "MyInterfaceX" not in content
slither.include_interfaces = True
output = printer.output("test_printer.dot")
content = output.elements[0]["name"]["content"]
assert "MyInterfaceX" in content
# Remove test generated files
Path("test_printer.dot").unlink(missing_ok=True)

Loading…
Cancel
Save