| 46 | common_internal::NavigableAstMetadata<common_internal::ProtoAstTraits>; |
| 47 | |
| 48 | NodeKind GetNodeKind(const Expr& expr) { |
| 49 | switch (expr.expr_kind_case()) { |
| 50 | case Expr::kConstExpr: |
| 51 | return NodeKind::kConstant; |
| 52 | case Expr::kIdentExpr: |
| 53 | return NodeKind::kIdent; |
| 54 | case Expr::kSelectExpr: |
| 55 | return NodeKind::kSelect; |
| 56 | case Expr::kCallExpr: |
| 57 | return NodeKind::kCall; |
| 58 | case Expr::kListExpr: |
| 59 | return NodeKind::kList; |
| 60 | case Expr::kStructExpr: |
| 61 | if (!expr.struct_expr().message_name().empty()) { |
| 62 | return NodeKind::kStruct; |
| 63 | } else { |
| 64 | return NodeKind::kMap; |
| 65 | } |
| 66 | case Expr::kComprehensionExpr: |
| 67 | return NodeKind::kComprehension; |
| 68 | case Expr::EXPR_KIND_NOT_SET: |
| 69 | default: |
| 70 | return NodeKind::kUnspecified; |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | // Get the traversal relationship from parent to the given node. |
| 75 | // Note: these depend on the ast_visitor utility's traversal ordering. |