lib/rbs/environment.rb in rbs-3.1.1 vs lib/rbs/environment.rb in rbs-3.1.2

- old
+ new

@@ -273,56 +273,99 @@ def constant_entry(type_name) class_entry(type_name) || module_entry(type_name) || constant_decls[type_name] end + def normalize_type_name?(name) + if name.class? + normalize_module_name?(name) + else + unless name.namespace.empty? + parent = name.namespace.to_type_name + parent = normalize_module_name?(parent) + return parent unless parent + + TypeName.new(namespace: parent.to_namespace, name: name.name) + else + name + end + end + end + + def normalize_type_name!(name) + result = normalize_type_name?(name) + + case result + when TypeName + result + when false + raise "Type name `#{name}` cannot be normalized because it's a cyclic definition" + when nil + raise "Type name `#{name}` cannot be normalized because of unknown type name in the path" + end + end + + def normalized_type_name?(type_name) + case + when type_name.interface? + interface_decls.key?(type_name) + when type_name.class? + class_decls.key?(type_name) + when type_name.alias? + type_alias_decls.key?(type_name) + else + false + end + end + + def normalized_type_name!(name) + normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`" + name + end + + def normalize_type_name(name) + normalize_type_name?(name) || name + end + def normalize_module_name(name) normalize_module_name?(name) or name end def normalize_module_name?(name) raise "Class/module name is expected: #{name}" unless name.class? - name = name.absolute! if name.relative! + name = name.absolute! unless name.absolute? if @normalize_module_name_cache.key?(name) return @normalize_module_name_cache[name] end + unless name.namespace.empty? + parent = name.namespace.to_type_name + if normalized_parent = normalize_module_name?(parent) + type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name) + else + @normalize_module_name_cache[name] = nil + return + end + else + type_name = name + end + @normalize_module_name_cache[name] = false - entry = constant_entry(name) - case entry - when ClassEntry, ModuleEntry - @normalize_module_name_cache[name] = entry.name - entry.name + entry = constant_entry(type_name) - when ClassAliasEntry, ModuleAliasEntry - old_name = entry.decl.old_name - if old_name.namespace.empty? - @normalize_module_name_cache[name] = normalize_module_name?(old_name) + normalized_type_name = + case entry + when ClassEntry, ModuleEntry + type_name + when ClassAliasEntry, ModuleAliasEntry + normalize_module_name?(entry.decl.old_name) else - parent = old_name.namespace.to_type_name - - if normalized_parent = normalize_module_name?(parent) - @normalize_module_name_cache[name] = - if normalized_parent == parent - normalize_module_name?(old_name) - else - normalize_module_name?( - TypeName.new(name: old_name.name, namespace: normalized_parent.to_namespace) - ) - end - else - @normalize_module_name_cache[name] = nil - end + nil end - when ConstantEntry - raise "#{name} is a constant name" - - else - @normalize_module_name_cache[name] = nil - end + @normalize_module_name_cache[name] = normalized_type_name end def insert_decl(decl, outer:, namespace:) case decl when AST::Declarations::Class, AST::Declarations::Module