@@ -81,93 +81,113 @@ const MonacoEditorCore: React.FC<CommonEditorProps> = (props) => {
81
81
editor . focus ( ) ;
82
82
} , [ ] ) ;
83
83
84
- useEditorProp ( editor , props . onEditCode , ( _editor , model , onEditCode ) => {
85
- model . onDidChangeContent ( ( ) => {
86
- onEditCode ( model . getValue ( ) ) ;
87
- } ) ;
88
- } ) ;
89
-
90
- useEditorProp ( editor , props . execute , ( editor , _model , execute ) => {
91
- editor . addCommand ( monaco . KeyMod . CtrlCmd | monaco . KeyCode . Enter , ( ) => {
92
- execute ( ) ;
93
- } ) ;
94
- // Ace's Vim mode runs code with :w, so let's do the same
95
- editor . addCommand ( monaco . KeyMod . CtrlCmd | monaco . KeyCode . KeyS , ( ) => {
96
- execute ( ) ;
97
- } ) ;
98
- } ) ;
84
+ useEditorProp (
85
+ editor ,
86
+ props . onEditCode ,
87
+ useCallback ( ( _editor , model , onEditCode ) => {
88
+ model . onDidChangeContent ( ( ) => {
89
+ onEditCode ( model . getValue ( ) ) ;
90
+ } ) ;
91
+ } , [ ] ) ,
92
+ ) ;
99
93
100
- useEditorProp ( editor , props . code , ( editor , model , code ) => {
101
- // Short-circuit if nothing interesting to change.
102
- if ( code === model . getValue ( ) ) {
103
- return ;
104
- }
94
+ useEditorProp (
95
+ editor ,
96
+ props . execute ,
97
+ useCallback ( ( editor , _model , execute ) => {
98
+ editor . addCommand ( monaco . KeyMod . CtrlCmd | monaco . KeyCode . Enter , ( ) => {
99
+ execute ( ) ;
100
+ } ) ;
101
+ // Ace's Vim mode runs code with :w, so let's do the same
102
+ editor . addCommand ( monaco . KeyMod . CtrlCmd | monaco . KeyCode . KeyS , ( ) => {
103
+ execute ( ) ;
104
+ } ) ;
105
+ } , [ ] ) ,
106
+ ) ;
105
107
106
- editor . executeEdits ( 'redux' , [
107
- {
108
- text : code ,
109
- range : model . getFullModelRange ( ) ,
110
- } ,
111
- ] ) ;
112
- } ) ;
108
+ useEditorProp (
109
+ editor ,
110
+ props . code ,
111
+ useCallback ( ( editor , model , code ) => {
112
+ // Short-circuit if nothing interesting to change.
113
+ if ( code === model . getValue ( ) ) {
114
+ return ;
115
+ }
116
+
117
+ editor . executeEdits ( 'redux' , [
118
+ {
119
+ text : code ,
120
+ range : model . getFullModelRange ( ) ,
121
+ } ,
122
+ ] ) ;
123
+ } , [ ] ) ,
124
+ ) ;
113
125
114
- useEditorProp ( editor , theme , ( editor , _model , theme ) => {
115
- editor . updateOptions ( { theme } ) ;
116
- } ) ;
126
+ useEditorProp (
127
+ editor ,
128
+ theme ,
129
+ useCallback ( ( editor , _model , theme ) => {
130
+ editor . updateOptions ( { theme } ) ;
131
+ } , [ ] ) ,
132
+ ) ;
117
133
118
134
const autocompleteProps = useMemo (
119
135
( ) => ( { autocompleteOnUse, crates : props . crates } ) ,
120
136
[ autocompleteOnUse , props . crates ] ,
121
137
) ;
122
138
123
- useEditorProp ( editor , autocompleteProps , ( _editor , _model , { autocompleteOnUse, crates } ) => {
124
- completionProvider . current = monaco . languages . registerCompletionItemProvider ( 'rust' , {
125
- triggerCharacters : [ ' ' ] ,
126
-
127
- provideCompletionItems ( model , position , _context , _token ) {
128
- const word = model . getWordUntilPosition ( position ) ;
129
-
130
- function wordBefore (
131
- word : monaco . editor . IWordAtPosition ,
132
- ) : monaco . editor . IWordAtPosition | null {
133
- const prevPos = { lineNumber : position . lineNumber , column : word . startColumn - 1 } ;
134
- return model . getWordAtPosition ( prevPos ) ;
135
- }
136
-
137
- const preWord = wordBefore ( word ) ;
138
- const prePreWord = preWord && wordBefore ( preWord ) ;
139
-
140
- const oldStyle = prePreWord ?. word === 'extern' && preWord ?. word === 'crate' ;
141
- const newStyle = autocompleteOnUse && preWord ?. word === 'use' ;
142
-
143
- const triggerPrefix = oldStyle || newStyle ;
144
-
145
- if ( ! triggerPrefix ) {
146
- return { suggestions : [ ] } ;
147
- }
148
-
149
- const range = {
150
- startLineNumber : position . lineNumber ,
151
- endLineNumber : position . lineNumber ,
152
- startColumn : word . startColumn ,
153
- endColumn : word . endColumn ,
154
- } ;
155
-
156
- const suggestions = crates . map ( ( { name, version, id } ) => ( {
157
- kind : monaco . languages . CompletionItemKind . Module ,
158
- label : `${ name } (${ version } )` ,
159
- insertText : `${ id } ; // ${ version } ` ,
160
- range,
161
- } ) ) ;
162
-
163
- return { suggestions } ;
164
- } ,
165
- } ) ;
166
-
167
- return ( ) => {
168
- completionProvider . current ?. dispose ( ) ;
169
- } ;
170
- } ) ;
139
+ useEditorProp (
140
+ editor ,
141
+ autocompleteProps ,
142
+ useCallback ( ( _editor , _model , { autocompleteOnUse, crates } ) => {
143
+ completionProvider . current = monaco . languages . registerCompletionItemProvider ( 'rust' , {
144
+ triggerCharacters : [ ' ' ] ,
145
+
146
+ provideCompletionItems ( model , position , _context , _token ) {
147
+ const word = model . getWordUntilPosition ( position ) ;
148
+
149
+ function wordBefore (
150
+ word : monaco . editor . IWordAtPosition ,
151
+ ) : monaco . editor . IWordAtPosition | null {
152
+ const prevPos = { lineNumber : position . lineNumber , column : word . startColumn - 1 } ;
153
+ return model . getWordAtPosition ( prevPos ) ;
154
+ }
155
+
156
+ const preWord = wordBefore ( word ) ;
157
+ const prePreWord = preWord && wordBefore ( preWord ) ;
158
+
159
+ const oldStyle = prePreWord ?. word === 'extern' && preWord ?. word === 'crate' ;
160
+ const newStyle = autocompleteOnUse && preWord ?. word === 'use' ;
161
+
162
+ const triggerPrefix = oldStyle || newStyle ;
163
+
164
+ if ( ! triggerPrefix ) {
165
+ return { suggestions : [ ] } ;
166
+ }
167
+
168
+ const range = {
169
+ startLineNumber : position . lineNumber ,
170
+ endLineNumber : position . lineNumber ,
171
+ startColumn : word . startColumn ,
172
+ endColumn : word . endColumn ,
173
+ } ;
174
+
175
+ const suggestions = crates . map ( ( { name, version, id } ) => ( {
176
+ kind : monaco . languages . CompletionItemKind . Module ,
177
+ label : `${ name } (${ version } )` ,
178
+ insertText : `${ id } ; // ${ version } ` ,
179
+ range,
180
+ } ) ) ;
181
+
182
+ return { suggestions } ;
183
+ } ,
184
+ } ) ;
185
+
186
+ return ( ) => {
187
+ completionProvider . current ?. dispose ( ) ;
188
+ } ;
189
+ } , [ ] ) ,
190
+ ) ;
171
191
172
192
return < div className = { styles . monaco } ref = { child } /> ;
173
193
} ;
0 commit comments