diff --git a/server/src/e2e/suite/testcases/signatureHelp/initOf.test b/server/src/e2e/suite/testcases/signatureHelp/initOf.test index e9d5d7da..b410a2f3 100644 --- a/server/src/e2e/suite/testcases/signatureHelp/initOf.test +++ b/server/src/e2e/suite/testcases/signatureHelp/initOf.test @@ -57,3 +57,54 @@ contract ContractB { ------------------------------------------------------------------------ b: Int init(a: Int, b: Int, c: Int) + +======================================================================== +initOf for contract with parameter +======================================================================== +primitive Int; + +contract ContractA(a: Int) { +} + +contract ContractB { + init() { + initOf ContractA() + } +} +------------------------------------------------------------------------ +a: Int +init(a: Int) + +======================================================================== +initOf for contract with parameters +======================================================================== +primitive Int; + +contract ContractA(a: Int, other: Int) { +} + +contract ContractB { + init() { + initOf ContractA(10, ) + } +} +------------------------------------------------------------------------ +other: Int +init(a: Int, other: Int) + +======================================================================== +initOf for contract without parameters +======================================================================== +primitive Int; + +contract ContractA { +} + +contract ContractB { + init() { + initOf ContractA() + } +} +------------------------------------------------------------------------ + +init() diff --git a/server/src/server.ts b/server/src/server.ts index 995c9a1e..f1777c47 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -1138,12 +1138,22 @@ connection.onInitialize(async (initParams: lsp.InitializeParams): Promise { - const findParametersNode = (element: NamedNode): SyntaxNode | null => { + const findParameters = (element: NamedNode): Node[] => { if (element instanceof Contract) { - return element.initFunction()?.node.childForFieldName("parameters") ?? null + const initFunction = element.initFunction() + if (initFunction) { + return initFunction.parameters() + } + return element.parameters() } - return element.node.childForFieldName("parameters") + const parameters = element.node.childForFieldName("parameters") + if (!parameters) return [] + + return parameters.children + .filter(param => param?.type === "parameter") + .filter(param => param !== null) + .map(param => new Node(param, element.file)) } const findSignatureHelpNode = (node: SyntaxNode): SyntaxNode | null => { @@ -1238,20 +1248,14 @@ connection.onInitialize(async (initParams: lsp.InitializeParams): Promise value?.type === "parameter") - .filter(value => value !== null) - - const rawArguments = call.rawArguments() - - const parametersInfo: lsp.ParameterInformation[] = parameters.map(value => ({ - label: value.text, + const parameters = findParameters(res) + const parametersInfo: lsp.ParameterInformation[] = parameters.map(param => ({ + label: param.node.text, })) const parametersString = parametersInfo.map(el => el.label).join(", ") + const rawArguments = call.rawArguments() + if (callNode.type === "initOf") { return { rawArguments,