OSDN Git Service

fix commands
[bytom/shuttle.git] / vendor / github.com / bytom / equity / compiler / types.go
diff --git a/vendor/github.com/bytom/equity/compiler/types.go b/vendor/github.com/bytom/equity/compiler/types.go
new file mode 100644 (file)
index 0000000..1252de3
--- /dev/null
@@ -0,0 +1,74 @@
+package compiler
+
+type typeDesc string
+
+var (
+       amountType   = typeDesc("Amount")
+       assetType    = typeDesc("Asset")
+       boolType     = typeDesc("Boolean")
+       contractType = typeDesc("Contract")
+       hashType     = typeDesc("Hash")
+       intType      = typeDesc("Integer")
+       listType     = typeDesc("List")
+       nilType      = typeDesc("")
+       predType     = typeDesc("Predicate")
+       progType     = typeDesc("Program")
+       pubkeyType   = typeDesc("PublicKey")
+       sigType      = typeDesc("Signature")
+       strType      = typeDesc("String")
+
+       sha3StrType      = typeDesc("Sha3(String)")
+       sha3PubkeyType   = typeDesc("Sha3(PublicKey)")
+       sha256StrType    = typeDesc("Sha256(String)")
+       sha256PubkeyType = typeDesc("Sha256(PublicKey)")
+)
+
+var types = map[string]typeDesc{
+       string(amountType): amountType,
+       string(assetType):  assetType,
+       string(boolType):   boolType,
+       string(hashType):   hashType,
+       string(intType):    intType,
+       string(listType):   listType,
+       string(nilType):    nilType,
+       string(predType):   predType,
+       string(progType):   progType,
+       string(pubkeyType): pubkeyType,
+       string(sigType):    sigType,
+       string(strType):    strType,
+
+       string(sha3StrType):      sha3StrType,
+       string(sha3PubkeyType):   sha3PubkeyType,
+       string(sha256StrType):    sha256StrType,
+       string(sha256PubkeyType): sha256PubkeyType,
+}
+
+func isHashSubtype(t typeDesc) bool {
+       switch t {
+       case sha3StrType, sha3PubkeyType, sha256StrType, sha256PubkeyType:
+               return true
+       }
+       return false
+}
+
+func propagateType(contract *Contract, clause *Clause, env *environ, t typeDesc, e expression) {
+       v, ok := e.(varRef)
+       if !ok {
+               return
+       }
+       if entry := env.lookup(string(v)); entry != nil {
+               entry.t = t
+               for _, p := range contract.Params {
+                       if p.Name == string(v) {
+                               p.InferredType = t
+                               return
+                       }
+               }
+               for _, p := range clause.Params {
+                       if p.Name == string(v) {
+                               p.InferredType = t
+                               return
+                       }
+               }
+       }
+}