xref: /freebsd/contrib/llvm-project/clang/include/clang/Lex/PPEmbedParameters.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1  //===--- PPEmbedParameters.h ------------------------------------*- C++ -*-===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // Defines all of the preprocessor directive parmeters for #embed
10  //
11  //===----------------------------------------------------------------------===//
12  
13  #ifndef LLVM_CLANG_LEX_PPEMBEDPARAMETERS_H
14  #define LLVM_CLANG_LEX_PPEMBEDPARAMETERS_H
15  
16  #include "clang/Lex/PPDirectiveParameter.h"
17  #include "clang/Lex/Token.h"
18  #include "llvm/ADT/SmallVector.h"
19  
20  namespace clang {
21  
22  /// Preprocessor extension embed parameter "clang::offset"
23  /// `clang::offset( constant-expression )`
24  class PPEmbedParameterOffset : public PPDirectiveParameter {
25  public:
26    size_t Offset;
27  
PPEmbedParameterOffset(size_t Offset,SourceRange R)28    PPEmbedParameterOffset(size_t Offset, SourceRange R)
29        : PPDirectiveParameter(R), Offset(Offset) {}
30  };
31  
32  /// Preprocessor standard embed parameter "limit"
33  /// `limit( constant-expression )`
34  class PPEmbedParameterLimit : public PPDirectiveParameter {
35  public:
36    size_t Limit;
37  
PPEmbedParameterLimit(size_t Limit,SourceRange R)38    PPEmbedParameterLimit(size_t Limit, SourceRange R)
39        : PPDirectiveParameter(R), Limit(Limit) {}
40  };
41  
42  /// Preprocessor standard embed parameter "prefix"
43  /// `prefix( balanced-token-seq )`
44  class PPEmbedParameterPrefix : public PPDirectiveParameter {
45  public:
46    SmallVector<Token, 2> Tokens;
47  
PPEmbedParameterPrefix(SmallVectorImpl<Token> && Tokens,SourceRange R)48    PPEmbedParameterPrefix(SmallVectorImpl<Token> &&Tokens, SourceRange R)
49        : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
50  };
51  
52  /// Preprocessor standard embed parameter "suffix"
53  /// `suffix( balanced-token-seq )`
54  class PPEmbedParameterSuffix : public PPDirectiveParameter {
55  public:
56    SmallVector<Token, 2> Tokens;
57  
PPEmbedParameterSuffix(SmallVectorImpl<Token> && Tokens,SourceRange R)58    PPEmbedParameterSuffix(SmallVectorImpl<Token> &&Tokens, SourceRange R)
59        : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
60  };
61  
62  /// Preprocessor standard embed parameter "if_empty"
63  /// `if_empty( balanced-token-seq )`
64  class PPEmbedParameterIfEmpty : public PPDirectiveParameter {
65  public:
66    SmallVector<Token, 2> Tokens;
67  
PPEmbedParameterIfEmpty(SmallVectorImpl<Token> && Tokens,SourceRange R)68    PPEmbedParameterIfEmpty(SmallVectorImpl<Token> &&Tokens, SourceRange R)
69        : PPDirectiveParameter(R), Tokens(std::move(Tokens)) {}
70  };
71  
72  struct LexEmbedParametersResult {
73    std::optional<PPEmbedParameterLimit> MaybeLimitParam;
74    std::optional<PPEmbedParameterOffset> MaybeOffsetParam;
75    std::optional<PPEmbedParameterIfEmpty> MaybeIfEmptyParam;
76    std::optional<PPEmbedParameterPrefix> MaybePrefixParam;
77    std::optional<PPEmbedParameterSuffix> MaybeSuffixParam;
78    int UnrecognizedParams;
79  
PrefixTokenCountLexEmbedParametersResult80    size_t PrefixTokenCount() const {
81      if (MaybePrefixParam)
82        return MaybePrefixParam->Tokens.size();
83      return 0;
84    }
SuffixTokenCountLexEmbedParametersResult85    size_t SuffixTokenCount() const {
86      if (MaybeSuffixParam)
87        return MaybeSuffixParam->Tokens.size();
88      return 0;
89    }
90  };
91  } // end namespace clang
92  
93  #endif
94