SolidityFlattener icon indicating copy to clipboard operation
SolidityFlattener copied to clipboard

Handle alternate import syntax

Open bokkypoobah opened this issue 5 years ago • 4 comments

From https://www.reddit.com/r/ethdev/comments/9ibfus/a_simpletoinstall_solidity_flattener/e6lrper/?context=3, user https://www.reddit.com/user/MEGATURBOZGEG:

Great tool, thanks for that. I'd like to use it but it doesn't look like you support the following syntax: import {FirstContract} from MyContracts.sol

right ? I'm not good at perl so I'm not sure and hence cannot do any pull request.

Reference https://solidity.readthedocs.io/en/develop/layout-of-source-files.html?highlight=import#syntax-and-semantics

bokkypoobah avatar Sep 25 '18 14:09 bokkypoobah

#Scenario1 - import "browser/ContractA.sol" as contracta;

In Remix, tab ContractA

pragma solidity ^0.4.24;

contract ContractA {
    function returnSomething() public pure returns (uint) {
        return 123;
    }
}

In Remix, tab ContractB

pragma solidity ^0.4.24;

import "browser/ContractA.sol" as contracta;

contract ContractB is contracta.ContractA {
    function returnSomethingElse() public pure returns (uint) {
        return returnSomething();
    }    
}

Q: How to implement flattening with the contracta namespace?

bokkypoobah avatar Sep 26 '18 02:09 bokkypoobah

#Scenario2 - import {ContractA} from "browser/ContractA.sol;

In Remix, tab ContractA

pragma solidity ^0.4.24;

contract ContractA {
    function returnSomething() public pure returns (uint) {
        return 123;
    }
}

contract ContractA1 {
    function returnSomething1() public pure returns (uint) {
        return 1231;
    }
}

In Remix, tab ContractB

pragma solidity ^0.4.24;

import {ContractA} from "browser/ContractA.sol";

// Following fails as only ContractA is imported
contract ContractB is ContractA1 {
    function returnSomethingElse() public pure returns (uint) {
        return returnSomething();
    }    
}

If instead, in tab ContractB

pragma solidity ^0.4.24;

import {ContractA1} from "browser/ContractA.sol";

// Following works as only ContractA1 is imported
contract ContractB is ContractA1 {
    function returnSomethingElse() public pure returns (uint) {
        return returnSomething1();
    }    
}

bokkypoobah avatar Sep 26 '18 03:09 bokkypoobah

Labeling as out of scope as this flattener is just meant as a simple tool

bokkypoobah avatar Sep 26 '18 03:09 bokkypoobah

The SolidityFlattery Go tool handles explicit imports but it doesn't handled nested imports. That is, if the file you are importing also imports files then SolidityFlattery will not work :-( https://github.com/akombalabs/SolidityFlattery

naddison36 avatar Jun 24 '19 07:06 naddison36