diff options
Diffstat (limited to 'src/server/completion.odin')
| -rw-r--r-- | src/server/completion.odin | 206 |
1 files changed, 113 insertions, 93 deletions
diff --git a/src/server/completion.odin b/src/server/completion.odin index d80e451..2fcd7be 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -772,99 +772,7 @@ get_selector_completion :: proc( case SymbolFixedArrayValue: is_incomplete = true append_magic_array_like_completion(position_context, selector, results) - - containsColor := 1 - containsCoord := 1 - - expr_len := 0 - - if v.len != nil { - if basic, ok := v.len.derived.(^ast.Basic_Lit); ok { - if expr_len, ok = strconv.parse_int(basic.tok.text); !ok { - expr_len = 0 - } - } - } - - if field != "" { - for i := 0; i < len(field); i += 1 { - c := field[i] - if _, ok := swizzle_color_map[c]; ok { - containsColor += 1 - } else if _, ok := swizzle_coord_map[c]; ok { - containsCoord += 1 - } else { - return is_incomplete - } - } - } - - if containsColor == 1 && containsCoord == 1 { - save := expr_len - for k in swizzle_color_components { - if expr_len <= 0 { - break - } - - expr_len -= 1 - - item := CompletionItem { - label = fmt.tprintf("%v%v", field, k), - kind = .Property, - detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)), - } - append(results, CompletionResult{completion_item = item}) - } - - expr_len = save - - for k in swizzle_coord_components { - if expr_len <= 0 { - break - } - - expr_len -= 1 - - item := CompletionItem { - label = fmt.tprintf("%v%v", field, k), - kind = .Property, - detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)), - } - append(results, CompletionResult{completion_item = item}) - } - } - - if containsColor > 1 { - for k in swizzle_color_components { - if expr_len <= 0 { - break - } - - expr_len -= 1 - - item := CompletionItem { - label = fmt.tprintf("%v%v", field, k), - kind = .Property, - detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsColor, node_to_string(v.expr)), - } - append(results, CompletionResult{completion_item = item}) - } - } else if containsCoord > 1 { - for k in swizzle_coord_components { - if expr_len <= 0 { - break - } - - expr_len -= 1 - - item := CompletionItem { - label = fmt.tprintf("%v%v", field, k), - kind = .Property, - detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsCoord, node_to_string(v.expr)), - } - append(results, CompletionResult{completion_item = item}) - } - } + add_fixed_array_selector_completions(v, field, results) add_soa_field_completion(ast_context, selector, v.expr, v.len, results, selector.name) case SymbolUnionValue: is_incomplete = false @@ -971,6 +879,13 @@ get_selector_completion :: proc( is_incomplete = false for name, i in v.names { if name == "_" { + if is_struct_field_using(v, i) { + if symbol, ok := resolve_type_expression(ast_context, v.types[i]); ok { + if value, ok := symbol.value.(SymbolFixedArrayValue); ok { + add_fixed_array_selector_completions(value, field, results) + } + } + } continue } @@ -991,6 +906,12 @@ get_selector_completion :: proc( construct_struct_field_symbol(&symbol, selector.name, v, i) append(results, CompletionResult{symbol = symbol}) + + if is_struct_field_using(v, i) { + if value, ok := symbol.value.(SymbolFixedArrayValue); ok { + add_fixed_array_selector_completions(value, field, results) + } + } } else { //just give some generic symbol with name. item := CompletionItem { @@ -1084,6 +1005,105 @@ get_selector_completion :: proc( return is_incomplete } +add_fixed_array_selector_completions :: proc( + v: SymbolFixedArrayValue, + field: string, + results: ^[dynamic]CompletionResult, +) { + containsColor := 1 + containsCoord := 1 + + expr_len := 0 + + if v.len != nil { + if basic, ok := v.len.derived.(^ast.Basic_Lit); ok { + if expr_len, ok = strconv.parse_int(basic.tok.text); !ok { + expr_len = 0 + } + } + } + + if field != "" { + for i := 0; i < len(field); i += 1 { + c := field[i] + if _, ok := swizzle_color_map[c]; ok { + containsColor += 1 + } else if _, ok := swizzle_coord_map[c]; ok { + containsCoord += 1 + } else { + return + } + } + } + + if containsColor == 1 && containsCoord == 1 { + save := expr_len + for k in swizzle_color_components { + if expr_len <= 0 { + break + } + + expr_len -= 1 + + item := CompletionItem { + label = fmt.tprintf("%v%v", field, k), + kind = .Property, + detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)), + } + append(results, CompletionResult{completion_item = item}) + } + + expr_len = save + + for k in swizzle_coord_components { + if expr_len <= 0 { + break + } + + expr_len -= 1 + + item := CompletionItem { + label = fmt.tprintf("%v%v", field, k), + kind = .Property, + detail = fmt.tprintf("%v%v: %v", field, k, node_to_string(v.expr)), + } + append(results, CompletionResult{completion_item = item}) + } + } + + if containsColor > 1 { + for k in swizzle_color_components { + if expr_len <= 0 { + break + } + + expr_len -= 1 + + item := CompletionItem { + label = fmt.tprintf("%v%v", field, k), + kind = .Property, + detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsColor, node_to_string(v.expr)), + } + append(results, CompletionResult{completion_item = item}) + } + } else if containsCoord > 1 { + for k in swizzle_coord_components { + if expr_len <= 0 { + break + } + + expr_len -= 1 + + item := CompletionItem { + label = fmt.tprintf("%v%v", field, k), + kind = .Property, + detail = fmt.tprintf("%v%v: [%v]%v", field, k, containsCoord, node_to_string(v.expr)), + } + append(results, CompletionResult{completion_item = item}) + } + } +} + get_implicit_completion :: proc( ast_context: ^AstContext, position_context: ^DocumentPositionContext, |