expr-defs.h
// expr-defs.h
// Syntax class definitions for expressions.
// Base class for expressions that will reference declarations
ABSTRACT_SYNTAX_CLASS(DeclRefExpr, Expr)
// The scope in which to perform lookup
FIELD(RefPtr<Scope>, scope)
// The declaration of the symbol being referenced
DECL_FIELD(DeclRef<Decl>, declRef)
// The name of the symbol being referenced
FIELD(Name*, name)
END_SYNTAX_CLASS()
SIMPLE_SYNTAX_CLASS(VarExpr, DeclRefExpr)
// An expression that references an overloaded set of declarations
// having the same name.
SYNTAX_CLASS(OverloadedExpr, Expr)
// Optional: the base expression is this overloaded result
// arose from a member-reference expression.
SYNTAX_FIELD(RefPtr<Expr>, base)
// The lookup result that was ambiguous
FIELD(LookupResult, lookupResult2)
END_SYNTAX_CLASS()
// An expression that references an overloaded set of declarations
// having the same name.
SYNTAX_CLASS(OverloadedExpr2, Expr)
// Optional: the base expression is this overloaded result
// arose from a member-reference expression.
SYNTAX_FIELD(RefPtr<Expr>, base)
// The lookup result that was ambiguous
FIELD(List<RefPtr<Expr>>, candidiateExprs)
END_SYNTAX_CLASS()
ABSTRACT_SYNTAX_CLASS(LiteralExpr, Expr)
// The token that was used to express the literal. This can be
// used to get the raw text of the literal, including any suffix.
FIELD(Token, token)
END_SYNTAX_CLASS()
SYNTAX_CLASS(IntegerLiteralExpr, LiteralExpr)
FIELD(IntegerLiteralValue, value)
END_SYNTAX_CLASS()
SYNTAX_CLASS(FloatingPointLiteralExpr, LiteralExpr)
FIELD(FloatingPointLiteralValue, value)
END_SYNTAX_CLASS()
SYNTAX_CLASS(BoolLiteralExpr, LiteralExpr)
FIELD(bool, value)
END_SYNTAX_CLASS()
SYNTAX_CLASS(StringLiteralExpr, LiteralExpr)
// TODO: consider storing the "segments" of the string
// literal, in the case where multiple literals were
//lined up at the lexer level, e.g.:
//
// "first" "second" "third"
//
FIELD(String, value)
END_SYNTAX_CLASS()
// An initializer list, e.g. `{ 1, 2, 3 }`
SYNTAX_CLASS(InitializerListExpr, Expr)
SYNTAX_FIELD(List<RefPtr<Expr>>, args)
END_SYNTAX_CLASS()
// A base class for expressions with arguments
ABSTRACT_SYNTAX_CLASS(ExprWithArgsBase, Expr)
SYNTAX_FIELD(List<RefPtr<Expr>>, Arguments)
END_SYNTAX_CLASS()
// An aggregate type constructor
SYNTAX_CLASS(AggTypeCtorExpr, ExprWithArgsBase)
SYNTAX_FIELD(TypeExp, base);
END_SYNTAX_CLASS()
// A base expression being applied to arguments: covers
// both ordinary `()` function calls and `<>` generic application
ABSTRACT_SYNTAX_CLASS(AppExprBase, ExprWithArgsBase)
SYNTAX_FIELD(RefPtr<Expr>, FunctionExpr)
END_SYNTAX_CLASS()
SIMPLE_SYNTAX_CLASS(InvokeExpr, AppExprBase)
SIMPLE_SYNTAX_CLASS(OperatorExpr, InvokeExpr)
SIMPLE_SYNTAX_CLASS(InfixExpr , OperatorExpr)
SIMPLE_SYNTAX_CLASS(PrefixExpr , OperatorExpr)
SIMPLE_SYNTAX_CLASS(PostfixExpr, OperatorExpr)
SYNTAX_CLASS(IndexExpr, Expr)
SYNTAX_FIELD(RefPtr<Expr>, BaseExpression)
SYNTAX_FIELD(RefPtr<Expr>, IndexExpression)
END_SYNTAX_CLASS()
SYNTAX_CLASS(MemberExpr, DeclRefExpr)
SYNTAX_FIELD(RefPtr<Expr>, BaseExpression)
END_SYNTAX_CLASS()
// Member looked up on a type, rather than a value
SYNTAX_CLASS(StaticMemberExpr, DeclRefExpr)
SYNTAX_FIELD(RefPtr<Expr>, BaseExpression)
END_SYNTAX_CLASS()
SYNTAX_CLASS(SwizzleExpr, Expr)
SYNTAX_FIELD(RefPtr<Expr>, base)
FIELD(int, elementCount)
FIELD(int, elementIndices[4])
END_SYNTAX_CLASS()
// A dereference of a pointer or pointer-like type
SYNTAX_CLASS(DerefExpr, Expr)
SYNTAX_FIELD(RefPtr<Expr>, base)
END_SYNTAX_CLASS()
// Any operation that performs type-casting
SYNTAX_CLASS(TypeCastExpr, InvokeExpr)
// SYNTAX_FIELD(TypeExp, TargetType)
// SYNTAX_FIELD(RefPtr<Expr>, Expression)
END_SYNTAX_CLASS()
// An explicit type-cast that appear in the user's code with `(type) expr` syntax
SYNTAX_CLASS(ExplicitCastExpr, TypeCastExpr)
END_SYNTAX_CLASS()
// An implicit type-cast inserted during semantic checking
SYNTAX_CLASS(ImplicitCastExpr, TypeCastExpr)
END_SYNTAX_CLASS()
SIMPLE_SYNTAX_CLASS(SelectExpr, OperatorExpr)
SIMPLE_SYNTAX_CLASS(GenericAppExpr, AppExprBase)
// An expression representing re-use of the syntax for a type in more
// than once conceptually-distinct declaration
SYNTAX_CLASS(SharedTypeExpr, Expr)
// The underlying type expression that we want to share
SYNTAX_FIELD(TypeExp, base)
END_SYNTAX_CLASS()
SYNTAX_CLASS(AssignExpr, Expr)
SYNTAX_FIELD(RefPtr<Expr>, left);
SYNTAX_FIELD(RefPtr<Expr>, right);
END_SYNTAX_CLASS()
// Just an expression inside parentheses `(exp)`
//
// We keep this around explicitly to be sure we don't lose any structure
// when we do rewriter stuff.
SYNTAX_CLASS(ParenExpr, Expr)
SYNTAX_FIELD(RefPtr<Expr>, base);
END_SYNTAX_CLASS()
// An object-oriented `this` expression, used to
// refer to the current instance of an enclosing type.
SYNTAX_CLASS(ThisExpr, Expr)
FIELD(RefPtr<Scope>, scope);
END_SYNTAX_CLASS()