aboutsummaryrefslogtreecommitdiff
path: root/src/lsp/server.zc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lsp/server.zc')
-rw-r--r--src/lsp/server.zc16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/lsp/server.zc b/src/lsp/server.zc
index d776b1d..85f3ea5 100644
--- a/src/lsp/server.zc
+++ b/src/lsp/server.zc
@@ -3100,6 +3100,18 @@ int cp_score(char* name) {
if (exact) { if (n == i) return 0; return 10 + n - i; }
return 100 + score + n - i;
}
+// a label already offered (a symbol named like a keyword wins over the keyword)
+int cp_has(char* name) {
+ int k = 0, i;
+ while (k < cp_n) {
+ i = 0;
+ while (name[i] && cp_name[k][i] == name[i]) i++;
+ if (!name[i] && !cp_name[k][i]) return 1;
+ k++;
+ }
+ return 0;
+}
+
int cp_add(char* name, int kind, int dead, int relevance) {
int score = cp_score(name);
if (score < 0) return 0;
@@ -3270,8 +3282,8 @@ int do_completion(int i) {
if (run.skind[s] != run.K_DOC && run.lookup(run.sname[s]) == s && (run.skind[s] != run.K_FN || (run.sflag[s] & (run.F_DEF | run.F_DECL)))) cp_symbol(s, run.sname[s]);
s++;
}
- if (cp_score("hold") >= 0) { hn = 0; hov_text("hold { shared let c; fn f() { } }"); if (cp_add("hold", 14, 0, 1)) cp_docs[cp_n - 1] = cp_copy("a monitor: shared variables for every actor, used under the block's lock by the functions written in it"); }
- if (cp_score("shared") >= 0) { hn = 0; hov_text("shared let name;"); if (cp_add("shared", 14, 0, 1)) cp_docs[cp_n - 1] = cp_copy("inside a hold block: a variable every actor sees, used only by the block's functions"); }
+ if (cp_score("hold") >= 0 && !cp_has("hold")) { hn = 0; hov_text("hold { shared let c; fn f() { } }"); if (cp_add("hold", 14, 0, 1)) cp_docs[cp_n - 1] = cp_copy("a monitor: shared variables for every actor, used under the block's lock by the functions written in it"); }
+ if (cp_score("shared") >= 0 && !cp_has("shared")) { hn = 0; hov_text("shared let name;"); if (cp_add("shared", 14, 0, 1)) cp_docs[cp_n - 1] = cp_copy("inside a hold block: a variable every actor sees, used only by the block's functions"); }
run.probe_off = cp_cursor; old = chk_stream; chk_stream = 0; check_doc(i); chk_stream = old; run.probe_off = -1;
member = 0;
if (run.probe_has == 2 && run.probe_mem && run.probe_mem[0] == run.TY_STRUCT) member = run.probe_mem[2];