~/bend-docscommunity

src/lsp/checker/names.bend source

src/lsp/checker/names.bend on the hub · documented module

# checker/names: pure. The names bend gives the items of the file it# checks, so a report's Location can be told apart as this file's or an# import's (report.bend's mine). bend keys a def by its name, and a def# whose name opens with an import alias (`def Laws.x` filling a law of# `./LAWS.bend`) by that import's namespace: its path, `./` and `.bend`# dropped (`LAWS.x`). A def of an import beside the file is keyed the same# way (`m.g`), which is why the file's own keys are needed at all.import Baseimport ../../syntax/outline.bend as Outlineimport ../../lazy/lazy.bend as Lazy# a path without its leading `./`sdef ns.lead(ss: String) -> String:  match ss:    case SCon{'.', SCon{'/', tt}}:      ns.lead(tt)    case other:      other# an import's namespace: its path, without a leading `./` or its `.bend`def ns(path: String) -> String:  +pp = ns.lead(path)  Bool.pick(String, String.ends_with(pp, ".bend"), String.take(pp, Nat.sub(String.length(pp), 5n)), pp)# the key of a name that opens with `head.`: through the import aliased head# when there is one, else the name as writtendef key.of(alias: Maybe<&2, String>, +name: String, +rest: String) -> String:  match alias:    case None{}:      name    case Some{path}:      ns(path) ++ "." ++ rest# an item's key, among the file's itemsdef key.parts(items: List<&2, Outline.Item>, +name: String, parts: List<&2, String>) -> String:  match parts:    case Con{+head, Con{rr, more}}:      key.of(Outline.import_path(items, head), name, String.join(rr <> more, "."))    case other:      name# an item's key: bend's name for itdef key(items: List<&2, Outline.Item>, +name: String) -> String:  key.parts(items, name, String.split(name, '.'))# the keys of the items, imports aside, onto acc (in no particular order)def keys(its: List<&2, Outline.Item>, +items: List<&2, Outline.Item>, +acc: List<&2, String>) -> List<&2, String>:  match its:    case Nil{}:      acc    case Con{Outline.Item{+kk, +nn, _line, _sig, _doc, _path}, rest}:      keys(rest, items, Lazy.stop(List<&2, String>, Outline.is_import(kk), acc, _u => key(items, nn) <> acc))# the names bend gives a file's items, when its text could be readdef of(mm: Maybe<&2, String>) -> Maybe<&2, List<&2, String>>:  match mm:    case None{}:      None{}    case Some{text}:      +items = Outline.items(text)      Some{keys(items, items, [])}