@ -16,6 +16,7 @@ import { retrieveNodesAtPosition } from './helpers/retrieveNodesAtPosition'
import { RemixHoverProvider } from './providers/hoverProvider'
import { RemixHoverProvider } from './providers/hoverProvider'
import { RemixReferenceProvider } from './providers/referenceProvider'
import { RemixReferenceProvider } from './providers/referenceProvider'
import { RemixCompletionProvider } from './providers/completionProvider'
import { RemixCompletionProvider } from './providers/completionProvider'
import { RemixSolidityDocumentationProvider } from './providers/documentationProvider'
import { RemixHighLightProvider } from './providers/highlightProvider'
import { RemixHighLightProvider } from './providers/highlightProvider'
import { RemixDefinitionProvider } from './providers/definitionProvider'
import { RemixDefinitionProvider } from './providers/definitionProvider'
import { RemixCodeActionProvider } from './providers/codeActionProvider'
import { RemixCodeActionProvider } from './providers/codeActionProvider'
@ -23,6 +24,7 @@ import './remix-ui-editor.css'
import { circomLanguageConfig , circomTokensProvider } from './syntaxes/circom'
import { circomLanguageConfig , circomTokensProvider } from './syntaxes/circom'
import { IPosition } from 'monaco-editor'
import { IPosition } from 'monaco-editor'
import { RemixInLineCompletionProvider } from './providers/inlineCompletionProvider'
import { RemixInLineCompletionProvider } from './providers/inlineCompletionProvider'
import { providers } from 'ethers'
const _paq = ( window . _paq = window . _paq || [ ] )
const _paq = ( window . _paq = window . _paq || [ ] )
enum MarkerSeverity {
enum MarkerSeverity {
@ -174,6 +176,8 @@ export const EditorUI = (props: EditorUIProps) => {
const currentFunction = useRef ( '' )
const currentFunction = useRef ( '' )
const currentFileRef = useRef ( '' )
const currentFileRef = useRef ( '' )
const currentUrlRef = useRef ( '' )
const currentUrlRef = useRef ( '' )
let currenFunctionNode = useRef ( '' )
// const currentDecorations = useRef({ sourceAnnotationsPerFile: {}, markerPerFile: {} }) // decorations that are currently in use by the editor
// const currentDecorations = useRef({ sourceAnnotationsPerFile: {}, markerPerFile: {} }) // decorations that are currently in use by the editor
// const registeredDecorations = useRef({}) // registered decorations
// const registeredDecorations = useRef({}) // registered decorations
@ -713,6 +717,12 @@ export const EditorUI = (props: EditorUIProps) => {
}
}
let gptGenerateDocumentationAction
let gptGenerateDocumentationAction
const extractNatspecComments = ( codeString : string ) : string = > {
const natspecCommentRegex = /\/\*\*[\s\S]*?\*\//g ;
const comments = codeString . match ( natspecCommentRegex ) ;
return comments ? comments [ 0 ] : "" ;
}
const executeGptGenerateDocumentationAction = {
const executeGptGenerateDocumentationAction = {
id : 'generateDocumentation' ,
id : 'generateDocumentation' ,
label : intl.formatMessage ( { id : 'editor.generateDocumentation' } ) ,
label : intl.formatMessage ( { id : 'editor.generateDocumentation' } ) ,
@ -726,7 +736,23 @@ export const EditorUI = (props: EditorUIProps) => {
const file = await props . plugin . call ( 'fileManager' , 'getCurrentFile' )
const file = await props . plugin . call ( 'fileManager' , 'getCurrentFile' )
const content = await props . plugin . call ( 'fileManager' , 'readFile' , file )
const content = await props . plugin . call ( 'fileManager' , 'readFile' , file )
const message = intl . formatMessage ( { id : 'editor.generateDocumentationByAI' } , { content , currentFunction : currentFunction.current } )
const message = intl . formatMessage ( { id : 'editor.generateDocumentationByAI' } , { content , currentFunction : currentFunction.current } )
await props . plugin . call ( 'solcoder' , 'code_explaining' , message )
const cm = await props . plugin . call ( 'solcoder' , 'code_explaining' , message )
const natspecCom = extractNatspecComments ( cm )
const cln = await props . plugin . call ( 'codeParser' , "getLineColumnOfNode" , currenFunctionNode )
const range = new monacoRef . current . Range ( cln . start . line , cln . start . column , cln . start . line , cln . start . column )
// TODO: activate the provider to let the user accept the documentation suggestion
// const provider = new RemixSolidityDocumentationProvider(natspecCom)
// editor.inlineProviderDisposable = monacoRef.current.languages.registerInlineCompletionsProvider('remix-docu', provider)
editor . executeEdits ( 'inlineCompletionDocu' , [
{
range : range ,
text : natspecCom ,
forceMoveMarkers : true ,
} ,
] ) ;
_paq . push ( [ 'trackEvent' , 'ai' , 'solcoder' , 'generateDocumentation' ] )
_paq . push ( [ 'trackEvent' , 'ai' , 'solcoder' , 'generateDocumentation' ] )
} ,
} ,
}
}
@ -845,6 +871,8 @@ export const EditorUI = (props: EditorUIProps) => {
const functionImpl = nodesAtPosition . find ( ( node ) = > node . kind === 'function' )
const functionImpl = nodesAtPosition . find ( ( node ) = > node . kind === 'function' )
if ( functionImpl ) {
if ( functionImpl ) {
currentFunction . current = functionImpl . name
currentFunction . current = functionImpl . name
currenFunctionNode = functionImpl
executeGptGenerateDocumentationAction . label = intl . formatMessage ( { id : 'editor.generateDocumentation2' } , { name : functionImpl.name } )
executeGptGenerateDocumentationAction . label = intl . formatMessage ( { id : 'editor.generateDocumentation2' } , { name : functionImpl.name } )
gptGenerateDocumentationAction = editor . addAction ( executeGptGenerateDocumentationAction )
gptGenerateDocumentationAction = editor . addAction ( executeGptGenerateDocumentationAction )
executegptExplainFunctionAction . label = intl . formatMessage ( { id : 'editor.explainFunction2' } , { name : functionImpl.name } )
executegptExplainFunctionAction . label = intl . formatMessage ( { id : 'editor.explainFunction2' } , { name : functionImpl.name } )