Appearance
| 1 | namespace Semantic.Symbols is | |
| 2 | use Collections.List | |
| 3 | ||
| 4 | use IO.Std | |
| 5 | ||
| 6 | use IoC | |
| 7 | use Logging | |
| 8 | use Source | |
| 9 | ||
| 10 | use Types.Type | |
| 11 | ||
| 12 | use Ghul.Pipes | |
| 13 | ||
| 14 | class TUPLE: GENERIC is | |
| 15 | names: List[string?]? | |
| 16 | ||
| 17 | qualified_name: string => Types.TUPLE.get_short_description(type, names, true) | |
| 18 | ||
| 19 | describe(context: DESCRIBE_CONTEXT) -> SignaturePart => | |
| 20 | PARTS.literal(qualified_name) | |
| 21 | ||
| 22 | init(location: LOCATION, symbol: Symbols.Classy, arguments: Collections.List[Type], names: List[string?]?) is | |
| 23 | super.init(location, symbol, arguments) | |
| 24 | ||
| 25 | self.names = names | |
| 26 | si | |
| 27 | ||
| 28 | get_element_name(index: int) -> string? => | |
| 29 | if names? /\ index < names.count then | |
| 30 | names[index] | |
| 31 | else | |
| 32 | "{index}" | |
| 33 | fi | |
| 34 | ||
| 35 | find_named_element(name: string) -> Symbol? is | |
| 36 | if !names? then | |
| 37 | return null | |
| 38 | fi | |
| 39 | ||
| 40 | let m = names |> index() |> find(iv => iv.value =~ name) | |
| 41 | ||
| 42 | if !m? then | |
| 43 | return null | |
| 44 | fi | |
| 45 | ||
| 46 | let s = symbol.find_direct("{m.index}") | |
| 47 | return _specialize(s) | |
| 48 | si | |
| 49 | ||
| 50 | find_direct(name: string) -> Symbol? is | |
| 51 | assert_symbols_pulled_down() | |
| 52 | ||
| 53 | return _specialize(symbol.find_direct(name)) | |
| 54 | si | |
| 55 | ||
| 56 | find_member(name: string) -> Symbol? is | |
| 57 | let named_element = find_named_element(name) | |
| 58 | ||
| 59 | if named_element? then | |
| 60 | return named_element | |
| 61 | fi | |
| 62 | ||
| 63 | return _specialize(symbol.find_member(name)) | |
| 64 | si | |
| 65 | ||
| 66 | find_enclosing(name: string) -> Symbol? is | |
| 67 | let unspecialized = symbol.find_enclosing(name) | |
| 68 | ||
| 69 | if unspecialized? /\ unspecialized.owner == symbol then | |
| 70 | return _specialize(unspecialized) | |
| 71 | else | |
| 72 | return unspecialized | |
| 73 | fi | |
| 74 | si | |
| 75 | ||
| 76 | find_direct_matches(prefix: string, matches: Collections.MutableMap[string, Symbols.Symbol]) is | |
| 77 | let m = Collections.MAP[string, Symbols.Symbol]() | |
| 78 | ||
| 79 | symbol.find_direct_matches(prefix, m) | |
| 80 | ||
| 81 | if names? then | |
| 82 | for (index, name) in names |> index() do | |
| 83 | if name? then | |
| 84 | if let positional = symbol.find_direct("{index}") then | |
| 85 | m[name] = positional | |
| 86 | fi | |
| 87 | m.remove("{index}") | |
| 88 | fi | |
| 89 | od | |
| 90 | fi | |
| 91 | ||
| 92 | for p in m do | |
| 93 | if !matches.contains_key(p.key) then | |
| 94 | matches[p.key] = _specialize(p.value)!.collapse_group_if_single_member() | |
| 95 | fi | |
| 96 | od | |
| 97 | si | |
| 98 | ||
| 99 | find_member_matches(prefix: string, matches: Collections.MutableMap[string, Symbols.Symbol]) is | |
| 100 | find_direct_matches(prefix, matches) | |
| 101 | symbol.find_ancestor_matches(prefix, matches) | |
| 102 | si | |
| 103 | ||
| 104 | find_enclosing_matches(prefix: string, matches: Collections.MutableMap[string, Symbols.Symbol]) is | |
| 105 | si | |
| 106 | ||
| 107 | to_string() -> string => description | |
| 108 | si | |
| 109 | si |