@@ -59,6 +59,49 @@ pub fn (r &ReferenceImpl) resolve() ?PsiElement {
5959 return result
6060}
6161
62+ pub fn (r &ReferenceImpl) multi_resolve () []PsiElement {
63+ file := r.file or { return [] }
64+
65+ if res := r.resolve_as_import_spec () {
66+ return res
67+ }
68+
69+ sub := SubResolver{
70+ containing_file: file
71+ element: r.element
72+ for_types: r.for_types
73+ for_attributes: r.for_attributes
74+ }
75+ mut processor := ResolveProcessor{
76+ containing_file: file
77+ ref: r.element
78+ ref_name: r.element.name ()
79+ collect_all: true
80+ }
81+
82+ sub.process_resolve_variants (mut processor)
83+
84+ return processor.result
85+ }
86+
87+ fn (r &ReferenceImpl) resolve_as_import_spec () ? []PsiElement {
88+ if r.element is Identifier {
89+ parent := r.element.parent ()?
90+ if parent ! is ImportName {
91+ return none
92+ }
93+ spec := parent.parent ()? .parent ()?
94+ if spec is ImportSpec {
95+ if ident := spec.identifier () {
96+ if ident.is_equal (parent) {
97+ return [spec]
98+ }
99+ }
100+ }
101+ }
102+ return none
103+ }
104+
62105pub struct SubResolver {
63106pub :
64107 containing_file ? & PsiFile
@@ -91,16 +134,22 @@ pub fn (r &SubResolver) process_qualifier_expression(qualifier PsiElement, mut p
91134
92135 if qualifier is ReferenceExpressionBase {
93136 resolved := qualifier.resolve () or { return true }
137+
94138 if resolved is ImportSpec {
95- import_name := resolved.qualified_name ()
96- real_fqn := stubs_index.find_real_module_fqn (import_name)
139+ import_name := resolved.import_name ()
140+ file := r.containing_file or { return true }
141+ specs := file.resolve_import_specs (import_name)
97142
98- elements := stubs_index.get_all_declarations_from_module (real_fqn, r.for_types)
99- for element in elements {
100- if ! processor.execute (element) {
143+ for _, spec in specs {
144+ target_fqn := spec.qualified_name ()
145+ real_fqn := stubs_index.find_real_module_fqn (target_fqn)
146+ elements := stubs_index.get_all_declarations_from_module (real_fqn, r.for_types)
147+
148+ if ! r.process_elements (elements, mut processor) {
101149 return false
102150 }
103151 }
152+ return true
104153 }
105154
106155 if resolved is ModuleClause {
@@ -821,7 +870,8 @@ pub struct ResolveProcessor {
821870 ref ReferenceExpressionBase
822871 ref_name string
823872mut :
824- result []PsiElement
873+ result []PsiElement
874+ collect_all bool
825875}
826876
827877fn (mut r ResolveProcessor) execute (element PsiElement) bool {
@@ -836,6 +886,9 @@ fn (mut r ResolveProcessor) execute(element PsiElement) bool {
836886 }
837887 if name == r.ref_name {
838888 r.result << element as PsiElement
889+ if r.collect_all {
890+ return true
891+ }
839892 return false
840893 }
841894 }
0 commit comments