//===- TokenLexer.h - Lex from a token buffer -------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// This file defines the TokenLexer interface.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_LEX_TOKENLEXER_H
#define LLVM_CLANG_LEX_TOKENLEXER_H

#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/ArrayRef.h"

namespace clang {

class MacroArgs;
class MacroInfo;
class Preprocessor;
class Token;
class VAOptExpansionContext;

/// TokenLexer - This implements a lexer that returns tokens from a macro body
/// or token stream instead of lexing from a character buffer.  This is used for
/// macro expansion and _Pragma handling, for example.
class TokenLexer {
  friend class Preprocessor;

  /// The macro we are expanding from. This is null if expanding a token stream.
  MacroInfo *Macro = nullptr;

  /// The actual arguments specified for a function-like macro, or null. The
  /// TokenLexer owns the pointed-to object.
  MacroArgs *ActualArgs = nullptr;

  /// The current preprocessor object we are expanding for.
  Preprocessor &PP;

  /// This is the pointer to an array of tokens that the macro is
  /// defined to, with arguments expanded for function-like macros.  If this is
  /// a token stream, these are the tokens we are returning.  This points into
  /// the macro definition we are lexing from, a cache buffer that is owned by
  /// the preprocessor, or some other buffer that we may or may not own
  /// (depending on OwnsTokens).
  /// Note that if it points into Preprocessor's cache buffer, the Preprocessor
  /// may update the pointer as needed.
  const Token *Tokens;

  /// This is the length of the Tokens array.
  unsigned NumTokens;

  /// This is the index of the next token that Lex will return.
  unsigned CurTokenIdx;

  /// The source location range where this macro was expanded.
  SourceLocation ExpandLocStart, ExpandLocEnd;

  /// Source location pointing at the source location entry chunk that
  /// was reserved for the current macro expansion.
  SourceLocation MacroExpansionStart;

  /// The offset of the macro expansion in the
  /// "source location address space".
  unsigned MacroStartSLocOffset;

  /// Location of the macro definition.
  SourceLocation MacroDefStart;

  /// Length of the macro definition.
  unsigned MacroDefLength;

  /// Lexical information about the expansion point of the macro: the identifier
  /// that the macro expanded from had these properties.
  bool AtStartOfLine : 1;
  bool HasLeadingSpace : 1;

  // When this is true, the next token appended to the
  // output list during function argument expansion will get a leading space,
  // regardless of whether it had one to begin with or not. This is used for
  // placemarker support. If still true after function argument expansion, the
  // leading space will be applied to the first token following the macro
  // expansion.
  bool NextTokGetsSpace : 1;

  /// This is true if this TokenLexer allocated the Tokens
  /// array, and thus needs to free it when destroyed.  For simple object-like
  /// macros (for example) we just point into the token buffer of the macro
  /// definition, we don't make a copy of it.
  bool OwnsTokens : 1;

  /// This is true when tokens lexed from the TokenLexer
  /// should not be subject to further macro expansion.
  bool DisableMacroExpansion : 1;

  /// When true, the produced tokens have Token::IsReinjected flag set.
  /// See the flag documentation for details.
  bool IsReinject : 1;

public:
  /// Create a TokenLexer for the specified macro with the specified actual
  /// arguments.  Note that this ctor takes ownership of the ActualArgs pointer.
  /// ILEnd specifies the location of the ')' for a function-like macro or the
  /// identifier for an object-like macro.
  TokenLexer(Token &Tok, SourceLocation ILEnd, MacroInfo *MI,
             MacroArgs *ActualArgs, Preprocessor &pp)
      : PP(pp), OwnsTokens(false) {
    Init(Tok, ILEnd, MI, ActualArgs);
  }

  /// Create a TokenLexer for the specified token stream.  If 'OwnsTokens' is
  /// specified, this takes ownership of the tokens and delete[]'s them when
  /// the token lexer is empty.
  TokenLexer(const Token *TokArray, unsigned NumToks, bool DisableExpansion,
             bool ownsTokens, bool isReinject, Preprocessor &pp)
      : PP(pp), OwnsTokens(false) {
    Init(TokArray, NumToks, DisableExpansion, ownsTokens, isReinject);
  }

  TokenLexer(const TokenLexer &) = delete;
  TokenLexer &operator=(const TokenLexer &) = delete;
  ~TokenLexer() { destroy(); }

  /// Initialize this TokenLexer to expand from the specified macro
  /// with the specified argument information.  Note that this ctor takes
  /// ownership of the ActualArgs pointer.  ILEnd specifies the location of the
  /// ')' for a function-like macro or the identifier for an object-like macro.
  void Init(Token &Tok, SourceLocation ELEnd, MacroInfo *MI,
            MacroArgs *Actuals);

  /// Initialize this TokenLexer with the specified token stream.
  /// This does not take ownership of the specified token vector.
  ///
  /// DisableExpansion is true when macro expansion of tokens lexed from this
  /// stream should be disabled.
  void Init(const Token *TokArray, unsigned NumToks, bool DisableMacroExpansion,
            bool OwnsTokens, bool IsReinject);

  /// If the next token lexed will pop this macro off the
  /// expansion stack, return 2.  If the next unexpanded token is a '(', return
  /// 1, otherwise return 0.
  unsigned isNextTokenLParen() const;

  /// Lex and return a token from this macro stream.
  bool Lex(Token &Tok);

  /// isParsingPreprocessorDirective - Return true if we are in the middle of a
  /// preprocessor directive.
  bool isParsingPreprocessorDirective() const;

private:
  void destroy();

  /// Return true if the next lex call will pop this macro off the include
  /// stack.
  bool isAtEnd() const {
    return CurTokenIdx == NumTokens;
  }

  /// Concatenates the next (sub-)sequence of \p Tokens separated by '##'
  /// starting with LHSTok - stopping when we encounter a token that is neither
  /// '##' nor preceded by '##'.  Places the result back into \p LHSTok and sets
  /// \p CurIdx to point to the token following the last one that was pasted.
  ///
  /// Also performs the MSVC extension wide-literal token pasting involved with:
  ///       \code L #macro-arg. \endcode
  ///
  /// \param[in,out] LHSTok - Contains the token to the left of '##' in \p
  /// Tokens upon entry and will contain the resulting concatenated Token upon
  /// exit.
  ///
  /// \param[in] TokenStream - The stream of Tokens we are lexing from.
  ///
  /// \param[in,out] CurIdx - Upon entry, \pTokens[\pCurIdx] must equal '##'
  /// (with the exception of the MSVC extension mentioned above).  Upon exit, it
  /// is set to the index of the token following the last token that was
  /// concatenated together.
  ///
  /// \returns If this returns true, the caller should immediately return the
  /// token.
  bool pasteTokens(Token &LHSTok, ArrayRef<Token> TokenStream,
                   unsigned int &CurIdx);

  /// Calls pasteTokens above, passing in the '*this' object's Tokens and
  /// CurTokenIdx data members.
  bool pasteTokens(Token &Tok);


  /// Takes the tail sequence of tokens within ReplacementToks that represent
  /// the just expanded __VA_OPT__ tokens (possibly zero tokens) and transforms
  /// them into a string.  \p VCtx is used to determine which token represents
  /// the first __VA_OPT__ replacement token.
  ///
  /// \param[in,out] ResultToks - Contains the current Replacement Tokens
  /// (prior to rescanning and token pasting), the tail end of which represents
  /// the tokens just expanded through __VA_OPT__ processing.  These (sub)
  /// sequence of tokens are folded into one stringified token.
  ///
  /// \param[in] VCtx - contains relevant contextual information about the
  /// state of the tokens around and including the __VA_OPT__ token, necessary
  /// for stringification.
  void stringifyVAOPTContents(SmallVectorImpl<Token> &ResultToks,
                              const VAOptExpansionContext &VCtx,
                              SourceLocation VAOPTClosingParenLoc);

  /// Expand the arguments of a function-like macro so that we can quickly
  /// return preexpanded tokens from Tokens.
  void ExpandFunctionArguments();

  /// In microsoft compatibility mode, /##/ pastes
  /// together to form a comment that comments out everything in the current
  /// macro, other active macros, and anything left on the current physical
  /// source line of the expanded buffer.  Handle this by returning the
  /// first token on the next line.
  void HandleMicrosoftCommentPaste(Token &Tok, SourceLocation OpLoc);

  /// If \p loc is a FileID and points inside the current macro
  /// definition, returns the appropriate source location pointing at the
  /// macro expansion source location entry.
  SourceLocation getExpansionLocForMacroDefLoc(SourceLocation loc) const;

  /// Creates SLocEntries and updates the locations of macro argument
  /// tokens to their new expanded locations.
  ///
  /// \param ArgIdSpellLoc the location of the macro argument id inside the
  /// macro definition.
  void updateLocForMacroArgTokens(SourceLocation ArgIdSpellLoc,
                                  Token *begin_tokens, Token *end_tokens);

  /// Remove comma ahead of __VA_ARGS__, if present, according to compiler
  /// dialect settings.  Returns true if the comma is removed.
  bool MaybeRemoveCommaBeforeVaArgs(SmallVectorImpl<Token> &ResultToks,
                                    bool HasPasteOperator,
                                    MacroInfo *Macro, unsigned MacroArgNo,
                                    Preprocessor &PP);

  void PropagateLineStartLeadingSpaceInfo(Token &Result);
};

} // namespace clang

#endif // LLVM_CLANG_LEX_TOKENLEXER_H
