blob: 4c6ef2cfcb6a2d7ec5622998fdfd50a3c573e4b1 [file] [log] [blame]
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package semantic
import "android.googlesource.com/platform/tools/gpu/api/ast"
// Type is the interface to any object that can act as a type to the api
// langauge.
type Type interface {
Node
Typename() string // returns the full name of the type, must be unique
Member(Name string) Node // looks up a member by name from a type
}
// Expression represents anything that can act as an expression in the api
// language, it must be able to correctly report the type of value it would
// return if executed.
type Expression interface {
Node
ExpressionType() Type // returns the expression value type.
}
// Members wraps a map and implements part of the Type interface.
// It is used as a mixin helper.
type Members map[string]Node
// Member returns the entry in the map that matches name, or nil if none does.
func (t Members) Member(name string) Node {
m, ok := t[name]
if !ok {
return nil
}
return m
}
// Class represents an api class construct.
type Class struct {
AST *ast.Class // the underlying syntax node this was built from
Annotations // the annotations applied to this class
Name string // the name of the class
Docs []string // the documentation for the class
Extends []*Class // the classes this extends
ExtendedBy []*Class // the classes that declared they extended this class
Fields []*Field // the set of fields the class declares
Methods []*Function // the set of functions associated with the class
Members // the name->member map, to implement Type
}
// Implements Type to return the class name as the type name
func (t Class) Typename() string { return t.Name }
// Field represents a field entry in a class.
type Field struct {
AST *ast.Field // the underlying syntax node this was built from
Annotations // the annotations applied to this field
Class *Class // the class this field belongs to
Type Type // the type the field stores
Name string // the name of the field
Docs []string // the documentation for the field
Default Expression // the default value of the field
}
// Implements Expression to return the type stored in the field.
func (f *Field) ExpressionType() Type { return f.Type }
// ClassInitializer represents an expression that can assign values to multiple
// fields of a class.
type ClassInitializer struct {
AST *ast.Call // the underlying syntax node this was built from
Class *Class // the class to initialize
Fields []*FieldInitializer // the set of field assignments
}
// ExpressionType implements Expression returning the class type being initialized.
func (c *ClassInitializer) ExpressionType() Type {
if c.Class != nil {
return c.Class
} else {
return nil
}
}
// FieldInitializer
type FieldInitializer struct {
AST ast.Node // the underlying syntax node this was built from
Field *Field // the field to assign to
Value Expression // the value to assign
}
// Enum represents the api enum construct.
type Enum struct {
AST *ast.Enum // the underlying syntax node this was built from
Annotations // the annotations applied to this enum
Name string // the type name of the enum
Docs []string // the documentation for the enum
IsBitfield bool // whether this enum is actually a bitfield
Extends []*Enum // the enums this enum extends
Entries []*EnumEntry // the entries of this enum
AllEntries []*EnumEntry // the flattened list of all entries including inherited ones
}
// Implements Type to return the enum name as the type name
func (t Enum) Typename() string { return t.Name }
// Implements Type returning the matching enum entry if there is one.
func (t Enum) Member(name string) Node {
for _, e := range t.AllEntries {
if e.Name == name {
return e
}
}
return nil
}
// EnumEntry represents a single entry in an Enum.
type EnumEntry struct {
AST *ast.EnumEntry // the underlying syntax node this was built from
Enum *Enum // the enum this entry belongs to
Name string // the name of this entry
Docs []string // the documentation for the enum entry
Value uint32 // the value this entry represents
}
// ExpressionType implements Expression returning the enum type.
func (e *EnumEntry) ExpressionType() Type {
if e.Enum != nil {
return e.Enum
} else {
return nil
}
}
// Pseudonym represents the type construct.
// It acts as a type in it's own right that can carry methods, but is defined
// in terms of another type.
type Pseudonym struct {
AST *ast.Pseudonym // the underlying syntax node this was built from
Annotations // the annotations applied to this pseudonym
Name string // the type name
Docs []string // the documentation for the pseudonym
To Type // the underlying type
Methods []*Function // the methods added directly to the pseudonym
Members // the direct members
}
// Implements Type to return the type name
func (t Pseudonym) Typename() string { return t.Name }
// Implements Type returning the direct member if it has it, otherwise
// delegating the lookup to the underlying type.
func (t Pseudonym) Member(name string) Node {
m := t.Members.Member(name)
if m == nil {
m = t.To.Member(name)
}
return m
}
// StaticArray represents a multi-dimensional fixed size array type, of the
// form T[8]
type StaticArray struct {
Name string // the full type name
ValueType Type // the storage type of the elements
Size uint32 // the dimension of the array
}
func (t StaticArray) Typename() string { return t.Name }
func (t StaticArray) Member(name string) Node { return nil }
// Map represents an api map type declaration, of the form
// map!(KeyType, ValueType)
type Map struct {
Name string // the full type name
KeyType Type // the type used as an indexing key
ValueType Type // the type stored in the map
Members // holds the map built-in methods
}
func (t Map) Typename() string { return t.Name }
// Pointer represents an api pointer type declaration, of the form To*
type Pointer struct {
Name string // the full type name
To Type // the type this is a pointer to
Const bool // wether the pointer was declared with the const attribute
Slice *Slice // The complementary slice type for this pointer.
}
func (t Pointer) Typename() string { return t.Name }
func (t Pointer) Member(name string) Node {
return t.To.Member(name)
}
// Slice represents an api slice type declaration, of the form To[]
type Slice struct {
Name string // the full type name
To Type // The type this is a slice of
Pointer *Pointer // The complementary pointer type for this slice.
}
func (t Slice) Typename() string { return t.Name }
func (t Slice) Member(name string) Node { return nil }
// Reference represents an api reference type declaration, of the form
// ref!To
type Reference struct {
Name string // the full type name
To Type // the type this is a reference to
}
func (t Reference) Typename() string { return t.Name }
func (t Reference) Member(name string) Node {
return t.To.Member(name)
}
// Builtin represents one of the primitive types.
type Builtin struct {
Name string // the primitive type name
}
func (t Builtin) Typename() string { return t.Name }
func (t Builtin) Member(name string) Node { return nil }
func builtin(name string) *Builtin {
b := &Builtin{Name: name}
BuiltinTypes = append(BuiltinTypes, b)
return b
}
var (
// These are all the fundamental primitive types of the api language
// Special types
VoidType = builtin("void")
AnyType = builtin("any")
StringType = builtin("string")
// Unsized primitives
BoolType = builtin("bool")
CharType = builtin("char")
IntType = builtin("int")
UintType = builtin("uint")
// Fixed size integer forms
Int8Type = builtin("s8")
Uint8Type = builtin("u8")
Int16Type = builtin("s16")
Uint16Type = builtin("u16")
Int32Type = builtin("s32")
Uint32Type = builtin("u32")
Int64Type = builtin("s64")
Uint64Type = builtin("u64")
// Floating point forms
Float32Type = builtin("f32")
Float64Type = builtin("f64")
)
var BuiltinTypes []*Builtin