@@ -71,6 +71,11 @@ pub struct CodeEditorProps {
7171 pub oninput : EventHandler < String > ,
7272}
7373
74+ struct EditorBuffer {
75+ buffer : Option < Buffer > ,
76+ language : Language ,
77+ }
78+
7479/// Editable syntax-highlighted code surface.
7580///
7681/// The component is controlled by [`CodeEditorProps::value`]; update that value
@@ -96,10 +101,15 @@ pub struct CodeEditorProps {
96101/// ```
97102#[ component]
98103pub fn CodeEditor ( props : CodeEditorProps ) -> Element {
99- let buffer = use_hook ( {
104+ let state = use_hook ( {
100105 let value = props. value . clone ( ) ;
101106 let language = props. language ;
102- move || Rc :: new ( RefCell :: new ( Buffer :: new ( language, value) . ok ( ) ) )
107+ move || {
108+ Rc :: new ( RefCell :: new ( EditorBuffer {
109+ buffer : Buffer :: new ( language, value) . ok ( ) ,
110+ language,
111+ } ) )
112+ }
103113 } ) ;
104114 let edit_tracker = use_hook ( || {
105115 Rc :: new ( RefCell :: new ( edit_capture:: InputEditTracker :: new (
@@ -109,16 +119,14 @@ pub fn CodeEditor(props: CodeEditorProps) -> Element {
109119
110120 let edit = edit_tracker. borrow_mut ( ) . take_for_render ( & props. value ) ;
111121 let snapshot = {
112- let mut buffer_slot = buffer. borrow_mut ( ) ;
113- if buffer_slot. is_none ( ) {
114- * buffer_slot = Buffer :: new ( props. language , props. value . clone ( ) ) . ok ( ) ;
122+ let mut slot = state. borrow_mut ( ) ;
123+ if slot. language != props. language {
124+ slot. buffer = Buffer :: new ( props. language , props. value . clone ( ) ) . ok ( ) ;
125+ slot. language = props. language ;
115126 }
116127
117- match buffer_slot . as_mut ( ) {
128+ match slot . buffer . as_mut ( ) {
118129 Some ( buffer) => {
119- if buffer. language ( ) != props. language {
120- let _ = buffer. set_language ( props. language ) ;
121- }
122130 if buffer. source ( ) != props. value {
123131 let result = match edit {
124132 Some ( edit) => match buffer. edit ( edit, props. value . clone ( ) ) {
@@ -134,9 +142,7 @@ pub fn CodeEditor(props: CodeEditorProps) -> Element {
134142 }
135143 buffer. highlighted ( )
136144 }
137- None => SourceCode :: new ( props. value . clone ( ) )
138- . with_language ( props. language )
139- . into ( ) ,
145+ None => SourceCode :: new ( props. language , props. value . clone ( ) ) . into ( ) ,
140146 }
141147 } ;
142148 let lines = snapshot. lines ( ) ;
0 commit comments