ast_kinds.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. //
  5. // This file defines a number of X-macros that can be used to walk the AST
  6. // class hierarchy. The main entry points are:
  7. //
  8. // - `CARBON_AST_FOR_EACH_FINAL_CLASS(ACTION)`
  9. // Invokes `ACTION` on each leaf class in the AST class hierarchy.
  10. // - `CARBON_AST_FOR_EACH_ABSTRACT_CLASS(ACTION)`
  11. // Invokes `ACTION` on each non-leaf class in the AST class hierarchy.
  12. // - `CARBON_AST_FOR_EACH_FINAL_CLASS_BELOW(BASE, ACTION)`
  13. // Invokes `ACTION` on each leaf class in the AST class hierarchy that
  14. // derives from `BASE`.
  15. // - `CARBON_AST_FOR_EACH_ABSTRACT_CLASS_BELOW(BASE, ACTION)`
  16. // Invokes `ACTION` on each non-leaf class in the AST class hierarchy that
  17. // derives from `BASE`.
  18. //
  19. // These macros are implemented in terms of `CARBON_Foo_KINDS` X-macros. Each of
  20. // these macros takes two macro names as arguments:
  21. //
  22. // - `CARBON_Foo_KINDS(ABSTRACT, FINAL)`
  23. // Invokes `ABSTRACT(Class)` for each abstract class that inherits from
  24. // `Foo`.
  25. // Invokes `FINAL(Class)` for each final class that inherits from `Foo`.
  26. //
  27. // A fake root class, `AST_RTTI`, is also provided, so that
  28. // `CARBON_AST_RTTI_KINDS` can be used to walk all AST classes.
  29. #ifndef CARBON_EXPLORER_AST_AST_KINDS_H_
  30. #define CARBON_EXPLORER_AST_AST_KINDS_H_
  31. #define CARBON_RTTI_NOOP_ACTION(X)
  32. #define CARBON_AST_FOR_EACH_ABSTRACT_CLASS_BELOW(ROOT, ACTION) \
  33. CARBON_##ROOT##_KINDS(ACTION, CARBON_RTTI_NOOP_ACTION)
  34. #define CARBON_AST_FOR_EACH_FINAL_CLASS_BELOW(ROOT, ACTION) \
  35. CARBON_##ROOT##_KINDS(CARBON_RTTI_NOOP_ACTION, ACTION)
  36. #define CARBON_AST_FOR_EACH_ABSTRACT_CLASS(ACTION) \
  37. CARBON_AST_FOR_EACH_ABSTRACT_CLASS_BELOW(AST_RTTI, ACTION)
  38. #define CARBON_AST_FOR_EACH_FINAL_CLASS(ACTION) \
  39. CARBON_AST_FOR_EACH_FINAL_CLASS_BELOW(AST_RTTI, ACTION)
  40. // Class hierarchy description follows, with one _KINDS macro for each abstract
  41. // base class.
  42. #define CARBON_AST_RTTI_KINDS(ABSTRACT, FINAL) \
  43. CARBON_AstNode_KINDS(ABSTRACT, FINAL) ABSTRACT(AstNode) \
  44. CARBON_Element_KINDS(ABSTRACT, FINAL) ABSTRACT(Element)
  45. #define CARBON_AstNode_KINDS(ABSTRACT, FINAL) \
  46. CARBON_Pattern_KINDS(ABSTRACT, FINAL) ABSTRACT(Pattern) \
  47. CARBON_Declaration_KINDS(ABSTRACT, FINAL) ABSTRACT(Declaration) \
  48. FINAL(ImplBinding) \
  49. FINAL(AlternativeSignature) \
  50. CARBON_Statement_KINDS(ABSTRACT, FINAL) ABSTRACT(Statement) \
  51. CARBON_Expression_KINDS(ABSTRACT, FINAL) ABSTRACT(Expression) \
  52. CARBON_WhereClause_KINDS(ABSTRACT, FINAL) ABSTRACT(WhereClause)
  53. #define CARBON_Pattern_KINDS(ABSTRACT, FINAL) \
  54. FINAL(AutoPattern) \
  55. FINAL(VarPattern) \
  56. FINAL(AddrPattern) \
  57. FINAL(BindingPattern) \
  58. FINAL(GenericBinding) \
  59. FINAL(TuplePattern) \
  60. FINAL(AlternativePattern) \
  61. FINAL(ExpressionPattern)
  62. #define CARBON_Declaration_KINDS(ABSTRACT, FINAL) \
  63. FINAL(NamespaceDeclaration) \
  64. CARBON_CallableDeclaration_KINDS(ABSTRACT, FINAL) \
  65. ABSTRACT(CallableDeclaration) \
  66. FINAL(SelfDeclaration) \
  67. FINAL(ClassDeclaration) \
  68. FINAL(MixinDeclaration) \
  69. FINAL(MixDeclaration) \
  70. FINAL(ChoiceDeclaration) \
  71. FINAL(VariableDeclaration) \
  72. CARBON_ConstraintTypeDeclaration_KINDS(ABSTRACT, FINAL) \
  73. ABSTRACT(ConstraintTypeDeclaration) \
  74. FINAL(InterfaceExtendDeclaration) \
  75. FINAL(InterfaceRequireDeclaration) \
  76. FINAL(AssociatedConstantDeclaration) \
  77. FINAL(ImplDeclaration) \
  78. FINAL(MatchFirstDeclaration) \
  79. FINAL(AliasDeclaration) \
  80. FINAL(ExtendBaseDeclaration)
  81. #define CARBON_CallableDeclaration_KINDS(ABSTRACT, FINAL) \
  82. FINAL(FunctionDeclaration) \
  83. FINAL(DestructorDeclaration)
  84. #define CARBON_ConstraintTypeDeclaration_KINDS(ABSTRACT, FINAL) \
  85. FINAL(InterfaceDeclaration) \
  86. FINAL(ConstraintDeclaration)
  87. #define CARBON_Statement_KINDS(ABSTRACT, FINAL) \
  88. FINAL(ExpressionStatement) \
  89. FINAL(Assign) \
  90. FINAL(IncrementDecrement) \
  91. FINAL(VariableDefinition) \
  92. FINAL(If) \
  93. CARBON_Return_KINDS(ABSTRACT, FINAL) ABSTRACT(Return) \
  94. FINAL(Block) \
  95. FINAL(While) \
  96. FINAL(Break) \
  97. FINAL(Continue) \
  98. FINAL(Match) \
  99. FINAL(For)
  100. #define CARBON_Return_KINDS(ABSTRACT, FINAL) \
  101. FINAL(ReturnVar) \
  102. FINAL(ReturnExpression)
  103. #define CARBON_Expression_KINDS(ABSTRACT, FINAL) \
  104. FINAL(BoolTypeLiteral) \
  105. FINAL(BoolLiteral) \
  106. FINAL(CallExpression) \
  107. CARBON_ConstantValueLiteral_KINDS(ABSTRACT, FINAL) \
  108. ABSTRACT(ConstantValueLiteral) \
  109. CARBON_MemberAccessExpression_KINDS(ABSTRACT, FINAL) \
  110. ABSTRACT(MemberAccessExpression) \
  111. FINAL(IndexExpression) \
  112. FINAL(IntTypeLiteral) \
  113. FINAL(IntLiteral) \
  114. FINAL(OperatorExpression) \
  115. FINAL(StringLiteral) \
  116. FINAL(StringTypeLiteral) \
  117. FINAL(TupleLiteral) \
  118. FINAL(StructLiteral) \
  119. FINAL(TypeTypeLiteral) \
  120. FINAL(IdentifierExpression) \
  121. FINAL(DotSelfExpression) \
  122. FINAL(IntrinsicExpression) \
  123. FINAL(IfExpression) \
  124. FINAL(WhereExpression) \
  125. FINAL(BuiltinConvertExpression) \
  126. FINAL(UnimplementedExpression)
  127. #define CARBON_ConstantValueLiteral_KINDS(ABSTRACT, FINAL) \
  128. FINAL(FunctionTypeLiteral) \
  129. FINAL(StructTypeLiteral) \
  130. FINAL(ArrayTypeLiteral) \
  131. FINAL(ValueLiteral)
  132. #define CARBON_MemberAccessExpression_KINDS(ABSTRACT, FINAL) \
  133. FINAL(SimpleMemberAccessExpression) \
  134. FINAL(CompoundMemberAccessExpression) \
  135. FINAL(BaseAccessExpression)
  136. #define CARBON_WhereClause_KINDS(ABSTRACT, FINAL) \
  137. FINAL(ImplsWhereClause) \
  138. FINAL(EqualsWhereClause) \
  139. FINAL(RewriteWhereClause)
  140. #define CARBON_Element_KINDS(ABSTRACT, FINAL) \
  141. FINAL(NamedElement) \
  142. FINAL(PositionalElement) \
  143. FINAL(BaseElement)
  144. #endif // CARBON_EXPLORER_AST_AST_KINDS_H_