#include "mlir/Tools/PDLL/Parser/Parser.h"
#include "Lexer.h"
#include "mlir/Support/IndentedOstream.h"
#include "mlir/TableGen/Argument.h"
#include "mlir/TableGen/Attribute.h"
#include "mlir/TableGen/Constraint.h"
#include "mlir/TableGen/Format.h"
#include "mlir/TableGen/Operator.h"
#include "mlir/Tools/PDLL/AST/Context.h"
#include "mlir/Tools/PDLL/AST/Diagnostic.h"
#include "mlir/Tools/PDLL/AST/Nodes.h"
#include "mlir/Tools/PDLL/AST/Types.h"
#include "mlir/Tools/PDLL/ODS/Constraint.h"
#include "mlir/Tools/PDLL/ODS/Context.h"
#include "mlir/Tools/PDLL/ODS/Operation.h"
#include "mlir/Tools/PDLL/Parser/CodeComplete.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/ScopedPrinter.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Parser.h"
#include <optional>
#include <string>
usingnamespacemlir;
usingnamespacemlir::pdll;
namespace {
class Parser { … };
}
FailureOr<ast::Module *> Parser::parseModule() { … }
LogicalResult Parser::parseModuleBody(SmallVectorImpl<ast::Decl *> &decls) { … }
ast::Expr *Parser::convertOpToValue(const ast::Expr *opExpr) { … }
LogicalResult Parser::convertExpressionTo(
ast::Expr *&expr, ast::Type type,
function_ref<void(ast::Diagnostic &diag)> noteAttachFn) { … }
LogicalResult Parser::convertOpExpressionTo(
ast::Expr *&expr, ast::OperationType exprType, ast::Type type,
function_ref<ast::InFlightDiagnostic()> emitErrorFn) { … }
LogicalResult Parser::convertTupleExpressionTo(
ast::Expr *&expr, ast::TupleType exprType, ast::Type type,
function_ref<ast::InFlightDiagnostic()> emitErrorFn,
function_ref<void(ast::Diagnostic &diag)> noteAttachFn) { … }
LogicalResult Parser::parseDirective(SmallVectorImpl<ast::Decl *> &decls) { … }
LogicalResult Parser::parseInclude(SmallVectorImpl<ast::Decl *> &decls) { … }
LogicalResult Parser::parseTdInclude(StringRef filename, llvm::SMRange fileLoc,
SmallVectorImpl<ast::Decl *> &decls) { … }
void Parser::processTdIncludeRecords(const llvm::RecordKeeper &tdRecords,
SmallVectorImpl<ast::Decl *> &decls) { … }
template <typename ConstraintT>
ast::Decl *Parser::createODSNativePDLLConstraintDecl(
StringRef name, StringRef codeBlock, SMRange loc, ast::Type type,
StringRef nativeType, StringRef docString) { … }
template <typename ConstraintT>
ast::Decl *
Parser::createODSNativePDLLConstraintDecl(const tblgen::Constraint &constraint,
SMRange loc, ast::Type type,
StringRef nativeType) { … }
FailureOr<ast::Decl *> Parser::parseTopLevelDecl() { … }
FailureOr<ast::NamedAttributeDecl *>
Parser::parseNamedAttributeDecl(std::optional<StringRef> parentOpName) { … }
FailureOr<ast::CompoundStmt *> Parser::parseLambdaBody(
function_ref<LogicalResult(ast::Stmt *&)> processStatementFn,
bool expectTerminalSemicolon) { … }
FailureOr<ast::VariableDecl *> Parser::parseArgumentDecl() { … }
FailureOr<ast::VariableDecl *> Parser::parseResultDecl(unsigned resultNum) { … }
FailureOr<ast::UserConstraintDecl *>
Parser::parseUserConstraintDecl(bool isInline) { … }
FailureOr<ast::UserConstraintDecl *> Parser::parseInlineUserConstraintDecl() { … }
FailureOr<ast::UserConstraintDecl *> Parser::parseUserPDLLConstraintDecl(
const ast::Name &name, bool isInline,
ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope,
ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { … }
FailureOr<ast::UserRewriteDecl *> Parser::parseUserRewriteDecl(bool isInline) { … }
FailureOr<ast::UserRewriteDecl *> Parser::parseInlineUserRewriteDecl() { … }
FailureOr<ast::UserRewriteDecl *> Parser::parseUserPDLLRewriteDecl(
const ast::Name &name, bool isInline,
ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope,
ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { … }
template <typename T, typename ParseUserPDLLDeclFnT>
FailureOr<T *> Parser::parseUserConstraintOrRewriteDecl(
ParseUserPDLLDeclFnT &&parseUserPDLLFn, ParserContext declContext,
StringRef anonymousNamePrefix, bool isInline) { … }
template <typename T>
FailureOr<T *> Parser::parseUserNativeConstraintOrRewriteDecl(
const ast::Name &name, bool isInline,
ArrayRef<ast::VariableDecl *> arguments,
ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { … }
LogicalResult Parser::parseUserConstraintOrRewriteSignature(
SmallVectorImpl<ast::VariableDecl *> &arguments,
SmallVectorImpl<ast::VariableDecl *> &results,
ast::DeclScope *&argumentScope, ast::Type &resultType) { … }
LogicalResult Parser::validateUserConstraintOrRewriteReturn(
StringRef declType, ast::CompoundStmt *body,
ArrayRef<ast::Stmt *>::iterator bodyIt,
ArrayRef<ast::Stmt *>::iterator bodyE,
ArrayRef<ast::VariableDecl *> results, ast::Type &resultType) { … }
FailureOr<ast::CompoundStmt *> Parser::parsePatternLambdaBody() { … }
FailureOr<ast::Decl *> Parser::parsePatternDecl() { … }
LogicalResult
Parser::parsePatternDeclMetadata(ParsedPatternMetadata &metadata) { … }
FailureOr<ast::Expr *> Parser::parseTypeConstraintExpr() { … }
LogicalResult Parser::checkDefineNamedDecl(const ast::Name &name) { … }
FailureOr<ast::VariableDecl *>
Parser::defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type,
ast::Expr *initExpr,
ArrayRef<ast::ConstraintRef> constraints) { … }
FailureOr<ast::VariableDecl *>
Parser::defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type,
ArrayRef<ast::ConstraintRef> constraints) { … }
LogicalResult Parser::parseVariableDeclConstraintList(
SmallVectorImpl<ast::ConstraintRef> &constraints) { … }
FailureOr<ast::ConstraintRef>
Parser::parseConstraint(std::optional<SMRange> &typeConstraint,
ArrayRef<ast::ConstraintRef> existingConstraints,
bool allowInlineTypeConstraints) { … }
FailureOr<ast::ConstraintRef> Parser::parseArgOrResultConstraint() { … }
FailureOr<ast::Expr *> Parser::parseExpr() { … }
FailureOr<ast::Expr *> Parser::parseAttributeExpr() { … }
FailureOr<ast::Expr *> Parser::parseCallExpr(ast::Expr *parentExpr,
bool isNegated) { … }
FailureOr<ast::Expr *> Parser::parseDeclRefExpr(StringRef name, SMRange loc) { … }
FailureOr<ast::Expr *> Parser::parseIdentifierExpr() { … }
FailureOr<ast::Expr *> Parser::parseInlineConstraintLambdaExpr() { … }
FailureOr<ast::Expr *> Parser::parseInlineRewriteLambdaExpr() { … }
FailureOr<ast::Expr *> Parser::parseMemberAccessExpr(ast::Expr *parentExpr) { … }
FailureOr<ast::Expr *> Parser::parseNegatedExpr() { … }
FailureOr<ast::OpNameDecl *> Parser::parseOperationName(bool allowEmptyName) { … }
FailureOr<ast::OpNameDecl *>
Parser::parseWrappedOperationName(bool allowEmptyName) { … }
FailureOr<ast::Expr *>
Parser::parseOperationExpr(OpResultTypeContext inputResultTypeContext) { … }
FailureOr<ast::Expr *> Parser::parseTupleExpr() { … }
FailureOr<ast::Expr *> Parser::parseTypeExpr() { … }
FailureOr<ast::Expr *> Parser::parseUnderscoreExpr() { … }
FailureOr<ast::Stmt *> Parser::parseStmt(bool expectTerminalSemicolon) { … }
FailureOr<ast::CompoundStmt *> Parser::parseCompoundStmt() { … }
FailureOr<ast::EraseStmt *> Parser::parseEraseStmt() { … }
FailureOr<ast::LetStmt *> Parser::parseLetStmt() { … }
FailureOr<ast::ReplaceStmt *> Parser::parseReplaceStmt() { … }
FailureOr<ast::ReturnStmt *> Parser::parseReturnStmt() { … }
FailureOr<ast::RewriteStmt *> Parser::parseRewriteStmt() { … }
ast::CallableDecl *Parser::tryExtractCallableDecl(ast::Node *node) { … }
FailureOr<ast::PatternDecl *>
Parser::createPatternDecl(SMRange loc, const ast::Name *name,
const ParsedPatternMetadata &metadata,
ast::CompoundStmt *body) { … }
ast::Type Parser::createUserConstraintRewriteResultType(
ArrayRef<ast::VariableDecl *> results) { … }
template <typename T>
FailureOr<T *> Parser::createUserPDLLConstraintOrRewriteDecl(
const ast::Name &name, ArrayRef<ast::VariableDecl *> arguments,
ArrayRef<ast::VariableDecl *> results, ast::Type resultType,
ast::CompoundStmt *body) { … }
FailureOr<ast::VariableDecl *>
Parser::createVariableDecl(StringRef name, SMRange loc, ast::Expr *initializer,
ArrayRef<ast::ConstraintRef> constraints) { … }
FailureOr<ast::VariableDecl *>
Parser::createArgOrResultVariableDecl(StringRef name, SMRange loc,
const ast::ConstraintRef &constraint) { … }
LogicalResult
Parser::validateVariableConstraints(ArrayRef<ast::ConstraintRef> constraints,
ast::Type &inferredType) { … }
LogicalResult Parser::validateVariableConstraint(const ast::ConstraintRef &ref,
ast::Type &inferredType) { … }
LogicalResult Parser::validateTypeConstraintExpr(const ast::Expr *typeExpr) { … }
LogicalResult
Parser::validateTypeRangeConstraintExpr(const ast::Expr *typeExpr) { … }
FailureOr<ast::CallExpr *>
Parser::createCallExpr(SMRange loc, ast::Expr *parentExpr,
MutableArrayRef<ast::Expr *> arguments, bool isNegated) { … }
FailureOr<ast::DeclRefExpr *> Parser::createDeclRefExpr(SMRange loc,
ast::Decl *decl) { … }
FailureOr<ast::DeclRefExpr *>
Parser::createInlineVariableExpr(ast::Type type, StringRef name, SMRange loc,
ArrayRef<ast::ConstraintRef> constraints) { … }
FailureOr<ast::MemberAccessExpr *>
Parser::createMemberAccessExpr(ast::Expr *parentExpr, StringRef name,
SMRange loc) { … }
FailureOr<ast::Type> Parser::validateMemberAccess(ast::Expr *parentExpr,
StringRef name, SMRange loc) { … }
FailureOr<ast::OperationExpr *> Parser::createOperationExpr(
SMRange loc, const ast::OpNameDecl *name,
OpResultTypeContext resultTypeContext,
SmallVectorImpl<ast::Expr *> &operands,
MutableArrayRef<ast::NamedAttributeDecl *> attributes,
SmallVectorImpl<ast::Expr *> &results) { … }
LogicalResult
Parser::validateOperationOperands(SMRange loc, std::optional<StringRef> name,
const ods::Operation *odsOp,
SmallVectorImpl<ast::Expr *> &operands) { … }
LogicalResult
Parser::validateOperationResults(SMRange loc, std::optional<StringRef> name,
const ods::Operation *odsOp,
SmallVectorImpl<ast::Expr *> &results) { … }
void Parser::checkOperationResultTypeInferrence(SMRange loc, StringRef opName,
const ods::Operation *odsOp) { … }
LogicalResult Parser::validateOperationOperandsOrResults(
StringRef groupName, SMRange loc, std::optional<SMRange> odsOpLoc,
std::optional<StringRef> name, SmallVectorImpl<ast::Expr *> &values,
ArrayRef<ods::OperandOrResult> odsValues, ast::Type singleTy,
ast::RangeType rangeTy) { … }
FailureOr<ast::TupleExpr *>
Parser::createTupleExpr(SMRange loc, ArrayRef<ast::Expr *> elements,
ArrayRef<StringRef> elementNames) { … }
FailureOr<ast::EraseStmt *> Parser::createEraseStmt(SMRange loc,
ast::Expr *rootOp) { … }
FailureOr<ast::ReplaceStmt *>
Parser::createReplaceStmt(SMRange loc, ast::Expr *rootOp,
MutableArrayRef<ast::Expr *> replValues) { … }
FailureOr<ast::RewriteStmt *>
Parser::createRewriteStmt(SMRange loc, ast::Expr *rootOp,
ast::CompoundStmt *rewriteBody) { … }
LogicalResult Parser::codeCompleteMemberAccess(ast::Expr *parentExpr) { … }
LogicalResult
Parser::codeCompleteAttributeName(std::optional<StringRef> opName) { … }
LogicalResult
Parser::codeCompleteConstraintName(ast::Type inferredType,
bool allowInlineTypeConstraints) { … }
LogicalResult Parser::codeCompleteDialectName() { … }
LogicalResult Parser::codeCompleteOperationName(StringRef dialectName) { … }
LogicalResult Parser::codeCompletePatternMetadata() { … }
LogicalResult Parser::codeCompleteIncludeFilename(StringRef curPath) { … }
void Parser::codeCompleteCallSignature(ast::Node *parent,
unsigned currentNumArgs) { … }
void Parser::codeCompleteOperationOperandsSignature(
std::optional<StringRef> opName, unsigned currentNumOperands) { … }
void Parser::codeCompleteOperationResultsSignature(
std::optional<StringRef> opName, unsigned currentNumResults) { … }
FailureOr<ast::Module *>
mlir::pdll::parsePDLLAST(ast::Context &ctx, llvm::SourceMgr &sourceMgr,
bool enableDocumentation,
CodeCompleteContext *codeCompleteContext) { … }