summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2019-10-10 02:34:47 +0000
committerYitzhak Mandelbaum <yitzhakm@google.com>2019-10-10 02:34:47 +0000
commitfbdf83521b17c4683e4f819587000bbce71d928b (patch)
tree729317d14b678ab28d26557e4d46478783435cc4 /clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp
parent79a8476d4363912553d5165a055601bcd417e8ff (diff)
downloadbcm5719-llvm-fbdf83521b17c4683e4f819587000bbce71d928b.tar.gz
bcm5719-llvm-fbdf83521b17c4683e4f819587000bbce71d928b.zip
[libTooling] Move Transformer files to their own directory/library.
Summary: The Transformer library has been growing inside of lib/Tooling/Refactoring. However, it's not really related to anything else in that directory. This revision moves all Transformer-related files into their own include & lib directories. A followup revision will (temporarily) add forwarding headers to help any users migrate their code to the new location. Reviewers: gribozavr Subscribers: mgorny, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68637 llvm-svn: 374271
Diffstat (limited to 'clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp')
-rw-r--r--clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp160
1 files changed, 0 insertions, 160 deletions
diff --git a/clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp b/clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp
deleted file mode 100644
index 2499c0f1eb3..00000000000
--- a/clang/lib/Tooling/Refactoring/SourceCodeBuilders.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-//===--- SourceCodeBuilder.cpp ----------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Tooling/Refactoring/SourceCodeBuilders.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Expr.h"
-#include "clang/AST/ExprCXX.h"
-#include "clang/Tooling/Refactoring/SourceCode.h"
-#include "llvm/ADT/Twine.h"
-#include <string>
-
-using namespace clang;
-using namespace tooling;
-
-const Expr *tooling::reallyIgnoreImplicit(const Expr &E) {
- const Expr *Expr = E.IgnoreImplicit();
- if (const auto *CE = dyn_cast<CXXConstructExpr>(Expr)) {
- if (CE->getNumArgs() > 0 &&
- CE->getArg(0)->getSourceRange() == Expr->getSourceRange())
- return CE->getArg(0)->IgnoreImplicit();
- }
- return Expr;
-}
-
-bool tooling::mayEverNeedParens(const Expr &E) {
- const Expr *Expr = reallyIgnoreImplicit(E);
- // We always want parens around unary, binary, and ternary operators, because
- // they are lower precedence.
- if (isa<UnaryOperator>(Expr) || isa<BinaryOperator>(Expr) ||
- isa<AbstractConditionalOperator>(Expr))
- return true;
-
- // We need parens around calls to all overloaded operators except: function
- // calls, subscripts, and expressions that are already part of an (implicit)
- // call to operator->. These latter are all in the same precedence level as
- // dot/arrow and that level is left associative, so they don't need parens
- // when appearing on the left.
- if (const auto *Op = dyn_cast<CXXOperatorCallExpr>(Expr))
- return Op->getOperator() != OO_Call && Op->getOperator() != OO_Subscript &&
- Op->getOperator() != OO_Arrow;
-
- return false;
-}
-
-bool tooling::needParensAfterUnaryOperator(const Expr &E) {
- const Expr *Expr = reallyIgnoreImplicit(E);
- if (isa<BinaryOperator>(Expr) || isa<AbstractConditionalOperator>(Expr))
- return true;
-
- if (const auto *Op = dyn_cast<CXXOperatorCallExpr>(Expr))
- return Op->getNumArgs() == 2 && Op->getOperator() != OO_PlusPlus &&
- Op->getOperator() != OO_MinusMinus && Op->getOperator() != OO_Call &&
- Op->getOperator() != OO_Subscript;
-
- return false;
-}
-
-llvm::Optional<std::string> tooling::buildParens(const Expr &E,
- const ASTContext &Context) {
- StringRef Text = getText(E, Context);
- if (Text.empty())
- return llvm::None;
- if (mayEverNeedParens(E))
- return ("(" + Text + ")").str();
- return Text.str();
-}
-
-llvm::Optional<std::string>
-tooling::buildDereference(const Expr &E, const ASTContext &Context) {
- if (const auto *Op = dyn_cast<UnaryOperator>(&E))
- if (Op->getOpcode() == UO_AddrOf) {
- // Strip leading '&'.
- StringRef Text =
- getText(*Op->getSubExpr()->IgnoreParenImpCasts(), Context);
- if (Text.empty())
- return llvm::None;
- return Text.str();
- }
-
- StringRef Text = getText(E, Context);
- if (Text.empty())
- return llvm::None;
- // Add leading '*'.
- if (needParensAfterUnaryOperator(E))
- return ("*(" + Text + ")").str();
- return ("*" + Text).str();
-}
-
-llvm::Optional<std::string> tooling::buildAddressOf(const Expr &E,
- const ASTContext &Context) {
- if (const auto *Op = dyn_cast<UnaryOperator>(&E))
- if (Op->getOpcode() == UO_Deref) {
- // Strip leading '*'.
- StringRef Text =
- getText(*Op->getSubExpr()->IgnoreParenImpCasts(), Context);
- if (Text.empty())
- return llvm::None;
- return Text.str();
- }
- // Add leading '&'.
- StringRef Text = getText(E, Context);
- if (Text.empty())
- return llvm::None;
- if (needParensAfterUnaryOperator(E)) {
- return ("&(" + Text + ")").str();
- }
- return ("&" + Text).str();
-}
-
-llvm::Optional<std::string> tooling::buildDot(const Expr &E,
- const ASTContext &Context) {
- if (const auto *Op = llvm::dyn_cast<UnaryOperator>(&E))
- if (Op->getOpcode() == UO_Deref) {
- // Strip leading '*', add following '->'.
- const Expr *SubExpr = Op->getSubExpr()->IgnoreParenImpCasts();
- StringRef DerefText = getText(*SubExpr, Context);
- if (DerefText.empty())
- return llvm::None;
- if (needParensBeforeDotOrArrow(*SubExpr))
- return ("(" + DerefText + ")->").str();
- return (DerefText + "->").str();
- }
-
- // Add following '.'.
- StringRef Text = getText(E, Context);
- if (Text.empty())
- return llvm::None;
- if (needParensBeforeDotOrArrow(E)) {
- return ("(" + Text + ").").str();
- }
- return (Text + ".").str();
-}
-
-llvm::Optional<std::string> tooling::buildArrow(const Expr &E,
- const ASTContext &Context) {
- if (const auto *Op = llvm::dyn_cast<UnaryOperator>(&E))
- if (Op->getOpcode() == UO_AddrOf) {
- // Strip leading '&', add following '.'.
- const Expr *SubExpr = Op->getSubExpr()->IgnoreParenImpCasts();
- StringRef DerefText = getText(*SubExpr, Context);
- if (DerefText.empty())
- return llvm::None;
- if (needParensBeforeDotOrArrow(*SubExpr))
- return ("(" + DerefText + ").").str();
- return (DerefText + ".").str();
- }
-
- // Add following '->'.
- StringRef Text = getText(E, Context);
- if (Text.empty())
- return llvm::None;
- if (needParensBeforeDotOrArrow(E))
- return ("(" + Text + ")->").str();
- return (Text + "->").str();
-}
OpenPOWER on IntegriCloud