diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Format/MacroExpander.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Format/MacroExpander.cpp | 50 |
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); |