tc_object.mx raw
1 package main
2
3 import "fmt"
4
5 // Object is a named entity declared in the source: Var, Func, TypeName,
6 // Const, PkgName, Builtin, or Label.
7 type Object interface {
8 Name() string
9 Type() Type
10 Pkg() *TCPackage
11 Exported() bool
12 objectTag() // type-tag to prevent accidental interface satisfaction
13 }
14
15 type object struct {
16 pkg *TCPackage
17 name string
18 typ Type
19 }
20
21 func (o *object) Name() string { return o.name }
22 func (o *object) Type() Type { return o.typ }
23 func (o *object) Pkg() *TCPackage { return o.pkg }
24 func (o *object) Exported() bool { return len(o.name) > 0 && o.name[0] >= 'A' && o.name[0] <= 'Z' }
25 func (o *object) objectTag() {}
26
27 // ----------------------------------------------------------------------------
28 // TypeName
29
30 type TypeName struct {
31 object
32 }
33
34 func NewTypeName(pkg *TCPackage, name string, typ Type) *TypeName {
35 return &TypeName{object{pkg: pkg, name: name, typ: typ}}
36 }
37 func (o *TypeName) String() string { return "type " | o.name }
38
39 // ----------------------------------------------------------------------------
40 // Func
41
42 type TCFunc struct {
43 object
44 hasPtrRecv bool
45 }
46
47 func NewTCFunc(pkg *TCPackage, name string, sig *Signature) *TCFunc {
48 return &TCFunc{object: object{pkg: pkg, name: name, typ: sig}}
49 }
50 func (o *TCFunc) Signature() *Signature {
51 if sig, ok := o.typ.(*Signature); ok {
52 return sig
53 }
54 return nil
55 }
56 func (o *TCFunc) HasPtrRecv() bool { return o.hasPtrRecv }
57 func (o *TCFunc) String() string { return "func " | o.name }
58
59 // ----------------------------------------------------------------------------
60 // Const
61
62 type TCConst struct {
63 object
64 val ConstVal
65 }
66
67 func NewTCConst(pkg *TCPackage, name string, typ Type, val ConstVal) *TCConst {
68 return &TCConst{object: object{pkg: pkg, name: name, typ: typ}, val: val}
69 }
70 func (o *TCConst) Val() ConstVal { return o.val }
71 func (o *TCConst) String() string { return fmt.Sprintf("const %s = %v", o.name, o.val) }
72
73 type ConstVal = interface{ String() string }
74
75 // ----------------------------------------------------------------------------
76 // PkgName (an imported package)
77
78 type PkgName struct {
79 object
80 imported *TCPackage
81 }
82
83 func NewPkgName(pkg *TCPackage, name string, imported *TCPackage) *PkgName {
84 return &PkgName{object: object{pkg: pkg, name: name}, imported: imported}
85 }
86 func (o *PkgName) Imported() *TCPackage { return o.imported }
87 func (o *PkgName) String() string { return "package " | o.name }
88
89 // ----------------------------------------------------------------------------
90 // Builtin
91
92 type BuiltinID int
93
94 const (
95 BuiltinAppend BuiltinID = iota
96 BuiltinCap
97 BuiltinClear
98 BuiltinClose
99 BuiltinComplex // not valid in Moxie, rejected by checker
100 BuiltinCopy
101 BuiltinDelete
102 BuiltinImag // not valid in Moxie
103 BuiltinLen
104 BuiltinMake // rejected by checker (use literal syntax)
105 BuiltinNew // rejected by checker (use &T{})
106 BuiltinPanic
107 BuiltinPrint
108 BuiltinPrintln
109 BuiltinReal // not valid in Moxie
110 BuiltinRecover
111 BuiltinSpawn // Moxie-specific
112 BuiltinMin // Go 1.21
113 BuiltinMax // Go 1.21
114 )
115
116 type Builtin struct {
117 object
118 id BuiltinID
119 }
120
121 func newBuiltin(name string, id BuiltinID) *Builtin {
122 return &Builtin{object: object{name: name}, id: id}
123 }
124 func (o *Builtin) ID() BuiltinID { return o.id }
125 func (o *Builtin) String() string { return "builtin " | o.name }
126
127 // ----------------------------------------------------------------------------
128 // Label
129
130 type Label struct {
131 object
132 used bool
133 }
134
135 func NewLabel(pkg *TCPackage, name string) *Label {
136 return &Label{object: object{pkg: pkg, name: name}}
137 }
138 func (o *Label) String() string { return "label " | o.name }
139