summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling/Refactoring/Extract.cpp
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-11-03 18:11:22 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-11-03 18:11:22 +0000
commitebbbb8126678c027e1f6bfa9c34f3470a2f81b89 (patch)
tree08489508b012b15d355df631e076b1966f764a99 /clang/lib/Tooling/Refactoring/Extract.cpp
parent666e23b513d5782d13152b53a19df93eba87cd0a (diff)
downloadbcm5719-llvm-ebbbb8126678c027e1f6bfa9c34f3470a2f81b89.tar.gz
bcm5719-llvm-ebbbb8126678c027e1f6bfa9c34f3470a2f81b89.zip
[refactor][extract] insert semicolons into extracted/inserted code
when needed This commit implements the semicolon insertion logic into the extract refactoring. The following rules are used: - extracting expression: add terminating ';' to the extracted function. - extracting statements that don't require terminating ';' (e.g. switch): add terminating ';' to the callee. - extracting statements with ';': move (if possible) the original ';' from the callee and add terminating ';'. - otherwise, add ';' to both places. Differential Revision: https://reviews.llvm.org/D39441 llvm-svn: 317343
Diffstat (limited to 'clang/lib/Tooling/Refactoring/Extract.cpp')
-rw-r--r--clang/lib/Tooling/Refactoring/Extract.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/Tooling/Refactoring/Extract.cpp b/clang/lib/Tooling/Refactoring/Extract.cpp
index 3f5a839318b..b0847a74004 100644
--- a/clang/lib/Tooling/Refactoring/Extract.cpp
+++ b/clang/lib/Tooling/Refactoring/Extract.cpp
@@ -14,6 +14,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Tooling/Refactoring/Extract/Extract.h"
+#include "SourceExtraction.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/Expr.h"
@@ -145,6 +146,8 @@ ExtractFunction::createSourceReplacements(RefactoringRuleContext &Context) {
PP.SuppressLifetimeQualifiers = true;
PP.SuppressUnwrittenScope = true;
+ ExtractionSemicolonPolicy Semicolons = ExtractionSemicolonPolicy::compute(
+ Code[Code.size() - 1], ExtractedRange, SM, LangOpts);
AtomicChange Change(SM, ExtractedDeclLocation);
// Create the replacement for the extracted declaration.
{
@@ -162,8 +165,8 @@ ExtractFunction::createSourceReplacements(RefactoringRuleContext &Context) {
if (IsExpr && !ReturnType->isVoidType())
OS << "return ";
OS << ExtractedCodeRewriter.getRewrittenText(ExtractedRange);
- // FIXME: Compute the correct semicolon policy.
- OS << ';';
+ if (Semicolons.isNeededInExtractedFunction())
+ OS << ';';
OS << "\n}\n\n";
auto Err = Change.insert(SM, ExtractedDeclLocation, OS.str());
if (Err)
@@ -178,7 +181,8 @@ ExtractFunction::createSourceReplacements(RefactoringRuleContext &Context) {
OS << DeclName << '(';
// FIXME: Forward arguments.
OS << ')';
- // FIXME: Add semicolon if needed.
+ if (Semicolons.isNeededInOriginalFunction())
+ OS << ';';
auto Err = Change.replace(
SM, CharSourceRange::getTokenRange(ExtractedRange), OS.str());
OpenPOWER on IntegriCloud