Viewing file: TokenConcatenation.h (2.55 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===--- TokenConcatenation.h - Token Concatenation Avoidance ---*- 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 TokenConcatenation class. // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_LEX_TOKENCONCATENATION_H #define LLVM_CLANG_LEX_TOKENCONCATENATION_H
#include "clang/Basic/TokenKinds.h"
namespace clang { class Preprocessor; class Token;
/// TokenConcatenation class, which answers the question of /// "Is it safe to emit two tokens without a whitespace between them, or /// would that cause implicit concatenation of the tokens?" /// /// For example, it emitting two identifiers "foo" and "bar" next to each /// other would cause the lexer to produce one "foobar" token. Emitting "1" /// and ")" next to each other is safe. /// class TokenConcatenation { const Preprocessor &PP;
enum AvoidConcatInfo { /// By default, a token never needs to avoid concatenation. Most tokens /// (e.g. ',', ')', etc) don't cause a problem when concatenated. aci_never_avoid_concat = 0,
/// aci_custom_firstchar - AvoidConcat contains custom code to handle this /// token's requirements, and it needs to know the first character of the /// token. aci_custom_firstchar = 1,
/// aci_custom - AvoidConcat contains custom code to handle this token's /// requirements, but it doesn't need to know the first character of the /// token. aci_custom = 2,
/// aci_avoid_equal - Many tokens cannot be safely followed by an '=' /// character. For example, "<<" turns into "<<=" when followed by an =. aci_avoid_equal = 4 };
/// TokenInfo - This array contains information for each token on what /// action to take when avoiding concatenation of tokens in the AvoidConcat /// method. char TokenInfo[tok::NUM_TOKENS]; public: TokenConcatenation(const Preprocessor &PP);
bool AvoidConcat(const Token &PrevPrevTok, const Token &PrevTok, const Token &Tok) const;
private: /// IsIdentifierStringPrefix - Return true if the spelling of the token /// is literally 'L', 'u', 'U', or 'u8'. bool IsIdentifierStringPrefix(const Token &Tok) const; }; } // end clang namespace
#endif
|