[mlir:PDLL] Fix signature help for operation operands

We were currently only completing on the first operand because
the completion check was outside of the parse loop.

Differential Revision: https://reviews.llvm.org/D124784
This commit is contained in:
River Riddle 2022-04-30 00:32:24 -07:00
parent 01652d889c
commit 0429472efe
3 changed files with 162 additions and 14 deletions

View File

@ -1982,14 +1982,14 @@ Parser::parseOperationExpr(OpResultTypeContext inputResultTypeContext) {
ast::ValueRangeConstraintDecl::create(ctx, loc), valueRangeTy));
}
} else if (!consumeIf(Token::r_paren)) {
// Check for operand signature code completion.
if (curToken.is(Token::code_complete)) {
codeCompleteOperationOperandsSignature(opName, operands.size());
return failure();
}
// If the operand list was specified and non-empty, parse the operands.
do {
// Check for operand signature code completion.
if (curToken.is(Token::code_complete)) {
codeCompleteOperationOperandsSignature(opName, operands.size());
return failure();
}
FailureOr<ast::Expr *> operand = parseExpr();
if (failed(operand))
return failure();

View File

@ -1,4 +1,10 @@
include "mlir/IR/OpBase.td"
// This file is merely to test the processing of includes, it has
// no other purpose or contents.
def Test_Dialect : Dialect {
let name = "test";
}
def OpMulti : Op<Test_Dialect, "multi"> {
let arguments = (outs I64:$operand, I64:$operand2);
let results = (outs I64:$result, I64:$result2);
}

View File

@ -1,16 +1,16 @@
// RUN: mlir-pdll-lsp-server -lit-test < %s | FileCheck -strict-whitespace %s
// RUN: mlir-pdll-lsp-server -pdll-extra-dir %S -pdll-extra-dir %S/../../include -lit-test < %s | FileCheck -strict-whitespace %s
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"pdll","capabilities":{},"trace":"off"}}
// -----
{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{
"uri":"test:///foo.pdll",
"languageId":"pdll",
"version":1,
"text":"Constraint ValueCst(value: Value);\nPattern {\nlet root = op<test.op>() -> ();\nValueCst(root);\nerase root;\n}"
"text":"#include \"include/included.td\"\nConstraint ValueCst(value: Value, value2: Value);\nPattern {\nlet root = op<test.multi>(val: Value, val) -> (ty: Type, ty);\nValueCst(root.result, root.result2);\nerase root;\n}"
}}}
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":2,"character":23}
"position":{"line":3,"character":26}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
@ -19,6 +19,26 @@
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "`op<test.multi>` ODS operand specification",
// CHECK-NEXT: "label": "(operand: Value, operand2: Value)",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 1,
// CHECK-NEXT: 15
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 17,
// CHECK-NEXT: 32
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "Generic operation operand specification",
// CHECK-NEXT: "label": "(<operands>: ValueRange)",
// CHECK-NEXT: "parameters": [
@ -36,7 +56,40 @@
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":2,"character":29}
"position":{"line":3,"character":38}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
// CHECK-NEXT: "result": {
// CHECK-NEXT: "activeParameter": 1,
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "`op<test.multi>` ODS operand specification",
// CHECK-NEXT: "label": "(operand: Value, operand2: Value)",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 1,
// CHECK-NEXT: 15
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 17,
// CHECK-NEXT: 32
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":3,"character":47}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
@ -45,6 +98,26 @@
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "`op<test.multi>` ODS result specification",
// CHECK-NEXT: "label": "(result: Type, result2: Type)",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 1,
// CHECK-NEXT: 13
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 15,
// CHECK-NEXT: 28
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "Generic operation result specification",
// CHECK-NEXT: "label": "(<results>: TypeRange)",
// CHECK-NEXT: "parameters": [
@ -62,7 +135,40 @@
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":3,"character":9}
"position":{"line":3,"character":57}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
// CHECK-NEXT: "result": {
// CHECK-NEXT: "activeParameter": 1,
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "`op<test.multi>` ODS result specification",
// CHECK-NEXT: "label": "(result: Type, result2: Type)",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 1,
// CHECK-NEXT: 13
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "documentation": "64-bit signless integer",
// CHECK-NEXT: "label": [
// CHECK-NEXT: 15,
// CHECK-NEXT: 28
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":4,"character":9}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
@ -71,13 +177,49 @@
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "ValueCst(value: Value) -> Tuple<>",
// CHECK-NEXT: "label": "ValueCst(value: Value, value2: Value) -> Tuple<>",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": [
// CHECK-NEXT: 9,
// CHECK-NEXT: 21
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "label": [
// CHECK-NEXT: 23,
// CHECK-NEXT: 36
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// -----
{"jsonrpc":"2.0","id":1,"method":"textDocument/signatureHelp","params":{
"textDocument":{"uri":"test:///foo.pdll"},
"position":{"line":4,"character":21}
}}
// CHECK: "id": 1
// CHECK-NEXT: "jsonrpc": "2.0",
// CHECK-NEXT: "result": {
// CHECK-NEXT: "activeParameter": 1,
// CHECK-NEXT: "activeSignature": 0,
// CHECK-NEXT: "signatures": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "ValueCst(value: Value, value2: Value) -> Tuple<>",
// CHECK-NEXT: "parameters": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": [
// CHECK-NEXT: 9,
// CHECK-NEXT: 21
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "label": [
// CHECK-NEXT: 23,
// CHECK-NEXT: 36
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }