# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

root class AstNode;
abstract class Pattern : AstNode;
  class AutoPattern : Pattern;
  class VarPattern : Pattern;
  class AddrPattern : Pattern;
  class BindingPattern : Pattern;
  class GenericBinding : Pattern;
  class TuplePattern : Pattern;
  class AlternativePattern : Pattern;
  class ExpressionPattern : Pattern;
abstract class Declaration : AstNode;
  class NamespaceDeclaration : Declaration;
  abstract class CallableDeclaration : Declaration;
    class FunctionDeclaration : CallableDeclaration;
    class DestructorDeclaration : CallableDeclaration;
  class SelfDeclaration : Declaration;
  class ClassDeclaration : Declaration;
  class MixinDeclaration : Declaration;
  class MixDeclaration : Declaration;
  class ChoiceDeclaration : Declaration;
  class VariableDeclaration : Declaration;
  abstract class ConstraintTypeDeclaration : Declaration;
    class InterfaceDeclaration : ConstraintTypeDeclaration;
    class ConstraintDeclaration : ConstraintTypeDeclaration;
  class InterfaceExtendsDeclaration : Declaration;
  class InterfaceImplDeclaration : Declaration;
  class AssociatedConstantDeclaration : Declaration;
  class ImplDeclaration : Declaration;
  class MatchFirstDeclaration : Declaration;
  class AliasDeclaration : Declaration;
class ImplBinding : AstNode;
class AlternativeSignature : AstNode;
abstract class Statement : AstNode;
  class ExpressionStatement : Statement;
  class Assign : Statement;
  class IncrementDecrement : Statement;
  class VariableDefinition : Statement;
  class If : Statement;
  abstract class Return : Statement;
    class ReturnVar : Return;
    class ReturnExpression : Return;
  class Block : Statement;
  class While : Statement;
  class Break : Statement;
  class Continue : Statement;
  class Match : Statement;
  class Continuation : Statement;
  class Run : Statement;
  class Await : Statement;
  class For : Statement;
abstract class Expression : AstNode;
  class BoolTypeLiteral : Expression;
  class BoolLiteral : Expression;
  class CallExpression : Expression;
  abstract class ConstantValueLiteral : Expression;
    class FunctionTypeLiteral : ConstantValueLiteral;
    class StructTypeLiteral : ConstantValueLiteral;
    class ArrayTypeLiteral : ConstantValueLiteral;
    class ValueLiteral : ConstantValueLiteral;
  abstract class MemberAccessExpression : Expression;
    class SimpleMemberAccessExpression : MemberAccessExpression;
    class CompoundMemberAccessExpression : MemberAccessExpression;
    class BaseAccessExpression : MemberAccessExpression;
  class IndexExpression : Expression;
  class IntTypeLiteral : Expression;
  class ContinuationTypeLiteral : Expression;
  class IntLiteral : Expression;
  class OperatorExpression : Expression;
  class StringLiteral : Expression;
  class StringTypeLiteral : Expression;
  class TupleLiteral : Expression;
  class StructLiteral : Expression;
  class TypeTypeLiteral : Expression;
  class IdentifierExpression : Expression;
  class DotSelfExpression : Expression;
  class IntrinsicExpression : Expression;
  class IfExpression : Expression;
  class WhereExpression : Expression;
  class BuiltinConvertExpression : Expression;
  class UnimplementedExpression : Expression;
abstract class WhereClause : AstNode;
  class IsWhereClause : WhereClause;
  class EqualsWhereClause : WhereClause;
  class RewriteWhereClause : WhereClause;
root class Element;
  class NamedElement : Element;
  class PositionalElement : Element;
  class BaseElement : Element;
