OSDN Git Service

new repo
[bytom/vapor.git] / equity / compiler / types.go
1 package compiler
2
3 type typeDesc string
4
5 var (
6         amountType   = typeDesc("Amount")
7         assetType    = typeDesc("Asset")
8         boolType     = typeDesc("Boolean")
9         contractType = typeDesc("Contract")
10         hashType     = typeDesc("Hash")
11         intType      = typeDesc("Integer")
12         listType     = typeDesc("List")
13         nilType      = typeDesc("")
14         predType     = typeDesc("Predicate")
15         progType     = typeDesc("Program")
16         pubkeyType   = typeDesc("PublicKey")
17         sigType      = typeDesc("Signature")
18         strType      = typeDesc("String")
19
20         sha3StrType      = typeDesc("Sha3(String)")
21         sha3PubkeyType   = typeDesc("Sha3(PublicKey)")
22         sha256StrType    = typeDesc("Sha256(String)")
23         sha256PubkeyType = typeDesc("Sha256(PublicKey)")
24 )
25
26 var types = map[string]typeDesc{
27         string(amountType): amountType,
28         string(assetType):  assetType,
29         string(boolType):   boolType,
30         string(hashType):   hashType,
31         string(intType):    intType,
32         string(listType):   listType,
33         string(nilType):    nilType,
34         string(predType):   predType,
35         string(progType):   progType,
36         string(pubkeyType): pubkeyType,
37         string(sigType):    sigType,
38         string(strType):    strType,
39
40         string(sha3StrType):      sha3StrType,
41         string(sha3PubkeyType):   sha3PubkeyType,
42         string(sha256StrType):    sha256StrType,
43         string(sha256PubkeyType): sha256PubkeyType,
44 }
45
46 func isHashSubtype(t typeDesc) bool {
47         switch t {
48         case sha3StrType, sha3PubkeyType, sha256StrType, sha256PubkeyType:
49                 return true
50         }
51         return false
52 }
53
54 func propagateType(contract *Contract, clause *Clause, env *environ, t typeDesc, e expression) {
55         v, ok := e.(varRef)
56         if !ok {
57                 return
58         }
59         if entry := env.lookup(string(v)); entry != nil {
60                 entry.t = t
61                 for _, p := range contract.Params {
62                         if p.Name == string(v) {
63                                 p.InferredType = t
64                                 return
65                         }
66                 }
67                 for _, p := range clause.Params {
68                         if p.Name == string(v) {
69                                 p.InferredType = t
70                                 return
71                         }
72                 }
73         }
74 }