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