From 0fa35661668988410a7d6b6d302da6a81c552826 Mon Sep 17 00:00:00 2001 From: STetsing <41009393+STetsing@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:25:05 +0100 Subject: [PATCH 1/2] initila support for vyper and circom --- .../editor/src/lib/remix-ui-editor.tsx | 13 ++++ .../remix-ui/editor/src/lib/syntaxes/vyper.ts | 75 +++++++++++++++++++ libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 2 +- 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 libs/remix-ui/editor/src/lib/syntaxes/vyper.ts diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index e330efb78a8..5a7696484e5 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -9,6 +9,7 @@ import { solidityTokensProvider, solidityLanguageConfig } from './syntaxes/solid import { cairoTokensProvider, cairoLanguageConfig } from './syntaxes/cairo' import { zokratesTokensProvider, zokratesLanguageConfig } from './syntaxes/zokrates' import { moveTokenProvider, moveLanguageConfig } from './syntaxes/move' +import { vyperTokenProvider, vyperLanguageConfig } from './syntaxes/vyper' import { tomlLanguageConfig, tomlTokenProvider } from './syntaxes/toml' import { monacoTypes } from '@remix-ui/editor' import { loadTypes } from './web-types' @@ -357,6 +358,7 @@ export const EditorUI = (props: EditorUIProps) => { }) if (file.language === 'sol') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-solidity') + console.log('monaco ref set to solidity') } else if (file.language === 'cairo') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-cairo') } else if (file.language === 'zokrates') { @@ -365,10 +367,14 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current.editor.setModelLanguage(file.model, 'remix-move') } else if (file.language === 'circom') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-circom') + console.log('monaco ref set to circom') } else if (file.language === 'toml') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-toml') } else if (file.language === 'noir') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-noir') + } else if (file.language === 'python') { + console.log('monaco ref set to vyper') + monacoRef.current.editor.setModelLanguage(file.model, 'remix-vyper') } }, [props.currentFile, props.isDiff]) @@ -1011,6 +1017,7 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current.languages.register({ id: 'remix-zokrates' }) monacoRef.current.languages.register({ id: 'remix-move' }) monacoRef.current.languages.register({ id: 'remix-circom' }) + monacoRef.current.languages.register({ id: 'remix-vyper' }) monacoRef.current.languages.register({ id: 'remix-toml' }) monacoRef.current.languages.register({ id: 'remix-noir' }) @@ -1035,6 +1042,7 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current.languages.setMonarchTokensProvider('remix-circom', circomTokensProvider as any) monacoRef.current.languages.setLanguageConfiguration('remix-circom', circomLanguageConfig(monacoRef.current) as any) + monacoRef.current.languages.registerInlineCompletionsProvider('remix-circom', inlineCompletionProvider) monacoRef.current.languages.setMonarchTokensProvider('remix-toml', tomlTokenProvider as any) monacoRef.current.languages.setLanguageConfiguration('remix-toml', tomlLanguageConfig as any) @@ -1050,6 +1058,11 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current.languages.registerInlineCompletionsProvider('remix-solidity', inlineCompletionProvider) monaco.languages.registerCodeActionProvider('remix-solidity', new RemixCodeActionProvider(props, monaco)) + monacoRef.current.languages.setMonarchTokensProvider('remix-vyper', vyperTokenProvider as any) + monacoRef.current.languages.setLanguageConfiguration('remix-vyper', vyperLanguageConfig as any) + monacoRef.current.languages.registerCompletionItemProvider('remix-vyper', new RemixCompletionProvider(props, monaco)) + monacoRef.current.languages.registerInlineCompletionsProvider('remix-vyper', inlineCompletionProvider) + loadTypes(monacoRef.current) } diff --git a/libs/remix-ui/editor/src/lib/syntaxes/vyper.ts b/libs/remix-ui/editor/src/lib/syntaxes/vyper.ts new file mode 100644 index 00000000000..59545ab13a8 --- /dev/null +++ b/libs/remix-ui/editor/src/lib/syntaxes/vyper.ts @@ -0,0 +1,75 @@ +export const vyperLanguageConfig = { + comments: { + lineComment: "#", + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ], + autoClosingPairs: [ + { open: "[", close: "]" }, + { open: "{", close: "}" }, + { open: "(", close: ")" }, + { open: "'", close: "'", notIn: ["string"] }, + { open: '"', close: '"', notIn: ["string"] }, + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: "'", close: "'" }, + { open: '"', close: '"' }, + ], +}; + +export const vyperTokenProvider = { + keywords: [ + "contract", "def", "if", "elif", "else", "for", "while", "break", "continue", "return", "assert", "pass", "log", "struct", + "event", "indexed", "public", "private", "pure", "view", "payable", "nonpayable", "external", "internal", "self", "send", + "call", "delegatecall", "transfer", "mod", "range", "True", "False", "None", + ], + + typeKeywords: [ + "address", "bool", "bytes", "bytes32", "decimal", "int128", "uint256", "string", "mapping", "immutable", + ], + + operators: [ + "=", "+", "-", "*", "/", "%", "**", "//", "&", "|", "^", "~", "<<", ">>", "+=", "-=", "*=", "/=", "%=", "**=", "//=", + "&=", "|=", "^=", "<<=", ">>=", "==", "!=", "<", "<=", ">", ">=", "and", "or", "not", + ], + + symbols: /[=> { data-id="remix_ai_switch" id='remix_ai_switch' className="btn ai-switch text-ai pl-2 pr-0 py-0" - disabled={!(tabsState.currentExt === 'sol')} + disabled={!((tabsState.currentExt === 'sol') || (tabsState.currentExt === 'vy') || (tabsState.currentExt === 'circom') )} onClick={async () => { await props.plugin.call('settings', 'updateCopilotChoice', !ai_switch) setAI_switch(!ai_switch) From 1621b807a0e9c06f662de36063174e9021d4ffc9 Mon Sep 17 00:00:00 2001 From: STetsing <41009393+STetsing@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:24:30 +0100 Subject: [PATCH 2/2] minor --- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 5a7696484e5..b38ad5a7d48 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -358,7 +358,6 @@ export const EditorUI = (props: EditorUIProps) => { }) if (file.language === 'sol') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-solidity') - console.log('monaco ref set to solidity') } else if (file.language === 'cairo') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-cairo') } else if (file.language === 'zokrates') { @@ -367,13 +366,11 @@ export const EditorUI = (props: EditorUIProps) => { monacoRef.current.editor.setModelLanguage(file.model, 'remix-move') } else if (file.language === 'circom') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-circom') - console.log('monaco ref set to circom') } else if (file.language === 'toml') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-toml') } else if (file.language === 'noir') { monacoRef.current.editor.setModelLanguage(file.model, 'remix-noir') } else if (file.language === 'python') { - console.log('monaco ref set to vyper') monacoRef.current.editor.setModelLanguage(file.model, 'remix-vyper') } }, [props.currentFile, props.isDiff])