aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/caches.odin3
-rw-r--r--src/server/completion.odin46
-rw-r--r--src/server/requests.odin3
-rw-r--r--src/server/types.odin3
4 files changed, 42 insertions, 13 deletions
diff --git a/src/server/caches.odin b/src/server/caches.odin
index 3d26e22..7e87762 100644
--- a/src/server/caches.odin
+++ b/src/server/caches.odin
@@ -79,9 +79,6 @@ find_all_package_aliases :: proc() {
for pkg in pkgs {
if pkg, err := filepath.rel(v, pkg, context.temp_allocator); err == .None {
forward_pkg, _ := filepath.to_slash(pkg, context.temp_allocator)
- if !strings.contains(forward_pkg, "/") {
- continue
- }
if k not_in build_cache.pkg_aliases {
build_cache.pkg_aliases[k] = make([dynamic]string)
}
diff --git a/src/server/completion.odin b/src/server/completion.odin
index 04d580a..cc9975e 100644
--- a/src/server/completion.odin
+++ b/src/server/completion.odin
@@ -1700,23 +1700,51 @@ append_non_imported_packages :: proc(
position_context: ^DocumentPositionContext,
items: ^[dynamic]CompletionItem,
) {
-
-
for collection, pkgs in build_cache.pkg_aliases {
-
+ //Right now only do it for core
+ if collection != "core" {
+ continue
+ }
for pkg in pkgs {
+ fullpath := path.join({common.config.collections[collection], pkg})
+ found := false
- //filepath.is_separator()
+ for doc_pkg in ast_context.imports {
+ if fullpath == doc_pkg.name {
+ found = true
+ }
+ }
- }
+ if !found {
+ pkg_decl := ast_context.file.pkg_decl
- }
+ import_edit := TextEdit {
+ range = {
+ start = {line = pkg_decl.end.line + 1, character = 0},
+ end = {line = pkg_decl.end.line + 1, character = 0},
+ },
+ newText = fmt.tprintf("import \"%v:%v\"\n", collection, pkg),
+ }
- for pkg in ast_context.imports {
- //log.error(pkg)
- }
+ additionalTextEdits := make([]TextEdit, 1, context.temp_allocator)
+ additionalTextEdits[0] = import_edit
+
+ item := CompletionItem {
+ label = pkg,
+ kind = .Module,
+ detail = pkg,
+ insertText = path.base(pkg),
+ additionalTextEdits = additionalTextEdits,
+ insertTextFormat = .PlainText,
+ InsertTextMode = .adjustIndentation,
+ }
+ log.error(item)
+ append(items, item)
+ }
+ }
+ }
}
append_magic_map_completion :: proc(
diff --git a/src/server/requests.odin b/src/server/requests.odin
index 52df45c..aef44f6 100644
--- a/src/server/requests.odin
+++ b/src/server/requests.odin
@@ -374,6 +374,8 @@ read_ols_initialize_options :: proc(config: ^common.Config, ols_config: OlsConfi
config.enable_procedure_snippet =
ols_config.enable_procedure_snippet.(bool) or_else config.enable_procedure_snippet
+ config.enable_auto_import = ols_config.enable_auto_import.(bool) or_else config.enable_auto_import
+
config.enable_checker_only_saved =
ols_config.enable_checker_only_saved.(bool) or_else config.enable_checker_only_saved
@@ -607,6 +609,7 @@ request_initialize :: proc(
config.enable_fake_method = false
config.enable_procedure_snippet = true
config.enable_checker_only_saved = true
+ config.enable_auto_import = true
read_ols_config :: proc(file: string, config: ^common.Config, uri: common.Uri) {
if data, ok := os.read_entire_file(file, context.temp_allocator); ok {
diff --git a/src/server/types.odin b/src/server/types.odin
index 24dc2e8..1da5f3c 100644
--- a/src/server/types.odin
+++ b/src/server/types.odin
@@ -132,7 +132,7 @@ MarkupContent :: struct {
ServerCapabilities :: struct {
textDocumentSync: TextDocumentSyncOptions,
definitionProvider: bool,
- typeDefinitionProvider: bool,
+ typeDefinitionProvider: bool,
completionProvider: CompletionOptions,
signatureHelpProvider: SignatureHelpOptions,
semanticTokensProvider: SemanticTokensOptions,
@@ -412,6 +412,7 @@ OlsConfig :: struct {
enable_fake_methods: Maybe(bool),
enable_procedure_snippet: Maybe(bool),
enable_checker_only_saved: Maybe(bool),
+ enable_auto_import: Maybe(bool),
disable_parser_errors: Maybe(bool),
verbose: Maybe(bool),
file_log: Maybe(bool),