void VisitDeclRefExpr(DeclRefExpr *Node) { ValueDecl* decl = Node->getDecl(); if (isa<EnumConstantDecl>(decl)) { EnumConstantDecl* ecdecl = cast<EnumConstantDecl>(decl); if (ecdecl->getInitVal() < 0) { OS << "(- "; OS << (-(ecdecl->getInitVal())).toString(10); OS << ")"; } else { OS << ecdecl->getInitVal().toString(10); } } else { OS << Node->getNameInfo(); } }
static bool UseNSOptionsMacro(ASTContext &Ctx, const EnumDecl *EnumDcl) { bool PowerOfTwo = true; for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(), EE = EnumDcl->enumerator_end(); EI != EE; ++EI) { EnumConstantDecl *Enumerator = (*EI); const Expr *InitExpr = Enumerator->getInitExpr(); if (!InitExpr) { PowerOfTwo = false; continue; } InitExpr = InitExpr->IgnoreImpCasts(); if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(InitExpr)) if (BO->isShiftOp() || BO->isBitwiseOp()) return true; uint64_t EnumVal = Enumerator->getInitVal().getZExtValue(); if (PowerOfTwo && EnumVal && !llvm::isPowerOf2_64(EnumVal)) PowerOfTwo = false; } return PowerOfTwo; }