diff options
| author | Daniel Gavin <danielgavin5@hotmail.com> | 2022-04-28 22:22:13 +0200 |
|---|---|---|
| committer | Daniel Gavin <danielgavin5@hotmail.com> | 2022-04-28 22:22:13 +0200 |
| commit | a2b50f9d8c2a5a3ab9cc276cf35c36d9198906a6 (patch) | |
| tree | b91bcb6f42bdf0b419608de7854ecdde57775c33 | |
| parent | 485285ee58c3c3ef3bd09a1d8cd4232d2dfa1917 (diff) | |
Add last package cache for memory_index.
| -rw-r--r-- | src/server/analysis.odin | 9 | ||||
| -rw-r--r-- | src/server/completion.odin | 2 | ||||
| -rw-r--r-- | src/server/indexer.odin | 1 | ||||
| -rw-r--r-- | src/server/memory_index.odin | 9 | ||||
| -rw-r--r-- | src/server/requests.odin | 30 | ||||
| -rw-r--r-- | src/testing/testing.odin | 2 |
6 files changed, 34 insertions, 19 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index d1ec0a2..34dcc5f 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -697,16 +697,13 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou candidates := make([dynamic]Symbol, context.temp_allocator) for arg_expr in group.args { - next_fn: if f, ok := resolve_type_expression(ast_context, arg_expr); ok { - if call_expr == nil || len(call_expr.args) == 0 { append(&candidates, f) break next_fn } if procedure, ok := f.value.(SymbolProcedureValue); ok { - count_required_params := 0 for arg in procedure.arg_types { @@ -720,7 +717,6 @@ resolve_function_overload :: proc(ast_context: ^AstContext, group: ast.Proc_Grou } for arg, i in call_expr.args { - ast_context.use_locals = true call_symbol: Symbol @@ -1101,7 +1097,7 @@ get_local :: proc(ast_context: ^AstContext, offset: int, name: string) -> ^ast.E } } } - + return nil } @@ -2446,8 +2442,7 @@ resolve_entire_file :: proc(document: ^common.Document, allocator := context.all for decl in document.ast.decls { resolve_entire_decl(&ast_context, decl, &symbols, allocator) - clear_local_group(&ast_context, 0) - add_local_group(&ast_context, 0) + clear(&ast_context.locals) } return symbols diff --git a/src/server/completion.odin b/src/server/completion.odin index ea51fb5..38a5baa 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -120,7 +120,7 @@ get_attribute_completion :: proc(ast_context: ^AstContext, position_context: ^Do get_directive_completion :: proc(ast_context: ^AstContext, position_context: ^DocumentPositionContext, list: ^CompletionList) { list.isIncomplete = false - + items := make([dynamic]CompletionItem, context.temp_allocator) /* diff --git a/src/server/indexer.odin b/src/server/indexer.odin index 03b3e75..068a807 100644 --- a/src/server/indexer.odin +++ b/src/server/indexer.odin @@ -64,6 +64,7 @@ lookup :: proc(name: string, pkg: string, loc := #caller_location) -> (Symbol, b return {}, false } + fuzzy_search :: proc(name: string, pkgs: []string) -> ([]FuzzyResult, bool) { dynamic_results, dynamic_ok := memory_index_fuzzy_search(&indexer.dynamic_index, name, pkgs) static_results, static_ok := memory_index_fuzzy_search(&indexer.static_index, name, pkgs) diff --git a/src/server/memory_index.odin b/src/server/memory_index.odin index 03504c1..22b901f 100644 --- a/src/server/memory_index.odin +++ b/src/server/memory_index.odin @@ -16,6 +16,8 @@ import "shared:common" */ MemoryIndex :: struct { collection: SymbolCollection, + last_package_name: string, + last_package: ^map[string]Symbol, } make_memory_index :: proc(collection: SymbolCollection) -> MemoryIndex { @@ -25,7 +27,14 @@ make_memory_index :: proc(collection: SymbolCollection) -> MemoryIndex { } memory_index_lookup :: proc(index: ^MemoryIndex, name: string, pkg: string) -> (Symbol, bool) { + if index.last_package_name == pkg && index.last_package != nil { + return index.last_package[name] + } + + index.last_package_name = pkg + if pkg, ok := &index.collection.packages[pkg]; ok { + index.last_package = pkg return pkg[name] } diff --git a/src/server/requests.odin b/src/server/requests.odin index ca78c08..3e4eda2 100644 --- a/src/server/requests.odin +++ b/src/server/requests.odin @@ -16,6 +16,7 @@ import "core:path/filepath" import "core:intrinsics" import "core:odin/ast" import "core:odin/parser" +import "core:time" import "shared:common" @@ -338,19 +339,26 @@ call :: proc(value: json.Value, id: RequestId, writer: ^Writer, config: ^common. root := value.(json.Object) method := root["method"].(json.String) - if fn, ok := call_map[method]; !ok { - response := make_response_message_error(id = id, error = ResponseError {code = .MethodNotFound, message = ""}) - send_error(response, writer) - } else { - err := fn(root["params"], id, config, writer) - if err != .None { - response := make_response_message_error( - id = id, - error = ResponseError {code = err, message = ""}, - ) + diff: time.Duration + { + time.SCOPED_TICK_DURATION(&diff) + + if fn, ok := call_map[method]; !ok { + response := make_response_message_error(id = id, error = ResponseError {code = .MethodNotFound, message = ""}) send_error(response, writer) + } else { + err := fn(root["params"], id, config, writer) + if err != .None { + response := make_response_message_error( + id = id, + error = ResponseError {code = err, message = ""}, + ) + send_error(response, writer) + } } } + + log.infof("time duration %v for %v", time.duration_milliseconds(diff), method) } request_initialize :: proc (params: json.Value, id: RequestId, config: ^common.Config, writer: ^Writer) -> common.Error { @@ -514,7 +522,7 @@ request_initialize :: proc (params: json.Value, id: RequestId, config: ^common.C retriggerCharacters = signatureRetriggerCharacters, }, semanticTokensProvider = SemanticTokensOptions { - range = false, + range = config.enable_semantic_tokens, full = config.enable_semantic_tokens, legend = SemanticTokensLegend { tokenTypes = token_types, diff --git a/src/testing/testing.odin b/src/testing/testing.odin index 6c5baa6..0335cce 100644 --- a/src/testing/testing.odin +++ b/src/testing/testing.odin @@ -119,6 +119,8 @@ setup :: proc(src: ^Source) { @private teardown :: proc(src: ^Source) { server.free_static_index() + server.indexer.dynamic_index = {} + server.indexer.static_index = {} } expect_signature_labels :: proc(t: ^testing.T, src: ^Source, expect_labels: []string) { |