123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- package object
- import (
- "ypk/assert"
- )
- type Mode int
- const (
- HEAD Mode = iota
- VARIABLE
- LOCAL_PROC
- EXTERNAL_PROC
- TYPE_PROC
- CONSTANT
- PARAMETER
- FIELD
- TYPE
- MODULE
- )
- type Object interface {
- SetName(name string)
- SetType(typ Type)
- Type() Type
- SetComplex(typ ComplexType)
- Complex() ComplexType
- Link() Object
- SetLink(o Object)
- Name() string
- SetRef(n Ref)
- Ref() []Ref
- }
- type Ref interface {
- Object() Object
- }
- type VariableObject interface {
- Object
- self() VariableObject
- }
- type ConstantObject interface {
- Object
- SetData(x interface{})
- Data() interface{}
- }
- type ParameterObject interface {
- Object
- self() ParameterObject
- }
- type FieldObject interface {
- Object
- self() FieldObject
- }
- type ProcedureObject interface {
- Object
- self() ProcedureObject
- }
- type TypeObject interface {
- Object
- self() TypeObject
- }
- type Module interface {
- self() Module
- }
- func New(mode Mode) Object {
- switch mode {
- case HEAD:
- return new(headObject)
- case VARIABLE:
- return new(variableObject)
- case LOCAL_PROC:
- return new(localProcedureObject)
- case CONSTANT:
- return new(constantObject)
- case PARAMETER:
- return new(parameterObject)
- case EXTERNAL_PROC:
- return new(externalProcedureObject)
- case TYPE_PROC:
- return new(typeProcedureObject)
- case FIELD:
- return new(fieldObject)
- case TYPE:
- return new(typeObject)
- case MODULE:
- return new(mod)
- default:
- panic("no such object mode")
- }
- }
- type objectFields struct {
- name string
- typ Type
- link Object
- comp ComplexType
- ref []Ref
- }
- func (of *objectFields) SetType(typ Type) { of.typ = typ }
- func (of *objectFields) SetName(name string) { of.name = name }
- func (of *objectFields) Name() string { return of.name }
- func (of *objectFields) Type() Type { return of.typ }
- func (of *objectFields) Link() Object { return of.link }
- func (of *objectFields) SetLink(o Object) { of.link = o }
- func (of *objectFields) SetComplex(t ComplexType) { of.comp = t }
- func (of *objectFields) Complex() ComplexType { return of.comp }
- func (of *objectFields) SetRef(n Ref) {
- assert.For(n != nil, 20)
- exists := func() bool {
- for _, v := range of.ref {
- if v == n {
- return true
- }
- }
- return false
- }
- if !exists() {
- of.ref = append(of.ref, n)
- }
- }
- func (of *objectFields) Ref() []Ref { return of.ref }
- type variableObject struct {
- objectFields
- }
- type headObject struct {
- objectFields
- }
- type localProcedureObject struct {
- objectFields
- }
- func (p *localProcedureObject) self() ProcedureObject { return p }
- type externalProcedureObject struct {
- objectFields
- }
- func (p *externalProcedureObject) self() ProcedureObject { return p }
- type typeProcedureObject struct {
- objectFields
- }
- func (p *typeProcedureObject) self() ProcedureObject { return p }
- func (v *variableObject) self() VariableObject { return v }
- type constantObject struct {
- objectFields
- val interface{}
- }
- func (o *constantObject) SetData(x interface{}) {
- o.val = x
- }
- func (o *constantObject) Data() interface{} { return o.val }
- type parameterObject struct {
- objectFields
- }
- func (v *parameterObject) self() ParameterObject { return v }
- type fieldObject struct {
- objectFields
- }
- func (v *fieldObject) self() FieldObject { return v }
- type typeObject struct {
- objectFields
- }
- func (v *typeObject) self() TypeObject { return v }
- type mod struct {
- objectFields
- }
- func (v *mod) self() Module { return v }
|