From f8297dc036e7aec99751ba71db9708a097e1c957 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 11 Jan 2020 17:20:40 -0800 Subject: [PATCH] Fixed paren-statement interaction in indentation logic --- custom/4coder_auto_indent.cpp | 2 +- custom/4coder_code_index.cpp | 40 ++++++++++++++++++----------- custom/generated/command_metadata.h | 2 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/custom/4coder_auto_indent.cpp b/custom/4coder_auto_indent.cpp index e34efdb1..f6460cd0 100644 --- a/custom/4coder_auto_indent.cpp +++ b/custom/4coder_auto_indent.cpp @@ -265,7 +265,7 @@ get_indentation_array(Application_Links *app, Arena *arena, Buffer_ID buffer, Ra if (nest != 0){ following_indent = nest->indent; } - ignore_unfinished_statement = true; + //ignore_unfinished_statement = true; }break; } } diff --git a/custom/4coder_code_index.cpp b/custom/4coder_code_index.cpp index 2e7d0fcc..ff9c6731 100644 --- a/custom/4coder_code_index.cpp +++ b/custom/4coder_code_index.cpp @@ -266,7 +266,7 @@ struct: "struct" $(";" | "{") union: "union" $(";" | "{") enum: "enum" $(";" | "{") typedef: "typedef" [* - ( (";" | "("))] $(";" | "(") -function: >"(" [* - ("(" | ")" | "{" | "}" | ";")] ")" ("{" | ";") +function: >"(" ["(" ")" | * - ("(" | ")")] ")" ("{" | ";") #endif @@ -359,6 +359,7 @@ cpp_parse_function(Code_Index_File *index, Generic_Parse_State *state, Code_Inde Token *reset_point = peek; if (peek != 0 && peek->sub_kind == TokenCppKind_ParenOp){ b32 at_paren_close = false; + i32 paren_nest_level = 0; for (; peek != 0;){ generic_parse_inc(state); generic_parse_skip_soft_tokens(index, state); @@ -367,15 +368,17 @@ cpp_parse_function(Code_Index_File *index, Generic_Parse_State *state, Code_Inde break; } - if (peek->kind == TokenBaseKind_ParentheticalOpen || - peek->kind == TokenBaseKind_ScopeOpen || - peek->kind == TokenBaseKind_ScopeClose || - peek->kind == TokenBaseKind_StatementClose){ - break; + if (peek->kind == TokenBaseKind_ParentheticalOpen){ + paren_nest_level += 1; } - if (peek->kind == TokenBaseKind_ParentheticalClose){ - at_paren_close = true; - break; + else if (peek->kind == TokenBaseKind_ParentheticalClose){ + if (paren_nest_level > 0){ + paren_nest_level -= 1; + } + else{ + at_paren_close = true; + break; + } } } @@ -386,7 +389,7 @@ cpp_parse_function(Code_Index_File *index, Generic_Parse_State *state, Code_Inde if (peek != 0 && peek->kind == TokenBaseKind_ScopeOpen || peek->kind == TokenBaseKind_StatementClose){ - index_new_note(index, state, Ii64(token), CodeIndexNote_Function, parent); + index_new_note(index, state, Ii64(token), CodeIndexNote_Function, parent); } } } @@ -573,15 +576,22 @@ generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state){ continue; } + if (token->kind == TokenBaseKind_ParentheticalClose){ + generic_parse_inc(state); + continue; + } + if (token->kind == TokenBaseKind_ParentheticalOpen){ Code_Index_Nest *nest = generic_parse_paren(index, state); nest->parent = result; code_index_push_nest(&result->nest_list, nest); - continue; - } - - if (token->kind == TokenBaseKind_ParentheticalClose){ - generic_parse_inc(state); + + // NOTE(allen): after a parenthetical group we consider ourselves immediately + // transitioning into a statement + nest = generic_parse_statement(index, state); + nest->parent = result; + code_index_push_nest(&result->nest_list, nest); + continue; } diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index cc473ae3..a1d0cdde 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -461,7 +461,7 @@ static Command_Metadata fcoder_metacmd_table[229] = { { PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, { PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, { PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 710 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1160 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1170 }, { PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, { PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, { PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "w:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 },