Lines Matching refs:ast

46   Parser(ast::Context &ctx, llvm::SourceMgr &sourceMgr,  in Parser()
50 valueTy(ast::ValueType::get(ctx)), in Parser()
51 valueRangeTy(ast::ValueRangeType::get(ctx)), in Parser()
52 typeTy(ast::TypeType::get(ctx)), in Parser()
53 typeRangeTy(ast::TypeRangeType::get(ctx)), in Parser()
54 attrTy(ast::AttributeType::get(ctx)), in Parser()
58 FailureOr<ast::Module *> parseModule();
99 ast::DeclScope *pushDeclScope() { in pushDeclScope()
100 ast::DeclScope *newScope = in pushDeclScope()
101 new (scopeAllocator.Allocate()) ast::DeclScope(curDeclScope); in pushDeclScope()
104 void pushDeclScope(ast::DeclScope *scope) { curDeclScope = scope; } in pushDeclScope()
110 LogicalResult parseModuleBody(SmallVectorImpl<ast::Decl *> &decls);
117 ast::Expr *&expr, ast::Type type,
118 function_ref<void(ast::Diagnostic &diag)> noteAttachFn = {});
122 ast::Expr *convertOpToValue(const ast::Expr *opExpr);
154 LogicalResult parseDirective(SmallVectorImpl<ast::Decl *> &decls);
155 LogicalResult parseInclude(SmallVectorImpl<ast::Decl *> &decls);
157 SmallVectorImpl<ast::Decl *> &decls);
161 SmallVectorImpl<ast::Decl *> &decls);
166 ast::Decl *
168 SMRange loc, ast::Type type,
171 ast::Decl *
173 SMRange loc, ast::Type type,
185 FailureOr<ast::Decl *> parseTopLevelDecl();
186 FailureOr<ast::NamedAttributeDecl *>
191 FailureOr<ast::VariableDecl *> parseArgumentDecl();
195 FailureOr<ast::VariableDecl *> parseResultDecl(unsigned resultNum);
199 FailureOr<ast::UserConstraintDecl *>
204 FailureOr<ast::UserConstraintDecl *> parseInlineUserConstraintDecl();
208 FailureOr<ast::UserConstraintDecl *> parseUserPDLLConstraintDecl(
209 const ast::Name &name, bool isInline,
210 ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope,
211 ArrayRef<ast::VariableDecl *> results, ast::Type resultType);
215 FailureOr<ast::UserRewriteDecl *> parseUserRewriteDecl(bool isInline = false);
219 FailureOr<ast::UserRewriteDecl *> parseInlineUserRewriteDecl();
223 FailureOr<ast::UserRewriteDecl *> parseUserPDLLRewriteDecl(
224 const ast::Name &name, bool isInline,
225 ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope,
226 ArrayRef<ast::VariableDecl *> results, ast::Type resultType);
240 const ast::Name &name, bool isInline,
241 ArrayRef<ast::VariableDecl *> arguments,
242 ArrayRef<ast::VariableDecl *> results, ast::Type resultType);
247 SmallVectorImpl<ast::VariableDecl *> &arguments,
248 SmallVectorImpl<ast::VariableDecl *> &results,
249 ast::DeclScope *&argumentScope, ast::Type &resultType);
254 StringRef declType, ast::CompoundStmt *body,
255 ArrayRef<ast::Stmt *>::iterator bodyIt,
256 ArrayRef<ast::Stmt *>::iterator bodyE,
257 ArrayRef<ast::VariableDecl *> results, ast::Type &resultType);
259 FailureOr<ast::CompoundStmt *>
260 parseLambdaBody(function_ref<LogicalResult(ast::Stmt *&)> processStatementFn,
262 FailureOr<ast::CompoundStmt *> parsePatternLambdaBody();
263 FailureOr<ast::Decl *> parsePatternDecl();
268 LogicalResult checkDefineNamedDecl(const ast::Name &name);
272 FailureOr<ast::VariableDecl *>
273 defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type,
274 ast::Expr *initExpr,
275 ArrayRef<ast::ConstraintRef> constraints);
276 FailureOr<ast::VariableDecl *>
277 defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type,
278 ArrayRef<ast::ConstraintRef> constraints);
282 SmallVectorImpl<ast::ConstraintRef> &constraints);
285 FailureOr<ast::Expr *> parseTypeConstraintExpr();
295 FailureOr<ast::ConstraintRef>
297 ArrayRef<ast::ConstraintRef> existingConstraints,
304 FailureOr<ast::ConstraintRef> parseArgOrResultConstraint();
309 FailureOr<ast::Expr *> parseExpr();
312 FailureOr<ast::Expr *> parseAttributeExpr();
313 FailureOr<ast::Expr *> parseCallExpr(ast::Expr *parentExpr);
314 FailureOr<ast::Expr *> parseDeclRefExpr(StringRef name, SMRange loc);
315 FailureOr<ast::Expr *> parseIdentifierExpr();
316 FailureOr<ast::Expr *> parseInlineConstraintLambdaExpr();
317 FailureOr<ast::Expr *> parseInlineRewriteLambdaExpr();
318 FailureOr<ast::Expr *> parseMemberAccessExpr(ast::Expr *parentExpr);
319 FailureOr<ast::OpNameDecl *> parseOperationName(bool allowEmptyName = false);
320 FailureOr<ast::OpNameDecl *> parseWrappedOperationName(bool allowEmptyName);
321 FailureOr<ast::Expr *>
324 FailureOr<ast::Expr *> parseTupleExpr();
325 FailureOr<ast::Expr *> parseTypeExpr();
326 FailureOr<ast::Expr *> parseUnderscoreExpr();
331 FailureOr<ast::Stmt *> parseStmt(bool expectTerminalSemicolon = true);
332 FailureOr<ast::CompoundStmt *> parseCompoundStmt();
333 FailureOr<ast::EraseStmt *> parseEraseStmt();
334 FailureOr<ast::LetStmt *> parseLetStmt();
335 FailureOr<ast::ReplaceStmt *> parseReplaceStmt();
336 FailureOr<ast::ReturnStmt *> parseReturnStmt();
337 FailureOr<ast::RewriteStmt *> parseRewriteStmt();
348 ast::CallableDecl *tryExtractCallableDecl(ast::Node *node);
352 FailureOr<ast::PatternDecl *>
353 createPatternDecl(SMRange loc, const ast::Name *name,
355 ast::CompoundStmt *body);
359 ast::Type
360 createUserConstraintRewriteResultType(ArrayRef<ast::VariableDecl *> results);
365 const ast::Name &name, ArrayRef<ast::VariableDecl *> arguments,
366 ArrayRef<ast::VariableDecl *> results, ast::Type resultType,
367 ast::CompoundStmt *body);
371 FailureOr<ast::VariableDecl *>
372 createVariableDecl(StringRef name, SMRange loc, ast::Expr *initializer,
373 ArrayRef<ast::ConstraintRef> constraints);
377 FailureOr<ast::VariableDecl *>
379 const ast::ConstraintRef &constraint);
388 validateVariableConstraints(ArrayRef<ast::ConstraintRef> constraints,
389 ast::Type &inferredType,
396 LogicalResult validateVariableConstraint(const ast::ConstraintRef &ref,
397 ast::Type &inferredType,
399 LogicalResult validateTypeConstraintExpr(const ast::Expr *typeExpr);
400 LogicalResult validateTypeRangeConstraintExpr(const ast::Expr *typeExpr);
405 FailureOr<ast::CallExpr *>
406 createCallExpr(SMRange loc, ast::Expr *parentExpr,
407 MutableArrayRef<ast::Expr *> arguments);
408 FailureOr<ast::DeclRefExpr *> createDeclRefExpr(SMRange loc, ast::Decl *decl);
409 FailureOr<ast::DeclRefExpr *>
410 createInlineVariableExpr(ast::Type type, StringRef name, SMRange loc,
411 ArrayRef<ast::ConstraintRef> constraints);
412 FailureOr<ast::MemberAccessExpr *>
413 createMemberAccessExpr(ast::Expr *parentExpr, StringRef name, SMRange loc);
417 FailureOr<ast::Type> validateMemberAccess(ast::Expr *parentExpr,
419 FailureOr<ast::OperationExpr *>
420 createOperationExpr(SMRange loc, const ast::OpNameDecl *name,
422 MutableArrayRef<ast::Expr *> operands,
423 MutableArrayRef<ast::NamedAttributeDecl *> attributes,
424 MutableArrayRef<ast::Expr *> results);
428 MutableArrayRef<ast::Expr *> operands);
431 MutableArrayRef<ast::Expr *> results);
436 Optional<StringRef> name, MutableArrayRef<ast::Expr *> values,
437 ArrayRef<ods::OperandOrResult> odsValues, ast::Type singleTy,
438 ast::Type rangeTy);
439 FailureOr<ast::TupleExpr *> createTupleExpr(SMRange loc,
440 ArrayRef<ast::Expr *> elements,
446 FailureOr<ast::EraseStmt *> createEraseStmt(SMRange loc, ast::Expr *rootOp);
447 FailureOr<ast::ReplaceStmt *>
448 createReplaceStmt(SMRange loc, ast::Expr *rootOp,
449 MutableArrayRef<ast::Expr *> replValues);
450 FailureOr<ast::RewriteStmt *>
451 createRewriteStmt(SMRange loc, ast::Expr *rootOp,
452 ast::CompoundStmt *rewriteBody);
462 LogicalResult codeCompleteMemberAccess(ast::Expr *parentExpr);
464 LogicalResult codeCompleteConstraintName(ast::Type inferredType,
472 void codeCompleteCallSignature(ast::Node *parent, unsigned currentNumArgs);
538 ast::Context &ctx;
551 ast::DeclScope *curDeclScope = nullptr;
552 llvm::SpecificBumpPtrAllocator<ast::DeclScope> scopeAllocator;
558 ast::Type valueTy, valueRangeTy;
559 ast::Type typeTy, typeRangeTy;
560 ast::Type attrTy;
570 FailureOr<ast::Module *> Parser::parseModule() { in parseModule()
575 SmallVector<ast::Decl *> decls; in parseModule()
580 return ast::Module::create(ctx, moduleLoc, decls); in parseModule()
583 LogicalResult Parser::parseModuleBody(SmallVectorImpl<ast::Decl *> &decls) { in parseModuleBody()
591 FailureOr<ast::Decl *> decl = parseTopLevelDecl(); in parseModuleBody()
599 ast::Expr *Parser::convertOpToValue(const ast::Expr *opExpr) { in convertOpToValue()
600 return ast::AllResultsMemberAccessExpr::create(ctx, opExpr->getLoc(), opExpr, in convertOpToValue()
605 ast::Expr *&expr, ast::Type type, in convertExpressionTo()
606 function_ref<void(ast::Diagnostic &diag)> noteAttachFn) { in convertExpressionTo()
607 ast::Type exprType = expr->getType(); in convertExpressionTo()
611 auto emitConvertError = [&]() -> ast::InFlightDiagnostic { in convertExpressionTo()
612 ast::InFlightDiagnostic diag = ctx.getDiagEngine().emitError( in convertExpressionTo()
622 if (auto exprOpType = exprType.dyn_cast<ast::OperationType>()) { in convertExpressionTo()
625 if (auto opType = type.dyn_cast<ast::OperationType>()) { in convertExpressionTo()
633 expr = ast::AllResultsMemberAccessExpr::create(ctx, expr->getLoc(), expr, in convertExpressionTo()
665 expr = ast::AllResultsMemberAccessExpr::create(ctx, expr->getLoc(), expr, in convertExpressionTo()
684 if (auto exprTupleType = exprType.dyn_cast<ast::TupleType>()) { in convertExpressionTo()
685 auto tupleType = type.dyn_cast<ast::TupleType>(); in convertExpressionTo()
691 SmallVector<ast::Expr *> newExprs; in convertExpressionTo()
693 newExprs.push_back(ast::MemberAccessExpr::create( in convertExpressionTo()
697 auto diagFn = [&](ast::Diagnostic &diag) { in convertExpressionTo()
707 expr = ast::TupleExpr::create(ctx, expr->getLoc(), newExprs, in convertExpressionTo()
718 LogicalResult Parser::parseDirective(SmallVectorImpl<ast::Decl *> &decls) { in parseDirective()
726 LogicalResult Parser::parseInclude(SmallVectorImpl<ast::Decl *> &decls) { in parseInclude()
768 SmallVectorImpl<ast::Decl *> &decls) { in parseTdInclude()
818 SmallVectorImpl<ast::Decl *> &decls) { in processTdIncludeRecords()
888 decls.push_back(createODSNativePDLLConstraintDecl<ast::AttrConstraintDecl>( in processTdIncludeRecords()
898 decls.push_back(createODSNativePDLLConstraintDecl<ast::TypeConstraintDecl>( in processTdIncludeRecords()
903 ast::Type opTy = ast::OperationType::get(ctx); in processTdIncludeRecords()
921 decls.push_back(createODSNativePDLLConstraintDecl<ast::OpConstraintDecl>( in processTdIncludeRecords()
927 ast::Decl *Parser::createODSNativePDLLConstraintDecl( in createODSNativePDLLConstraintDecl()
928 StringRef name, StringRef codeBlock, SMRange loc, ast::Type type, in createODSNativePDLLConstraintDecl()
931 ast::DeclScope *argScope = pushDeclScope(); in createODSNativePDLLConstraintDecl()
932 auto *paramVar = ast::VariableDecl::create( in createODSNativePDLLConstraintDecl()
933 ctx, ast::Name::create(ctx, "self", loc), type, in createODSNativePDLLConstraintDecl()
934 /*initExpr=*/nullptr, ast::ConstraintRef(ConstraintT::create(ctx, loc))); in createODSNativePDLLConstraintDecl()
939 auto *constraintDecl = ast::UserConstraintDecl::createNative( in createODSNativePDLLConstraintDecl()
940 ctx, ast::Name::create(ctx, name, loc), paramVar, in createODSNativePDLLConstraintDecl()
941 /*results=*/llvm::None, codeBlock, ast::TupleType::get(ctx), nativeType); in createODSNativePDLLConstraintDecl()
948 ast::Decl *
950 SMRange loc, ast::Type type, in createODSNativePDLLConstraintDecl()
978 FailureOr<ast::Decl *> Parser::parseTopLevelDecl() { in parseTopLevelDecl()
979 FailureOr<ast::Decl *> decl; in parseTopLevelDecl()
997 if (const ast::Name *name = (*decl)->getName()) { in parseTopLevelDecl()
1005 FailureOr<ast::NamedAttributeDecl *>
1018 const auto &name = ast::Name::create(ctx, attrNameStr, curToken.getLoc()); in parseNamedAttributeDecl()
1022 ast::Expr *attrValue = nullptr; in parseNamedAttributeDecl()
1024 FailureOr<ast::Expr *> attrExpr = parseExpr(); in parseNamedAttributeDecl()
1031 attrValue = ast::AttributeExpr::create(ctx, name.getLoc(), "unit"); in parseNamedAttributeDecl()
1034 return ast::NamedAttributeDecl::create(ctx, name, attrValue); in parseNamedAttributeDecl()
1037 FailureOr<ast::CompoundStmt *> Parser::parseLambdaBody( in parseLambdaBody()
1038 function_ref<LogicalResult(ast::Stmt *&)> processStatementFn, in parseLambdaBody()
1045 FailureOr<ast::Stmt *> singleStatement = parseStmt(expectTerminalSemicolon); in parseLambdaBody()
1053 return ast::CompoundStmt::create(ctx, bodyLoc, *singleStatement); in parseLambdaBody()
1056 FailureOr<ast::VariableDecl *> Parser::parseArgumentDecl() { in parseArgumentDecl()
1070 FailureOr<ast::ConstraintRef> cst = parseArgOrResultConstraint(); in parseArgumentDecl()
1077 FailureOr<ast::VariableDecl *> Parser::parseResultDecl(unsigned resultNum) { in parseResultDecl()
1081 ast::Decl *existingDecl = curDeclScope->lookup(curToken.getSpelling()); in parseResultDecl()
1082 if (isa_and_nonnull<ast::ConstraintDecl>(existingDecl)) { in parseResultDecl()
1104 FailureOr<ast::ConstraintRef> cst = parseArgOrResultConstraint(); in parseResultDecl()
1114 FailureOr<ast::ConstraintRef> cst = parseArgOrResultConstraint(); in parseResultDecl()
1121 FailureOr<ast::UserConstraintDecl *>
1125 return parseUserConstraintOrRewriteDecl<ast::UserConstraintDecl>( in parseUserConstraintDecl()
1132 FailureOr<ast::UserConstraintDecl *> Parser::parseInlineUserConstraintDecl() { in parseInlineUserConstraintDecl()
1133 FailureOr<ast::UserConstraintDecl *> decl = in parseInlineUserConstraintDecl()
1142 FailureOr<ast::UserConstraintDecl *> Parser::parseUserPDLLConstraintDecl( in parseUserPDLLConstraintDecl()
1143 const ast::Name &name, bool isInline, in parseUserPDLLConstraintDecl()
1144 ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope, in parseUserPDLLConstraintDecl()
1145 ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { in parseUserPDLLConstraintDecl()
1152 ast::CompoundStmt *body; in parseUserPDLLConstraintDecl()
1154 FailureOr<ast::CompoundStmt *> bodyResult = parseLambdaBody( in parseUserPDLLConstraintDecl()
1155 [&](ast::Stmt *&stmt) -> LogicalResult { in parseUserPDLLConstraintDecl()
1156 ast::Expr *stmtExpr = dyn_cast<ast::Expr>(stmt); in parseUserPDLLConstraintDecl()
1162 stmt = ast::ReturnStmt::create(ctx, stmt->getLoc(), stmtExpr); in parseUserPDLLConstraintDecl()
1170 FailureOr<ast::CompoundStmt *> bodyResult = parseCompoundStmt(); in parseUserPDLLConstraintDecl()
1178 if (isa<ast::ReturnStmt>(*bodyIt)) in parseUserPDLLConstraintDecl()
1186 return createUserPDLLConstraintOrRewriteDecl<ast::UserConstraintDecl>( in parseUserPDLLConstraintDecl()
1190 FailureOr<ast::UserRewriteDecl *> Parser::parseUserRewriteDecl(bool isInline) { in parseUserRewriteDecl()
1193 return parseUserConstraintOrRewriteDecl<ast::UserRewriteDecl>( in parseUserRewriteDecl()
1198 FailureOr<ast::UserRewriteDecl *> Parser::parseInlineUserRewriteDecl() { in parseInlineUserRewriteDecl()
1199 FailureOr<ast::UserRewriteDecl *> decl = in parseInlineUserRewriteDecl()
1208 FailureOr<ast::UserRewriteDecl *> Parser::parseUserPDLLRewriteDecl( in parseUserPDLLRewriteDecl()
1209 const ast::Name &name, bool isInline, in parseUserPDLLRewriteDecl()
1210 ArrayRef<ast::VariableDecl *> arguments, ast::DeclScope *argumentScope, in parseUserPDLLRewriteDecl()
1211 ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { in parseUserPDLLRewriteDecl()
1215 ast::CompoundStmt *body; in parseUserPDLLRewriteDecl()
1217 FailureOr<ast::CompoundStmt *> bodyResult = parseLambdaBody( in parseUserPDLLRewriteDecl()
1218 [&](ast::Stmt *&statement) -> LogicalResult { in parseUserPDLLRewriteDecl()
1219 if (isa<ast::OpRewriteStmt>(statement)) in parseUserPDLLRewriteDecl()
1222 ast::Expr *statementExpr = dyn_cast<ast::Expr>(statement); in parseUserPDLLRewriteDecl()
1231 ast::ReturnStmt::create(ctx, statement->getLoc(), statementExpr); in parseUserPDLLRewriteDecl()
1239 FailureOr<ast::CompoundStmt *> bodyResult = parseCompoundStmt(); in parseUserPDLLRewriteDecl()
1249 if (isa<ast::ReturnStmt>(*bodyIt)) in parseUserPDLLRewriteDecl()
1254 return createUserPDLLConstraintOrRewriteDecl<ast::UserRewriteDecl>( in parseUserPDLLRewriteDecl()
1267 const ast::Name *name = nullptr; in parseUserConstraintOrRewriteDecl()
1280 name = &ast::Name::create(ctx, anonName, loc); in parseUserConstraintOrRewriteDecl()
1283 name = &ast::Name::create(ctx, curToken.getSpelling(), curToken.getLoc()); in parseUserConstraintOrRewriteDecl()
1288 SmallVector<ast::VariableDecl *> arguments, results; in parseUserConstraintOrRewriteDecl()
1289 ast::DeclScope *argumentScope; in parseUserConstraintOrRewriteDecl()
1290 ast::Type resultType; in parseUserConstraintOrRewriteDecl()
1308 const ast::Name &name, bool isInline, in parseUserNativeConstraintOrRewriteDecl()
1309 ArrayRef<ast::VariableDecl *> arguments, in parseUserNativeConstraintOrRewriteDecl()
1310 ArrayRef<ast::VariableDecl *> results, ast::Type resultType) { in parseUserNativeConstraintOrRewriteDecl()
1329 if (std::is_same<ast::UserConstraintDecl, T>::value && !results.empty()) { in parseUserNativeConstraintOrRewriteDecl()
1337 SmallVectorImpl<ast::VariableDecl *> &arguments, in parseUserConstraintOrRewriteSignature()
1338 SmallVectorImpl<ast::VariableDecl *> &results, in parseUserConstraintOrRewriteSignature()
1339 ast::DeclScope *&argumentScope, ast::Type &resultType) { in parseUserConstraintOrRewriteSignature()
1347 FailureOr<ast::VariableDecl *> argument = parseArgumentDecl(); in parseUserConstraintOrRewriteSignature()
1361 FailureOr<ast::VariableDecl *> result = parseResultDecl(results.size()); in parseUserConstraintOrRewriteSignature()
1397 StringRef declType, ast::CompoundStmt *body, in validateUserConstraintOrRewriteReturn()
1398 ArrayRef<ast::Stmt *>::iterator bodyIt, in validateUserConstraintOrRewriteReturn()
1399 ArrayRef<ast::Stmt *>::iterator bodyE, in validateUserConstraintOrRewriteReturn()
1400 ArrayRef<ast::VariableDecl *> results, ast::Type &resultType) { in validateUserConstraintOrRewriteReturn()
1423 FailureOr<ast::CompoundStmt *> Parser::parsePatternLambdaBody() { in parsePatternLambdaBody()
1424 return parseLambdaBody([&](ast::Stmt *&statement) -> LogicalResult { in parsePatternLambdaBody()
1425 if (isa<ast::OpRewriteStmt>(statement)) in parsePatternLambdaBody()
1434 FailureOr<ast::Decl *> Parser::parsePatternDecl() { in parsePatternDecl()
1441 const ast::Name *name = nullptr; in parsePatternDecl()
1443 name = &ast::Name::create(ctx, curToken.getSpelling(), curToken.getLoc()); in parsePatternDecl()
1453 ast::CompoundStmt *body; in parsePatternDecl()
1457 FailureOr<ast::CompoundStmt *> bodyResult = parsePatternLambdaBody(); in parsePatternDecl()
1464 FailureOr<ast::CompoundStmt *> bodyResult = parseCompoundStmt(); in parsePatternDecl()
1472 if (isa<ast::ReturnStmt>(*bodyIt)) { in parsePatternDecl()
1478 if (isa<ast::OpRewriteStmt>(*bodyIt)) in parsePatternDecl()
1559 FailureOr<ast::Expr *> Parser::parseTypeConstraintExpr() { in parseTypeConstraintExpr()
1562 FailureOr<ast::Expr *> typeExpr = parseExpr(); in parseTypeConstraintExpr()
1570 LogicalResult Parser::checkDefineNamedDecl(const ast::Name &name) { in checkDefineNamedDecl()
1572 if (ast::Decl *lastDecl = curDeclScope->lookup(name.getName())) { in checkDefineNamedDecl()
1580 FailureOr<ast::VariableDecl *>
1581 Parser::defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type, in defineVariableDecl()
1582 ast::Expr *initExpr, in defineVariableDecl()
1583 ArrayRef<ast::ConstraintRef> constraints) { in defineVariableDecl()
1585 const ast::Name &nameDecl = ast::Name::create(ctx, name, nameLoc); in defineVariableDecl()
1590 return ast::VariableDecl::create(ctx, nameDecl, type, initExpr, in defineVariableDecl()
1597 ast::VariableDecl::create(ctx, nameDecl, type, initExpr, constraints); in defineVariableDecl()
1602 FailureOr<ast::VariableDecl *>
1603 Parser::defineVariableDecl(StringRef name, SMRange nameLoc, ast::Type type, in defineVariableDecl()
1604 ArrayRef<ast::ConstraintRef> constraints) { in defineVariableDecl()
1610 SmallVectorImpl<ast::ConstraintRef> &constraints) { in parseVariableDeclConstraintList()
1613 FailureOr<ast::ConstraintRef> constraint = parseConstraint( in parseVariableDeclConstraintList()
1633 FailureOr<ast::ConstraintRef>
1635 ArrayRef<ast::ConstraintRef> existingConstraints, in parseConstraint()
1638 auto parseTypeConstraint = [&](ast::Expr *&typeExpr) -> LogicalResult { in parseConstraint()
1650 FailureOr<ast::Expr *> constraintExpr = parseTypeConstraintExpr(); in parseConstraint()
1664 ast::Expr *typeExpr = nullptr; in parseConstraint()
1667 return ast::ConstraintRef( in parseConstraint()
1668 ast::AttrConstraintDecl::create(ctx, loc, typeExpr), loc); in parseConstraint()
1675 FailureOr<ast::OpNameDecl *> opName = in parseConstraint()
1680 return ast::ConstraintRef(ast::OpConstraintDecl::create(ctx, loc, *opName), in parseConstraint()
1685 return ast::ConstraintRef(ast::TypeConstraintDecl::create(ctx, loc), loc); in parseConstraint()
1688 return ast::ConstraintRef(ast::TypeRangeConstraintDecl::create(ctx, loc), in parseConstraint()
1694 ast::Expr *typeExpr = nullptr; in parseConstraint()
1698 return ast::ConstraintRef( in parseConstraint()
1699 ast::ValueConstraintDecl::create(ctx, loc, typeExpr), loc); in parseConstraint()
1705 ast::Expr *typeExpr = nullptr; in parseConstraint()
1709 return ast::ConstraintRef( in parseConstraint()
1710 ast::ValueRangeConstraintDecl::create(ctx, loc, typeExpr), loc); in parseConstraint()
1715 FailureOr<ast::UserConstraintDecl *> decl = parseInlineUserConstraintDecl(); in parseConstraint()
1718 return ast::ConstraintRef(*decl, loc); in parseConstraint()
1725 ast::Decl *cstDecl = curDeclScope->lookup<ast::Decl>(constraintName); in parseConstraint()
1732 if (auto *cst = dyn_cast<ast::ConstraintDecl>(cstDecl)) in parseConstraint()
1733 return ast::ConstraintRef(cst, loc); in parseConstraint()
1742 ast::Type inferredType; in parseConstraint()
1756 FailureOr<ast::ConstraintRef> Parser::parseArgOrResultConstraint() { in parseArgOrResultConstraint()
1769 FailureOr<ast::Expr *> Parser::parseExpr() { in parseExpr()
1774 FailureOr<ast::Expr *> lhsExpr; in parseExpr()
1820 FailureOr<ast::Expr *> Parser::parseAttributeExpr() { in parseAttributeExpr()
1840 return ast::AttributeExpr::create(ctx, loc, attrExpr); in parseAttributeExpr()
1843 FailureOr<ast::Expr *> Parser::parseCallExpr(ast::Expr *parentExpr) { in parseCallExpr()
1847 SmallVector<ast::Expr *> arguments; in parseCallExpr()
1856 FailureOr<ast::Expr *> argument = parseExpr(); in parseCallExpr()
1870 FailureOr<ast::Expr *> Parser::parseDeclRefExpr(StringRef name, SMRange loc) { in parseDeclRefExpr()
1871 ast::Decl *decl = curDeclScope->lookup(name); in parseDeclRefExpr()
1878 FailureOr<ast::Expr *> Parser::parseIdentifierExpr() { in parseIdentifierExpr()
1886 SmallVector<ast::ConstraintRef> constraints; in parseIdentifierExpr()
1889 ast::Type type; in parseIdentifierExpr()
1898 FailureOr<ast::Expr *> Parser::parseInlineConstraintLambdaExpr() { in parseInlineConstraintLambdaExpr()
1899 FailureOr<ast::UserConstraintDecl *> decl = parseInlineUserConstraintDecl(); in parseInlineConstraintLambdaExpr()
1903 return ast::DeclRefExpr::create(ctx, (*decl)->getLoc(), *decl, in parseInlineConstraintLambdaExpr()
1904 ast::ConstraintType::get(ctx)); in parseInlineConstraintLambdaExpr()
1907 FailureOr<ast::Expr *> Parser::parseInlineRewriteLambdaExpr() { in parseInlineRewriteLambdaExpr()
1908 FailureOr<ast::UserRewriteDecl *> decl = parseInlineUserRewriteDecl(); in parseInlineRewriteLambdaExpr()
1912 return ast::DeclRefExpr::create(ctx, (*decl)->getLoc(), *decl, in parseInlineRewriteLambdaExpr()
1913 ast::RewriteType::get(ctx)); in parseInlineRewriteLambdaExpr()
1916 FailureOr<ast::Expr *> Parser::parseMemberAccessExpr(ast::Expr *parentExpr) { in parseMemberAccessExpr()
1936 FailureOr<ast::OpNameDecl *> Parser::parseOperationName(bool allowEmptyName) { in parseOperationName()
1946 return ast::OpNameDecl::create(ctx, SMRange()); in parseOperationName()
1970 return ast::OpNameDecl::create(ctx, ast::Name::create(ctx, name, loc)); in parseOperationName()
1973 FailureOr<ast::OpNameDecl *>
1976 return ast::OpNameDecl::create(ctx, SMRange()); in parseWrappedOperationName()
1978 FailureOr<ast::OpNameDecl *> opNameDecl = parseOperationName(allowEmptyName); in parseWrappedOperationName()
1987 FailureOr<ast::Expr *>
2003 FailureOr<ast::OpNameDecl *> opNameDecl = in parseOperationExpr()
2011 auto createImplicitRangeVar = [&](ast::ConstraintDecl *cst, ast::Type type) { in parseOperationExpr()
2012 FailureOr<ast::VariableDecl *> rangeVar = in parseOperationExpr()
2013 defineVariableDecl("_", loc, type, ast::ConstraintRef(cst, loc)); in parseOperationExpr()
2015 return ast::DeclRefExpr::create(ctx, loc, *rangeVar, type); in parseOperationExpr()
2019 SmallVector<ast::Expr *> operands; in parseOperationExpr()
2027 ast::ValueRangeConstraintDecl::create(ctx, loc), valueRangeTy)); in parseOperationExpr()
2038 FailureOr<ast::Expr *> operand = parseExpr(); in parseOperationExpr()
2050 SmallVector<ast::NamedAttributeDecl *> attributes; in parseOperationExpr()
2053 FailureOr<ast::NamedAttributeDecl *> decl = in parseOperationExpr()
2066 SmallVector<ast::Expr *> resultTypes; in parseOperationExpr()
2091 FailureOr<ast::Expr *> resultTypeExpr = parseExpr(); in parseOperationExpr()
2107 ast::TypeRangeConstraintDecl::create(ctx, loc), typeRangeTy)); in parseOperationExpr()
2118 FailureOr<ast::Expr *> Parser::parseTupleExpr() { in parseTupleExpr()
2124 SmallVector<ast::Expr *> elements; in parseTupleExpr()
2157 FailureOr<ast::Expr *> element = parseExpr(); in parseTupleExpr()
2170 FailureOr<ast::Expr *> Parser::parseTypeExpr() { in parseTypeExpr()
2189 return ast::TypeExpr::create(ctx, loc, attrExpr); in parseTypeExpr()
2192 FailureOr<ast::Expr *> Parser::parseUnderscoreExpr() { in parseUnderscoreExpr()
2202 SmallVector<ast::ConstraintRef> constraints; in parseUnderscoreExpr()
2206 ast::Type type; in parseUnderscoreExpr()
2215 FailureOr<ast::Stmt *> Parser::parseStmt(bool expectTerminalSemicolon) { in parseStmt()
2216 FailureOr<ast::Stmt *> stmt; in parseStmt()
2244 FailureOr<ast::CompoundStmt *> Parser::parseCompoundStmt() { in parseCompoundStmt()
2250 SmallVector<ast::Stmt *> statements; in parseCompoundStmt()
2252 FailureOr<ast::Stmt *> statement = parseStmt(); in parseCompoundStmt()
2263 return ast::CompoundStmt::create(ctx, location, statements); in parseCompoundStmt()
2266 FailureOr<ast::EraseStmt *> Parser::parseEraseStmt() { in parseEraseStmt()
2273 FailureOr<ast::Expr *> rootOp = parseExpr(); in parseEraseStmt()
2280 FailureOr<ast::LetStmt *> Parser::parseLetStmt() { in parseLetStmt()
2299 SmallVector<ast::ConstraintRef> constraints; in parseLetStmt()
2305 ast::Expr *initializer = nullptr; in parseLetStmt()
2307 FailureOr<ast::Expr *> initOrFailure = parseExpr(); in parseLetStmt()
2314 for (ast::ConstraintRef constraint : constraints) { in parseLetStmt()
2316 TypeSwitch<const ast::Node *, LogicalResult>(constraint.constraint) in parseLetStmt()
2317 .Case<ast::AttrConstraintDecl, ast::ValueConstraintDecl, in parseLetStmt()
2318 ast::ValueRangeConstraintDecl>([&](const auto *cst) { in parseLetStmt()
2333 FailureOr<ast::VariableDecl *> varDecl = in parseLetStmt()
2337 return ast::LetStmt::create(ctx, loc, *varDecl); in parseLetStmt()
2340 FailureOr<ast::ReplaceStmt *> Parser::parseReplaceStmt() { in parseReplaceStmt()
2347 FailureOr<ast::Expr *> rootOp = parseExpr(); in parseReplaceStmt()
2360 SmallVector<ast::Expr *> replValues; in parseReplaceStmt()
2369 FailureOr<ast::Expr *> replExpr = parseExpr(); in parseReplaceStmt()
2381 FailureOr<ast::Expr *> replExpr; in parseReplaceStmt()
2394 FailureOr<ast::ReturnStmt *> Parser::parseReturnStmt() { in parseReturnStmt()
2399 FailureOr<ast::Expr *> resultExpr = parseExpr(); in parseReturnStmt()
2403 return ast::ReturnStmt::create(ctx, loc, *resultExpr); in parseReturnStmt()
2406 FailureOr<ast::RewriteStmt *> Parser::parseRewriteStmt() { in parseRewriteStmt()
2413 FailureOr<ast::Expr *> rootOp = parseExpr(); in parseRewriteStmt()
2427 FailureOr<ast::CompoundStmt *> rewriteBody = parseCompoundStmt(); in parseRewriteStmt()
2432 for (const ast::Stmt *stmt : (*rewriteBody)->getChildren()) { in parseRewriteStmt()
2433 if (isa<ast::ReturnStmt>(stmt)) { in parseRewriteStmt()
2450 ast::CallableDecl *Parser::tryExtractCallableDecl(ast::Node *node) { in tryExtractCallableDecl()
2452 if (auto *init = dyn_cast<ast::DeclRefExpr>(node)) in tryExtractCallableDecl()
2454 return dyn_cast<ast::CallableDecl>(node); in tryExtractCallableDecl()
2457 FailureOr<ast::PatternDecl *>
2458 Parser::createPatternDecl(SMRange loc, const ast::Name *name, in createPatternDecl()
2460 ast::CompoundStmt *body) { in createPatternDecl()
2461 return ast::PatternDecl::create(ctx, loc, name, metadata.benefit, in createPatternDecl()
2465 ast::Type Parser::createUserConstraintRewriteResultType( in createUserConstraintRewriteResultType()
2466 ArrayRef<ast::VariableDecl *> results) { in createUserConstraintRewriteResultType()
2477 return ast::TupleType::get(ctx, llvm::to_vector(resultTypes), in createUserConstraintRewriteResultType()
2483 const ast::Name &name, ArrayRef<ast::VariableDecl *> arguments, in createUserPDLLConstraintOrRewriteDecl()
2484 ArrayRef<ast::VariableDecl *> results, ast::Type resultType, in createUserPDLLConstraintOrRewriteDecl()
2485 ast::CompoundStmt *body) { in createUserPDLLConstraintOrRewriteDecl()
2487 if (auto *retStmt = dyn_cast<ast::ReturnStmt>(body->getChildren().back())) { in createUserPDLLConstraintOrRewriteDecl()
2488 ast::Expr *resultExpr = retStmt->getResultExpr(); in createUserPDLLConstraintOrRewriteDecl()
2504 FailureOr<ast::VariableDecl *>
2505 Parser::createVariableDecl(StringRef name, SMRange loc, ast::Expr *initializer, in createVariableDecl()
2506 ArrayRef<ast::ConstraintRef> constraints) { in createVariableDecl()
2509 ast::Type type; in createVariableDecl()
2518 else if (ast::Type mergedType = type.refineWith(initializer->getType())) in createVariableDecl()
2533 if (type.isa<ast::ConstraintType, ast::RewriteType>()) { in createVariableDecl()
2539 FailureOr<ast::VariableDecl *> varDecl = in createVariableDecl()
2547 FailureOr<ast::VariableDecl *>
2549 const ast::ConstraintRef &constraint) { in createArgOrResultVariableDecl()
2552 ast::Type argType; in createArgOrResultVariableDecl()
2560 Parser::validateVariableConstraints(ArrayRef<ast::ConstraintRef> constraints, in validateVariableConstraints()
2561 ast::Type &inferredType, in validateVariableConstraints()
2563 for (const ast::ConstraintRef &ref : constraints) in validateVariableConstraints()
2570 LogicalResult Parser::validateVariableConstraint(const ast::ConstraintRef &ref, in validateVariableConstraint()
2571 ast::Type &inferredType, in validateVariableConstraint()
2573 ast::Type constraintType; in validateVariableConstraint()
2574 if (const auto *cst = dyn_cast<ast::AttrConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2575 if (const ast::Expr *typeExpr = cst->getTypeExpr()) { in validateVariableConstraint()
2579 constraintType = ast::AttributeType::get(ctx); in validateVariableConstraint()
2581 dyn_cast<ast::OpConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2582 constraintType = ast::OperationType::get( in validateVariableConstraint()
2584 } else if (isa<ast::TypeConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2586 } else if (isa<ast::TypeRangeConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2589 dyn_cast<ast::ValueConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2590 if (const ast::Expr *typeExpr = cst->getTypeExpr()) { in validateVariableConstraint()
2596 dyn_cast<ast::ValueRangeConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2597 if (const ast::Expr *typeExpr = cst->getTypeExpr()) { in validateVariableConstraint()
2603 dyn_cast<ast::UserConstraintDecl>(ref.constraint)) { in validateVariableConstraint()
2611 ArrayRef<ast::VariableDecl *> inputs = cst->getInputs(); in validateVariableConstraint()
2629 } else if (ast::Type mergedTy = inferredType.refineWith(constraintType)) { in validateVariableConstraint()
2640 LogicalResult Parser::validateTypeConstraintExpr(const ast::Expr *typeExpr) { in validateTypeConstraintExpr()
2641 ast::Type typeExprType = typeExpr->getType(); in validateTypeConstraintExpr()
2650 Parser::validateTypeRangeConstraintExpr(const ast::Expr *typeExpr) { in validateTypeRangeConstraintExpr()
2651 ast::Type typeExprType = typeExpr->getType(); in validateTypeRangeConstraintExpr()
2662 FailureOr<ast::CallExpr *>
2663 Parser::createCallExpr(SMRange loc, ast::Expr *parentExpr, in createCallExpr()
2664 MutableArrayRef<ast::Expr *> arguments) { in createCallExpr()
2665 ast::Type parentType = parentExpr->getType(); in createCallExpr()
2667 ast::CallableDecl *callableDecl = tryExtractCallableDecl(parentExpr); in createCallExpr()
2675 if (isa<ast::UserConstraintDecl>(callableDecl)) in createCallExpr()
2678 } else if (isa<ast::UserRewriteDecl>(callableDecl)) { in createCallExpr()
2684 ArrayRef<ast::VariableDecl *> callArgs = callableDecl->getInputs(); in createCallExpr()
2698 auto attachDiagFn = [&](ast::Diagnostic &diag) { in createCallExpr()
2709 return ast::CallExpr::create(ctx, loc, parentExpr, arguments, in createCallExpr()
2713 FailureOr<ast::DeclRefExpr *> Parser::createDeclRefExpr(SMRange loc, in createDeclRefExpr()
2714 ast::Decl *decl) { in createDeclRefExpr()
2716 ast::Type declType; in createDeclRefExpr()
2717 if (isa<ast::ConstraintDecl>(decl)) in createDeclRefExpr()
2718 declType = ast::ConstraintType::get(ctx); in createDeclRefExpr()
2719 else if (isa<ast::UserRewriteDecl>(decl)) in createDeclRefExpr()
2720 declType = ast::RewriteType::get(ctx); in createDeclRefExpr()
2721 else if (auto *varDecl = dyn_cast<ast::VariableDecl>(decl)) in createDeclRefExpr()
2727 return ast::DeclRefExpr::create(ctx, loc, decl, declType); in createDeclRefExpr()
2730 FailureOr<ast::DeclRefExpr *>
2731 Parser::createInlineVariableExpr(ast::Type type, StringRef name, SMRange loc, in createInlineVariableExpr()
2732 ArrayRef<ast::ConstraintRef> constraints) { in createInlineVariableExpr()
2733 FailureOr<ast::VariableDecl *> decl = in createInlineVariableExpr()
2737 return ast::DeclRefExpr::create(ctx, loc, *decl, type); in createInlineVariableExpr()
2740 FailureOr<ast::MemberAccessExpr *>
2741 Parser::createMemberAccessExpr(ast::Expr *parentExpr, StringRef name, in createMemberAccessExpr()
2744 FailureOr<ast::Type> memberType = validateMemberAccess(parentExpr, name, loc); in createMemberAccessExpr()
2748 return ast::MemberAccessExpr::create(ctx, loc, parentExpr, name, *memberType); in createMemberAccessExpr()
2751 FailureOr<ast::Type> Parser::validateMemberAccess(ast::Expr *parentExpr, in validateMemberAccess()
2753 ast::Type parentType = parentExpr->getType(); in validateMemberAccess()
2754 if (ast::OperationType opType = parentType.dyn_cast<ast::OperationType>()) { in validateMemberAccess()
2755 if (name == ast::AllResultsMemberAccessExpr::getMemberName()) in validateMemberAccess()
2780 } else if (auto tupleType = parentType.dyn_cast<ast::TupleType>()) { in validateMemberAccess()
2800 FailureOr<ast::OperationExpr *> Parser::createOperationExpr( in createOperationExpr()
2801 SMRange loc, const ast::OpNameDecl *name, in createOperationExpr()
2803 MutableArrayRef<ast::Expr *> operands, in createOperationExpr()
2804 MutableArrayRef<ast::NamedAttributeDecl *> attributes, in createOperationExpr()
2805 MutableArrayRef<ast::Expr *> results) { in createOperationExpr()
2814 for (ast::NamedAttributeDecl *attr : attributes) { in createOperationExpr()
2816 ast::Type attrType = attr->getValue()->getType(); in createOperationExpr()
2817 if (!attrType.isa<ast::AttributeType>()) { in createOperationExpr()
2841 return ast::OperationExpr::create(ctx, loc, odsOp, name, operands, results, in createOperationExpr()
2848 MutableArrayRef<ast::Expr *> operands) { in validateOperationOperands()
2858 MutableArrayRef<ast::Expr *> results) { in validateOperationResults()
2892 ast::InFlightDiagnostic diag = ctx.getDiagEngine().emitWarning( in checkOperationResultTypeInferrence()
2908 Optional<StringRef> name, MutableArrayRef<ast::Expr *> values, in validateOperationOperandsOrResults()
2909 ArrayRef<ods::OperandOrResult> odsValues, ast::Type singleTy, in validateOperationOperandsOrResults()
2910 ast::Type rangeTy) { in validateOperationOperandsOrResults()
2929 auto diagFn = [&](ast::Diagnostic &diag) { in validateOperationOperandsOrResults()
2934 ast::Type expectedType = odsValues[i].isVariadic() ? rangeTy : singleTy; in validateOperationOperandsOrResults()
2943 for (ast::Expr *&valueExpr : values) { in validateOperationOperandsOrResults()
2944 ast::Type valueExprType = valueExpr->getType(); in validateOperationOperandsOrResults()
2954 if (valueExprType.isa<ast::OperationType>()) { in validateOperationOperandsOrResults()
2969 FailureOr<ast::TupleExpr *>
2970 Parser::createTupleExpr(SMRange loc, ArrayRef<ast::Expr *> elements, in createTupleExpr()
2972 for (const ast::Expr *element : elements) { in createTupleExpr()
2973 ast::Type eleTy = element->getType(); in createTupleExpr()
2974 if (eleTy.isa<ast::ConstraintType, ast::RewriteType, ast::TupleType>()) { in createTupleExpr()
2980 return ast::TupleExpr::create(ctx, loc, elements, elementNames); in createTupleExpr()
2986 FailureOr<ast::EraseStmt *> Parser::createEraseStmt(SMRange loc, in createEraseStmt()
2987 ast::Expr *rootOp) { in createEraseStmt()
2989 ast::Type rootType = rootOp->getType(); in createEraseStmt()
2990 if (!rootType.isa<ast::OperationType>()) in createEraseStmt()
2993 return ast::EraseStmt::create(ctx, loc, rootOp); in createEraseStmt()
2996 FailureOr<ast::ReplaceStmt *>
2997 Parser::createReplaceStmt(SMRange loc, ast::Expr *rootOp, in createReplaceStmt()
2998 MutableArrayRef<ast::Expr *> replValues) { in createReplaceStmt()
3000 ast::Type rootType = rootOp->getType(); in createReplaceStmt()
3001 if (!rootType.isa<ast::OperationType>()) { in createReplaceStmt()
3010 for (ast::Expr *&replExpr : replValues) { in createReplaceStmt()
3011 ast::Type replType = replExpr->getType(); in createReplaceStmt()
3014 if (replType.isa<ast::OperationType>()) { in createReplaceStmt()
3028 return ast::ReplaceStmt::create(ctx, loc, rootOp, replValues); in createReplaceStmt()
3031 FailureOr<ast::RewriteStmt *>
3032 Parser::createRewriteStmt(SMRange loc, ast::Expr *rootOp, in createRewriteStmt()
3033 ast::CompoundStmt *rewriteBody) { in createRewriteStmt()
3035 ast::Type rootType = rootOp->getType(); in createRewriteStmt()
3036 if (!rootType.isa<ast::OperationType>()) { in createRewriteStmt()
3042 return ast::RewriteStmt::create(ctx, loc, rootOp, rewriteBody); in createRewriteStmt()
3049 LogicalResult Parser::codeCompleteMemberAccess(ast::Expr *parentExpr) { in codeCompleteMemberAccess()
3050 ast::Type parentType = parentExpr->getType(); in codeCompleteMemberAccess()
3051 if (ast::OperationType opType = parentType.dyn_cast<ast::OperationType>()) in codeCompleteMemberAccess()
3053 else if (ast::TupleType tupleType = parentType.dyn_cast<ast::TupleType>()) in codeCompleteMemberAccess()
3065 Parser::codeCompleteConstraintName(ast::Type inferredType, in codeCompleteConstraintName()
3094 void Parser::codeCompleteCallSignature(ast::Node *parent, in codeCompleteCallSignature()
3096 ast::CallableDecl *callableDecl = tryExtractCallableDecl(parent); in codeCompleteCallSignature()
3119 FailureOr<ast::Module *>
3120 mlir::pdll::parsePDLLAST(ast::Context &ctx, llvm::SourceMgr &sourceMgr, in parsePDLLAST()