aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2022-04-28 22:22:13 +0200
committerDaniel Gavin <danielgavin5@hotmail.com>2022-04-28 22:22:13 +0200
commita2b50f9d8c2a5a3ab9cc276cf35c36d9198906a6 (patch)
treeb91bcb6f42bdf0b419608de7854ecdde57775c33
parent485285ee58c3c3ef3bd09a1d8cd4232d2dfa1917 (diff)
Add last package cache for memory_index.
-rw-r--r--src/server/analysis.odin9
-rw-r--r--src/server/completion.odin2
-rw-r--r--src/server/indexer.odin1
-rw-r--r--src/server/memory_index.odin9
-rw-r--r--src/server/requests.odin30
-rw-r--r--src/testing/testing.odin2
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) {