blob: fe091a1626b32bad04bc1f665926c4ec858f406b [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"
// Select is the expression form of a switch.
type Select struct {
AST *ast.Switch // the underlying syntax node this was built from
Type Type // the return type of the select if valid
Value Expression // the value to match the cases against
Choices []*Choice // The set of possible choices to match
Default *Expression // the expression to use if no condition matches
}
// ExpressionType implements Expression with the unified type of the choices
func (s *Select) ExpressionType() Type { return s.Type }
// Choice represents a possible choice in a select
type Choice struct {
AST *ast.Case // the underlying syntax node this was built from
Conditions []Expression // the set of expressions to match the select value against
Expression Expression // the expression to use if a condition matches
}
// Local represents an immutable local storage slot, created by a DeclareLocal,
// and referred to by identifiers that resolve to that slot.
type Local struct {
Declaration *DeclareLocal // the statement that created the local
Type Type // the type of the storage
Named // the identifier that will resolve to this local
Value Expression // the expression the local was assigned on creation
}
// ExpressionType implements Expression
func (l *Local) ExpressionType() Type { return l.Type }
// UnaryOp represents an operator applied to a single expression.
// It's type depends on the operator and the type of the expression it is
// being applied to.
type UnaryOp struct {
AST *ast.UnaryOp // the underlying syntax node this was built from
Type Type // the resolved type of the operation
Operator string // the operator being applied
Expression Expression // the expression to apply the operator to
}
// ExpressionType implements Expression
func (b *UnaryOp) ExpressionType() Type { return b.Type }
// BinaryOp represents any operator applied to two arguments.
// The resolved type of the expression depends on the types of the two
// arguments and which operator it represents.
type BinaryOp struct {
AST *ast.BinaryOp // the underlying syntax node this was built from
Type Type // the resolved type of this binary expression
LHS Expression // the expression that appears on the left of the operator
Operator string // the operator being applied
RHS Expression // the expression that appears on the right of the operator
}
// ExpressionType implements Expression
func (b *BinaryOp) ExpressionType() Type { return b.Type }
// BitTest is the "in" operator applied to a bitfield.
type BitTest struct {
AST *ast.BinaryOp // the underlying syntax node this was built from
Bitfield Expression // the bitfield being tested
Bits Expression // the bits to test for
}
// ExpressionType implements Expression
func (BitTest) ExpressionType() Type { return BoolType }
// MapContains is the "in" operator applied to a map.
type MapContains struct {
AST *ast.BinaryOp // the underlying syntax node this was built from
Map Expression // the map being tested
Key Expression // the key to test for
}
// ExpressionType implements Expression
func (MapContains) ExpressionType() Type { return BoolType }
// Member is an expression that looks up a field by name from an object.
type Member struct {
AST *ast.Member // the underlying syntax node this was built from
Object Expression // the object to look up a field of
Field *Field // the field to look up
}
// ExpressionType implements Expression returning the type of the field.
func (m *Member) ExpressionType() Type { return m.Field.Type }
// PointerRange represents using the indexing operator on a pointer type with a
// range expression.
type PointerRange struct {
AST *ast.Index // the underlying syntax node this was built from
Type *Slice // the slice type returned.
Pointer Expression // the expression that returns the pointer to be indexed
Range *BinaryOp // the range to use on the slice
}
// ExpressionType implements Expression.
// It returns the same slice type being sliced.
func (i *PointerRange) ExpressionType() Type { return i.Type }
// SliceRange represents using the indexing operator on a slice type with a
// range expression.
type SliceRange struct {
AST *ast.Index // the underlying syntax node this was built from
Type *Slice // the slice type
Slice Expression // the expression that returns the slice to be indexed
Range *BinaryOp // the range to use on the slice
}
// ExpressionType implements Expression.
// It returns the same slice type being sliced.
func (i *SliceRange) ExpressionType() Type { return i.Type }
// ArrayIndex represents using the indexing operator on a static-array type.
type ArrayIndex struct {
AST *ast.Index // the underlying syntax node this was built from
Type *StaticArray // the array type
Array Expression // the expression that returns the array to be indexed
Index Expression // the index to use on the array
}
// ExpressionType implements Expression.
// It returns the element type of the array.
func (i *ArrayIndex) ExpressionType() Type { return i.Type.ValueType }
// SliceIndex represents using the indexing operator on a slice type.
type SliceIndex struct {
AST *ast.Index // the underlying syntax node this was built from
Type *Slice // the slice type
Slice Expression // the expression that returns the slice to be indexed
Index Expression // the index to use on the slice
}
// ExpressionType implements Expression.
// It returns the value type of the slice.
func (i *SliceIndex) ExpressionType() Type { return i.Type.To }
// MapIndex represents using the indexing operator on a map type.
type MapIndex struct {
AST *ast.Index // the underlying syntax node this was built from
Type *Map // the value type of the map being indexed
Map Expression // the expression that returns the map to be indexed
Index Expression // the index to use on the map
}
// ExpressionType implements Expression returning the value type of the map.
func (i *MapIndex) ExpressionType() Type { return i.Type.ValueType }
// Unknown represents a value that cannot be predicted.
// These values are non-deterministic with regard to the API specification and
// may vary between implementations of the API.
type Unknown struct {
AST *ast.Unknown // the underlying syntax node this was built from
Inferred Expression // the inferred expression to derive the unknown from the outputs
}
// ExpressionType implements Expression with the inferred type of the unknown.
// If the unknown could not be inferred, it will be of type "any" so allow
// expressions using it to resolve anyway.
func (u Unknown) ExpressionType() Type {
if u.Inferred == nil {
return AnyType
}
return u.Inferred.ExpressionType()
}
// Ignore represents an _ expression.
type Ignore struct {
AST ast.Node // the underlying syntax node this was built from
}
// ExpressionType implements Expression.
func (i Ignore) ExpressionType() Type {
return AnyType
}
// Null represents a default value.
type Null struct {
AST *ast.Null // the underlying syntax node this was built from
Type Type // the resolved type of this null
}
// ExpressionType implements Expression with the inferred type of the null.
func (n Null) ExpressionType() Type {
return n.Type
}
// Int8Value is an int8 that implements Expression so it can be in the semantic graph
type Int8Value int8
// ExpressionType implements Expression with a type of Int8Type
func (v Int8Value) ExpressionType() Type { return Int8Type }
// Uint8Value is a uint8 that implements Expression so it can be in the semantic graph
type Uint8Value uint8
// ExpressionType implements Expression with a type of Uint8Type
func (v Uint8Value) ExpressionType() Type { return Uint8Type }
// Int16Value is an int16 that implements Expression so it can be in the semantic graph
type Int16Value int16
// ExpressionType implements Expression with a type of Int16Type
func (v Int16Value) ExpressionType() Type { return Int16Type }
// Uint16Value is a uint16 that implements Expression so it can be in the semantic graph
type Uint16Value uint16
// ExpressionType implements Expression with a type of Uint16Type
func (v Uint16Value) ExpressionType() Type { return Uint16Type }
// Int32Value is an int32 that implements Expression so it can be in the semantic graph
type Int32Value int32
// ExpressionType implements Expression with a type of Int32Type
func (v Int32Value) ExpressionType() Type { return Int32Type }
// Uint32Value is a uint32 that implements Expression so it can be in the semantic graph
type Uint32Value uint32
// ExpressionType implements Expression with a type of Uint32Type
func (v Uint32Value) ExpressionType() Type { return Uint32Type }
// Int64Value is an int64 that implements Expression so it can be in the semantic graph
type Int64Value int64
// ExpressionType implements Expression with a type of Int64Type
func (v Int64Value) ExpressionType() Type { return Int64Type }
// Uint64Value is a uint64 that implements Expression so it can be in the semantic graph
type Uint64Value uint64
// ExpressionType implements Expression with a type of Uint64Type
func (v Uint64Value) ExpressionType() Type { return Uint64Type }
// BoolValue is a bool that implements Expression so it can be in the semantic graph
type BoolValue bool
// ExpressionType implements Expression with a type of BoolType
func (v BoolValue) ExpressionType() Type { return BoolType }
// StringValue is a string that implements Expression so it can be in the semantic graph
type StringValue string
// ExpressionType implements Expression with a type of StringType
func (v StringValue) ExpressionType() Type { return StringType }
// Float64Value is a float64 that implements Expression so it can be in the semantic graph
type Float64Value float64
// ExpressionType implements Expression with a type of Float64Type
func (v Float64Value) ExpressionType() Type { return Float64Type }
// Float32Value is a float32 that implements Expression so it can be in the semantic graph
type Float32Value float32
// ExpressionType implements Expression with a type of Float32Type
func (v Float32Value) ExpressionType() Type { return Float32Type }