+class FindTransitVisitor : public RecursiveASTVisitor<FindTransitVisitor>
+{
+ Model::Model &model;
+ const CXXRecordDecl *SrcState;
+ const Type *EventType;
+public:
+ explicit FindTransitVisitor(Model::Model &model, const CXXRecordDecl *SrcState, const Type *EventType)
+ : model(model), SrcState(SrcState), EventType(EventType) {}
+
+ bool VisitMemberExpr(MemberExpr *E) {
+ if (E->getMemberNameInfo().getAsString() != "transit")
+ return true;
+ if (E->hasExplicitTemplateArgs()) {
+ const Type *DstStateType = E->getExplicitTemplateArgs()[0].getArgument().getAsType().getTypePtr();
+ CXXRecordDecl *DstState = DstStateType->getAsCXXRecordDecl();
+ CXXRecordDecl *Event = EventType->getAsCXXRecordDecl();
+ Model::Transition *T = new Model::Transition(SrcState->getName(), DstState->getName(), Event->getName());
+ model.transitions.push_back(T);
+ }
+ return true;
+ }
+};