saqut-compiler/llvm/include/clang/Lex/LexHLSLRootSignature.h

101 lines
3.0 KiB
C++

//===--- LexHLSLRootSignature.h ---------------------------------*- 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 LexHLSLRootSignature interface.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_LEX_LEXHLSLROOTSIGNATURE_H
#define LLVM_CLANG_LEX_LEXHLSLROOTSIGNATURE_H
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
namespace clang {
namespace hlsl {
struct RootSignatureToken {
enum Kind {
#define TOK(X, SPELLING) X,
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
};
Kind TokKind = Kind::invalid;
// Retain the location offset of the token in the Signature
// string
uint32_t LocOffset;
// Retain spelling of an numeric constant to be parsed later
StringRef NumSpelling;
// Constructors
RootSignatureToken(uint32_t LocOffset) : LocOffset(LocOffset) {}
RootSignatureToken(Kind TokKind, uint32_t LocOffset)
: TokKind(TokKind), LocOffset(LocOffset) {}
};
inline const DiagnosticBuilder &
operator<<(const DiagnosticBuilder &DB, const RootSignatureToken::Kind Kind) {
switch (Kind) {
#define TOK(X, SPELLING) \
case RootSignatureToken::Kind::X: \
DB << SPELLING; \
break;
#define PUNCTUATOR(X, SPELLING) \
case RootSignatureToken::Kind::pu_##X: \
DB << #SPELLING; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
}
return DB;
}
class RootSignatureLexer {
public:
RootSignatureLexer(StringRef Signature) : Buffer(Signature) {}
/// Consumes and returns the next token.
RootSignatureToken consumeToken();
/// Returns the token that proceeds CurToken
RootSignatureToken peekNextToken();
bool isEndOfBuffer() {
advanceBuffer(Buffer.take_while(isspace).size());
return Buffer.empty();
}
private:
// Internal buffer state
StringRef Buffer;
uint32_t LocOffset = 0;
// Current peek state
std::optional<RootSignatureToken> NextToken = std::nullopt;
/// Consumes the buffer and returns the lexed token.
RootSignatureToken lexToken();
/// Advance the buffer by the specified number of characters.
/// Updates the SourceLocation appropriately.
void advanceBuffer(unsigned NumCharacters = 1) {
Buffer = Buffer.drop_front(NumCharacters);
LocOffset += NumCharacters;
}
};
} // namespace hlsl
} // namespace clang
#endif // LLVM_CLANG_LEX_PARSEHLSLROOTSIGNATURE_H