@@ -134,24 +134,24 @@ impl<'db> AmbiguousClassCollector<'db> {
134134 match value {
135135 AmbiguityState :: Unambiguous ( existing) => {
136136 if * existing != class {
137- let class_parents = class. class_parents ( db) ;
138- if existing. class_parents ( db) == class_parents {
137+ let qualified_name_components = class. qualified_name_components ( db) ;
138+ if existing. qualified_name_components ( db) == qualified_name_components {
139139 * value = AmbiguityState :: RequiresFileAndLineNumber ;
140140 } else {
141141 * value = AmbiguityState :: RequiresFullyQualifiedName {
142142 class,
143- class_parents ,
143+ qualified_name_components ,
144144 } ;
145145 }
146146 }
147147 }
148148 AmbiguityState :: RequiresFullyQualifiedName {
149149 class : existing,
150- class_parents ,
150+ qualified_name_components ,
151151 } => {
152152 if * existing != class {
153- let new_class_parents = class. class_parents ( db) ;
154- if * class_parents == new_class_parents {
153+ let new_components = class. qualified_name_components ( db) ;
154+ if * qualified_name_components == new_components {
155155 * value = AmbiguityState :: RequiresFileAndLineNumber ;
156156 }
157157 }
@@ -172,7 +172,7 @@ enum AmbiguityState<'db> {
172172 /// The class must be displayed using its fully qualified name to avoid ambiguity.
173173 RequiresFullyQualifiedName {
174174 class : ClassLiteral < ' db > ,
175- class_parents : Vec < String > ,
175+ qualified_name_components : Vec < String > ,
176176 } ,
177177 /// Even the class's fully qualified name is not sufficient;
178178 /// we must also include the file and line number.
@@ -275,16 +275,14 @@ impl<'db> ClassLiteral<'db> {
275275 settings,
276276 }
277277 }
278- }
279-
280- struct ClassDisplay < ' db > {
281- db : & ' db dyn Db ,
282- class : ClassLiteral < ' db > ,
283- settings : DisplaySettings < ' db > ,
284- }
285278
286- impl < ' db > ClassLiteral < ' db > {
287- fn class_parents ( self , db : & ' db dyn Db ) -> Vec < String > {
279+ /// Returns the components of the qualified name of this class, excluding this class itself.
280+ ///
281+ /// For example, calling this method on a class `C` in the module `a.b` would return
282+ /// `["a", "b"]`. Calling this method on a class `D` inside the namespace of a method
283+ /// `m` inside the namespace of a class `C` in the module `a.b` would return
284+ /// `["a", "b", "C", "<locals of function 'm'>"]`.
285+ fn qualified_name_components ( self , db : & ' db dyn Db ) -> Vec < String > {
288286 let body_scope = self . body_scope ( db) ;
289287 let file = body_scope. file ( db) ;
290288 let module_ast = parsed_module ( db, file) . load ( db) ;
@@ -325,11 +323,17 @@ impl<'db> ClassLiteral<'db> {
325323 }
326324}
327325
326+ struct ClassDisplay < ' db > {
327+ db : & ' db dyn Db ,
328+ class : ClassLiteral < ' db > ,
329+ settings : DisplaySettings < ' db > ,
330+ }
331+
328332impl Display for ClassDisplay < ' _ > {
329333 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
330334 let qualification_level = self . settings . qualified . get ( & * * self . class . name ( self . db ) ) ;
331335 if qualification_level. is_some ( ) {
332- for parent in self . class . class_parents ( self . db ) {
336+ for parent in self . class . qualified_name_components ( self . db ) {
333337 f. write_str ( & parent) ?;
334338 f. write_char ( '.' ) ?;
335339 }
0 commit comments