@@ -2056,48 +2056,59 @@ fn process_conditional_expression(
20562056 let group_index = begin_group ( render_elements) ;
20572057 render_elements. push ( RenderElement :: ForceBreakingParent ) ;
20582058
2059- if let Some ( value) = node. child ( 0 ) {
2060- process_node ( input, value, render_elements) ;
2061- }
2062-
2063- render_elements. push ( RenderElement :: SoftLine ) ;
2064- let if_space_index = render_elements. len ( ) + 1 ;
2065- render_elements. push ( RenderElement :: Branch {
2066- if_single_line : Some ( RangeRenderElement {
2067- start : if_space_index,
2068- end : if_space_index + 1 ,
2069- } ) ,
2070- if_multiline : None ,
2071- } ) ;
2072- render_elements. push ( RenderElement :: Space ) ;
2073-
2074- if let Some ( if_kw) = node. child ( 1 ) {
2075- process_node ( input, if_kw, render_elements) ;
2076- }
2077-
2078- if let Some ( cond) = node. child ( 2 ) {
2079- render_elements. push ( RenderElement :: Space ) ;
2080- process_node ( input, cond, render_elements) ;
2081- }
2082-
2083- render_elements. push ( RenderElement :: SoftLine ) ;
2084- let else_space_index = render_elements. len ( ) + 1 ;
2085- render_elements. push ( RenderElement :: Branch {
2086- if_single_line : Some ( RangeRenderElement {
2087- start : else_space_index,
2088- end : else_space_index + 1 ,
2089- } ) ,
2090- if_multiline : None ,
2091- } ) ;
2092- render_elements. push ( RenderElement :: Space ) ;
2059+ // The conditional keywords or things like not are anonymous children in the
2060+ // syntax tree, so we have to walk every child in source order to find
2061+ // where's what.
2062+ let mut previous_child: Option < tree_sitter:: Node > = None ;
2063+ let mut child_index = 0 ;
2064+ while child_index < child_count {
2065+ let Some ( child) = node. child ( child_index as u32 ) else {
2066+ child_index += 1 ;
2067+ continue ;
2068+ } ;
2069+ let child_kind = GDScriptNodeKind :: get_kind_from_ast_node ( child) ;
2070+ let is_current_conditional_keyword = child. kind ( ) == "if" || child. kind ( ) == "else" ;
2071+
2072+ if let Some ( previous) = previous_child {
2073+ let previous_kind = GDScriptNodeKind :: get_kind_from_ast_node ( previous) ;
2074+ if is_current_conditional_keyword
2075+ && previous_kind != GDScriptNodeKind :: LineContinuation
2076+ && previous_kind != GDScriptNodeKind :: Comment
2077+ {
2078+ render_elements. push ( RenderElement :: SoftLine ) ;
2079+ } else {
2080+ process_separator_between_sibling_nodes (
2081+ GDScriptNodeKind :: Condition ,
2082+ & previous,
2083+ & child,
2084+ render_elements,
2085+ ) ;
2086+ }
20932087
2094- if let Some ( else_kw) = node. child ( 3 ) {
2095- process_node ( input, else_kw, render_elements) ;
2096- }
2088+ if previous_kind == GDScriptNodeKind :: LineContinuation {
2089+ let indent_index = begin_indent ( render_elements, input. continuation_indent_level ) ;
2090+ process_node ( input, child, render_elements) ;
2091+ finish_indent ( render_elements, indent_index) ;
2092+ previous_child = Some ( child) ;
2093+ child_index += 1 ;
2094+ continue ;
2095+ }
2096+ }
20972097
2098- if let Some ( value) = node. child ( 4 ) {
2099- render_elements. push ( RenderElement :: Space ) ;
2100- process_node ( input, value, render_elements) ;
2098+ if child_kind == GDScriptNodeKind :: LineContinuation {
2099+ let start_byte = child. start_byte ( ) ;
2100+ render_elements. push ( RenderElement :: Text {
2101+ range : RangeSourceBytes {
2102+ start_byte,
2103+ end_byte : start_byte + 1 ,
2104+ } ,
2105+ } ) ;
2106+ render_elements. push ( RenderElement :: HardLine ) ;
2107+ } else {
2108+ process_node ( input, child, render_elements) ;
2109+ }
2110+ previous_child = Some ( child) ;
2111+ child_index += 1 ;
21012112 }
21022113
21032114 finish_group ( render_elements, group_index) ;
0 commit comments