]> rtime.felk.cvut.cz Git - boost-statechart-viewer.git/blobdiff - src/visualizer.cpp
Fix template argument finding.
[boost-statechart-viewer.git] / src / visualizer.cpp
index 165da3ad2d5868c679dca8e8c5f0eaa308fda979..8686b462287470eaaabd2a945b8cc02499fc60fc 100644 (file)
@@ -99,7 +99,7 @@ namespace Model
        string label = s.name;
        for (list<string>::const_iterator i = s.defferedEvents.begin(), e = s.defferedEvents.end(); i != e; ++i)
            label.append("<br />").append(*i).append(" / defer");
-       if(s.noTypedef) os << indent << s.name << " [label=<" << label << ">, color=\"red\"]\n";
+       if (s.noTypedef) os << indent << s.name << " [label=<" << label << ">, color=\"red\"]\n";
        else os << indent << s.name << " [label=<" << label << ">]\n";
        if (s.size()) {
            os << indent << s.name << " -> " << s.initialInnerState << " [style = dashed]\n";
@@ -371,27 +371,27 @@ public:
            Diag(Decl->getLocation(), diag_unhandled_reaction_decl) << Decl->getDeclKindName();
     }
 
-    TemplateArgumentLoc getTemplateArgLoc(const TypeLoc &T, unsigned ArgNum)
+    TemplateArgumentLoc getTemplateArgLoc(const TypeLoc &T, unsigned ArgNum, bool ignore)
     {
        if (const ElaboratedTypeLoc *ET = dyn_cast<ElaboratedTypeLoc>(&T))
-           return getTemplateArgLoc(ET->getNamedTypeLoc(), ArgNum);
+           return getTemplateArgLoc(ET->getNamedTypeLoc(), ArgNum, ignore);
        else if (const TemplateSpecializationTypeLoc *TST = dyn_cast<TemplateSpecializationTypeLoc>(&T)) {
            if (TST->getNumArgs() >= ArgNum+1) {
                return TST->getArgLoc(ArgNum);
            } else
-               if(ArgNum!=2)
+               if (!ignore)
                    Diag(TST->getBeginLoc(), diag_warning) << TST->getType()->getTypeClassName() << "has not enough arguments" << TST->getSourceRange();
        } else
            Diag(T.getBeginLoc(), diag_warning) << T.getType()->getTypeClassName() << "type as template argument is not supported" << T.getSourceRange();
        return TemplateArgumentLoc();
     }
 
-    TemplateArgumentLoc getTemplateArgLocOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum) {
-       return getTemplateArgLoc(Base->getTypeSourceInfo()->getTypeLoc(), ArgNum);
+    TemplateArgumentLoc getTemplateArgLocOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum, bool ignore) {
+       return getTemplateArgLoc(Base->getTypeSourceInfo()->getTypeLoc(), ArgNum, ignore);
     }
 
-    CXXRecordDecl *getTemplateArgDeclOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum, TemplateArgumentLoc &Loc) {
-       Loc = getTemplateArgLocOfBase(Base, ArgNum);
+    CXXRecordDecl *getTemplateArgDeclOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum, TemplateArgumentLoc &Loc, bool ignore = false) {
+       Loc = getTemplateArgLocOfBase(Base, ArgNum, ignore);
        switch (Loc.getArgument().getKind()) {
        case TemplateArgument::Type:
            return Loc.getTypeSourceInfo()->getType()->getAsCXXRecordDecl();
@@ -404,16 +404,15 @@ public:
        return 0;
     }
 
-    CXXRecordDecl *getTemplateArgDeclOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum) {
+    CXXRecordDecl *getTemplateArgDeclOfBase(const CXXBaseSpecifier *Base, unsigned ArgNum, bool ignore = false) {
        TemplateArgumentLoc Loc;
-       return getTemplateArgDeclOfBase(Base, ArgNum, Loc);
+       return getTemplateArgDeclOfBase(Base, ArgNum, Loc, ignore);
     }
 
     void handleSimpleState(CXXRecordDecl *RecordDecl, const CXXBaseSpecifier *Base)
     {
        int typedef_num = 0;
        string name(RecordDecl->getName()); //getQualifiedNameAsString());
-       printf("stav %s\n", RecordDecl->getName());
        Diag(RecordDecl->getLocStart(), diag_found_state) << name;
 
        Model::State *state;
@@ -435,7 +434,7 @@ public:
        //TODO support more innitial states
        TemplateArgumentLoc Loc;
        if (MyCXXRecordDecl *InnerInitialState =
-           static_cast<MyCXXRecordDecl*>(getTemplateArgDeclOfBase(Base, 2, Loc))) {
+           static_cast<MyCXXRecordDecl*>(getTemplateArgDeclOfBase(Base, 2, Loc, true))) {
              if (InnerInitialState->isDerivedFrom("boost::statechart::simple_state") ||
                InnerInitialState->isDerivedFrom("boost::statechart::state_machine")) {
                  state->setInitialInnerState(InnerInitialState->getName());
@@ -455,7 +454,7 @@ public:
            HandleReaction(*Reactions.first, RecordDecl);
        if(typedef_num == 0) {
            Diag(RecordDecl->getLocStart(), diag_warning)
-               << " missing typedef for reactions in state : " << RecordDecl->getName();
+               << RecordDecl->getName() << "state has no typedef for reactions";
            state->setNoTypedef();
        }
     }