add imports to autodcomplete

pull/5370/head
filip mertens 2 years ago
parent 14f9c4ad82
commit e6299ebec9
  1. 262
      libs/remix-ui/editor/src/lib/providers/completion/completionGlobals.ts
  2. 17
      libs/remix-ui/editor/src/lib/providers/completionProvider.ts

@ -389,6 +389,268 @@ export function GeCompletionUnits(range: IRange, monaco): monaco.languages.Compl
return completionItems; return completionItems;
} }
export function GetImports(range: IRange, monaco): monaco.languages.CompletionItem[] {
let list = [
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/ERC20.sol',
label: 'OZ ERC20',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC721/ERC721.sol',
label: 'OZ ERC721',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/access/Ownable.sol',
label: 'OZ Ownable',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/Counters.sol',
label: 'OZ Counters',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/Address.sol',
label: 'OZ Address',
range
},
{
detail: '@openzeppelin/contracts/utils/Context.sol',
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/Context.sol',
label: 'OZ Context',
range
},
{
detail: '@openzeppelin/contracts/utils/EnumerableSet.sol',
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/EnumerableSet.sol',
label: 'OZ EnumerableSet',
range
},
{
detail: '@openzeppelin/contracts/utils/EnumerableMap.sol',
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/EnumerableMap.sol',
label: 'OZ EnumerableMap',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/Strings.sol',
label: 'OZ Strings',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/ReentrancyGuard.sol',
label: 'OZ ReentrancyGuard',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/Pausable.sol',
label: 'OZ Pausable',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/structs/EnumerableSet.sol',
label: 'OZ EnumerableSet',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/structs/EnumerableMap.sol',
label: 'OZ EnumerableMap',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/SafeMath.sol',
label: 'OZ SafeMath',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/SafeCast.sol',
label: 'OZ SafeCast',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/Math.sol',
label: 'OZ Math',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/SignedSafeMath.sol',
label: 'OZ SignedSafeMath',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/SafeMath.sol',
label: 'OZ SafeMath',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/utils/math/SafeCast.sol',
label: 'OZ SafeCast',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol',
label: 'OZ ERC20Burnable',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol',
label: 'OZ ERC20Pausable',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol',
label: 'OZ ERC20Snapshot',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol',
label: 'OZ ERC20Permit',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Votes.sol',
label: 'OZ ERC20Votes',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC1155/ERC1155.sol',
label: 'OZ ERC1155',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/IERC20.sol',
label: 'OZ IERC20',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC721/IERC721.sol',
label: 'OZ IERC721',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC1155/IERC1155.sol',
label: 'OZ IERC1155',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/IERC20Metadata.sol',
label: 'OZ IERC20Metadata',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol',
label: 'OZ IERC721Metadata',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol',
label: 'OZ IERC1155MetadataURI',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol',
label: 'OZ IERC1155Receiver',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol',
label: 'OZ IERC721Receiver',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol',
label: 'OZ SafeERC20',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/Governor.sol',
label: 'OZ Governor',
range
},
{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol',
label: 'OZ GovernorCountingSimple',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorVotes.sol',
label: 'OZ GovernorVotes',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol',
label: 'OZ GovernorVotesQuorumFraction',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorTimelockCompound.sol',
label: 'OZ GovernorTimelockCompound',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol',
label: 'OZ GovernorTimelockControl',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol',
label: 'OZ GovernorCountingSimple',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorSettings.sol',
label: 'OZ GovernorSettings',
range
},{
kind: monaco.languages.CompletionItemKind.Module,
insertText: '@openzeppelin/contracts/governance/extensions/GovernorCompatibilityBravo.sol',
label: 'OZ GovernorCompatibilityBravo',
range
}
]
list = list.map((item) => {
return {
...item,
label: `${item.label}: ${item.insertText}`,
}
})
console.log(list)
return list;
};
export function GetGlobalVariable(range: IRange, monaco): monaco.languages.CompletionItem[] { export function GetGlobalVariable(range: IRange, monaco): monaco.languages.CompletionItem[] {
return [ return [

@ -4,7 +4,7 @@ import { isArray } from "lodash"
import { editor, languages, Position } from "monaco-editor" import { editor, languages, Position } from "monaco-editor"
import monaco from "../../types/monaco" import monaco from "../../types/monaco"
import { EditorUIProps } from "../remix-ui-editor" import { EditorUIProps } from "../remix-ui-editor"
import { GeCompletionUnits, GetCompletionKeywords, getCompletionSnippets, GetCompletionTypes, getContextualAutoCompleteBTypeName, getContextualAutoCompleteByGlobalVariable, GetGlobalFunctions, GetGlobalVariable } from "./completion/completionGlobals" import { GeCompletionUnits, GetCompletionKeywords, getCompletionSnippets, GetCompletionTypes, getContextualAutoCompleteBTypeName, getContextualAutoCompleteByGlobalVariable, GetGlobalFunctions, GetGlobalVariable, GetImports } from "./completion/completionGlobals"
export class RemixCompletionProvider implements languages.CompletionItemProvider { export class RemixCompletionProvider implements languages.CompletionItemProvider {
@ -16,7 +16,7 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider
this.monaco = monaco this.monaco = monaco
} }
triggerCharacters = ['.', ''] triggerCharacters = ['.', '', '"']
async provideCompletionItems(model: editor.ITextModel, position: Position, context: monaco.languages.CompletionContext): Promise<monaco.languages.CompletionList | undefined> { async provideCompletionItems(model: editor.ITextModel, position: Position, context: monaco.languages.CompletionContext): Promise<monaco.languages.CompletionList | undefined> {
const completionSettings = await this.props.plugin.call('config', 'getAppParameter', 'settings/auto-completion') const completionSettings = await this.props.plugin.call('config', 'getAppParameter', 'settings/auto-completion')
@ -33,6 +33,19 @@ export class RemixCompletionProvider implements languages.CompletionItemProvider
let nodes: AstNode[] = [] let nodes: AstNode[] = []
let suggestions: monaco.languages.CompletionItem[] = [] let suggestions: monaco.languages.CompletionItem[] = []
if (context.triggerCharacter === '"') {
const ast = await this.props.plugin.call('codeParser', 'parseSolidity', line)
if (ast && ast.children && ast.children[0] && ast.children[0].type === "ImportDirective") {
suggestions = [...suggestions,
...GetImports(range, this.monaco),
]
}else{
return
}
} else
if (context.triggerCharacter === '.') { if (context.triggerCharacter === '.') {
const lineTextBeforeCursor: string = line.substring(0, position.column - 1) const lineTextBeforeCursor: string = line.substring(0, position.column - 1)
const lastNodeInExpression = await this.getLastNodeInExpression(lineTextBeforeCursor) const lastNodeInExpression = await this.getLastNodeInExpression(lineTextBeforeCursor)

Loading…
Cancel
Save