Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/CodeLocationTools.cpp

    r364a03c rc9e0991  
    1010// Created On       : Fri Dec  4 15:42:00 2020
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Dec  9  9:42:00 2020
    13 // Update Count     : 1
     12// Last Modified On : Mon Dec  7 15:15:00 2020
     13// Update Count     : 0
    1414//
    1515
     
    2424namespace {
    2525
    26 // There are a lot of helpers in this file that could be used much more
    27 // generally if anyone has another use for them.
    28 
    29 // Check if a node type has a code location.
    3026template<typename node_t>
    3127struct has_code_location : public std::is_base_of<ast::ParseNode, node_t> {};
     
    8783};
    8884
    89 // ALL_VISITS(macro)
    90 // Expands `macro(node_type, return_type)` for every visit method of the
    91 // ast::Visitor class where node_type is the name of the parameter and
    92 // 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 VISIT
    193 };
    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 VISIT
    205 };
    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 VISIT
    219 };
    220 
    22185// Collect pointers to all the nodes with unset code locations.
    22286class CollectCore {
     
    239103
    240104void checkAllCodeLocations( ast::TranslationUnit const & unit ) {
    241         checkAllCodeLocations( "unknown location", unit );
    242 }
    243 
    244 void checkAllCodeLocations( char const * label, ast::TranslationUnit const & unit ) {
    245105        std::list< ast::ptr< ast::Node > > unsetNodes;
    246106        {
     
    254114        }
    255115
    256         std::cerr << "Code Location check at " << label << " failed." << std::endl;
    257116        std::cerr << "Total nodes without a set code location: "
    258117                << 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         }
    270118
    271119        assert( unsetNodes.empty() );
Note: See TracChangeset for help on using the changeset viewer.