//===--- MacroCallReconstructor.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. // //===----------------------------------------------------------------------===// /// /// \file /// This file contains the implementation of MacroCallReconstructor, which fits /// an reconstructed macro call to a parsed set of UnwrappedLines. /// //===----------------------------------------------------------------------===// #include "Macros.h" #include "UnwrappedLineParser.h" #include "clang/Basic/TokenKinds.h" #include "llvm/ADT/DenseSet.h" #include "llvm/Support/Debug.h" #include <cassert> #define DEBUG_TYPE … namespace clang { namespace format { // Call \p Call for each token in the unwrapped line given, passing // the token, its parent and whether it is the first token in the line. template <typename T> void forEachToken(const UnwrappedLine &Line, const T &Call, FormatToken *Parent = nullptr) { … } MacroCallReconstructor::MacroCallReconstructor( unsigned Level, const llvm::DenseMap<FormatToken *, std::unique_ptr<UnwrappedLine>> &ActiveExpansions) : … { … } void MacroCallReconstructor::addLine(const UnwrappedLine &Line) { … } UnwrappedLine MacroCallReconstructor::takeResult() && { … } // Reconstruct the position of the next \p Token, given its parent \p // ExpandedParent in the incoming unwrapped line. \p First specifies whether it // is the first token in a given unwrapped line. void MacroCallReconstructor::add(FormatToken *Token, FormatToken *ExpandedParent, bool First, unsigned Level) { … } // Adjusts the stack of active reconstructed lines so we're ready to push // tokens. The tokens to be pushed are children of ExpandedParent in the // expanded code. // // This may entail: // - creating a new line, if the parent is on the active line // - popping active lines, if the parent is further up the stack // // Postcondition: // ActiveReconstructedLines.back() is the line that has \p ExpandedParent or its // reconstructed replacement token as a parent (when possible) - that is, the // last token in \c ActiveReconstructedLines[ActiveReconstructedLines.size()-2] // is the parent of ActiveReconstructedLines.back() in the reconstructed // unwrapped line. void MacroCallReconstructor::prepareParent(FormatToken *ExpandedParent, bool NewLine, unsigned Level) { … } // For a given \p Parent in the incoming expanded token stream, find the // corresponding parent in the output. FormatToken *MacroCallReconstructor::getParentInResult(FormatToken *Parent) { … } // Reconstruct a \p Token that was expanded from a macro call. void MacroCallReconstructor::reconstruct(FormatToken *Token) { … } // Given a \p Token that starts an expansion, reconstruct the beginning of the // macro call. // For example, given: #define ID(x) x // And the call: ID(int a) // Reconstructs: ID( void MacroCallReconstructor::startReconstruction(FormatToken *Token) { … } // Add all tokens in the reconstruction stream to the output until we find the // given \p Token. bool MacroCallReconstructor::reconstructActiveCallUntil(FormatToken *Token) { … } // End all reconstructions for which \p Token is the final token. void MacroCallReconstructor::endReconstruction(FormatToken *Token) { … } void MacroCallReconstructor::debugParentMap() const { … } // If visible, add the next token of the reconstructed token sequence to the // output. Returns whether reconstruction passed a comma that is part of a // macro call. bool MacroCallReconstructor::processNextReconstructed() { … } void MacroCallReconstructor::finalize() { … } void MacroCallReconstructor::appendToken(FormatToken *Token, ReconstructedLine *L) { … } UnwrappedLine MacroCallReconstructor::createUnwrappedLine(const ReconstructedLine &Line, int Level) { … } void MacroCallReconstructor::debug(const ReconstructedLine &Line, int Level) { … } MacroCallReconstructor::ReconstructedLine & MacroCallReconstructor::parentLine() { … } MacroCallReconstructor::ReconstructedLine * MacroCallReconstructor::currentLine() { … } MacroCallReconstructor::MacroCallState::MacroCallState( MacroCallReconstructor::ReconstructedLine *Line, FormatToken *ParentLastToken, FormatToken *MacroCallLParen) : … { … } } // namespace format } // namespace clang