Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:57

0001 //===--- PPEmbedParameters.h ------------------------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // Defines all of the preprocessor directive parmeters for #embed
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 #ifndef LLVM_CLANG_LEX_PPEMBEDPARAMETERS_H
0014 #define LLVM_CLANG_LEX_PPEMBEDPARAMETERS_H
0015 
0016 #include "clang/Lex/PPDirectiveParameter.h"
0017 #include "clang/Lex/Token.h"
0018 #include "llvm/ADT/SmallVector.h"
0019 
0020 namespace clang {
0021 
0022 /// Preprocessor extension embed parameter "clang::offset"
0023 /// `clang::offset( constant-expression )`
0024 class PPEmbedParameterOffset : public PPDirectiveParameter {
0025 public:
0026   size_t Offset;
0027 
0028   PPEmbedParameterOffset(size_t Offset, SourceRange R)
0029       : PPDirectiveParameter(R), Offset(Offset) {}
0030 };
0031 
0032 /// Preprocessor standard embed parameter "limit"
0033 /// `limit( constant-expression )`
0034 class PPEmbedParameterLimit : public PPDirectiveParameter {
0035 public:
0036   size_t Limit;
0037 
0038   PPEmbedParameterLimit(size_t Limit, SourceRange R)
0039       : PPDirectiveParameter(R), Limit(Limit) {}
0040 };
0041 
0042 /// Preprocessor standard embed parameter "prefix"
0043 /// `prefix( balanced-token-seq )`
0044 class PPEmbedParameterPrefix : public PPDirectiveParameter {
0045 public:
0046   SmallVector<Token, 2> Tokens;
0047 
0048   PPEmbedParameterPrefix(SmallVectorImpl<Token> &&Tokens, SourceRange R)
0049       : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
0050 };
0051 
0052 /// Preprocessor standard embed parameter "suffix"
0053 /// `suffix( balanced-token-seq )`
0054 class PPEmbedParameterSuffix : public PPDirectiveParameter {
0055 public:
0056   SmallVector<Token, 2> Tokens;
0057 
0058   PPEmbedParameterSuffix(SmallVectorImpl<Token> &&Tokens, SourceRange R)
0059       : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
0060 };
0061 
0062 /// Preprocessor standard embed parameter "if_empty"
0063 /// `if_empty( balanced-token-seq )`
0064 class PPEmbedParameterIfEmpty : public PPDirectiveParameter {
0065 public:
0066   SmallVector<Token, 2> Tokens;
0067 
0068   PPEmbedParameterIfEmpty(SmallVectorImpl<Token> &&Tokens, SourceRange R)
0069       : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
0070 };
0071 
0072 struct LexEmbedParametersResult {
0073   std::optional<PPEmbedParameterLimit> MaybeLimitParam;
0074   std::optional<PPEmbedParameterOffset> MaybeOffsetParam;
0075   std::optional<PPEmbedParameterIfEmpty> MaybeIfEmptyParam;
0076   std::optional<PPEmbedParameterPrefix> MaybePrefixParam;
0077   std::optional<PPEmbedParameterSuffix> MaybeSuffixParam;
0078   int UnrecognizedParams;
0079 
0080   size_t PrefixTokenCount() const {
0081     if (MaybePrefixParam)
0082       return MaybePrefixParam->Tokens.size();
0083     return 0;
0084   }
0085   size_t SuffixTokenCount() const {
0086     if (MaybeSuffixParam)
0087       return MaybeSuffixParam->Tokens.size();
0088     return 0;
0089   }
0090 };
0091 } // end namespace clang
0092 
0093 #endif