diff options
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic')
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Marshallers.h | 11 | ||||
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Parser.cpp | 22 | ||||
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 52 |
4 files changed, 52 insertions, 41 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index ae0c300d094..0df9c8cd60d 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -167,13 +167,15 @@ private: /// out of the polymorphic object. template <class PolyMatcher> static void mergePolyMatchers(const PolyMatcher &Poly, - std::vector<DynTypedMatcher> &Out, + std::vector<const DynTypedMatcher *> &Out, ast_matchers::internal::EmptyTypeList) {} template <class PolyMatcher, class TypeList> static void mergePolyMatchers(const PolyMatcher &Poly, - std::vector<DynTypedMatcher> &Out, TypeList) { - Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly)); + std::vector<const DynTypedMatcher *> &Out, + TypeList) { + Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly) + .clone()); mergePolyMatchers(Poly, Out, typename TypeList::tail()); } @@ -191,9 +193,10 @@ template <typename T> static VariantMatcher outvalueToVariantMatcher(const T &PolyMatcher, typename T::ReturnTypes * = NULL) { - std::vector<DynTypedMatcher> Matchers; + std::vector<const DynTypedMatcher *> Matchers; mergePolyMatchers(PolyMatcher, Matchers, typename T::ReturnTypes()); VariantMatcher Out = VariantMatcher::PolymorphicMatcher(Matchers); + llvm::DeleteContainerPointers(Matchers); return Out; } diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp index df9596e9b93..37e6c10478c 100644 --- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp @@ -390,29 +390,29 @@ bool Parser::parseExpression(StringRef Code, Sema *S, return true; } -llvm::Optional<DynTypedMatcher> -Parser::parseMatcherExpression(StringRef Code, Diagnostics *Error) { +DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code, + Diagnostics *Error) { RegistrySema S; return parseMatcherExpression(Code, &S, Error); } -llvm::Optional<DynTypedMatcher> -Parser::parseMatcherExpression(StringRef Code, Parser::Sema *S, - Diagnostics *Error) { +DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code, + Parser::Sema *S, + Diagnostics *Error) { VariantValue Value; if (!parseExpression(Code, S, &Value, Error)) - return llvm::Optional<DynTypedMatcher>(); + return NULL; if (!Value.isMatcher()) { Error->addError(SourceRange(), Error->ET_ParserNotAMatcher); - return llvm::Optional<DynTypedMatcher>(); + return NULL; } - llvm::Optional<DynTypedMatcher> Result = - Value.getMatcher().getSingleMatcher(); - if (!Result.hasValue()) { + const DynTypedMatcher *Result; + if (!Value.getMatcher().getSingleMatcher(Result)) { Error->addError(SourceRange(), Error->ET_ParserOverloadedType) << Value.getTypeAsString(); + return NULL; } - return Result; + return Result->clone(); } } // namespace dynamic diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 3a17038d985..3f8e7d4cd9d 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -329,10 +329,10 @@ VariantMatcher Registry::constructBoundMatcher(StringRef MatcherName, VariantMatcher Out = constructMatcher(MatcherName, NameRange, Args, Error); if (Out.isNull()) return Out; - llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher(); - if (Result.hasValue()) { - llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID); - if (Bound.hasValue()) { + const DynTypedMatcher *Result; + if (Out.getSingleMatcher(Result)) { + OwningPtr<DynTypedMatcher> Bound(Result->tryBind(BindID)); + if (Bound) { return VariantMatcher::SingleMatcher(*Bound); } } diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp index 3e49e1b8ef0..c350d78aa14 100644 --- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -26,37 +26,44 @@ VariantMatcher::Payload::~Payload() {} class VariantMatcher::SinglePayload : public VariantMatcher::Payload { public: - SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher) {} + SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher.clone()) {} - virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { - return Matcher; + virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { + Out = Matcher.get(); + return true; } virtual std::string getTypeAsString() const { - return (Twine("Matcher<") + Matcher.getSupportedKind().asStringRef() + ">") + return (Twine("Matcher<") + Matcher->getSupportedKind().asStringRef() + ">") .str(); } virtual void makeTypedMatcher(MatcherOps &Ops) const { - if (Ops.canConstructFrom(Matcher)) - Ops.constructFrom(Matcher); + if (Ops.canConstructFrom(*Matcher)) + Ops.constructFrom(*Matcher); } private: - const DynTypedMatcher Matcher; + OwningPtr<const DynTypedMatcher> Matcher; }; class VariantMatcher::PolymorphicPayload : public VariantMatcher::Payload { public: - PolymorphicPayload(ArrayRef<DynTypedMatcher> MatchersIn) - : Matchers(MatchersIn) {} + PolymorphicPayload(ArrayRef<const DynTypedMatcher *> MatchersIn) { + for (size_t i = 0, e = MatchersIn.size(); i != e; ++i) { + Matchers.push_back(MatchersIn[i]->clone()); + } + } - virtual ~PolymorphicPayload() {} + virtual ~PolymorphicPayload() { + llvm::DeleteContainerPointers(Matchers); + } - virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { + virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { if (Matchers.size() != 1) - return llvm::Optional<DynTypedMatcher>(); - return Matchers[0]; + return false; + Out = Matchers[0]; + return true; } virtual std::string getTypeAsString() const { @@ -64,7 +71,7 @@ public: for (size_t i = 0, e = Matchers.size(); i != e; ++i) { if (i != 0) Inner += "|"; - Inner += Matchers[i].getSupportedKind().asStringRef(); + Inner += Matchers[i]->getSupportedKind().asStringRef(); } return (Twine("Matcher<") + Inner + ">").str(); } @@ -72,17 +79,17 @@ public: virtual void makeTypedMatcher(MatcherOps &Ops) const { const DynTypedMatcher *Found = NULL; for (size_t i = 0, e = Matchers.size(); i != e; ++i) { - if (Ops.canConstructFrom(Matchers[i])) { + if (Ops.canConstructFrom(*Matchers[i])) { if (Found) return; - Found = &Matchers[i]; + Found = Matchers[i]; } } if (Found) Ops.constructFrom(*Found); } - const std::vector<DynTypedMatcher> Matchers; + std::vector<const DynTypedMatcher *> Matchers; }; class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload { @@ -91,8 +98,8 @@ public: ArrayRef<VariantMatcher> Args) : Func(Func), Args(Args) {} - virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { - return llvm::Optional<DynTypedMatcher>(); + virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { + return false; } virtual std::string getTypeAsString() const { @@ -121,7 +128,7 @@ VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) { } VariantMatcher -VariantMatcher::PolymorphicMatcher(ArrayRef<DynTypedMatcher> Matchers) { +VariantMatcher::PolymorphicMatcher(ArrayRef<const DynTypedMatcher *> Matchers) { return VariantMatcher(new PolymorphicPayload(Matchers)); } @@ -131,8 +138,9 @@ VariantMatcher VariantMatcher::VariadicOperatorMatcher( return VariantMatcher(new VariadicOpPayload(Func, Args)); } -llvm::Optional<DynTypedMatcher> VariantMatcher::getSingleMatcher() const { - return Value ? Value->getSingleMatcher() : llvm::Optional<DynTypedMatcher>(); +bool VariantMatcher::getSingleMatcher(const DynTypedMatcher *&Out) const { + if (Value) return Value->getSingleMatcher(Out); + return false; } void VariantMatcher::reset() { Value.reset(); } |

