From 7137736e49ce533930dd043b79f4c97f239c56f3 Mon Sep 17 00:00:00 2001 From: Shaurya Gupta Date: Thu, 8 Aug 2019 08:37:49 +0000 Subject: [PATCH] [Extract] Fixed SemicolonExtractionPolicy for SwitchStmt and SwitchCase Reviewers: arphaman, sammccall Subscribers: dexonsmith, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D65883 llvm-svn: 368267 --- .../Refactoring/Extract/SourceExtraction.cpp | 5 ++++- .../Refactor/Extract/ExtractionSemicolonPolicy.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/clang/lib/Tooling/Refactoring/Extract/SourceExtraction.cpp b/clang/lib/Tooling/Refactoring/Extract/SourceExtraction.cpp index 533c373e35c4..9b0c37b1709a 100644 --- a/clang/lib/Tooling/Refactoring/Extract/SourceExtraction.cpp +++ b/clang/lib/Tooling/Refactoring/Extract/SourceExtraction.cpp @@ -40,8 +40,11 @@ bool isSemicolonRequiredAfter(const Stmt *S) { return isSemicolonRequiredAfter(CXXFor->getBody()); if (const auto *ObjCFor = dyn_cast(S)) return isSemicolonRequiredAfter(ObjCFor->getBody()); + if(const auto *Switch = dyn_cast(S)) + return isSemicolonRequiredAfter(Switch->getBody()); + if(const auto *Case = dyn_cast(S)) + return isSemicolonRequiredAfter(Case->getSubStmt()); switch (S->getStmtClass()) { - case Stmt::SwitchStmtClass: case Stmt::CXXTryStmtClass: case Stmt::ObjCAtSynchronizedStmtClass: case Stmt::ObjCAutoreleasePoolStmtClass: diff --git a/clang/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp b/clang/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp index 5caf9d452684..97f124757619 100644 --- a/clang/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp +++ b/clang/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp @@ -64,6 +64,7 @@ void extractStatementNotSemiSwitch() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } + void extractStatementNotSemiWhile() { /*range eextract=->+2:4*/while (true) { int x = 0; @@ -190,3 +191,15 @@ void careForNonCompoundSemicolons2() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: // // CHECK-NEXT: } + +void careForSwitchSemicolon() { + /*range mextract=->+0:51*/switch(0) default: break; +} +// CHECK: 1 'mextract' results: +// CHECK: static void extracted() { +// CHECK-NEXT: switch(0) default: break;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: void careForSwitchSemicolon() { +// CHECK-NEXT: extracted();{{$}} +// CHECK-NEXT: } +