- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/CodeLocationTools.cpp
r364a03c rc9e0991 10 10 // Created On : Fri Dec 4 15:42:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Dec 9 9:42:00 202013 // Update Count : 112 // Last Modified On : Mon Dec 7 15:15:00 2020 13 // Update Count : 0 14 14 // 15 15 … … 24 24 namespace { 25 25 26 // There are a lot of helpers in this file that could be used much more27 // generally if anyone has another use for them.28 29 // Check if a node type has a code location.30 26 template<typename node_t> 31 27 struct has_code_location : public std::is_base_of<ast::ParseNode, node_t> {}; … … 87 83 }; 88 84 89 // ALL_VISITS(macro)90 // Expands `macro(node_type, return_type)` for every visit method of the91 // ast::Visitor class where node_type is the name of the parameter and92 // return_type is the name of the return type; not including the namespace,93 // pointer or const qualifiers.94 #define ALL_VISITS(macro) \95 macro(ObjectDecl, DeclWithType) \96 macro(FunctionDecl, DeclWithType) \97 macro(StructDecl, Decl) \98 macro(UnionDecl, Decl) \99 macro(EnumDecl, Decl) \100 macro(TraitDecl, Decl) \101 macro(TypeDecl, Decl) \102 macro(TypedefDecl, Decl) \103 macro(AsmDecl, AsmDecl) \104 macro(StaticAssertDecl, StaticAssertDecl) \105 macro(CompoundStmt, CompoundStmt) \106 macro(ExprStmt, Stmt) \107 macro(AsmStmt, Stmt) \108 macro(DirectiveStmt, Stmt) \109 macro(IfStmt, Stmt) \110 macro(WhileStmt, Stmt) \111 macro(ForStmt, Stmt) \112 macro(SwitchStmt, Stmt) \113 macro(CaseStmt, Stmt) \114 macro(BranchStmt, Stmt) \115 macro(ReturnStmt, Stmt) \116 macro(ThrowStmt, Stmt) \117 macro(TryStmt, Stmt) \118 macro(CatchStmt, Stmt) \119 macro(FinallyStmt, Stmt) \120 macro(SuspendStmt, Stmt) \121 macro(WaitForStmt, Stmt) \122 macro(WithStmt, Decl) \123 macro(NullStmt, NullStmt) \124 macro(DeclStmt, Stmt) \125 macro(ImplicitCtorDtorStmt, Stmt) \126 macro(ApplicationExpr, Expr) \127 macro(UntypedExpr, Expr) \128 macro(NameExpr, Expr) \129 macro(AddressExpr, Expr) \130 macro(LabelAddressExpr, Expr) \131 macro(CastExpr, Expr) \132 macro(KeywordCastExpr, Expr) \133 macro(VirtualCastExpr, Expr) \134 macro(UntypedMemberExpr, Expr) \135 macro(MemberExpr, Expr) \136 macro(VariableExpr, Expr) \137 macro(ConstantExpr, Expr) \138 macro(SizeofExpr, Expr) \139 macro(AlignofExpr, Expr) \140 macro(UntypedOffsetofExpr, Expr) \141 macro(OffsetofExpr, Expr) \142 macro(OffsetPackExpr, Expr) \143 macro(LogicalExpr, Expr) \144 macro(ConditionalExpr, Expr) \145 macro(CommaExpr, Expr) \146 macro(TypeExpr, Expr) \147 macro(AsmExpr, Expr) \148 macro(ImplicitCopyCtorExpr, Expr) \149 macro(ConstructorExpr, Expr) \150 macro(CompoundLiteralExpr, Expr) \151 macro(RangeExpr, Expr) \152 macro(UntypedTupleExpr, Expr) \153 macro(TupleExpr, Expr) \154 macro(TupleIndexExpr, Expr) \155 macro(TupleAssignExpr, Expr) \156 macro(StmtExpr, Expr) \157 macro(UniqueExpr, Expr) \158 macro(UntypedInitExpr, Expr) \159 macro(InitExpr, Expr) \160 macro(DeletedExpr, Expr) \161 macro(DefaultArgExpr, Expr) \162 macro(GenericExpr, Expr) \163 macro(VoidType, Type) \164 macro(BasicType, Type) \165 macro(PointerType, Type) \166 macro(ArrayType, Type) \167 macro(ReferenceType, Type) \168 macro(QualifiedType, Type) \169 macro(FunctionType, Type) \170 macro(StructInstType, Type) \171 macro(UnionInstType, Type) \172 macro(EnumInstType, Type) \173 macro(TraitInstType, Type) \174 macro(TypeInstType, Type) \175 macro(TupleType, Type) \176 macro(TypeofType, Type) \177 macro(VarArgsType, Type) \178 macro(ZeroType, Type) \179 macro(OneType, Type) \180 macro(GlobalScopeType, Type) \181 macro(Designation, Designation) \182 macro(SingleInit, Init) \183 macro(ListInit, Init) \184 macro(ConstructorInit, Init) \185 macro(Attribute, Attribute) \186 macro(TypeSubstitution, TypeSubstitution)187 188 // These could even go into the ast namespace.189 enum class LeafKind {190 #define VISIT(node_type, return_type) node_type,191 ALL_VISITS(VISIT)192 #undef VISIT193 };194 195 struct LeafKindVisitor : public ast::Visitor {196 LeafKind kind;197 198 #define VISIT(node_type, return_type) \199 const ast::return_type * visit( const ast::node_type * ) final { \200 kind = LeafKind::node_type; \201 return nullptr; \202 }203 ALL_VISITS(VISIT)204 #undef VISIT205 };206 207 constexpr size_t leaf_kind_count = (1 + (size_t)LeafKind::TypeSubstitution);208 209 LeafKind get_leaf_kind( ast::Node const * node ) {210 LeafKindVisitor visitor;211 node->accept( visitor );212 return visitor.kind;213 }214 215 const char * leaf_kind_names[leaf_kind_count] = {216 #define VISIT(node_type, return_type) #node_type,217 ALL_VISITS(VISIT)218 #undef VISIT219 };220 221 85 // Collect pointers to all the nodes with unset code locations. 222 86 class CollectCore { … … 239 103 240 104 void checkAllCodeLocations( ast::TranslationUnit const & unit ) { 241 checkAllCodeLocations( "unknown location", unit );242 }243 244 void checkAllCodeLocations( char const * label, ast::TranslationUnit const & unit ) {245 105 std::list< ast::ptr< ast::Node > > unsetNodes; 246 106 { … … 254 114 } 255 115 256 std::cerr << "Code Location check at " << label << " failed." << std::endl;257 116 std::cerr << "Total nodes without a set code location: " 258 117 << unsetNodes.size() << std::endl; 259 260 size_t node_counts[leaf_kind_count] = {0};261 for ( auto unset : unsetNodes ) {262 node_counts[(size_t)get_leaf_kind(unset)] += 1;263 }264 for ( size_t i = 0 ; i < leaf_kind_count ; ++i ) {265 if ( node_counts[i] ) {266 std::cerr << '\t' << node_counts[i]267 << " of type " << leaf_kind_names[i] << std::endl;268 }269 }270 118 271 119 assert( unsetNodes.empty() );
Note: See TracChangeset
for help on using the changeset viewer.