Joos1W Compiler Framework
All Classes Functions Typedefs Pages
VisitLeaf.cc
1 #include "parsetree/ParseTree.h"
2 #include "parsetree/ParseTreeVisitor.h"
3 #include <utils/Error.h>
4 #include <utility>
5 
6 namespace parsetree {
7 
8 using pty = Node::Type;
9 using ptv = ParseTreeVisitor;
10 
11 ast::UnresolvedType* ptv::visitReferenceType(Node* node,
12  ast::UnresolvedType* ast_node) {
13  check_node_type(node, pty::QualifiedIdentifier);
14  check_num_children(node, 1, 2);
15  if(ast_node == nullptr) {
16  ast_node = sem.BuildUnresolvedType(node->location());
17  }
18  if(node->num_children() == 1) {
19  ast_node->addIdentifier(visitIdentifier(node->child(0)));
20  return ast_node;
21  } else if(node->num_children() == 2) {
22  ast_node = visitReferenceType(node->child(0), ast_node);
23  ast_node->addIdentifier(visitIdentifier(node->child(1)));
24  return ast_node;
25  }
26  std::unreachable();
27 }
28 
29 std::string_view ptv::visitIdentifier(Node* node) {
30  check_node_type(node, pty::Identifier);
31  return cast<Identifier*>(node)->get_name();
32 }
33 
34 ast::Modifiers ptv::visitModifierList(Node* node, ast::Modifiers modifiers) {
35  if(node == nullptr) {
36  return modifiers;
37  }
38  check_node_type(node, pty::ModifierList);
39  check_num_children(node, 1, 2);
40  if(node->num_children() == 1) {
41  modifiers.set(visitModifier(node->child(0)));
42  return modifiers;
43  } else if(node->num_children() == 2) {
44  modifiers = visitModifierList(node->child(0), modifiers);
45  modifiers.set(visitModifier(node->child(1)));
46  return modifiers;
47  }
48  std::unreachable();
49 }
50 
51 Modifier ptv::visitModifier(Node* node) {
52  check_node_type(node, pty::Modifier);
53  return *cast<Modifier*>(node);
54 }
55 
56 ast::Type* ptv::visitType(Node* node) {
57  check_num_children(node, 1, 1);
58  auto innerTy = node;
59  innerTy = node->child(0);
60  ast::Type* elemTy = nullptr;
61  if(innerTy->get_node_type() == pty::BasicType) {
62  elemTy = sem.BuildBuiltInType(cast<BasicType*>(innerTy)->get_type(),
63  node->location());
64  } else if(innerTy->get_node_type() == pty::QualifiedIdentifier) {
65  elemTy = visitReferenceType(innerTy);
66  }
67  if(elemTy == nullptr)
68  throw utils::FatalError(
69  "Expected a BasicType or QualifiedIdentifier node but got " +
70  innerTy->type_string());
71  if(node->get_node_type() == pty::ArrayType)
72  return sem.BuildArrayType(elemTy, node->location());
73  else if(node->get_node_type() == pty::Type)
74  return elemTy;
75  throw utils::FatalError("Expected a Type or ArrayType node");
76 }
77 
78 } // namespace parsetree