Updated the playground transform to handle switch

statments.

<rdar://problem/16628109>


Swift SVN r16461
This commit is contained in:
Sean Callanan
2014-04-17 19:21:28 +00:00
parent 1b8087cf5d
commit f35acb6dba

View File

@@ -49,7 +49,8 @@ private:
enum class TargetKinds {
None = 0,
Break,
Return
Return,
Fallthrough
};
TargetKinds TargetKind = TargetKinds::None;
@@ -132,6 +133,10 @@ public:
TargetKindSetter TKS(BracePairs, BracePair::TargetKinds::Break);
return transformForEachStmt(llvm::cast<ForEachStmt>(S));
}
case StmtKind::Switch: {
TargetKindSetter TKS(BracePairs, BracePair::TargetKinds::Fallthrough);
return transformSwitchStmt(llvm::cast<SwitchStmt>(S));
}
}
}
@@ -199,6 +204,21 @@ public:
return FES;
}
SwitchStmt *transformSwitchStmt(SwitchStmt *SS) {
for (CaseStmt *CS : SS->getCases()) {
if (Stmt *S = CS->getBody()) {
if (BraceStmt *B = llvm::dyn_cast<BraceStmt>(S)) {
BraceStmt *NB = transformBraceStmt(B);
if (NB != B) {
CS->setBody(NB);
}
}
}
}
return SS;
}
std::pair<DeclRefExpr *, VarDecl *> digForVariable(Expr *E) {
if (DeclRefExpr *DRE = llvm::dyn_cast<DeclRefExpr>(E)) {
return std::make_pair(DRE, llvm::dyn_cast<VarDecl>(DRE->getDecl()));
@@ -337,6 +357,9 @@ public:
if (llvm::isa<BreakStmt>(S) ||
llvm::isa<ContinueStmt>(S)) {
EI = escapeToTarget(BracePair::TargetKinds::Break, Elements, EI);
} else if (llvm::isa<FallthroughStmt>(S)) {
EI = escapeToTarget(BracePair::TargetKinds::Fallthrough, Elements,
EI);
}
Stmt *NS = transformStmt(S);
if (NS != S) {