diff --git a/libs/remix-ui/editor/src/lib/providers/completionProvider.ts b/libs/remix-ui/editor/src/lib/providers/completionProvider.ts index 9c3f5cd3ba..2af96f0fb8 100644 --- a/libs/remix-ui/editor/src/lib/providers/completionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/completionProvider.ts @@ -57,9 +57,13 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider if (lastNodeInExpression.name === 'this') { dotCompleted = true let thisCompletionNodes = await this.getContractCompletions(nodes, position) - thisCompletionNodes = thisCompletionNodes.filter(node => - { - if(node.visibility && node.visibility === 'internal') { + + // with this. you can't have internal nodes and no contractDefinitions + thisCompletionNodes = thisCompletionNodes.filter(node => { + if (node.visibility && node.visibility === 'internal') { + return false + } + if(node.nodeType && node.nodeType === 'ContractDefinition') { return false } return true @@ -126,22 +130,22 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider // brute force search in all nodes with the name //if (!nodes.length || 1) { - const nodesOfScope = await this.props.plugin.call('codeParser', 'getNodesWithName', last) - console.log('NODES WITHE NAME ', last, nodesOfScope) - for (const nodeOfScope of nodesOfScope) { - if (nodeOfScope.name === last) { - console.log('FOUND NODE', nodeOfScope) - if (nodeOfScope.typeName && nodeOfScope.typeName.nodeType === 'UserDefinedTypeName') { - const declarationOf = await this.props.plugin.call('codeParser', 'declarationOf', nodeOfScope.typeName) - console.log('METHOD 3 HAS DECLARATION OF', declarationOf) - nodes = [...nodes, ...declarationOf.nodes || declarationOf.members] - //const baseContracts = await this.getlinearizedBaseContracts(declarationOf) - //for (const baseContract of baseContracts) { - //nodes = [...nodes, ...baseContract.nodes] - //} - } + const nodesOfScope = await this.props.plugin.call('codeParser', 'getNodesWithName', last) + console.log('NODES WITHE NAME ', last, nodesOfScope) + for (const nodeOfScope of nodesOfScope) { + if (nodeOfScope.name === last) { + console.log('FOUND NODE', nodeOfScope) + if (nodeOfScope.typeName && nodeOfScope.typeName.nodeType === 'UserDefinedTypeName') { + const declarationOf = await this.props.plugin.call('codeParser', 'declarationOf', nodeOfScope.typeName) + console.log('METHOD 3 HAS DECLARATION OF', declarationOf) + nodes = [...nodes, ...declarationOf.nodes || declarationOf.members] + //const baseContracts = await this.getlinearizedBaseContracts(declarationOf) + //for (const baseContract of baseContracts) { + //nodes = [...nodes, ...baseContract.nodes] + //} } } + } //} } } else { @@ -154,7 +158,15 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider ...GetGlobalFunctions(range, this.monaco), ...GeCompletionUnits(range, this.monaco), ] - nodes = [...nodes, ...await this.getContractCompletions(nodes, position)] + let thisCompletionNodes = await this.getContractCompletions(nodes, position) + // we can't have external nodes without using this. + thisCompletionNodes = thisCompletionNodes.filter(node => { + if (node.visibility && node.visibility === 'external') { + return false + } + return true + }) + nodes = [...nodes, ...thisCompletionNodes] } @@ -321,6 +333,7 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider if (isArray(nodesAtPosition) && nodesAtPosition.length) { for (const node of nodesAtPosition) { const nodesOfScope = await this.props.plugin.call('codeParser', 'getNodesWithScope', node.id) + for (const nodeOfScope of nodesOfScope) { const imports = await this.props.plugin.call('codeParser', 'resolveImports', nodeOfScope) if (imports) { @@ -330,6 +343,12 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider } } } + // if the node is a contract at this positio mark the nodes as the contractNodes + if (node.nodeType === 'ContractDefinition') { + for (const node of nodesOfScope) { + node.isInContract = true + } + } nodes = [...nodes, ...nodesOfScope] } // get the linearized base contracts @@ -344,6 +363,15 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider nodes = [...nodes, ...await this.props.plugin.call('codeParser', 'listAstNodes')] } + // filter private nodes, only allow them when isContract is true + nodes = nodes.filter(node => { + if (node.visibility) { + if (!node.isInContract) { + return node.visibility !== 'private' + } + } + return true + }) return nodes }