@@ -275,53 +275,96 @@ def constant_entry(type_name)
275275 class_entry ( type_name ) || module_entry ( type_name ) || constant_decls [ type_name ]
276276 end
277277
278+ def normalize_type_name? ( name )
279+ if name . class?
280+ normalize_module_name? ( name )
281+ else
282+ unless name . namespace . empty?
283+ parent = name . namespace . to_type_name
284+ parent = normalize_module_name? ( parent )
285+ return parent unless parent
286+
287+ TypeName . new ( namespace : parent . to_namespace , name : name . name )
288+ else
289+ name
290+ end
291+ end
292+ end
293+
294+ def normalize_type_name! ( name )
295+ result = normalize_type_name? ( name )
296+
297+ case result
298+ when TypeName
299+ result
300+ when false
301+ raise "Type name `#{ name } ` cannot be normalized because it's a cyclic definition"
302+ when nil
303+ raise "Type name `#{ name } ` cannot be normalized because of unknown type name in the path"
304+ end
305+ end
306+
307+ def normalized_type_name? ( type_name )
308+ case
309+ when type_name . interface?
310+ interface_decls . key? ( type_name )
311+ when type_name . class?
312+ class_decls . key? ( type_name )
313+ when type_name . alias?
314+ type_alias_decls . key? ( type_name )
315+ else
316+ false
317+ end
318+ end
319+
320+ def normalized_type_name! ( name )
321+ normalized_type_name? ( name ) or raise "Normalized type name is expected but given `#{ name } `, which is normalized to `#{ normalize_type_name? ( name ) } `"
322+ name
323+ end
324+
325+ def normalize_type_name ( name )
326+ normalize_type_name? ( name ) || name
327+ end
328+
278329 def normalize_module_name ( name )
279330 normalize_module_name? ( name ) or name
280331 end
281332
282333 def normalize_module_name? ( name )
283334 raise "Class/module name is expected: #{ name } " unless name . class?
284- name = name . absolute! if name . relative!
335+ name = name . absolute! unless name . absolute?
285336
286337 if @normalize_module_name_cache . key? ( name )
287338 return @normalize_module_name_cache [ name ]
288339 end
289340
341+ unless name . namespace . empty?
342+ parent = name . namespace . to_type_name
343+ if normalized_parent = normalize_module_name? ( parent )
344+ type_name = TypeName . new ( namespace : normalized_parent . to_namespace , name : name . name )
345+ else
346+ @normalize_module_name_cache [ name ] = nil
347+ return
348+ end
349+ else
350+ type_name = name
351+ end
352+
290353 @normalize_module_name_cache [ name ] = false
291354
292- entry = constant_entry ( name )
293- case entry
294- when ClassEntry , ModuleEntry
295- @normalize_module_name_cache [ name ] = entry . name
296- entry . name
355+ entry = constant_entry ( type_name )
297356
298- when ClassAliasEntry , ModuleAliasEntry
299- old_name = entry . decl . old_name
300- if old_name . namespace . empty?
301- @normalize_module_name_cache [ name ] = normalize_module_name? ( old_name )
357+ normalized_type_name =
358+ case entry
359+ when ClassEntry , ModuleEntry
360+ type_name
361+ when ClassAliasEntry , ModuleAliasEntry
362+ normalize_module_name? ( entry . decl . old_name )
302363 else
303- parent = old_name . namespace . to_type_name
304-
305- if normalized_parent = normalize_module_name? ( parent )
306- @normalize_module_name_cache [ name ] =
307- if normalized_parent == parent
308- normalize_module_name? ( old_name )
309- else
310- normalize_module_name? (
311- TypeName . new ( name : old_name . name , namespace : normalized_parent . to_namespace )
312- )
313- end
314- else
315- @normalize_module_name_cache [ name ] = nil
316- end
364+ nil
317365 end
318366
319- when ConstantEntry
320- raise "#{ name } is a constant name"
321-
322- else
323- @normalize_module_name_cache [ name ] = nil
324- end
367+ @normalize_module_name_cache [ name ] = normalized_type_name
325368 end
326369
327370 def insert_decl ( decl , outer :, namespace :)
0 commit comments