common/compiler: add extra include paths to solidity compiler (#24541)
This PR adds a ExtraAllowedPath field to Solidity and exposes two APIs: CompileSource and CompileFiles, which were hidden inside CompileSolidityString and CompileSolidity before.
This commit is contained in:
parent
67c070c379
commit
9f75994b5e
@ -31,6 +31,7 @@ import (
|
|||||||
type Solidity struct {
|
type Solidity struct {
|
||||||
Path, Version, FullVersion string
|
Path, Version, FullVersion string
|
||||||
Major, Minor, Patch int
|
Major, Minor, Patch int
|
||||||
|
ExtraAllowedPath []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// --combined-output format
|
// --combined-output format
|
||||||
@ -58,11 +59,19 @@ type solcOutputV8 struct {
|
|||||||
Version string
|
Version string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Solidity) allowedPaths() string {
|
||||||
|
paths := []string{".", "./", "../"} // default to support relative paths
|
||||||
|
if len(s.ExtraAllowedPath) > 0 {
|
||||||
|
paths = append(paths, s.ExtraAllowedPath...)
|
||||||
|
}
|
||||||
|
return strings.Join(paths, ", ")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Solidity) makeArgs() []string {
|
func (s *Solidity) makeArgs() []string {
|
||||||
p := []string{
|
p := []string{
|
||||||
"--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc",
|
"--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc",
|
||||||
"--optimize", // code optimizer switched on
|
"--optimize", // code optimizer switched on
|
||||||
"--allow-paths", "., ./, ../", // default to support relative paths
|
"--allow-paths", s.allowedPaths(),
|
||||||
}
|
}
|
||||||
if s.Major > 0 || s.Minor > 4 || s.Patch > 6 {
|
if s.Major > 0 || s.Minor > 4 || s.Patch > 6 {
|
||||||
p[1] += ",metadata,hashes"
|
p[1] += ",metadata,hashes"
|
||||||
@ -108,10 +117,7 @@ func CompileSolidityString(solc, source string) (map[string]*Contract, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
args := append(s.makeArgs(), "--")
|
return s.CompileSource(source)
|
||||||
cmd := exec.Command(s.Path, append(args, "-")...)
|
|
||||||
cmd.Stdin = strings.NewReader(source)
|
|
||||||
return s.run(cmd, source)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CompileSolidity compiles all given Solidity source files.
|
// CompileSolidity compiles all given Solidity source files.
|
||||||
@ -119,11 +125,25 @@ func CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract,
|
|||||||
if len(sourcefiles) == 0 {
|
if len(sourcefiles) == 0 {
|
||||||
return nil, errors.New("solc: no source files")
|
return nil, errors.New("solc: no source files")
|
||||||
}
|
}
|
||||||
source, err := slurpFiles(sourcefiles)
|
s, err := SolidityVersion(solc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
s, err := SolidityVersion(solc)
|
|
||||||
|
return s.CompileFiles(sourcefiles...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompileSource builds and returns all the contracts contained within a source string.
|
||||||
|
func (s *Solidity) CompileSource(source string) (map[string]*Contract, error) {
|
||||||
|
args := append(s.makeArgs(), "--")
|
||||||
|
cmd := exec.Command(s.Path, append(args, "-")...)
|
||||||
|
cmd.Stdin = strings.NewReader(source)
|
||||||
|
return s.run(cmd, source)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompileFiles compiles all given Solidity source files.
|
||||||
|
func (s *Solidity) CompileFiles(sourcefiles ...string) (map[string]*Contract, error) {
|
||||||
|
source, err := slurpFiles(sourcefiles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user