Preprocessor alignment in virtual whitespace implementation
This commit is contained in:
parent
09acacd3cf
commit
f468d4b57d
|
@ -18,22 +18,19 @@ function Code_Index_File_Storage*
|
||||||
code_index__alloc_storage(void){
|
code_index__alloc_storage(void){
|
||||||
Code_Index_File_Storage *result = global_code_index.free_storage;
|
Code_Index_File_Storage *result = global_code_index.free_storage;
|
||||||
if (result == 0){
|
if (result == 0){
|
||||||
result = push_array_zero(&global_code_index.node_arena,
|
result = push_array_zero(&global_code_index.node_arena, Code_Index_File_Storage, 1);
|
||||||
Code_Index_File_Storage, 1);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
sll_stack_pop(global_code_index.free_storage);
|
sll_stack_pop(global_code_index.free_storage);
|
||||||
}
|
}
|
||||||
zdll_push_back(global_code_index.storage_first, global_code_index.storage_last,
|
zdll_push_back(global_code_index.storage_first, global_code_index.storage_last, result);
|
||||||
result);
|
|
||||||
global_code_index.storage_count += 1;
|
global_code_index.storage_count += 1;
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
code_index__free_storage(Code_Index_File_Storage *storage){
|
code_index__free_storage(Code_Index_File_Storage *storage){
|
||||||
zdll_remove(global_code_index.storage_first, global_code_index.storage_last,
|
zdll_remove(global_code_index.storage_first, global_code_index.storage_last, storage);
|
||||||
storage);
|
|
||||||
global_code_index.storage_count -= 1;
|
global_code_index.storage_count -= 1;
|
||||||
sll_stack_push(global_code_index.free_storage, storage);
|
sll_stack_push(global_code_index.free_storage, storage);
|
||||||
}
|
}
|
||||||
|
@ -229,8 +226,68 @@ generic_parse_init(Application_Links *app, Arena *arena, String_Const_u8 content
|
||||||
}
|
}
|
||||||
|
|
||||||
function Code_Index_Nest*
|
function Code_Index_Nest*
|
||||||
generic_parse_paren(Code_Index_File *index, Generic_Parse_State *state,
|
generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state, i64 indentation);
|
||||||
i64 indentation);
|
|
||||||
|
function Code_Index_Nest*
|
||||||
|
generic_parse_paren(Code_Index_File *index, Generic_Parse_State *state, i64 indentation);
|
||||||
|
|
||||||
|
function Code_Index_Nest*
|
||||||
|
generic_parse_preprocessor(Code_Index_File *index, Generic_Parse_State *state, i64 indentation){
|
||||||
|
Token *token = token_it_read(&state->it);
|
||||||
|
Code_Index_Nest *result = push_array_zero(state->arena, Code_Index_Nest, 1);
|
||||||
|
result->kind = CodeIndexNest_Preprocessor;
|
||||||
|
result->open = Ii64(token->pos);
|
||||||
|
result->close = Ii64(max_i64);
|
||||||
|
result->file = index;
|
||||||
|
|
||||||
|
result->interior_indentation = 0;
|
||||||
|
result->close_indentation = 0;
|
||||||
|
indentation = 0;
|
||||||
|
|
||||||
|
state->in_preprocessor = true;
|
||||||
|
|
||||||
|
generic_parse_inc(state);
|
||||||
|
for (;;){
|
||||||
|
generic_parse_skip_soft_tokens(index, state);
|
||||||
|
token = token_it_read(&state->it);
|
||||||
|
if (token == 0 || state->finished){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HasFlag(token->flags, TokenBaseFlag_PreprocessorBody)){
|
||||||
|
result->is_closed = true;
|
||||||
|
result->close = Ii64(token->pos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token->kind == TokenBaseKind_Preprocessor){
|
||||||
|
result->is_closed = true;
|
||||||
|
result->close = Ii64(token->pos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token->kind == TokenBaseKind_ScopeOpen){
|
||||||
|
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
||||||
|
nest->parent = result;
|
||||||
|
code_index_push_nest(&result->nest_list, nest);
|
||||||
|
}
|
||||||
|
else if (token->kind == TokenBaseKind_ParentheticalOpen){
|
||||||
|
Code_Index_Nest *nest = generic_parse_paren(index, state,
|
||||||
|
indentation);
|
||||||
|
nest->parent = result;
|
||||||
|
code_index_push_nest(&result->nest_list, nest);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
generic_parse_inc(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result->nest_array = code_index_nest_ptr_array_from_list(state->arena, &result->nest_list);
|
||||||
|
|
||||||
|
state->in_preprocessor = false;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
function Code_Index_Nest*
|
function Code_Index_Nest*
|
||||||
generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state,
|
generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state,
|
||||||
|
@ -254,27 +311,43 @@ generic_parse_scope(Code_Index_File *index, Generic_Parse_State *state,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token->kind == TokenBaseKind_ScopeOpen){
|
if (token->kind == TokenBaseKind_ScopeClose){
|
||||||
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
|
||||||
nest->parent = result;
|
|
||||||
code_index_push_nest(&result->nest_list, nest);
|
|
||||||
}
|
|
||||||
else if (token->kind == TokenBaseKind_ParentheticalOpen){
|
|
||||||
Code_Index_Nest *nest = generic_parse_paren(index, state,
|
|
||||||
indentation);
|
|
||||||
nest->parent = result;
|
|
||||||
code_index_push_nest(&result->nest_list, nest);
|
|
||||||
}
|
|
||||||
else if (token->kind == TokenBaseKind_ScopeClose){
|
|
||||||
result->is_closed = true;
|
result->is_closed = true;
|
||||||
result->close = Ii64(token);
|
result->close = Ii64(token);
|
||||||
generic_parse_inc(state);
|
generic_parse_inc(state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
generic_parse_inc(state);
|
if (state->in_preprocessor){
|
||||||
|
if (!HasFlag(token->kind == TokenBaseFlag_PreprocessorBody) ||
|
||||||
|
token->kind == TokenBaseKind_Preprocessor){
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
if (token->kind == TokenBaseKind_Preprocessor){
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token->kind == TokenBaseKind_ScopeOpen){
|
||||||
|
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
||||||
|
nest->parent = result;
|
||||||
|
code_index_push_nest(&result->nest_list, nest);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token->kind == TokenBaseKind_ParentheticalOpen){
|
||||||
|
Code_Index_Nest *nest = generic_parse_paren(index, state,
|
||||||
|
indentation);
|
||||||
|
nest->parent = result;
|
||||||
|
code_index_push_nest(&result->nest_list, nest);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
generic_parse_inc(state);
|
||||||
|
}
|
||||||
|
|
||||||
result->nest_array = code_index_nest_ptr_array_from_list(state->arena, &result->nest_list);
|
result->nest_array = code_index_nest_ptr_array_from_list(state->arena, &result->nest_list);
|
||||||
|
|
||||||
|
@ -317,7 +390,11 @@ generic_parse_paren(Code_Index_File *index, Generic_Parse_State *state,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token->kind == TokenBaseKind_ScopeOpen){
|
if (token->kind == TokenBaseKind_Preprocessor){
|
||||||
|
Code_Index_Nest *nest = generic_parse_preprocessor(index, state, indentation);
|
||||||
|
code_index_push_nest(&index->nest_list, nest);
|
||||||
|
}
|
||||||
|
else if (token->kind == TokenBaseKind_ScopeOpen){
|
||||||
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
||||||
nest->parent = result;
|
nest->parent = result;
|
||||||
code_index_push_nest(&result->nest_list, nest);
|
code_index_push_nest(&result->nest_list, nest);
|
||||||
|
@ -362,7 +439,11 @@ generic_parse_full_input_breaks(Code_Index_File *index, Generic_Parse_State *sta
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token->kind == TokenBaseKind_ScopeOpen){
|
if (token->kind == TokenBaseKind_Preprocessor){
|
||||||
|
Code_Index_Nest *nest = generic_parse_preprocessor(index, state, indentation);
|
||||||
|
code_index_push_nest(&index->nest_list, nest);
|
||||||
|
}
|
||||||
|
else if (token->kind == TokenBaseKind_ScopeOpen){
|
||||||
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
Code_Index_Nest *nest = generic_parse_scope(index, state, indentation);
|
||||||
code_index_push_nest(&index->nest_list, nest);
|
code_index_push_nest(&index->nest_list, nest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ typedef i32 Code_Index_Nest_Kind;
|
||||||
enum{
|
enum{
|
||||||
CodeIndexNest_Scope,
|
CodeIndexNest_Scope,
|
||||||
CodeIndexNest_Paren,
|
CodeIndexNest_Paren,
|
||||||
|
CodeIndexNest_Preprocessor,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Code_Index_Nest{
|
struct Code_Index_Nest{
|
||||||
|
@ -78,6 +79,8 @@ struct Generic_Parse_State{
|
||||||
Generic_Parse_Comment_Function *handle_comment;
|
Generic_Parse_Comment_Function *handle_comment;
|
||||||
u8 *prev_line_start;
|
u8 *prev_line_start;
|
||||||
b32 finished;
|
b32 finished;
|
||||||
|
|
||||||
|
b32 in_preprocessor;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue