cleaned up the indenting code
parent
894a06d7ef
commit
46c21b991b
|
@ -272,101 +272,6 @@ struct Indent_Parse_State{
|
||||||
int32_t previous_comment_indent;
|
int32_t previous_comment_indent;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int32_t
|
|
||||||
compute_this_indent(Application_Links *app, Buffer_Summary *buffer, Indent_Parse_State *indent,
|
|
||||||
Cpp_Token T, Cpp_Token prev_token, int32_t line_i, bool32 this_line_gets_indented,
|
|
||||||
bool32 exact_align, int32_t tab_width){
|
|
||||||
|
|
||||||
int32_t previous_indent = indent->previous_line_indent;
|
|
||||||
int32_t this_indent = 0;
|
|
||||||
|
|
||||||
int32_t this_line_start = buffer_get_line_start(app, buffer, line_i);
|
|
||||||
int32_t next_line_start = buffer_get_line_start(app, buffer, line_i+1);
|
|
||||||
|
|
||||||
bool32 did_special_behavior = false;
|
|
||||||
|
|
||||||
if (prev_token.start <= this_line_start &&
|
|
||||||
prev_token.start + prev_token.size > this_line_start){
|
|
||||||
if (prev_token.type == CPP_TOKEN_COMMENT){
|
|
||||||
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, this_line_start, tab_width);
|
|
||||||
|
|
||||||
if (exact_align){
|
|
||||||
this_indent = indent->previous_comment_indent;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (hard_start.all_whitespace){
|
|
||||||
this_indent = previous_indent;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
int32_t line_pos = hard_start.char_pos - this_line_start;
|
|
||||||
this_indent = line_pos + indent->comment_shift;
|
|
||||||
if (this_indent < 0){
|
|
||||||
this_indent = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hard_start.all_whitespace){
|
|
||||||
if (this_line_gets_indented){
|
|
||||||
indent->previous_comment_indent = this_indent;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
indent->previous_comment_indent = hard_start.indent_pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
did_special_behavior = true;
|
|
||||||
}
|
|
||||||
else if (prev_token.type == CPP_TOKEN_STRING_CONSTANT){
|
|
||||||
this_indent = previous_indent;
|
|
||||||
did_special_behavior = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!did_special_behavior){
|
|
||||||
this_indent = indent->current_indent;
|
|
||||||
if (T.start < next_line_start){
|
|
||||||
if (T.flags & CPP_TFLAG_PP_DIRECTIVE){
|
|
||||||
this_indent = 0;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
switch (T.type){
|
|
||||||
case CPP_TOKEN_BRACKET_CLOSE: this_indent -= tab_width; break;
|
|
||||||
case CPP_TOKEN_BRACE_CLOSE: this_indent -= tab_width; break;
|
|
||||||
case CPP_TOKEN_BRACE_OPEN: break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (indent->current_indent > 0){
|
|
||||||
if (!(prev_token.flags & CPP_TFLAG_PP_BODY) &&
|
|
||||||
!(prev_token.flags & CPP_TFLAG_PP_DIRECTIVE)){
|
|
||||||
switch (prev_token.type){
|
|
||||||
case CPP_TOKEN_BRACKET_OPEN:
|
|
||||||
case CPP_TOKEN_BRACE_OPEN: case CPP_TOKEN_BRACE_CLOSE:
|
|
||||||
case CPP_TOKEN_SEMICOLON: case CPP_TOKEN_COLON:
|
|
||||||
case CPP_TOKEN_COMMA: case CPP_TOKEN_COMMENT: break;
|
|
||||||
default: this_indent += tab_width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this_indent < 0) this_indent = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (indent->paren_nesting > 0){
|
|
||||||
if (prev_token.type != CPP_TOKEN_PARENTHESE_OPEN){
|
|
||||||
int32_t level = indent->paren_nesting-1;
|
|
||||||
if (level >= ArrayCount(indent->paren_anchor_indent)){
|
|
||||||
level = ArrayCount(indent->paren_anchor_indent)-1;
|
|
||||||
}
|
|
||||||
this_indent = indent->paren_anchor_indent[level];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(this_indent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t*
|
static int32_t*
|
||||||
get_indentation_marks(Application_Links *app, Partition *part, Buffer_Summary *buffer,
|
get_indentation_marks(Application_Links *app, Partition *part, Buffer_Summary *buffer,
|
||||||
Cpp_Token_Array tokens, int32_t line_start, int32_t line_end,
|
Cpp_Token_Array tokens, int32_t line_start, int32_t line_end,
|
||||||
|
@ -374,7 +279,7 @@ get_indentation_marks(Application_Links *app, Partition *part, Buffer_Summary *b
|
||||||
|
|
||||||
int32_t indent_mark_count = line_end - line_start;
|
int32_t indent_mark_count = line_end - line_start;
|
||||||
int32_t *indent_marks = push_array(part, int32_t, indent_mark_count);
|
int32_t *indent_marks = push_array(part, int32_t, indent_mark_count);
|
||||||
// Shift the array so line_i works correctly.
|
// Shift the array so line_index works correctly.
|
||||||
indent_marks -= line_start;
|
indent_marks -= line_start;
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,15 +320,96 @@ get_indentation_marks(Application_Links *app, Partition *part, Buffer_Summary *b
|
||||||
for (;token.start >= next_line_start_pos && line_index < line_end;){
|
for (;token.start >= next_line_start_pos && line_index < line_end;){
|
||||||
next_line_start_pos = buffer_get_line_start(app, buffer, line_index+1);
|
next_line_start_pos = buffer_get_line_start(app, buffer, line_index+1);
|
||||||
|
|
||||||
// TODO(allen): Flatten this function back in, as it is no longer
|
int32_t this_indent = 0;
|
||||||
// leaving the indent state unchanged and it's only called here.
|
{
|
||||||
int32_t this_indent =
|
int32_t previous_indent = indent.previous_line_indent;
|
||||||
compute_this_indent(app, buffer, &indent, token, prev_token,
|
|
||||||
line_index, line_index >= line_start,
|
|
||||||
exact_align, tab_width);
|
|
||||||
|
|
||||||
// NOTE(allen): Rebase the paren anchor if the first token
|
int32_t this_line_start = buffer_get_line_start(app, buffer, line_index);
|
||||||
// after an open paren is on the next line.
|
int32_t next_line_start = buffer_get_line_start(app, buffer, line_index+1);
|
||||||
|
|
||||||
|
bool32 did_special_behavior = false;
|
||||||
|
|
||||||
|
if (prev_token.start <= this_line_start && prev_token.start + prev_token.size > this_line_start){
|
||||||
|
if (prev_token.type == CPP_TOKEN_COMMENT){
|
||||||
|
Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, this_line_start, tab_width);
|
||||||
|
|
||||||
|
if (exact_align){
|
||||||
|
this_indent = indent.previous_comment_indent;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (hard_start.all_whitespace){
|
||||||
|
this_indent = previous_indent;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
int32_t line_pos = hard_start.char_pos - this_line_start;
|
||||||
|
this_indent = line_pos + indent.comment_shift;
|
||||||
|
if (this_indent < 0){
|
||||||
|
this_indent = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hard_start.all_whitespace){
|
||||||
|
if (line_index >= line_start){
|
||||||
|
indent.previous_comment_indent = this_indent;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
indent.previous_comment_indent = hard_start.indent_pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
did_special_behavior = true;
|
||||||
|
}
|
||||||
|
else if (prev_token.type == CPP_TOKEN_STRING_CONSTANT){
|
||||||
|
this_indent = previous_indent;
|
||||||
|
did_special_behavior = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!did_special_behavior){
|
||||||
|
this_indent = indent.current_indent;
|
||||||
|
if (token.start < next_line_start){
|
||||||
|
if (token.flags & CPP_TFLAG_PP_DIRECTIVE){
|
||||||
|
this_indent = 0;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
switch (token.type){
|
||||||
|
case CPP_TOKEN_BRACKET_CLOSE: this_indent -= tab_width; break;
|
||||||
|
case CPP_TOKEN_BRACE_CLOSE: this_indent -= tab_width; break;
|
||||||
|
case CPP_TOKEN_BRACE_OPEN: break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (indent.current_indent > 0){
|
||||||
|
if (!(prev_token.flags & CPP_TFLAG_PP_BODY) &&
|
||||||
|
!(prev_token.flags & CPP_TFLAG_PP_DIRECTIVE)){
|
||||||
|
switch (prev_token.type){
|
||||||
|
case CPP_TOKEN_BRACKET_OPEN:
|
||||||
|
case CPP_TOKEN_BRACE_OPEN: case CPP_TOKEN_BRACE_CLOSE:
|
||||||
|
case CPP_TOKEN_SEMICOLON: case CPP_TOKEN_COLON:
|
||||||
|
case CPP_TOKEN_COMMA: case CPP_TOKEN_COMMENT: break;
|
||||||
|
default: this_indent += tab_width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this_indent < 0) this_indent = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (indent.paren_nesting > 0){
|
||||||
|
if (prev_token.type != CPP_TOKEN_PARENTHESE_OPEN){
|
||||||
|
int32_t level = indent.paren_nesting-1;
|
||||||
|
if (level >= ArrayCount(indent.paren_anchor_indent)){
|
||||||
|
level = ArrayCount(indent.paren_anchor_indent)-1;
|
||||||
|
}
|
||||||
|
this_indent = indent.paren_anchor_indent[level];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebase the paren anchor if the first token
|
||||||
|
// after the open paren is on the next line.
|
||||||
if (indent.paren_nesting > 0){
|
if (indent.paren_nesting > 0){
|
||||||
if (prev_token.type == CPP_TOKEN_PARENTHESE_OPEN){
|
if (prev_token.type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||||
int32_t level = indent.paren_nesting-1;
|
int32_t level = indent.paren_nesting-1;
|
||||||
|
|
17
TODO.txt
17
TODO.txt
|
@ -87,14 +87,6 @@
|
||||||
|
|
||||||
; BEFORE I SHIP
|
; BEFORE I SHIP
|
||||||
;
|
;
|
||||||
; [X] use strange theme
|
|
||||||
; [X] tokens in the custom API
|
|
||||||
; [X] token seeking on custom side
|
|
||||||
; [X] auto indent on the custom side
|
|
||||||
; [X] indent whole comments
|
|
||||||
; [X] inserting lines at end of block comment
|
|
||||||
; [] clean up and comment the auto indent code to allow for customizations
|
|
||||||
; [] more built in options for auto indenting
|
|
||||||
; [] occasionally missing the (!) mark on files on windows
|
; [] occasionally missing the (!) mark on files on windows
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -142,7 +134,16 @@
|
||||||
; [X] case insensitive interactive switch buffer
|
; [X] case insensitive interactive switch buffer
|
||||||
; [X] expose dirty flags
|
; [X] expose dirty flags
|
||||||
; [X] why are command line files not loading any more?
|
; [X] why are command line files not loading any more?
|
||||||
|
; [X] use strange theme
|
||||||
|
|
||||||
|
; [X] tokens in the custom API
|
||||||
|
; [X] token seeking on custom side
|
||||||
|
; [X] auto indent on the custom side
|
||||||
|
; [X] indent whole comments
|
||||||
|
; [X] inserting lines at end of block comment
|
||||||
|
; [] switch to line classification system
|
||||||
|
; [] more built in options for auto indenting
|
||||||
|
;
|
||||||
;
|
;
|
||||||
; [] binary buffers
|
; [] binary buffers
|
||||||
; [] commands for resizing panels
|
; [] commands for resizing panels
|
||||||
|
|
Loading…
Reference in New Issue