object.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package object
  2. import (
  3. "ypk/assert"
  4. )
  5. type Mode int
  6. const (
  7. HEAD Mode = iota
  8. VARIABLE
  9. LOCAL_PROC
  10. EXTERNAL_PROC
  11. TYPE_PROC
  12. CONSTANT
  13. PARAMETER
  14. FIELD
  15. TYPE
  16. MODULE
  17. )
  18. type Object interface {
  19. SetName(name string)
  20. SetType(typ Type)
  21. Type() Type
  22. SetComplex(typ ComplexType)
  23. Complex() ComplexType
  24. Link() Object
  25. SetLink(o Object)
  26. Name() string
  27. SetRef(n Ref)
  28. Ref() []Ref
  29. }
  30. type Ref interface {
  31. Object() Object
  32. }
  33. type VariableObject interface {
  34. Object
  35. self() VariableObject
  36. }
  37. type ConstantObject interface {
  38. Object
  39. SetData(x interface{})
  40. Data() interface{}
  41. }
  42. type ParameterObject interface {
  43. Object
  44. self() ParameterObject
  45. }
  46. type FieldObject interface {
  47. Object
  48. self() FieldObject
  49. }
  50. type ProcedureObject interface {
  51. Object
  52. self() ProcedureObject
  53. }
  54. type TypeObject interface {
  55. Object
  56. self() TypeObject
  57. }
  58. type Module interface {
  59. self() Module
  60. }
  61. func New(mode Mode) Object {
  62. switch mode {
  63. case HEAD:
  64. return new(headObject)
  65. case VARIABLE:
  66. return new(variableObject)
  67. case LOCAL_PROC:
  68. return new(localProcedureObject)
  69. case CONSTANT:
  70. return new(constantObject)
  71. case PARAMETER:
  72. return new(parameterObject)
  73. case EXTERNAL_PROC:
  74. return new(externalProcedureObject)
  75. case TYPE_PROC:
  76. return new(typeProcedureObject)
  77. case FIELD:
  78. return new(fieldObject)
  79. case TYPE:
  80. return new(typeObject)
  81. case MODULE:
  82. return new(mod)
  83. default:
  84. panic("no such object mode")
  85. }
  86. }
  87. type objectFields struct {
  88. name string
  89. typ Type
  90. link Object
  91. comp ComplexType
  92. ref []Ref
  93. }
  94. func (of *objectFields) SetType(typ Type) { of.typ = typ }
  95. func (of *objectFields) SetName(name string) { of.name = name }
  96. func (of *objectFields) Name() string { return of.name }
  97. func (of *objectFields) Type() Type { return of.typ }
  98. func (of *objectFields) Link() Object { return of.link }
  99. func (of *objectFields) SetLink(o Object) { of.link = o }
  100. func (of *objectFields) SetComplex(t ComplexType) { of.comp = t }
  101. func (of *objectFields) Complex() ComplexType { return of.comp }
  102. func (of *objectFields) SetRef(n Ref) {
  103. assert.For(n != nil, 20)
  104. exists := func() bool {
  105. for _, v := range of.ref {
  106. if v == n {
  107. return true
  108. }
  109. }
  110. return false
  111. }
  112. if !exists() {
  113. of.ref = append(of.ref, n)
  114. }
  115. }
  116. func (of *objectFields) Ref() []Ref { return of.ref }
  117. type variableObject struct {
  118. objectFields
  119. }
  120. type headObject struct {
  121. objectFields
  122. }
  123. type localProcedureObject struct {
  124. objectFields
  125. }
  126. func (p *localProcedureObject) self() ProcedureObject { return p }
  127. type externalProcedureObject struct {
  128. objectFields
  129. }
  130. func (p *externalProcedureObject) self() ProcedureObject { return p }
  131. type typeProcedureObject struct {
  132. objectFields
  133. }
  134. func (p *typeProcedureObject) self() ProcedureObject { return p }
  135. func (v *variableObject) self() VariableObject { return v }
  136. type constantObject struct {
  137. objectFields
  138. val interface{}
  139. }
  140. func (o *constantObject) SetData(x interface{}) {
  141. o.val = x
  142. }
  143. func (o *constantObject) Data() interface{} { return o.val }
  144. type parameterObject struct {
  145. objectFields
  146. }
  147. func (v *parameterObject) self() ParameterObject { return v }
  148. type fieldObject struct {
  149. objectFields
  150. }
  151. func (v *fieldObject) self() FieldObject { return v }
  152. type typeObject struct {
  153. objectFields
  154. }
  155. func (v *typeObject) self() TypeObject { return v }
  156. type mod struct {
  157. objectFields
  158. }
  159. func (v *mod) self() Module { return v }