class Steep::AST::Node::TypeApplication
def self.parse(location)
def self.parse(location) if location.source =~/\A\$\s*(.+)/ TypeApplication.new(location) end end
def initialize(location)
def initialize(location) @location = location end
def line
def line location.start_line end
def node
def node @node || raise end
def set_node(node)
def set_node(node) @node = node end
def source
def source location.source end
def type_location
def type_location offset = source.size - type_str.size RBS::Location.new(location.buffer, location.start_pos + offset, location.end_pos) end
def type_str
def type_str @type_str ||= source.delete_prefix("$").lstrip end
def types(context, subtyping, type_vars)
def types(context, subtyping, type_vars) resolver = RBS::Resolver::TypeNameResolver.new(subtyping.factory.env) # @type var types: Array[LocatedValue[Types::t]] types = [] loc = type_location while true rbs_ty = RBS::Parser.parse_type(loc.buffer, range: loc.range, variables: type_vars) or break rbs_loc = rbs_ty.location or raise ty = rbs_ty.map_type_name {|name| resolver.resolve(name, context: context) || name.absolute! } validator = Signature::Validator.new(checker: subtyping) validator.rescue_validation_errors do validator.validate_type(ty) end if validator.has_error? return validator.each_error end ty = subtyping.factory.type(ty) types << LocatedValue.new(value: ty, location: rbs_loc) match = RBS::Location.new(loc.buffer, rbs_loc.end_pos, type_location.end_pos).source.match(/\A\s*,\s*/) or break offset = match.length loc = RBS::Location.new(loc.buffer, rbs_loc.end_pos + offset, type_location.end_pos) end types rescue ::RBS::ParsingError => exn exn end
def types?(context, subtyping, type_vars)
def types?(context, subtyping, type_vars) case types = types(context, subtyping, type_vars) when RBS::ParsingError, Enumerator nil else types end end