mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-02-01 23:40:35 +00:00
compiler: provide .go
filename to Compile
First argument contains filename, thus we use '.go' suffix to distinguish between directories and files. Contract name should be provided in options. Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
8af9c870b1
commit
e7a0ecb349
10 changed files with 35 additions and 28 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
gio "io"
|
gio "io"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/cli/smartcontract"
|
"github.com/nspcc-dev/neo-go/cli/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
"github.com/nspcc-dev/neo-go/pkg/compiler"
|
||||||
|
@ -50,18 +51,14 @@ func NewTransferFromOwner(bc blockchainer.Blockchainer, contractHash, to util.Ui
|
||||||
return tx, SignTx(bc, tx)
|
return tx, SignTx(bc, tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDeployTx returns new deployment tx for contract with name with Go code read from r.
|
// NewDeployTx returns new deployment for contract with source from r and name equal to
|
||||||
|
// filename without '.go' suffix.
|
||||||
func NewDeployTx(bc blockchainer.Blockchainer, name string, sender util.Uint160, r gio.Reader, confFile *string) (*transaction.Transaction, util.Uint160, []byte, error) {
|
func NewDeployTx(bc blockchainer.Blockchainer, name string, sender util.Uint160, r gio.Reader, confFile *string) (*transaction.Transaction, util.Uint160, []byte, error) {
|
||||||
// nef.NewFile() cares about version a lot.
|
// nef.NewFile() cares about version a lot.
|
||||||
config.Version = "0.90.0-test"
|
config.Version = "0.90.0-test"
|
||||||
|
|
||||||
ne, di, err := compiler.CompileWithOptions(name, r, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, util.Uint160{}, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
o := &compiler.Options{
|
o := &compiler.Options{
|
||||||
Name: name,
|
Name: strings.TrimSuffix(name, ".go"),
|
||||||
NoStandardCheck: true,
|
NoStandardCheck: true,
|
||||||
NoEventsCheck: true,
|
NoEventsCheck: true,
|
||||||
}
|
}
|
||||||
|
@ -79,6 +76,12 @@ func NewDeployTx(bc blockchainer.Blockchainer, name string, sender util.Uint160,
|
||||||
}
|
}
|
||||||
o.SafeMethods = conf.SafeMethods
|
o.SafeMethods = conf.SafeMethods
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ne, di, err := compiler.CompileWithOptions(name, r, o)
|
||||||
|
if err != nil {
|
||||||
|
return nil, util.Uint160{}, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
m, err := compiler.CreateManifest(di, o)
|
m, err := compiler.CreateManifest(di, o)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, util.Uint160{}, nil, fmt.Errorf("failed to create manifest: %w", err)
|
return nil, util.Uint160{}, nil, fmt.Errorf("failed to create manifest: %w", err)
|
||||||
|
@ -100,7 +103,7 @@ func NewDeployTx(bc blockchainer.Blockchainer, name string, sender util.Uint160,
|
||||||
|
|
||||||
tx := transaction.New(buf.Bytes(), 100*native.GASFactor)
|
tx := transaction.New(buf.Bytes(), 100*native.GASFactor)
|
||||||
tx.Signers = []transaction.Signer{{Account: sender}}
|
tx.Signers = []transaction.Signer{{Account: sender}}
|
||||||
h := state.CreateContractHash(tx.Sender(), ne.Checksum, name)
|
h := state.CreateContractHash(tx.Sender(), ne.Checksum, m.Name)
|
||||||
|
|
||||||
return tx, h, ne.Script, nil
|
return tx, h, ne.Script, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ func compileFile(src string) error {
|
||||||
|
|
||||||
func TestOnPayableChecks(t *testing.T) {
|
func TestOnPayableChecks(t *testing.T) {
|
||||||
compileAndCheck := func(t *testing.T, src string) error {
|
compileAndCheck := func(t *testing.T, src string) error {
|
||||||
_, di, err := compiler.CompileWithOptions("payable", strings.NewReader(src), nil)
|
_, di, err := compiler.CompileWithOptions("payable.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = compiler.CreateManifest(di, &compiler.Options{})
|
_, err = compiler.CreateManifest(di, &compiler.Options{})
|
||||||
return err
|
return err
|
||||||
|
@ -129,7 +129,8 @@ func TestSafeMethodWarnings(t *testing.T) {
|
||||||
src := `package payable
|
src := `package payable
|
||||||
func Main() int { return 1 }`
|
func Main() int { return 1 }`
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src), nil)
|
_, di, err := compiler.CompileWithOptions("eventTest.go", strings.NewReader(src),
|
||||||
|
&compiler.Options{Name: "eventTest"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = compiler.CreateManifest(di, &compiler.Options{SafeMethods: []string{"main"}})
|
_, err = compiler.CreateManifest(di, &compiler.Options{SafeMethods: []string{"main"}})
|
||||||
|
@ -144,7 +145,7 @@ func TestEventWarnings(t *testing.T) {
|
||||||
import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
||||||
func Main() { runtime.Notify("Event", 1) }`
|
func Main() { runtime.Notify("Event", 1) }`
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src), nil)
|
_, di, err := compiler.CompileWithOptions("eventTest.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
t.Run("event it missing from config", func(t *testing.T) {
|
t.Run("event it missing from config", func(t *testing.T) {
|
||||||
|
@ -188,7 +189,7 @@ func TestEventWarnings(t *testing.T) {
|
||||||
return notify.Value
|
return notify.Value
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src), nil)
|
_, di, err := compiler.CompileWithOptions("eventTest.go", strings.NewReader(src), &compiler.Options{Name: "eventTest"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = compiler.CreateManifest(di, &compiler.Options{NoEventsCheck: true})
|
_, err = compiler.CreateManifest(di, &compiler.Options{NoEventsCheck: true})
|
||||||
|
@ -202,7 +203,8 @@ func TestEventWarnings(t *testing.T) {
|
||||||
return 42
|
return 42
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src), nil)
|
_, di, err := compiler.CompileWithOptions("eventTest.go",
|
||||||
|
strings.NewReader(src), &compiler.Options{Name: "eventTest"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = compiler.CreateManifest(di, &compiler.Options{})
|
_, err = compiler.CreateManifest(di, &compiler.Options{})
|
||||||
|
@ -224,12 +226,12 @@ func TestNotifyInVerify(t *testing.T) {
|
||||||
for _, name := range []string{"Notify", "Log"} {
|
for _, name := range []string{"Notify", "Log"} {
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
src := fmt.Sprintf(srcTmpl, name)
|
src := fmt.Sprintf(srcTmpl, name)
|
||||||
_, _, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src),
|
_, _, err := compiler.CompileWithOptions("eventTest.go", strings.NewReader(src),
|
||||||
&compiler.Options{ContractEvents: []manifest.Event{{Name: "Event"}}})
|
&compiler.Options{ContractEvents: []manifest.Event{{Name: "Event"}}})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
|
|
||||||
t.Run("suppress", func(t *testing.T) {
|
t.Run("suppress", func(t *testing.T) {
|
||||||
_, _, err := compiler.CompileWithOptions("eventTest", strings.NewReader(src),
|
_, _, err := compiler.CompileWithOptions("eventTest.go", strings.NewReader(src),
|
||||||
&compiler.Options{NoEventsCheck: true})
|
&compiler.Options{NoEventsCheck: true})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
})
|
})
|
||||||
|
@ -258,7 +260,7 @@ func TestInvokedContractsPermissons(t *testing.T) {
|
||||||
return 0
|
return 0
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("permissionTest", strings.NewReader(src), &compiler.Options{})
|
_, di, err := compiler.CompileWithOptions("permissionTest.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
var nh util.Uint160
|
var nh util.Uint160
|
||||||
|
@ -302,7 +304,7 @@ func TestInvokedContractsPermissons(t *testing.T) {
|
||||||
contract.Call(runh.RuntimeHash(), "method4", contract.All)
|
contract.Call(runh.RuntimeHash(), "method4", contract.All)
|
||||||
}`, hashStr)
|
}`, hashStr)
|
||||||
|
|
||||||
_, di, err := compiler.CompileWithOptions("permissionTest", strings.NewReader(src), &compiler.Options{})
|
_, di, err := compiler.CompileWithOptions("permissionTest.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
var h util.Uint160
|
var h util.Uint160
|
||||||
|
|
|
@ -365,7 +365,7 @@ func TestManifestOverload(t *testing.T) {
|
||||||
return 4
|
return 4
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, di, err := CompileWithOptions("foo", strings.NewReader(src), nil)
|
_, di, err := CompileWithOptions("foo.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m, err := di.ConvertToManifest(&Options{Overloads: map[string]string{"add3Aux": "add3"}})
|
m, err := di.ConvertToManifest(&Options{Overloads: map[string]string{"add3Aux": "add3"}})
|
||||||
|
|
|
@ -302,7 +302,7 @@ func TestJumpOptimize(t *testing.T) {
|
||||||
func Main() int {
|
func Main() int {
|
||||||
return Get3()
|
return Get3()
|
||||||
}`
|
}`
|
||||||
b, di, err := compiler.CompileWithOptions("", strings.NewReader(src), nil)
|
b, di, err := compiler.CompileWithOptions("file.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 6, len(di.Methods))
|
require.Equal(t, 6, len(di.Methods))
|
||||||
for _, mi := range di.Methods {
|
for _, mi := range di.Methods {
|
||||||
|
@ -333,7 +333,7 @@ func TestUnusedFunctions(t *testing.T) {
|
||||||
return nestedcall.X
|
return nestedcall.X
|
||||||
}`
|
}`
|
||||||
|
|
||||||
b, err := compiler.Compile("foo", strings.NewReader(src))
|
b, err := compiler.Compile("foo.go", strings.NewReader(src))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 3, len(b)) // PUSHINT8 (42) + RET
|
require.Equal(t, 3, len(b)) // PUSHINT8 (42) + RET
|
||||||
eval(t, src, big.NewInt(42))
|
eval(t, src, big.NewInt(42))
|
||||||
|
@ -346,7 +346,7 @@ func TestUnusedFunctions(t *testing.T) {
|
||||||
return inner.N()
|
return inner.N()
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, err := compiler.Compile("foo", strings.NewReader(src))
|
_, err := compiler.Compile("foo.go", strings.NewReader(src))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
eval(t, src, big.NewInt(65))
|
eval(t, src, big.NewInt(65))
|
||||||
})
|
})
|
||||||
|
@ -359,7 +359,7 @@ func TestUnusedFunctions(t *testing.T) {
|
||||||
return t.Method()
|
return t.Method()
|
||||||
}`
|
}`
|
||||||
|
|
||||||
_, err := compiler.Compile("foo", strings.NewReader(src))
|
_, err := compiler.Compile("foo.go", strings.NewReader(src))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
eval(t, src, big.NewInt(2231))
|
eval(t, src, big.NewInt(2231))
|
||||||
})
|
})
|
||||||
|
|
|
@ -139,7 +139,7 @@ func runSyscallTestCase(t *testing.T, ic *interop.Context, goName string, tc sys
|
||||||
}
|
}
|
||||||
ss := strings.Split(goName, ".")
|
ss := strings.Split(goName, ".")
|
||||||
src := fmt.Sprintf(srcTmpl, ss[0], goName, strings.Join(tc.params, ", "))
|
src := fmt.Sprintf(srcTmpl, ss[0], goName, strings.Join(tc.params, ", "))
|
||||||
b, _, err := compiler.CompileWithOptions("foo", strings.NewReader(src), nil)
|
b, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
v := ic.SpawnVM()
|
v := ic.SpawnVM()
|
||||||
|
|
|
@ -1257,7 +1257,7 @@ func TestIsTxStillRelevant(t *testing.T) {
|
||||||
currentHeight := contract.Call(addr, "currentIndex", contract.ReadStates)
|
currentHeight := contract.Call(addr, "currentIndex", contract.ReadStates)
|
||||||
return currentHeight.(int) < %d
|
return currentHeight.(int) < %d
|
||||||
}`, bc.BlockHeight()+2) // deploy + next block
|
}`, bc.BlockHeight()+2) // deploy + next block
|
||||||
txDeploy, h, _, err := testchain.NewDeployTx(bc, "TestVerify", neoOwner, strings.NewReader(src), nil)
|
txDeploy, h, _, err := testchain.NewDeployTx(bc, "TestVerify.go", neoOwner, strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
txDeploy.ValidUntilBlock = bc.BlockHeight() + 1
|
txDeploy.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
addSigners(neoOwner, txDeploy)
|
addSigners(neoOwner, txDeploy)
|
||||||
|
|
|
@ -187,7 +187,7 @@ func TestBug1728(t *testing.T) {
|
||||||
func _deploy(_ interface{}, isUpdate bool) {
|
func _deploy(_ interface{}, isUpdate bool) {
|
||||||
runtime.Log("Deploy")
|
runtime.Log("Deploy")
|
||||||
}`
|
}`
|
||||||
nf, di, err := compiler.CompileWithOptions("foo", strings.NewReader(src), nil)
|
nf, di, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
m, err := di.ConvertToManifest(&compiler.Options{Name: "TestContract"})
|
m, err := di.ConvertToManifest(&compiler.Options{Name: "TestContract"})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
@ -394,7 +394,9 @@ func handleLoadGo(c *ishell.Context) {
|
||||||
c.Err(fmt.Errorf("%w: <file>", ErrMissingParameter))
|
c.Err(fmt.Errorf("%w: <file>", ErrMissingParameter))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
b, di, err := compiler.CompileWithOptions(c.Args[0], nil, nil)
|
|
||||||
|
name := strings.TrimSuffix(c.Args[0], ".go")
|
||||||
|
b, di, err := compiler.CompileWithOptions(c.Args[0], nil, &compiler.Options{Name: name})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Err(err)
|
c.Err(err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -243,7 +243,7 @@ func TestLoad(t *testing.T) {
|
||||||
t.Run("loadnef", func(t *testing.T) {
|
t.Run("loadnef", func(t *testing.T) {
|
||||||
config.Version = "0.92.0-test"
|
config.Version = "0.92.0-test"
|
||||||
|
|
||||||
nefFile, di, err := compiler.CompileWithOptions("test", strings.NewReader(src), nil)
|
nefFile, di, err := compiler.CompileWithOptions("test.go", strings.NewReader(src), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
filename := filepath.Join(tmpDir, "vmtestcontract.nef")
|
filename := filepath.Join(tmpDir, "vmtestcontract.nef")
|
||||||
rawNef, err := nefFile.Bytes()
|
rawNef, err := nefFile.Bytes()
|
||||||
|
|
|
@ -75,7 +75,7 @@ func main() {
|
||||||
handleError("can't tranfser GAS", err)
|
handleError("can't tranfser GAS", err)
|
||||||
lastBlock = addBlock(bc, lastBlock, valScript, txMoveNeo, txMoveGas)
|
lastBlock = addBlock(bc, lastBlock, valScript, txMoveNeo, txMoveGas)
|
||||||
|
|
||||||
tx, contractHash, _, err := testchain.NewDeployTx(bc, "DumpContract", h, strings.NewReader(contract), nil)
|
tx, contractHash, _, err := testchain.NewDeployTx(bc, "DumpContract.go", h, strings.NewReader(contract), nil)
|
||||||
handleError("can't create deploy tx", err)
|
handleError("can't create deploy tx", err)
|
||||||
tx.NetworkFee = 10_000_000
|
tx.NetworkFee = 10_000_000
|
||||||
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
tx.ValidUntilBlock = bc.BlockHeight() + 1
|
||||||
|
|
Loading…
Add table
Reference in a new issue