aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/clang/lib/Format/MacroExpander.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/clang/lib/Format/MacroExpander.cpp')
-rw-r--r--contrib/llvm-project/clang/lib/Format/MacroExpander.cpp50
1 files changed, 33 insertions, 17 deletions
diff --git a/contrib/llvm-project/clang/lib/Format/MacroExpander.cpp b/contrib/llvm-project/clang/lib/Format/MacroExpander.cpp
index e50c80446963..5a1cdd884c5e 100644
--- a/contrib/llvm-project/clang/lib/Format/MacroExpander.cpp
+++ b/contrib/llvm-project/clang/lib/Format/MacroExpander.cpp
@@ -1,9 +1,8 @@
//===--- MacroExpander.cpp - Format C++ code --------------------*- C++ -*-===//
//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// 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
//
//===----------------------------------------------------------------------===//
///
@@ -53,10 +52,10 @@ public:
Current = Tokens[0];
}
- // Parse the token stream and return the corresonding Definition object.
+ // Parse the token stream and return the corresponding Definition object.
// Returns an empty definition object with a null-Name on error.
MacroExpander::Definition parse() {
- if (!Current->is(tok::identifier))
+ if (Current->isNot(tok::identifier))
return {};
Def.Name = Current->TokenText;
nextToken();
@@ -126,9 +125,8 @@ MacroExpander::MacroExpander(
IdentifierTable &IdentTable)
: SourceMgr(SourceMgr), Style(Style), Allocator(Allocator),
IdentTable(IdentTable) {
- for (const std::string &Macro : Macros) {
+ for (const std::string &Macro : Macros)
parseDefinition(Macro);
- }
}
MacroExpander::~MacroExpander() = default;
@@ -143,24 +141,42 @@ void MacroExpander::parseDefinition(const std::string &Macro) {
if (!Tokens.empty()) {
DefinitionParser Parser(Tokens);
auto Definition = Parser.parse();
- Definitions[Definition.Name] = std::move(Definition);
+ if (Definition.ObjectLike) {
+ ObjectLike[Definition.Name] = std::move(Definition);
+ } else {
+ FunctionLike[Definition.Name][Definition.Params.size()] =
+ std::move(Definition);
+ }
}
}
bool MacroExpander::defined(llvm::StringRef Name) const {
- return Definitions.find(Name) != Definitions.end();
+ return FunctionLike.contains(Name) || ObjectLike.contains(Name);
}
bool MacroExpander::objectLike(llvm::StringRef Name) const {
- return Definitions.find(Name)->second.ObjectLike;
+ return ObjectLike.contains(Name);
}
-llvm::SmallVector<FormatToken *, 8> MacroExpander::expand(FormatToken *ID,
- ArgsList Args) const {
- assert(defined(ID->TokenText));
- SmallVector<FormatToken *, 8> Result;
- const Definition &Def = Definitions.find(ID->TokenText)->second;
+bool MacroExpander::hasArity(llvm::StringRef Name, unsigned Arity) const {
+ auto it = FunctionLike.find(Name);
+ return it != FunctionLike.end() && it->second.contains(Arity);
+}
+llvm::SmallVector<FormatToken *, 8>
+MacroExpander::expand(FormatToken *ID,
+ std::optional<ArgsList> OptionalArgs) const {
+ if (OptionalArgs)
+ assert(hasArity(ID->TokenText, OptionalArgs->size()));
+ else
+ assert(objectLike(ID->TokenText));
+ const Definition &Def = OptionalArgs
+ ? FunctionLike.find(ID->TokenText)
+ ->second.find(OptionalArgs.value().size())
+ ->second
+ : ObjectLike.find(ID->TokenText)->second;
+ ArgsList Args = OptionalArgs ? OptionalArgs.value() : ArgsList();
+ SmallVector<FormatToken *, 8> Result;
// Expand each argument at most once.
llvm::StringSet<> ExpandedArgs;
@@ -175,7 +191,7 @@ llvm::SmallVector<FormatToken *, 8> MacroExpander::expand(FormatToken *ID,
auto expandArgument = [&](FormatToken *Tok) -> bool {
// If the current token references a parameter, expand the corresponding
// argument.
- if (!Tok->is(tok::identifier) || ExpandedArgs.contains(Tok->TokenText))
+ if (Tok->isNot(tok::identifier) || ExpandedArgs.contains(Tok->TokenText))
return false;
ExpandedArgs.insert(Tok->TokenText);
auto I = Def.ArgMap.find(Tok->TokenText);