moduleSteepmoduleServicesclassTypeNameCompletionmodulePrefixRawIdentPrefix=_=Struct.new(:ident)do# @implements RawIdentPrefixdefconst_name?ident.start_with?(/[A-Z]/)enddefsizeident.lengthendendNamespacedIdentPrefix=_=Struct.new(:namespace,:ident,:size)do# @implements NamespacedIdentPrefixdefconst_name?ident.start_with?(/[A-Z]/)endendNamespacePrefix=_=Struct.new(:namespace,:size)defself.parse(buffer,line:,column:)pos=buffer.loc_to_pos([line,column])prefix=buffer.content[0...pos]orraiseprefix.reverse!caseprefixwhen/\A((::\w+[A-Z])+(::)?)/namespace=$1orraiseNamespacePrefix.new(RBS::Namespace.parse(namespace.reverse),namespace.size)when/\A::/NamespacePrefix.new(RBS::Namespace.root,2)when/\A(\w*[A-Za-z_])((::\w+[A-Z])+(::)?)/namespace=$1orraiseidentifier=$2orraiseNamespacedIdentPrefix.new(RBS::Namespace.parse(identifier.reverse),namespace.reverse,namespace.size+identifier.size)when/\A(\w*[A-Za-z_])::/namespace=$1orraiseNamespacedIdentPrefix.new(RBS::Namespace.root,namespace.reverse,namespace.size+2)when/\A(\w*[A-Za-z_])/identifier=$1orraiseRawIdentPrefix.new(identifier.reverse)endendendattr_reader:env,:context,:type_name_resolver,:mapdefinitialize(env:,context:,dirs:)@env=env@context=contexttable=RBS::Environment::UseMap::Table.new()table.known_types.merge(env.class_decls.keys)table.known_types.merge(env.class_alias_decls.keys)table.known_types.merge(env.type_alias_decls.keys)table.known_types.merge(env.interface_decls.keys)table.compute_children@map=RBS::Environment::UseMap.new(table: table)dirs.eachdo|dir|dir.clauses.eachdo|clause|@map.build_map(clause)endend@type_name_resolver=RBS::Resolver::TypeNameResolver.new(env)enddefeach_outer_module(context=self.context,&block)ifblockif(parent,con=context)namespace=each_outer_module(parent,&block)caseconwhenfalsenamespacewhenRBS::TypeNamens=con.with_prefix(namespace).to_namespaceyield(ns)nsendelseyield(RBS::Namespace.root)RBS::Namespace.rootendelseenum_for:each_outer_moduleendenddefeach_type_name(&block)ifblockenv=self.envtable={}#: Hash[RBS::Namespace, Array[RBS::TypeName]]env.class_decls.each_keydo|type_name|yield(type_name)(table[type_name.namespace]||=[])<<type_nameendenv.type_alias_decls.each_keydo|type_name|yield(type_name)(table[type_name.namespace]||=[])<<type_nameendenv.interface_decls.each_keydo|type_name|yield(type_name)(table[type_name.namespace]||=[])<<type_nameendenv.class_alias_decls.each_keydo|type_name|yield(type_name)(table[type_name.namespace]||=[])<<type_nameendenv.class_alias_decls.each_keydo|alias_name|normalized_name=env.normalize_module_name?(alias_name)ornexteach_type_name_under(alias_name,normalized_name,table: table,&block)endresolve_pairs=[]#: Array[[RBS::TypeName, RBS::TypeName]]map.instance_evaldo@map.each_keydo|name|relative_name=RBS::TypeName.new(name: name,namespace: RBS::Namespace.empty)ifabsolute_name=resolve?(relative_name)ifenv.type_name?(absolute_name)# Yields only if the relative type name resolves to existing absolute type nameresolve_pairs<<[relative_name,absolute_name]endendendendresolve_pairs.eachdo|use_name,absolute_name|yielduse_nameeach_type_name_under(use_name,absolute_name,table: table,&block)endelseenum_for:each_type_nameendenddefeach_type_name_under(module_name,normalized_name,table:,&block)ifchildren=table.fetch(normalized_name.to_namespace,nil)module_namespace=module_name.to_namespacechildren.eachdo|normalized_child_name|child_name=RBS::TypeName.new(namespace: module_namespace,name: normalized_child_name.name)yieldchild_nameifnormalized_child_name.class?each_type_name_under(child_name,env.normalize_module_name(normalized_child_name),table: table,&block)endendendenddefresolve_used_name(name)returnnilifname.absolute?casewhenresolved=map.resolve?(name)resolvedwhenname.namespace.empty?nilelseifresolved_parent=resolve_used_name(name.namespace.to_type_name)resolved_name=RBS::TypeName.new(namespace: resolved_parent.to_namespace,name: name.name)ifenv.normalize_type_name?(resolved_name)resolved_nameendendendenddefresolve_name_in_context(name)ifresolved_name=resolve_used_name(name)return[resolved_name,name]endname.absolute?orraisenormalized_name=env.normalize_type_name?(name)orraise"Cannot normalize given type name `#{name}`"name.namespace.path.reverse_each.inject(RBS::TypeName.new(namespace: RBS::Namespace.empty,name: name.name))do|relative_name,component|iftype_name_resolver.resolve(relative_name,context: context)==namereturn[normalized_name,relative_name]endRBS::TypeName.new(namespace: RBS::Namespace.new(path: [component,*relative_name.namespace.path],absolute: false),name: name.name)endiftype_name_resolver.resolve(name.relative!,context: context)==name&&!resolve_used_name(name.relative!)[normalized_name,name.relative!]else[normalized_name,name]endenddeffind_type_names(prefix)caseprefixwhenPrefix::RawIdentPrefixeach_type_name.filterdo|type_name|type_name.split.any?{|sym|sym.to_s.downcase.include?(prefix.ident.downcase)}endwhenPrefix::NamespacedIdentPrefixabsolute_namespace=ifprefix.namespace.empty?RBS::Namespace.rootelsetype_name_resolver.resolve(prefix.namespace.to_type_name,context: context)&.to_namespace||prefix.namespaceendeach_type_name.filterdo|name|name.namespace==absolute_namespace&&name.name.to_s.downcase.include?(prefix.ident.downcase)endwhenPrefix::NamespacePrefixabsolute_namespace=type_name_resolver.resolve(prefix.namespace.to_type_name,context: context)&.to_namespace||prefix.namespaceeach_type_name.filter{|name|name.namespace==absolute_namespace}else# Returns all of the accessible type names from the contextnamespaces=each_outer_module.to_set# Relative type name means a *use*d type nameeach_type_name.filter{|name|namespaces.include?(name.namespace)||!name.absolute?}endendendendend