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";
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();
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;
//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());
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();
}
}