src/lsp/checker/names.bend
bolt@1.27.0.0 · 61 lines · 7 definitions
1
2
3
4
5
6
7
8import Base
9import bolt@1.27.0.0/src/syntax/outline.bend as Outline
10import bolt@1.27.0.0/src/lazy/lazy.bend as Lazy
11
12
13def ns.lead(ss: String) -> String:
14 match ss:
15 case SCon{'.', SCon{'/', tt}}:
16 ns.lead(tt)
17 case other:
18 other
19
20
21def ns(path: String) -> String:
22 +pp = ns.lead(path)
23 Bool.pick(String, String.ends_with(pp, ".bend"), String.take(pp, Nat.sub(String.length(pp), 5n)), pp)
24
25
26
27def key.of(alias: Maybe<&2, String>, +name: String, +rest: String) -> String:
28 match alias:
29 case None{}:
30 name
31 case Some{path}:
32 ns(path) ++ "." ++ rest
33
34
35def key.parts(items: List<&2, Outline.Item>, +name: String, parts: List<&2, String>) -> String:
36 match parts:
37 case Con{+head, Con{rr, more}}:
38 key.of(Outline.import_path(items, head), name, String.join(rr <> more, "."))
39 case other:
40 name
41
42
43def key(items: List<&2, Outline.Item>, +name: String) -> String:
44 key.parts(items, name, String.split(name, '.'))
45
46
47def keys(its: List<&2, Outline.Item>, +items: List<&2, Outline.Item>, +acc: List<&2, String>) -> List<&2, String>:
48 match its:
49 case Nil{}:
50 acc
51 case Con{Outline.Item{+kk, +nn, _line, _sig, _doc, _path}, rest}:
52 keys(rest, items, Lazy.stop(List<&2, String>, Outline.is_import(kk), acc, _u => key(items, nn) <> acc))
53
54
55def of(mm: Maybe<&2, String>) -> Maybe<&2, List<&2, String>>:
56 match mm:
57 case None{}:
58 None{}
59 case Some{text}:
60 +items = Outline.items(text)
61 Some{keys(items, items, [])}