diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2021-03-24 00:50:57 +0100 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2021-03-24 00:50:57 +0100 |
| commit | 0425d14832739922f1a4e95b81eeb08b3f86567d (patch) | |
| tree | 66bfc5ee8d87285e5cef00b7f607152d435c0150 /src | |
| parent | 7754c4ce36be910c83fda17a854407c86bd53de0 (diff) | |
move and fix bitsets to make them somewhat more robust than before
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/completion.odin | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin index aafbc36..d389409 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -48,9 +48,6 @@ get_completion_list :: proc(document: ^Document, position: common.Position) -> ( completion_type: Completion_Type = .Identifier; - if position_context.implicit { - completion_type = .Implicit; - } if position_context.comp_lit != nil && is_lhs_comp_lit(&position_context) { completion_type = .Comp_Lit; @@ -64,6 +61,10 @@ get_completion_list :: proc(document: ^Document, position: common.Position) -> ( completion_type = .Directive; } + if position_context.implicit { + completion_type = .Implicit; + } + if position_context.switch_type_stmt != nil && position_context.case_clause != nil { if assign, ok := position_context.switch_type_stmt.tag.derived.(ast.Assign_Stmt); ok && assign.rhs != nil && len(assign.rhs) == 1 { @@ -473,10 +474,15 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } - } else if position_context.comp_lit != nil && position_context.parent_binary != nil && is_bitset_binary_operator(position_context.binary.op.text) { + } + + if position_context.comp_lit != nil && position_context.assign != nil && position_context.assign.lhs != nil && len(position_context.assign.lhs) == 1 && is_bitset_assignment_operator(position_context.assign.op.text) { //bitsets - if symbol, ok := resolve_first_symbol_from_binary_expression(ast_context, position_context.parent_binary); ok { + if symbol, ok := resolve_type_expression(ast_context, position_context.assign.lhs[0]); ok { if value, ok := unwrap_bitset(ast_context, symbol); ok { @@ -490,11 +496,16 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } - } else if position_context.comp_lit != nil && position_context.assign != nil && position_context.assign.lhs != nil && len(position_context.assign.lhs) == 1 && is_bitset_assignment_operator(position_context.assign.op.text) { + } - if symbol, ok := resolve_type_expression(ast_context, position_context.assign.lhs[0]); ok { + if position_context.comp_lit != nil && position_context.parent_binary != nil && is_bitset_binary_operator(position_context.binary.op.text) { + //bitsets + if symbol, ok := resolve_first_symbol_from_binary_expression(ast_context, position_context.parent_binary); ok { if value, ok := unwrap_bitset(ast_context, symbol); ok { @@ -508,9 +519,14 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } - } else if position_context.comp_lit != nil { + } + + if position_context.comp_lit != nil { if position_context.parent_comp_lit.type == nil { return; @@ -554,12 +570,17 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } } } } - } else if position_context.binary != nil && (position_context.binary.op.text == "==" || position_context.binary.op.text == "!=") { + } + + if position_context.binary != nil && (position_context.binary.op.text == "==" || position_context.binary.op.text == "!=") { context_node: ^ast.Expr; enum_node: ^ast.Expr; @@ -586,9 +607,14 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } - } else if position_context.assign != nil && position_context.assign.rhs != nil && position_context.assign.lhs != nil { + } + + if position_context.assign != nil && position_context.assign.rhs != nil && position_context.assign.lhs != nil { rhs_index: int; @@ -629,9 +655,14 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } - } else if position_context.returns != nil && position_context.function != nil { + } + + if position_context.returns != nil && position_context.function != nil { return_index: int; @@ -671,12 +702,14 @@ get_implicit_completion :: proc(ast_context: ^AstContext, position_context: ^Doc append(&items, item); } + + list.items = items[:]; + return; } } } } - list.items = items[:]; } get_identifier_completion :: proc(ast_context: ^AstContext, position_context: ^DocumentPositionContext, list: ^CompletionList) { @@ -888,6 +921,7 @@ bitset_operators: map[string]bool = { "~" = true, "<" = true, ">" = true, + "==" = true, }; bitset_assignment_operators: map[string]bool = { |