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:
zhiqiangxu 2022-03-30 04:38:59 +08:00 committed by GitHub
parent 67c070c379
commit 9f75994b5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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
} }