This machine mirrors various open-source projects.
20 Gbit/s uplink.
If there are any issues or you want another project mirrored, please contact
mirror-service -=AT=- netcologne DOT de !
00001 //===-- ast/DeclVisitor.cpp ----------------------------------- -*- C++ -*-===// 00002 // 00003 // This file is distributed under the MIT license. See LICENSE.txt for details. 00004 // 00005 // Copyright (C) 2009-2010, Stephen Wilson 00006 // 00007 //===----------------------------------------------------------------------===// 00008 00009 #include "comma/ast/Decl.h" 00010 #include "comma/ast/DeclVisitor.h" 00011 00012 using namespace comma; 00013 00014 using llvm::dyn_cast; 00015 using llvm::cast; 00016 using llvm::isa; 00017 00020 #define DISPATCH(TYPE, NODE) \ 00021 Ast::AST_ ## TYPE: \ 00022 visit ## TYPE(cast<TYPE>(NODE)); \ 00023 break 00024 00025 //===----------------------------------------------------------------------===// 00026 // Virtual inner node visitors. 00027 //===----------------------------------------------------------------------===// 00028 00029 void DeclVisitor::visitAst(Ast *node) 00030 { 00031 if (Decl *decl = dyn_cast<Decl>(node)) 00032 visitDecl(decl); 00033 } 00034 00035 void DeclVisitor::visitDecl(Decl *node) 00036 { 00037 if (ModelDecl *model = dyn_cast<ModelDecl>(node)) 00038 visitModelDecl(model); 00039 else if (SubroutineDecl *routine = dyn_cast<SubroutineDecl>(node)) 00040 visitSubroutineDecl(routine); 00041 else if (TypeDecl *typed = dyn_cast<TypeDecl>(node)) 00042 visitTypeDecl(typed); 00043 else if (ValueDecl *value = dyn_cast<ValueDecl>(node)) 00044 visitValueDecl(value); 00045 else if (SigInstanceDecl *instance = dyn_cast<SigInstanceDecl>(node)) 00046 visitSigInstanceDecl(instance); 00047 else if (ExceptionDecl *exception = dyn_cast<ExceptionDecl>(node)) 00048 visitExceptionDecl(exception); 00049 else 00050 assert(false && "Cannot visit this kind of node!"); 00051 } 00052 00053 void DeclVisitor::visitModelDecl(ModelDecl *node) 00054 { 00055 if (Domoid *domoid = dyn_cast<Domoid>(node)) 00056 visitDomoid(domoid); 00057 else if (Sigoid *sigoid = dyn_cast<Sigoid>(node)) 00058 visitSigoid(sigoid); 00059 else 00060 assert(false && "Cannot visit this kind of node!"); 00061 } 00062 00063 void DeclVisitor::visitSigoid(Sigoid *node) 00064 { 00065 switch (node->getKind()) { 00066 default: 00067 assert(false && "Cannot visit this kind of node!"); 00068 break; 00069 case DISPATCH(SignatureDecl, node); 00070 case DISPATCH(VarietyDecl, node); 00071 }; 00072 } 00073 00074 void DeclVisitor::visitDomoid(Domoid *node) 00075 { 00076 switch (node->getKind()) { 00077 default: 00078 assert(false && "Cannot visit this kind of node!"); 00079 break; 00080 case DISPATCH(DomainDecl, node); 00081 case DISPATCH(FunctorDecl, node); 00082 }; 00083 } 00084 00085 void DeclVisitor::visitSubroutineDecl(SubroutineDecl *node) 00086 { 00087 switch (node->getKind()) { 00088 default: 00089 assert(false && "Cannot visit this kind of node!"); 00090 break; 00091 case DISPATCH(FunctionDecl, node); 00092 case DISPATCH(ProcedureDecl, node); 00093 }; 00094 } 00095 00096 void DeclVisitor::visitTypeDecl(TypeDecl *node) 00097 { 00098 switch (node->getKind()) { 00099 default: 00100 assert(false && "Cannot visit this kind of node!"); 00101 break; 00102 case DISPATCH(AbstractDomainDecl, node); 00103 case DISPATCH(ArrayDecl, node); 00104 case DISPATCH(CarrierDecl, node); 00105 case DISPATCH(DomainInstanceDecl, node); 00106 case DISPATCH(EnumerationDecl, node); 00107 case DISPATCH(IntegerDecl, node); 00108 case DISPATCH(PercentDecl, node); 00109 case DISPATCH(IncompleteTypeDecl, node); 00110 }; 00111 } 00112 00113 void DeclVisitor::visitValueDecl(ValueDecl *node) 00114 { 00115 switch (node->getKind()) { 00116 default: 00117 assert(false && "Cannot visit this kind of node!"); 00118 break; 00119 case DISPATCH(ObjectDecl, node); 00120 case DISPATCH(ParamValueDecl, node); 00121 case DISPATCH(LoopDecl, node); 00122 case DISPATCH(RenamedObjectDecl, node); 00123 }; 00124 } 00125 00126 void DeclVisitor::visitDomainTypeDecl(DomainTypeDecl *node) 00127 { 00128 switch (node->getKind()) { 00129 default: 00130 assert(false && "Cannot visit this kind of node!"); 00131 break; 00132 case DISPATCH(DomainInstanceDecl, node); 00133 case DISPATCH(PercentDecl, node); 00134 case DISPATCH(AbstractDomainDecl, node); 00135 }; 00136 } 00137 00138 //===----------------------------------------------------------------------===// 00139 // Concrete inner node visitors. 00140 //===----------------------------------------------------------------------===// 00141 00142 void DeclVisitor::visitFunctionDecl(FunctionDecl *node) 00143 { 00144 if (EnumLiteral *enumLit = dyn_cast<EnumLiteral>(node)) 00145 visitEnumLiteral(enumLit); 00146 } 00147 00148 //===----------------------------------------------------------------------===// 00149 // Leaf visitors. 00150 //===----------------------------------------------------------------------===// 00151 00152 void DeclVisitor::visitImportDecl(ImportDecl *node) { } 00153 void DeclVisitor::visitSignatureDecl(SignatureDecl *node) { } 00154 void DeclVisitor::visitVarietyDecl(VarietyDecl *node) { } 00155 void DeclVisitor::visitSigInstanceDecl(SigInstanceDecl *node) { } 00156 void DeclVisitor::visitAddDecl(AddDecl *node) { } 00157 void DeclVisitor::visitDomainDecl(DomainDecl *node) { } 00158 void DeclVisitor::visitFunctorDecl(FunctorDecl *node) { } 00159 void DeclVisitor::visitProcedureDecl(ProcedureDecl *node) { } 00160 void DeclVisitor::visitCarrierDecl(CarrierDecl *node) { } 00161 void DeclVisitor::visitAbstractDomainDecl(AbstractDomainDecl *node) { } 00162 void DeclVisitor::visitDomainInstanceDecl(DomainInstanceDecl *node) { } 00163 void DeclVisitor::visitPercentDecl(PercentDecl *node) { } 00164 void DeclVisitor::visitLoopDecl(LoopDecl *node) { } 00165 void DeclVisitor::visitParamValueDecl(ParamValueDecl *node) { } 00166 void DeclVisitor::visitObjectDecl(ObjectDecl *node) { } 00167 void DeclVisitor::visitRenamedObjectDecl(RenamedObjectDecl *node) { } 00168 void DeclVisitor::visitEnumLiteral(EnumLiteral *node) { } 00169 void DeclVisitor::visitEnumerationDecl(EnumerationDecl *node) { } 00170 void DeclVisitor::visitIntegerDecl(IntegerDecl *node) { } 00171 void DeclVisitor::visitArrayDecl(ArrayDecl *node) { } 00172 void DeclVisitor::visitExceptionDecl(ExceptionDecl *node) { } 00173 void DeclVisitor::visitIncompleteTypeDecl(IncompleteTypeDecl *node) { }