rbs 3.8.0 → 3.9.0.dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +3 -3
- data/.github/workflows/dependabot.yml +1 -1
- data/.github/workflows/ruby.yml +7 -7
- data/.github/workflows/typecheck.yml +2 -0
- data/.github/workflows/windows.yml +15 -0
- data/.rubocop.yml +20 -1
- data/CHANGELOG.md +14 -0
- data/Rakefile +5 -2
- data/config.yml +6 -0
- data/core/data.rbs +1 -1
- data/core/enumerator.rbs +14 -2
- data/core/exception.rbs +148 -39
- data/core/gc.rbs +2 -2
- data/core/io.rbs +7 -3
- data/core/kernel.rbs +58 -16
- data/core/method.rbs +2 -2
- data/core/module.rbs +3 -3
- data/core/proc.rbs +2 -2
- data/core/ractor.rbs +4 -1
- data/core/rbs/unnamed/argf.rbs +3 -3
- data/core/regexp.rbs +4 -2
- data/core/ruby_vm.rbs +8 -8
- data/core/rubygems/version.rbs +2 -2
- data/core/string.rbs +1 -1
- data/core/time.rbs +1 -1
- data/core/unbound_method.rbs +1 -1
- data/docs/syntax.md +10 -5
- data/ext/rbs_extension/extconf.rb +2 -1
- data/ext/rbs_extension/location.c +32 -10
- data/ext/rbs_extension/location.h +4 -3
- data/ext/rbs_extension/main.c +22 -1
- data/ext/rbs_extension/parser.c +144 -136
- data/ext/rbs_extension/parserstate.c +40 -9
- data/ext/rbs_extension/parserstate.h +6 -4
- data/include/rbs/ruby_objs.h +6 -6
- data/include/rbs/util/rbs_constant_pool.h +219 -0
- data/lib/rbs/ast/declarations.rb +9 -4
- data/lib/rbs/ast/directives.rb +10 -0
- data/lib/rbs/ast/members.rb +2 -0
- data/lib/rbs/ast/type_param.rb +2 -2
- data/lib/rbs/cli/validate.rb +1 -0
- data/lib/rbs/cli.rb +3 -3
- data/lib/rbs/collection/config/lockfile_generator.rb +28 -7
- data/lib/rbs/collection/sources/rubygems.rb +1 -1
- data/lib/rbs/definition.rb +46 -31
- data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
- data/lib/rbs/definition_builder.rb +86 -30
- data/lib/rbs/environment.rb +33 -18
- data/lib/rbs/errors.rb +23 -0
- data/lib/rbs/locator.rb +2 -0
- data/lib/rbs/method_type.rb +2 -0
- data/lib/rbs/parser_aux.rb +38 -1
- data/lib/rbs/subtractor.rb +3 -3
- data/lib/rbs/test/hook.rb +2 -2
- data/lib/rbs/test/type_check.rb +7 -5
- data/lib/rbs/types.rb +44 -5
- data/lib/rbs/unit_test/spy.rb +4 -2
- data/lib/rbs/unit_test/type_assertions.rb +17 -11
- data/lib/rbs/validator.rb +4 -0
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +10 -5
- data/lib/rbs.rb +1 -0
- data/rbs.gemspec +1 -1
- data/sig/collection/config/lockfile_generator.rbs +1 -1
- data/sig/declarations.rbs +10 -3
- data/sig/definition.rbs +67 -14
- data/sig/definition_builder.rbs +17 -3
- data/sig/directives.rbs +17 -1
- data/sig/environment.rbs +2 -0
- data/sig/errors.rbs +16 -0
- data/sig/parser.rbs +5 -1
- data/sig/subtractor.rbs +1 -1
- data/sig/test/type_check.rbs +2 -2
- data/sig/type_param.rbs +1 -1
- data/sig/types.rbs +3 -0
- data/sig/unit_test/spy.rbs +2 -0
- data/sig/unit_test/type_assertions.rbs +2 -0
- data/sig/validator.rbs +4 -0
- data/sig/writer.rbs +1 -1
- data/src/ruby_objs.c +12 -6
- data/src/util/rbs_constant_pool.c +342 -0
- data/stdlib/cgi/0/core.rbs +10 -0
- data/stdlib/json/0/json.rbs +52 -50
- data/stdlib/monitor/0/monitor.rbs +13 -4
- data/stdlib/net-http/0/net-http.rbs +2 -2
- data/stdlib/openssl/0/openssl.rbs +73 -73
- data/stdlib/resolv/0/resolv.rbs +8 -8
- data/stdlib/socket/0/addrinfo.rbs +1 -1
- data/stdlib/socket/0/unix_socket.rbs +4 -2
- data/stdlib/stringio/0/stringio.rbs +1 -1
- data/stdlib/uri/0/common.rbs +17 -0
- metadata +4 -7
- data/templates/include/rbs/constants.h.erb +0 -20
- data/templates/include/rbs/ruby_objs.h.erb +0 -10
- data/templates/src/constants.c.erb +0 -36
- data/templates/src/ruby_objs.c.erb +0 -27
- data/templates/template.rb +0 -122
    
        data/lib/rbs/definition.rb
    CHANGED
    
    | @@ -6,18 +6,23 @@ module RBS | |
| 6 6 | 
             
                  attr_reader :parent_variable
         | 
| 7 7 | 
             
                  attr_reader :type
         | 
| 8 8 | 
             
                  attr_reader :declared_in
         | 
| 9 | 
            +
                  attr_reader :source
         | 
| 9 10 |  | 
| 10 | 
            -
                  def initialize(parent_variable:, type:, declared_in:)
         | 
| 11 | 
            +
                  def initialize(parent_variable:, type:, declared_in:, source:)
         | 
| 11 12 | 
             
                    @parent_variable = parent_variable
         | 
| 12 13 | 
             
                    @type = type
         | 
| 13 14 | 
             
                    @declared_in = declared_in
         | 
| 15 | 
            +
                    @source = source
         | 
| 14 16 | 
             
                  end
         | 
| 15 17 |  | 
| 16 18 | 
             
                  def sub(s)
         | 
| 19 | 
            +
                    return self if s.empty?
         | 
| 20 | 
            +
             | 
| 17 21 | 
             
                    self.class.new(
         | 
| 18 22 | 
             
                      parent_variable: parent_variable,
         | 
| 19 23 | 
             
                      type: type.sub(s),
         | 
| 20 | 
            -
                      declared_in: declared_in
         | 
| 24 | 
            +
                      declared_in: declared_in,
         | 
| 25 | 
            +
                      source: source
         | 
| 21 26 | 
             
                    )
         | 
| 22 27 | 
             
                  end
         | 
| 23 28 | 
             
                end
         | 
| @@ -37,9 +42,9 @@ module RBS | |
| 37 42 | 
             
                      @member = member
         | 
| 38 43 | 
             
                      @defined_in = defined_in
         | 
| 39 44 | 
             
                      @implemented_in = implemented_in
         | 
| 40 | 
            -
                      @member_annotations =  | 
| 41 | 
            -
                      @overload_annotations =  | 
| 42 | 
            -
                      @annotations =  | 
| 45 | 
            +
                      @member_annotations = []
         | 
| 46 | 
            +
                      @overload_annotations = []
         | 
| 47 | 
            +
                      @annotations = []
         | 
| 43 48 | 
             
                    end
         | 
| 44 49 |  | 
| 45 50 | 
             
                    def ==(other)
         | 
| @@ -61,7 +66,10 @@ module RBS | |
| 61 66 | 
             
                    end
         | 
| 62 67 |  | 
| 63 68 | 
             
                    def update(type: self.type, member: self.member, defined_in: self.defined_in, implemented_in: self.implemented_in)
         | 
| 64 | 
            -
                      TypeDef.new(type: type, member: member, defined_in: defined_in, implemented_in: implemented_in | 
| 69 | 
            +
                      TypeDef.new(type: type, member: member, defined_in: defined_in, implemented_in: implemented_in).tap do |type_def|
         | 
| 70 | 
            +
                        type_def.overload_annotations.replace(self.overload_annotations)
         | 
| 71 | 
            +
                        type_def.member_annotations.replace(self.member_annotations)
         | 
| 72 | 
            +
                      end
         | 
| 65 73 | 
             
                    end
         | 
| 66 74 |  | 
| 67 75 | 
             
                    def overload?
         | 
| @@ -72,20 +80,33 @@ module RBS | |
| 72 80 | 
             
                        false
         | 
| 73 81 | 
             
                      end
         | 
| 74 82 | 
             
                    end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    def each_annotation(&block)
         | 
| 85 | 
            +
                      if block
         | 
| 86 | 
            +
                        member_annotations.each(&block)
         | 
| 87 | 
            +
                        overload_annotations.each(&block)
         | 
| 88 | 
            +
                      else
         | 
| 89 | 
            +
                        enum_for :each_annotation
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
                    end
         | 
| 75 92 | 
             
                  end
         | 
| 76 93 |  | 
| 77 94 | 
             
                  attr_reader :super_method
         | 
| 78 95 | 
             
                  attr_reader :defs
         | 
| 79 96 | 
             
                  attr_reader :accessibility
         | 
| 80 97 | 
             
                  attr_reader :extra_annotations
         | 
| 98 | 
            +
                  attr_reader :annotations
         | 
| 81 99 | 
             
                  attr_reader :alias_of
         | 
| 100 | 
            +
                  attr_reader :alias_member
         | 
| 82 101 |  | 
| 83 | 
            -
                  def initialize(super_method:, defs:, accessibility:, annotations: [], alias_of:)
         | 
| 102 | 
            +
                  def initialize(super_method:, defs:, accessibility:, annotations: [], alias_of:, alias_member: nil)
         | 
| 84 103 | 
             
                    @super_method = super_method
         | 
| 85 104 | 
             
                    @defs = defs
         | 
| 86 105 | 
             
                    @accessibility = accessibility
         | 
| 87 106 | 
             
                    @extra_annotations = []
         | 
| 107 | 
            +
                    @annotations = []
         | 
| 88 108 | 
             
                    @alias_of = alias_of
         | 
| 109 | 
            +
                    @alias_member = alias_member
         | 
| 89 110 | 
             
                  end
         | 
| 90 111 |  | 
| 91 112 | 
             
                  def ==(other)
         | 
| @@ -94,7 +115,8 @@ module RBS | |
| 94 115 | 
             
                      other.defs == defs &&
         | 
| 95 116 | 
             
                      other.accessibility == accessibility &&
         | 
| 96 117 | 
             
                      other.annotations == annotations &&
         | 
| 97 | 
            -
                      other.alias_of == alias_of
         | 
| 118 | 
            +
                      other.alias_of == alias_of &&
         | 
| 119 | 
            +
                      other.alias_member == alias_member
         | 
| 98 120 | 
             
                  end
         | 
| 99 121 |  | 
| 100 122 | 
             
                  alias eql? ==
         | 
| @@ -125,10 +147,6 @@ module RBS | |
| 125 147 | 
             
                    @comments ||= defs.map(&:comment).compact.uniq
         | 
| 126 148 | 
             
                  end
         | 
| 127 149 |  | 
| 128 | 
            -
                  def annotations
         | 
| 129 | 
            -
                    @annotations ||= defs.flat_map {|d| d.member_annotations }
         | 
| 130 | 
            -
                  end
         | 
| 131 | 
            -
             | 
| 132 150 | 
             
                  def members
         | 
| 133 151 | 
             
                    @members ||= defs.map(&:member).uniq
         | 
| 134 152 | 
             
                  end
         | 
| @@ -142,49 +160,44 @@ module RBS | |
| 142 160 | 
             
                  end
         | 
| 143 161 |  | 
| 144 162 | 
             
                  def sub(s)
         | 
| 145 | 
            -
                    self. | 
| 163 | 
            +
                    return self if s.empty?
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                    update(
         | 
| 146 166 | 
             
                      super_method: super_method&.sub(s),
         | 
| 147 | 
            -
                      defs: defs.map {|defn| defn.update(type: defn.type.sub(s)) } | 
| 148 | 
            -
                      accessibility: @accessibility,
         | 
| 149 | 
            -
                      alias_of: alias_of
         | 
| 167 | 
            +
                      defs: defs.map {|defn| defn.update(type: defn.type.sub(s)) }
         | 
| 150 168 | 
             
                    )
         | 
| 151 169 | 
             
                  end
         | 
| 152 170 |  | 
| 153 171 | 
             
                  def map_type(&block)
         | 
| 154 | 
            -
                     | 
| 172 | 
            +
                    update(
         | 
| 155 173 | 
             
                      super_method: super_method&.map_type(&block),
         | 
| 156 | 
            -
                      defs: defs.map {|defn| defn.update(type: defn.type.map_type(&block)) } | 
| 157 | 
            -
                      accessibility: @accessibility,
         | 
| 158 | 
            -
                      alias_of: alias_of
         | 
| 174 | 
            +
                      defs: defs.map {|defn| defn.update(type: defn.type.map_type(&block)) }
         | 
| 159 175 | 
             
                    )
         | 
| 160 176 | 
             
                  end
         | 
| 161 177 |  | 
| 162 178 | 
             
                  def map_type_bound(&block)
         | 
| 163 | 
            -
                     | 
| 179 | 
            +
                    update(
         | 
| 164 180 | 
             
                      super_method: super_method&.map_type_bound(&block),
         | 
| 165 | 
            -
                      defs: defs.map {|defn| defn.update(type: defn.type.map_type_bound(&block)) } | 
| 166 | 
            -
                      accessibility: @accessibility,
         | 
| 167 | 
            -
                      alias_of: alias_of
         | 
| 181 | 
            +
                      defs: defs.map {|defn| defn.update(type: defn.type.map_type_bound(&block)) }
         | 
| 168 182 | 
             
                    )
         | 
| 169 183 | 
             
                  end
         | 
| 170 184 |  | 
| 171 185 | 
             
                  def map_method_type(&block)
         | 
| 172 | 
            -
                     | 
| 173 | 
            -
                      super_method: super_method,
         | 
| 186 | 
            +
                    update(
         | 
| 174 187 | 
             
                      defs: defs.map {|defn| defn.update(type: yield(defn.type)) },
         | 
| 175 | 
            -
                      accessibility: @accessibility,
         | 
| 176 | 
            -
                      alias_of: alias_of
         | 
| 177 188 | 
             
                    )
         | 
| 178 189 | 
             
                  end
         | 
| 179 190 |  | 
| 180 | 
            -
                  def update(super_method: self.super_method, defs: self.defs, accessibility: self.accessibility, alias_of: self.alias_of, annotations: self.annotations)
         | 
| 191 | 
            +
                  def update(super_method: self.super_method, defs: self.defs, accessibility: self.accessibility, alias_of: self.alias_of, annotations: self.annotations, alias_member: self.alias_member)
         | 
| 181 192 | 
             
                    self.class.new(
         | 
| 182 193 | 
             
                      super_method: super_method,
         | 
| 183 194 | 
             
                      defs: defs,
         | 
| 184 195 | 
             
                      accessibility: accessibility,
         | 
| 185 196 | 
             
                      alias_of: alias_of,
         | 
| 186 | 
            -
                       | 
| 187 | 
            -
                    )
         | 
| 197 | 
            +
                      alias_member: alias_member
         | 
| 198 | 
            +
                    ).tap do |method|
         | 
| 199 | 
            +
                      method.annotations.replace(annotations)
         | 
| 200 | 
            +
                    end
         | 
| 188 201 | 
             
                  end
         | 
| 189 202 | 
             
                end
         | 
| 190 203 |  | 
| @@ -347,6 +360,8 @@ module RBS | |
| 347 360 | 
             
                end
         | 
| 348 361 |  | 
| 349 362 | 
             
                def sub(s)
         | 
| 363 | 
            +
                  return self if s.empty?
         | 
| 364 | 
            +
             | 
| 350 365 | 
             
                  definition = self.class.new(type_name: type_name, self_type: _ = self_type.sub(s), ancestors: ancestors, entry: entry)
         | 
| 351 366 |  | 
| 352 367 | 
             
                  definition.methods.merge!(methods.transform_values {|method| method.sub(s) })
         | 
| @@ -217,6 +217,7 @@ module RBS | |
| 217 217 | 
             
                        NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
         | 
| 218 218 | 
             
                        if super_class
         | 
| 219 219 | 
             
                          InheritModuleError.check!(super_class, env: env)
         | 
| 220 | 
            +
                          InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
         | 
| 220 221 | 
             
                        end
         | 
| 221 222 |  | 
| 222 223 | 
             
                        super_entry = env.normalized_class_entry(super_name) or raise
         | 
| @@ -243,6 +244,7 @@ module RBS | |
| 243 244 | 
             
                      else
         | 
| 244 245 | 
             
                        entry.self_types.each do |module_self|
         | 
| 245 246 | 
             
                          NoSelfTypeFoundError.check!(module_self, env: env)
         | 
| 247 | 
            +
                          InvalidTypeApplicationError.check2!(type_name: module_self.name, args: module_self.args, env: env, location: module_self.location)
         | 
| 246 248 |  | 
| 247 249 | 
             
                          module_name = module_self.name
         | 
| 248 250 | 
             
                          if module_name.class?
         | 
| @@ -82,7 +82,7 @@ module RBS | |
| 82 82 | 
             
                  AST::TypeParam.application(params, args) || Substitution.new()
         | 
| 83 83 | 
             
                end
         | 
| 84 84 |  | 
| 85 | 
            -
                def define_instance(definition, type_name, subst)
         | 
| 85 | 
            +
                def define_instance(definition, type_name, subst, define_class_vars:)
         | 
| 86 86 | 
             
                  one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
         | 
| 87 87 | 
             
                  methods = method_builder.build_instance(type_name)
         | 
| 88 88 |  | 
| @@ -104,7 +104,7 @@ module RBS | |
| 104 104 | 
             
                      validate_type_presence(arg)
         | 
| 105 105 | 
             
                    end
         | 
| 106 106 |  | 
| 107 | 
            -
                    define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args))
         | 
| 107 | 
            +
                    define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
         | 
| 108 108 | 
             
                  end
         | 
| 109 109 |  | 
| 110 110 | 
             
                  all_interfaces = one_ancestors.each_included_interface.flat_map do |interface|
         | 
| @@ -120,7 +120,7 @@ module RBS | |
| 120 120 | 
             
                      validate_type_presence(arg)
         | 
| 121 121 | 
             
                    end
         | 
| 122 122 |  | 
| 123 | 
            -
                    define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args))
         | 
| 123 | 
            +
                    define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
         | 
| 124 124 | 
             
                  end
         | 
| 125 125 |  | 
| 126 126 | 
             
                  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
         | 
| @@ -145,7 +145,8 @@ module RBS | |
| 145 145 | 
             
                              type_name,
         | 
| 146 146 | 
             
                              definition.instance_variables,
         | 
| 147 147 | 
             
                              name: ivar_name,
         | 
| 148 | 
            -
                              type: member.type.sub(subst_)
         | 
| 148 | 
            +
                              type: member.type.sub(subst_),
         | 
| 149 | 
            +
                              source: member
         | 
| 149 150 | 
             
                            )
         | 
| 150 151 | 
             
                          end
         | 
| 151 152 | 
             
                        end
         | 
| @@ -155,11 +156,14 @@ module RBS | |
| 155 156 | 
             
                          type_name,
         | 
| 156 157 | 
             
                          definition.instance_variables,
         | 
| 157 158 | 
             
                          name: member.name,
         | 
| 158 | 
            -
                          type: member.type.sub(subst_)
         | 
| 159 | 
            +
                          type: member.type.sub(subst_),
         | 
| 160 | 
            +
                          source: member
         | 
| 159 161 | 
             
                        )
         | 
| 160 162 |  | 
| 161 163 | 
             
                      when AST::Members::ClassVariable
         | 
| 162 | 
            -
                         | 
| 164 | 
            +
                        if define_class_vars
         | 
| 165 | 
            +
                          insert_variable(type_name, definition.class_variables, name: member.name, type: member.type, source: member)
         | 
| 166 | 
            +
                        end
         | 
| 163 167 | 
             
                      end
         | 
| 164 168 | 
             
                    end
         | 
| 165 169 | 
             
                  end
         | 
| @@ -214,13 +218,13 @@ module RBS | |
| 214 218 | 
             
                            if ans.name.interface?
         | 
| 215 219 | 
             
                              define_interface(definition, ans.name, subst)
         | 
| 216 220 | 
             
                            else
         | 
| 217 | 
            -
                              define_instance(definition, ans.name, subst)
         | 
| 221 | 
            +
                              define_instance(definition, ans.name, subst, define_class_vars: true)
         | 
| 218 222 | 
             
                            end
         | 
| 219 223 | 
             
                          end
         | 
| 220 224 | 
             
                        end
         | 
| 221 225 | 
             
                      end
         | 
| 222 226 |  | 
| 223 | 
            -
                      define_instance(definition, type_name, Substitution.new)
         | 
| 227 | 
            +
                      define_instance(definition, type_name, Substitution.new, define_class_vars: true)
         | 
| 224 228 | 
             
                    end
         | 
| 225 229 | 
             
                  end
         | 
| 226 230 | 
             
                end
         | 
| @@ -249,7 +253,6 @@ module RBS | |
| 249 253 |  | 
| 250 254 | 
             
                        definition.methods.merge!(defn.methods)
         | 
| 251 255 | 
             
                        definition.instance_variables.merge!(defn.instance_variables)
         | 
| 252 | 
            -
                        definition.class_variables.merge!(defn.class_variables)
         | 
| 253 256 | 
             
                      end
         | 
| 254 257 |  | 
| 255 258 | 
             
                      one_ancestors.each_extended_module do |mod|
         | 
| @@ -258,7 +261,7 @@ module RBS | |
| 258 261 | 
             
                        end
         | 
| 259 262 |  | 
| 260 263 | 
             
                        subst = tapp_subst(mod.name, mod.args)
         | 
| 261 | 
            -
                        define_instance(definition, mod.name, subst)
         | 
| 264 | 
            +
                        define_instance(definition, mod.name, subst, define_class_vars: false)
         | 
| 262 265 | 
             
                      end
         | 
| 263 266 |  | 
| 264 267 | 
             
                      all_interfaces = one_ancestors.each_extended_interface.flat_map do |interface|
         | 
| @@ -282,18 +285,18 @@ module RBS | |
| 282 285 | 
             
                                          end
         | 
| 283 286 |  | 
| 284 287 | 
             
                              if ivar_name
         | 
| 285 | 
            -
                                insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
         | 
| 288 | 
            +
                                insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type, source: member)
         | 
| 286 289 | 
             
                              end
         | 
| 287 290 | 
             
                            end
         | 
| 288 291 |  | 
| 289 292 | 
             
                          when AST::Members::ClassInstanceVariable
         | 
| 290 | 
            -
                            insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
         | 
| 291 | 
            -
             | 
| 292 | 
            -
                          when AST::Members::ClassVariable
         | 
| 293 | 
            -
                            insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
         | 
| 293 | 
            +
                            insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type, source: member)
         | 
| 294 294 | 
             
                          end
         | 
| 295 295 | 
             
                        end
         | 
| 296 296 | 
             
                      end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                      instance_definition = build_instance(type_name)
         | 
| 299 | 
            +
                      definition.class_variables.replace(instance_definition.class_variables)
         | 
| 297 300 | 
             
                    end
         | 
| 298 301 | 
             
                  end
         | 
| 299 302 | 
             
                end
         | 
| @@ -386,12 +389,14 @@ module RBS | |
| 386 389 | 
             
                                  type: method_type,
         | 
| 387 390 | 
             
                                  member: initialize_def.member,
         | 
| 388 391 | 
             
                                  defined_in: initialize_def.defined_in,
         | 
| 389 | 
            -
                                  implemented_in: initialize_def.implemented_in | 
| 390 | 
            -
             | 
| 391 | 
            -
             | 
| 392 | 
            +
                                  implemented_in: initialize_def.implemented_in
         | 
| 393 | 
            +
                                ).tap do |type_def|
         | 
| 394 | 
            +
                                  type_def.overload_annotations.replace(initialize_def.overload_annotations)
         | 
| 395 | 
            +
                                end
         | 
| 392 396 | 
             
                              end,
         | 
| 393 397 | 
             
                              accessibility: :public,
         | 
| 394 | 
            -
                              alias_of: nil
         | 
| 398 | 
            +
                              alias_of: nil,
         | 
| 399 | 
            +
                              alias_member: nil
         | 
| 395 400 | 
             
                            )
         | 
| 396 401 |  | 
| 397 402 | 
             
                            definition.methods[:new] = typed_new
         | 
| @@ -535,12 +540,42 @@ module RBS | |
| 535 540 | 
             
                  end
         | 
| 536 541 | 
             
                end
         | 
| 537 542 |  | 
| 538 | 
            -
                def insert_variable(type_name, variables, name:, type:)
         | 
| 543 | 
            +
                def insert_variable(type_name, variables, name:, type:, source:)
         | 
| 539 544 | 
             
                  variables[name] = Definition::Variable.new(
         | 
| 540 545 | 
             
                    parent_variable: variables[name],
         | 
| 541 546 | 
             
                    type: type,
         | 
| 542 | 
            -
                    declared_in: type_name
         | 
| 547 | 
            +
                    declared_in: type_name,
         | 
| 548 | 
            +
                    source: source
         | 
| 543 549 | 
             
                  )
         | 
| 550 | 
            +
                  validate_variable(variables[name])
         | 
| 551 | 
            +
                end
         | 
| 552 | 
            +
             | 
| 553 | 
            +
                def validate_variable(var)
         | 
| 554 | 
            +
                  return unless var.parent_variable
         | 
| 555 | 
            +
             | 
| 556 | 
            +
                  # Ignore attrs
         | 
| 557 | 
            +
                  variables = [] #: Array[Definition::Variable]
         | 
| 558 | 
            +
                  tmp_var = var
         | 
| 559 | 
            +
                  while tmp_var
         | 
| 560 | 
            +
                    variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
         | 
| 561 | 
            +
                    tmp_var = tmp_var.parent_variable
         | 
| 562 | 
            +
                  end
         | 
| 563 | 
            +
             | 
| 564 | 
            +
                  # Duplicates should be eliminated, so there can't be more than 3.
         | 
| 565 | 
            +
                  return unless variables.length == 2
         | 
| 566 | 
            +
             | 
| 567 | 
            +
                  l, r = variables #: [Definition::Variable, Definition::Variable]
         | 
| 568 | 
            +
             | 
| 569 | 
            +
                  case l.source
         | 
| 570 | 
            +
                  when AST::Members::InstanceVariable
         | 
| 571 | 
            +
                    if r.source.instance_of?(AST::Members::InstanceVariable) && l.declared_in == r.declared_in
         | 
| 572 | 
            +
                      raise InstanceVariableDuplicationError.new(member: l.source)
         | 
| 573 | 
            +
                    end
         | 
| 574 | 
            +
                  when AST::Members::ClassInstanceVariable
         | 
| 575 | 
            +
                    if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
         | 
| 576 | 
            +
                      raise ClassInstanceVariableDuplicationError.new(member: l.source)
         | 
| 577 | 
            +
                    end
         | 
| 578 | 
            +
                  end
         | 
| 544 579 | 
             
                end
         | 
| 545 580 |  | 
| 546 581 | 
             
                def import_methods(definition, module_name, module_methods, interfaces_methods, subst, self_type_methods)
         | 
| @@ -626,8 +661,11 @@ module RBS | |
| 626 661 | 
             
                        defn.update(defined_in: defined_in, implemented_in: implemented_in)
         | 
| 627 662 | 
             
                      end,
         | 
| 628 663 | 
             
                      accessibility: original_method.accessibility,
         | 
| 629 | 
            -
                      alias_of: original_method
         | 
| 664 | 
            +
                      alias_of: original_method,
         | 
| 665 | 
            +
                      alias_member: original
         | 
| 630 666 | 
             
                    )
         | 
| 667 | 
            +
             | 
| 668 | 
            +
                    method_definition.annotations.replace(original.annotations)
         | 
| 631 669 | 
             
                  when AST::Members::MethodDefinition
         | 
| 632 670 | 
             
                    if duplicated_method = methods[method.name]
         | 
| 633 671 | 
             
                      raise DuplicatedMethodDefinitionError.new(
         | 
| @@ -642,9 +680,11 @@ module RBS | |
| 642 680 | 
             
                        type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
         | 
| 643 681 | 
             
                        member: original,
         | 
| 644 682 | 
             
                        defined_in: defined_in,
         | 
| 645 | 
            -
                        implemented_in: implemented_in | 
| 646 | 
            -
             | 
| 647 | 
            -
             | 
| 683 | 
            +
                        implemented_in: implemented_in
         | 
| 684 | 
            +
                      ).tap do |type_def|
         | 
| 685 | 
            +
                        # Keep the original annotations given to overloads.
         | 
| 686 | 
            +
                        type_def.overload_annotations.replace(overload.annotations)
         | 
| 687 | 
            +
                      end
         | 
| 648 688 | 
             
                    end
         | 
| 649 689 |  | 
| 650 690 | 
             
                    # @type var accessibility: RBS::Definition::accessibility
         | 
| @@ -664,8 +704,11 @@ module RBS | |
| 664 704 | 
             
                      super_method: super_method,
         | 
| 665 705 | 
             
                      defs: defs,
         | 
| 666 706 | 
             
                      accessibility: accessibility,
         | 
| 667 | 
            -
                      alias_of: nil
         | 
| 707 | 
            +
                      alias_of: nil,
         | 
| 708 | 
            +
                      alias_member: nil
         | 
| 668 709 | 
             
                    )
         | 
| 710 | 
            +
             | 
| 711 | 
            +
                    method_definition.annotations.replace(original.annotations)
         | 
| 669 712 | 
             
                  when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
         | 
| 670 713 | 
             
                    if duplicated_method = methods[method.name]
         | 
| 671 714 | 
             
                      raise DuplicatedMethodDefinitionError.new(
         | 
| @@ -714,8 +757,11 @@ module RBS | |
| 714 757 | 
             
                        )
         | 
| 715 758 | 
             
                      ],
         | 
| 716 759 | 
             
                      accessibility: method.accessibility,
         | 
| 717 | 
            -
                      alias_of: nil
         | 
| 760 | 
            +
                      alias_of: nil,
         | 
| 761 | 
            +
                      alias_member: nil
         | 
| 718 762 | 
             
                    )
         | 
| 763 | 
            +
             | 
| 764 | 
            +
                    method_definition.annotations.replace(original.annotations)
         | 
| 719 765 | 
             
                  when nil
         | 
| 720 766 | 
             
                    # Overloading method definition only
         | 
| 721 767 |  | 
| @@ -742,8 +788,11 @@ module RBS | |
| 742 788 | 
             
                        defn.update(implemented_in: implemented_in)
         | 
| 743 789 | 
             
                      end,
         | 
| 744 790 | 
             
                      accessibility: existing_method.accessibility,
         | 
| 745 | 
            -
                      alias_of: existing_method.alias_of
         | 
| 791 | 
            +
                      alias_of: existing_method.alias_of,
         | 
| 792 | 
            +
                      alias_member: nil
         | 
| 746 793 | 
             
                    )
         | 
| 794 | 
            +
             | 
| 795 | 
            +
                    method_definition.annotations.replace(existing_method.annotations)
         | 
| 747 796 | 
             
                  end
         | 
| 748 797 |  | 
| 749 798 | 
             
                  method.overloads.each do |overloading_def|
         | 
| @@ -752,12 +801,19 @@ module RBS | |
| 752 801 | 
             
                        type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
         | 
| 753 802 | 
             
                        member: overloading_def,
         | 
| 754 803 | 
             
                        defined_in: defined_in,
         | 
| 755 | 
            -
                        implemented_in: implemented_in | 
| 756 | 
            -
                        overload_annotations: overload.annotations
         | 
| 804 | 
            +
                        implemented_in: implemented_in
         | 
| 757 805 | 
             
                      )
         | 
| 758 806 |  | 
| 807 | 
            +
                      type_def.overload_annotations.replace(overload.annotations)
         | 
| 808 | 
            +
             | 
| 759 809 | 
             
                      method_definition.defs.unshift(type_def)
         | 
| 760 810 | 
             
                    end
         | 
| 811 | 
            +
             | 
| 812 | 
            +
                    method_definition.annotations.concat(overloading_def.annotations)
         | 
| 813 | 
            +
                  end
         | 
| 814 | 
            +
             | 
| 815 | 
            +
                  method_definition.defs.each do |type_def|
         | 
| 816 | 
            +
                    type_def.member_annotations.replace(method_definition.annotations)
         | 
| 761 817 | 
             
                  end
         | 
| 762 818 |  | 
| 763 819 | 
             
                  methods[method.name] = method_definition
         | 
    
        data/lib/rbs/environment.rb
    CHANGED
    
    | @@ -486,6 +486,28 @@ module RBS | |
| 486 486 | 
             
                  end
         | 
| 487 487 | 
             
                end
         | 
| 488 488 |  | 
| 489 | 
            +
                def resolve_signature(resolver, table, dirs, decls, only: nil)
         | 
| 490 | 
            +
                  map = UseMap.new(table: table)
         | 
| 491 | 
            +
                  dirs.each do |dir|
         | 
| 492 | 
            +
                    case dir
         | 
| 493 | 
            +
                    when AST::Directives::Use
         | 
| 494 | 
            +
                      dir.clauses.each do |clause|
         | 
| 495 | 
            +
                        map.build_map(clause)
         | 
| 496 | 
            +
                      end
         | 
| 497 | 
            +
                    end
         | 
| 498 | 
            +
                  end
         | 
| 499 | 
            +
             | 
| 500 | 
            +
                  decls = decls.map do |decl|
         | 
| 501 | 
            +
                    if only && !only.member?(decl)
         | 
| 502 | 
            +
                      decl
         | 
| 503 | 
            +
                    else
         | 
| 504 | 
            +
                      resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
         | 
| 505 | 
            +
                    end
         | 
| 506 | 
            +
                  end
         | 
| 507 | 
            +
             | 
| 508 | 
            +
                  [dirs, decls]
         | 
| 509 | 
            +
                end
         | 
| 510 | 
            +
             | 
| 489 511 | 
             
                def resolve_type_names(only: nil)
         | 
| 490 512 | 
             
                  resolver = Resolver::TypeNameResolver.new(self)
         | 
| 491 513 | 
             
                  env = Environment.new
         | 
| @@ -498,21 +520,10 @@ module RBS | |
| 498 520 | 
             
                  table.compute_children
         | 
| 499 521 |  | 
| 500 522 | 
             
                  signatures.each do |buffer, (dirs, decls)|
         | 
| 501 | 
            -
                     | 
| 502 | 
            -
                     | 
| 503 | 
            -
                       | 
| 504 | 
            -
                        map.build_map(clause)
         | 
| 505 | 
            -
                      end
         | 
| 506 | 
            -
                    end
         | 
| 507 | 
            -
             | 
| 508 | 
            -
                    decls = decls.map do |decl|
         | 
| 509 | 
            -
                      if only && !only.member?(decl)
         | 
| 510 | 
            -
                        decl
         | 
| 511 | 
            -
                      else
         | 
| 512 | 
            -
                        resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
         | 
| 513 | 
            -
                      end
         | 
| 523 | 
            +
                    resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
         | 
| 524 | 
            +
                    if !resolve || resolve.value
         | 
| 525 | 
            +
                      _, decls = resolve_signature(resolver, table, dirs, decls)
         | 
| 514 526 | 
             
                    end
         | 
| 515 | 
            -
             | 
| 516 527 | 
             
                    env.add_signature(buffer: buffer, directives: dirs, decls: decls)
         | 
| 517 528 | 
             
                  end
         | 
| 518 529 |  | 
| @@ -541,7 +552,8 @@ module RBS | |
| 541 552 | 
             
                      name: decl.name,
         | 
| 542 553 | 
             
                      type: absolute_type(resolver, map, decl.type, context: nil),
         | 
| 543 554 | 
             
                      location: decl.location,
         | 
| 544 | 
            -
                      comment: decl.comment
         | 
| 555 | 
            +
                      comment: decl.comment,
         | 
| 556 | 
            +
                      annotations: decl.annotations
         | 
| 545 557 | 
             
                    )
         | 
| 546 558 | 
             
                  end
         | 
| 547 559 |  | 
| @@ -649,7 +661,8 @@ module RBS | |
| 649 661 | 
             
                      name: decl.name.with_prefix(prefix),
         | 
| 650 662 | 
             
                      type: absolute_type(resolver, map, decl.type, context: context),
         | 
| 651 663 | 
             
                      location: decl.location,
         | 
| 652 | 
            -
                      comment: decl.comment
         | 
| 664 | 
            +
                      comment: decl.comment,
         | 
| 665 | 
            +
                      annotations: decl.annotations
         | 
| 653 666 | 
             
                    )
         | 
| 654 667 |  | 
| 655 668 | 
             
                  when AST::Declarations::ClassAlias
         | 
| @@ -657,7 +670,8 @@ module RBS | |
| 657 670 | 
             
                      new_name: decl.new_name.with_prefix(prefix),
         | 
| 658 671 | 
             
                      old_name: absolute_type_name(resolver, map, decl.old_name, context: context),
         | 
| 659 672 | 
             
                      location: decl.location,
         | 
| 660 | 
            -
                      comment: decl.comment
         | 
| 673 | 
            +
                      comment: decl.comment,
         | 
| 674 | 
            +
                      annotations: decl.annotations
         | 
| 661 675 | 
             
                    )
         | 
| 662 676 |  | 
| 663 677 | 
             
                  when AST::Declarations::ModuleAlias
         | 
| @@ -665,7 +679,8 @@ module RBS | |
| 665 679 | 
             
                      new_name: decl.new_name.with_prefix(prefix),
         | 
| 666 680 | 
             
                      old_name: absolute_type_name(resolver, map, decl.old_name, context: context),
         | 
| 667 681 | 
             
                      location: decl.location,
         | 
| 668 | 
            -
                      comment: decl.comment
         | 
| 682 | 
            +
                      comment: decl.comment,
         | 
| 683 | 
            +
                      annotations: decl.annotations
         | 
| 669 684 | 
             
                    )
         | 
| 670 685 | 
             
                  end
         | 
| 671 686 | 
             
                end
         | 
    
        data/lib/rbs/errors.rb
    CHANGED
    
    | @@ -322,6 +322,29 @@ module RBS | |
| 322 322 | 
             
                end
         | 
| 323 323 | 
             
              end
         | 
| 324 324 |  | 
| 325 | 
            +
              class VariableDuplicationError < DefinitionError
         | 
| 326 | 
            +
                include DetailedMessageable
         | 
| 327 | 
            +
             | 
| 328 | 
            +
                attr_reader :member
         | 
| 329 | 
            +
             | 
| 330 | 
            +
                def initialize(member:)
         | 
| 331 | 
            +
                  @member = member
         | 
| 332 | 
            +
             | 
| 333 | 
            +
                  super "#{Location.to_string location}: Duplicated variable name #{member.name}"
         | 
| 334 | 
            +
                end
         | 
| 335 | 
            +
             | 
| 336 | 
            +
                def location
         | 
| 337 | 
            +
                  loc = @member.location or raise
         | 
| 338 | 
            +
                  loc[:name]
         | 
| 339 | 
            +
                end
         | 
| 340 | 
            +
              end
         | 
| 341 | 
            +
             | 
| 342 | 
            +
              class InstanceVariableDuplicationError < VariableDuplicationError
         | 
| 343 | 
            +
              end
         | 
| 344 | 
            +
             | 
| 345 | 
            +
              class ClassInstanceVariableDuplicationError < VariableDuplicationError
         | 
| 346 | 
            +
              end
         | 
| 347 | 
            +
             | 
| 325 348 | 
             
              class UnknownMethodAliasError < DefinitionError
         | 
| 326 349 | 
             
                include DetailedMessageable
         | 
| 327 350 |  | 
    
        data/lib/rbs/locator.rb
    CHANGED
    
    
    
        data/lib/rbs/method_type.rb
    CHANGED
    
    
    
        data/lib/rbs/parser_aux.rb
    CHANGED
    
    | @@ -17,11 +17,48 @@ module RBS | |
| 17 17 |  | 
| 18 18 | 
             
                def self.parse_signature(source)
         | 
| 19 19 | 
             
                  buf = buffer(source)
         | 
| 20 | 
            -
             | 
| 20 | 
            +
             | 
| 21 | 
            +
                  resolved = magic_comment(buf)
         | 
| 22 | 
            +
                  start_pos =
         | 
| 23 | 
            +
                    if resolved
         | 
| 24 | 
            +
                      (resolved.location || raise).end_pos
         | 
| 25 | 
            +
                    else
         | 
| 26 | 
            +
                      0
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  dirs, decls = _parse_signature(buf, start_pos, buf.last_position)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  if resolved
         | 
| 31 | 
            +
                    dirs = dirs.dup if dirs.frozen?
         | 
| 32 | 
            +
                    dirs.unshift(resolved)
         | 
| 33 | 
            +
                  end
         | 
| 21 34 |  | 
| 22 35 | 
             
                  [buf, dirs, decls]
         | 
| 23 36 | 
             
                end
         | 
| 24 37 |  | 
| 38 | 
            +
                def self.magic_comment(buf)
         | 
| 39 | 
            +
                  start_pos = 0
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  while true
         | 
| 42 | 
            +
                    case
         | 
| 43 | 
            +
                    when match = /\A#\s*(?<keyword>resolve-type-names)\s*(?<colon>:)\s+(?<value>true|false)$/.match(buf.content, start_pos)
         | 
| 44 | 
            +
                      value = match[:value] or raise
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      kw_offset = match.offset(:keyword) #: [Integer, Integer]
         | 
| 47 | 
            +
                      colon_offset = match.offset(:colon) #: [Integer, Integer]
         | 
| 48 | 
            +
                      value_offset = match.offset(:value) #: [Integer, Integer]
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      location = Location.new(buf, kw_offset[0], value_offset[1])
         | 
| 51 | 
            +
                      location.add_required_child(:keyword, kw_offset[0]...kw_offset[1])
         | 
| 52 | 
            +
                      location.add_required_child(:colon, colon_offset[0]...colon_offset[1])
         | 
| 53 | 
            +
                      location.add_required_child(:value, value_offset[0]...value_offset[1])
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                      return AST::Directives::ResolveTypeNames.new(value: value == "true", location: location)
         | 
| 56 | 
            +
                    else
         | 
| 57 | 
            +
                      return
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 25 62 | 
             
                def self.lex(source)
         | 
| 26 63 | 
             
                  buf = buffer(source)
         | 
| 27 64 | 
             
                  list = _lex(buf, buf.last_position)
         | 
    
        data/lib/rbs/subtractor.rb
    CHANGED
    
    | @@ -40,7 +40,7 @@ module RBS | |
| 40 40 | 
             
                      name = absolute_typename(decl.new_name, context: context)
         | 
| 41 41 | 
             
                      decl unless @subtrahend.module_alias?(name) || @subtrahend.module_decl?(name)
         | 
| 42 42 | 
             
                    else
         | 
| 43 | 
            -
                      raise " | 
| 43 | 
            +
                      raise "unknown decl: #{(_ = decl).class}"
         | 
| 44 44 | 
             
                    end
         | 
| 45 45 | 
             
                  end.compact
         | 
| 46 46 | 
             
                end
         | 
| @@ -51,7 +51,7 @@ module RBS | |
| 51 51 | 
             
                  context = _ = [context, decl.name]
         | 
| 52 52 | 
             
                  children = call(decl.each_decl.to_a, context: context) +
         | 
| 53 53 | 
             
                    decl.each_member.reject { |m| member_exist?(owner, m, context: context) }
         | 
| 54 | 
            -
                  children =  | 
| 54 | 
            +
                  children = filter_redundant_access_modifiers(children)
         | 
| 55 55 | 
             
                  return nil if children.empty?
         | 
| 56 56 |  | 
| 57 57 | 
             
                  update_decl(decl, members: children)
         | 
| @@ -145,7 +145,7 @@ module RBS | |
| 145 145 | 
             
                  end
         | 
| 146 146 | 
             
                end
         | 
| 147 147 |  | 
| 148 | 
            -
                private def  | 
| 148 | 
            +
                private def filter_redundant_access_modifiers(decls)
         | 
| 149 149 | 
             
                  decls = decls.dup
         | 
| 150 150 | 
             
                  decls.pop while access_modifier?(decls.last)
         | 
| 151 151 | 
             
                  decls = decls.map.with_index do |decl, i|
         |