steep 1.8.0.dev.1 → 1.8.0.dev.2
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/README.md +3 -2
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +1 -1
- data/lib/steep/diagnostic/ruby.rb +6 -6
- data/lib/steep/server/interaction_worker.rb +3 -1
- data/lib/steep/server/master.rb +2 -2
- data/lib/steep/server/type_check_worker.rb +7 -3
- data/lib/steep/server/worker_process.rb +1 -1
- data/lib/steep/services/completion_provider.rb +8 -2
- data/lib/steep/services/hover_provider/ruby.rb +23 -11
- data/lib/steep/services/signature_help_provider.rb +2 -1
- data/lib/steep/services/type_check_service.rb +16 -6
- data/lib/steep/source.rb +47 -1
- data/lib/steep/subtyping/constraints.rb +2 -2
- data/lib/steep/type_construction.rb +6 -0
- data/lib/steep/type_inference/block_params.rb +3 -0
- data/lib/steep/typing.rb +15 -13
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +1 -1
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: eff62e36ae34f76bafc5eb5ec8425ba373dd9ab64ae880537d65b96b4581970c
         | 
| 4 | 
            +
              data.tar.gz: b0dc7b3d10b83a0e188a211f40c3a91eb3e146138da328079c84639b92c87bb8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6e5d7e9e19bf782a8a03842eed077030a9f72eeb5f570ef23110658916f2d4c93c1090e3f3f6017957c80ef1a74c4c7a33bbc295316fe4afb47309cf47c2bcac
         | 
| 7 | 
            +
              data.tar.gz: 66a14f3ec60c294a90e85bde099eb40224f22a99493f121bd8378e288affd7ad32a7ee8e1aff23915dd373768c4a35657fd92e14c7afe9e9cbe244c18d36d96c
         | 
    
        data/README.md
    CHANGED
    
    | @@ -214,8 +214,9 @@ You can find examples in `smoke` directory. | |
| 214 214 | 
             
            ## IDEs
         | 
| 215 215 |  | 
| 216 216 | 
             
            Steep implements some of the Language Server Protocol features.
         | 
| 217 | 
            -
            - For **VSCode** please install [the plugin](https://github.com/soutaro/steep-vscode)
         | 
| 218 | 
            -
            - For **SublimeText** please install [LSP](https://github.com/sublimelsp/LSP) package and follow [instructions](https://lsp.sublimetext.io/language_servers/#steep)
         | 
| 217 | 
            +
            - For **VSCode** please install [the plugin](https://github.com/soutaro/steep-vscode).
         | 
| 218 | 
            +
            - For **SublimeText** please install [LSP](https://github.com/sublimelsp/LSP) package and follow [instructions](https://lsp.sublimetext.io/language_servers/#steep).
         | 
| 219 | 
            +
            - For **Vim** or **Neovim** please install [ALE](https://github.com/dense-analysis/ale?tab=readme-ov-file#asynchronous-lint-engine). You may want to `let g:ale_ruby_steep_executable = 'bundle'` to use your bundled `steep` version.
         | 
| 219 220 |  | 
| 220 221 | 
             
            Other LSP supporting tools may work with Steep where it starts the server as `steep langserver`.
         | 
| 221 222 |  | 
| @@ -16,7 +16,7 @@ You have to edit your `Gemfile`. Specify `require: false` for gems for which you | |
| 16 16 |  | 
| 17 17 | 
             
            ```ruby
         | 
| 18 18 | 
             
            gem 'rbs', require: false
         | 
| 19 | 
            -
            gem 'steep, require: false
         | 
| 19 | 
            +
            gem 'steep', require: false
         | 
| 20 20 | 
             
            gem 'rbs_rails', require: false
         | 
| 21 21 | 
             
            gem 'rbs_protobuf', require: false
         | 
| 22 22 | 
             
            ```
         | 
| @@ -162,7 +162,7 @@ module Steep | |
| 162 162 | 
             
                             end
         | 
| 163 163 |  | 
| 164 164 | 
             
                      loc = if send
         | 
| 165 | 
            -
                              send.loc.selector.with(end_pos: send.loc.expression.end_pos)
         | 
| 165 | 
            +
                              send.loc.selector.with(end_pos: send.loc.expression.end_pos) # steep:ignore NoMethod
         | 
| 166 166 | 
             
                            else
         | 
| 167 167 | 
             
                              node.loc.expression
         | 
| 168 168 | 
             
                            end
         | 
| @@ -213,7 +213,7 @@ module Steep | |
| 213 213 | 
             
                             end
         | 
| 214 214 |  | 
| 215 215 | 
             
                      loc = if send
         | 
| 216 | 
            -
                              send.loc.selector.with(end_pos: send.loc.expression.end_pos)
         | 
| 216 | 
            +
                              send.loc.selector.with(end_pos: send.loc.expression.end_pos) # steep:ignore NoMethod
         | 
| 217 217 | 
             
                            else
         | 
| 218 218 | 
             
                              node.loc.expression
         | 
| 219 219 | 
             
                            end
         | 
| @@ -287,8 +287,8 @@ module Steep | |
| 287 287 | 
             
                      loc = case node.type
         | 
| 288 288 | 
             
                            when :send
         | 
| 289 289 | 
             
                              loc = _ = nil
         | 
| 290 | 
            -
                              loc ||= node.loc.operator if node.loc.respond_to?(:operator)
         | 
| 291 | 
            -
                              loc ||= node.loc.selector if node.loc.respond_to?(:selector)
         | 
| 290 | 
            +
                              loc ||= node.loc.operator if node.loc.respond_to?(:operator) # steep:ignore NoMethod
         | 
| 291 | 
            +
                              loc ||= node.loc.selector if node.loc.respond_to?(:selector) # steep:ignore NoMethod
         | 
| 292 292 | 
             
                              loc
         | 
| 293 293 | 
             
                            when :block
         | 
| 294 294 | 
             
                              node.children[0].loc.selector
         | 
| @@ -463,7 +463,7 @@ module Steep | |
| 463 463 | 
             
                               node.children[1]
         | 
| 464 464 | 
             
                             when :defs
         | 
| 465 465 | 
             
                               node.children[2]
         | 
| 466 | 
            -
                             end
         | 
| 466 | 
            +
                             end #: Parser::AST::Node?
         | 
| 467 467 | 
             
                      super(node: node, location: args&.loc&.expression || node.loc.name)
         | 
| 468 468 | 
             
                      @method_type = method_type
         | 
| 469 469 | 
             
                    end
         | 
| @@ -668,7 +668,7 @@ module Steep | |
| 668 668 | 
             
                    attr_reader :name
         | 
| 669 669 |  | 
| 670 670 | 
             
                    def initialize(node:, name:)
         | 
| 671 | 
            -
                      super(node: node, location: node.loc.name)
         | 
| 671 | 
            +
                      super(node: node, location: node.loc.name)  # steep:ignore NoMethod
         | 
| 672 672 | 
             
                      @name = name
         | 
| 673 673 | 
             
                    end
         | 
| 674 674 |  | 
| @@ -464,9 +464,11 @@ module Steep | |
| 464 464 |  | 
| 465 465 | 
             
                        if (items, index = provider.run(line: job.line, column: job.column))
         | 
| 466 466 | 
             
                          signatures = items.map do |item|
         | 
| 467 | 
            +
                            params = item.parameters or raise
         | 
| 468 | 
            +
             | 
| 467 469 | 
             
                            LSP::Interface::SignatureInformation.new(
         | 
| 468 470 | 
             
                              label: item.method_type.to_s,
         | 
| 469 | 
            -
                              parameters:  | 
| 471 | 
            +
                              parameters: params.map { |param| LSP::Interface::ParameterInformation.new(label: param)},
         | 
| 470 472 | 
             
                              active_parameter: item.active_parameter,
         | 
| 471 473 | 
             
                              documentation: item.comment&.yield_self do |comment|
         | 
| 472 474 | 
             
                                LSP::Interface::MarkupContent.new(
         | 
    
        data/lib/steep/server/master.rb
    CHANGED
    
    | @@ -39,7 +39,7 @@ module Steep | |
| 39 39 | 
             
                    end
         | 
| 40 40 |  | 
| 41 41 | 
             
                    def percentage
         | 
| 42 | 
            -
                      checked_paths.size * 100 /  | 
| 42 | 
            +
                      checked_paths.size * 100 / total
         | 
| 43 43 | 
             
                    end
         | 
| 44 44 |  | 
| 45 45 | 
             
                    def all_paths
         | 
| @@ -58,7 +58,7 @@ module Steep | |
| 58 58 | 
             
                    end
         | 
| 59 59 |  | 
| 60 60 | 
             
                    def finished?
         | 
| 61 | 
            -
                       | 
| 61 | 
            +
                      total <= checked_paths.size
         | 
| 62 62 | 
             
                    end
         | 
| 63 63 |  | 
| 64 64 | 
             
                    def unchecked_paths
         | 
| @@ -173,7 +173,9 @@ module Steep | |
| 173 173 | 
             
                            method: :"textDocument/publishDiagnostics",
         | 
| 174 174 | 
             
                            params: LSP::Interface::PublishDiagnosticsParams.new(
         | 
| 175 175 | 
             
                              uri: Steep::PathHelper.to_uri(job.path).to_s,
         | 
| 176 | 
            -
                              diagnostics: diagnostics.map {|diagnostic| | 
| 176 | 
            +
                              diagnostics: diagnostics.map {|diagnostic|
         | 
| 177 | 
            +
                                _ = formatter.format(diagnostic)
         | 
| 178 | 
            +
                              }.uniq
         | 
| 177 179 | 
             
                            )
         | 
| 178 180 | 
             
                          )
         | 
| 179 181 | 
             
                        end
         | 
| @@ -191,7 +193,7 @@ module Steep | |
| 191 193 | 
             
                            method: :"textDocument/publishDiagnostics",
         | 
| 192 194 | 
             
                            params: LSP::Interface::PublishDiagnosticsParams.new(
         | 
| 193 195 | 
             
                              uri: Steep::PathHelper.to_uri(job.path).to_s,
         | 
| 194 | 
            -
                              diagnostics: diagnostics.map {|diagnostic| formatter.format(diagnostic) }.uniq.compact
         | 
| 196 | 
            +
                              diagnostics: diagnostics.map {|diagnostic| _ = formatter.format(diagnostic) }.uniq.compact
         | 
| 195 197 | 
             
                            )
         | 
| 196 198 | 
             
                          )
         | 
| 197 199 | 
             
                        end
         | 
| @@ -210,7 +212,9 @@ module Steep | |
| 210 212 | 
             
                            method: :"textDocument/publishDiagnostics",
         | 
| 211 213 | 
             
                            params: LSP::Interface::PublishDiagnosticsParams.new(
         | 
| 212 214 | 
             
                              uri: Steep::PathHelper.to_uri(job.path).to_s,
         | 
| 213 | 
            -
                              diagnostics: diagnostics.map {|diagnostic| | 
| 215 | 
            +
                              diagnostics: diagnostics.map {|diagnostic|
         | 
| 216 | 
            +
                                _ = formatter.format(diagnostic)
         | 
| 217 | 
            +
                              }.uniq.compact
         | 
| 214 218 | 
             
                            )
         | 
| 215 219 | 
             
                          )
         | 
| 216 220 | 
             
                        end
         | 
| @@ -132,7 +132,7 @@ module Steep | |
| 132 132 | 
             
                    new(reader: reader, writer: writer, stderr: stderr, wait_thread: thread, name: name, index: index&.[](1))
         | 
| 133 133 | 
             
                  end
         | 
| 134 134 |  | 
| 135 | 
            -
                  def self.start_typecheck_workers(steepfile:, args:, steep_command:, count: [Etc.nprocessors - 1, 1].max, delay_shutdown: false)
         | 
| 135 | 
            +
                  def self.start_typecheck_workers(steepfile:, args:, steep_command:, count: [Etc.nprocessors - 1, 1].max || raise, delay_shutdown: false)
         | 
| 136 136 | 
             
                    count.times.map do |i|
         | 
| 137 137 | 
             
                      start_worker(
         | 
| 138 138 | 
             
                        :typecheck,
         | 
| @@ -725,7 +725,7 @@ module Steep | |
| 725 725 | 
             
                  end
         | 
| 726 726 |  | 
| 727 727 | 
             
                  def keyword_argument_items_for_method(call_node:, send_node:, position:, prefix:, items:)
         | 
| 728 | 
            -
                     | 
| 728 | 
            +
                    _receiver_node, _method_name, argument_nodes = deconstruct_send_node!(send_node)
         | 
| 729 729 |  | 
| 730 730 | 
             
                    call = typing.call_of(node: call_node)
         | 
| 731 731 |  | 
| @@ -733,6 +733,7 @@ module Steep | |
| 733 733 | 
             
                    when TypeInference::MethodCall::Typed, TypeInference::MethodCall::Error
         | 
| 734 734 | 
             
                      context = typing.context_at(line: position.line, column: position.column)
         | 
| 735 735 | 
             
                      type = call.receiver_type
         | 
| 736 | 
            +
                      type = type.subst(Interface::Substitution.build([], self_type: context.self_type, module_type: context.module_context&.module_type, instance_type: context.module_context&.instance_type))
         | 
| 736 737 |  | 
| 737 738 | 
             
                      config = Interface::Builder::Config.new(self_type: type, variable_bounds: context.variable_context.upper_bounds)
         | 
| 738 739 | 
             
                      if shape = subtyping.builder.shape(type, config)
         | 
| @@ -745,7 +746,12 @@ module Steep | |
| 745 746 | 
             
                              kwargs = argument_nodes.find { |arg| arg.type == :kwargs }&.children || []
         | 
| 746 747 | 
             
                              used_kwargs = kwargs.filter_map { |arg| arg.type == :pair && arg.children.first.children.first }
         | 
| 747 748 |  | 
| 748 | 
            -
                               | 
| 749 | 
            +
                              if defn.type.type.is_a?(RBS::Types::UntypedFunction)
         | 
| 750 | 
            +
                                kwargs = [] #: Array[Symbol]
         | 
| 751 | 
            +
                              else
         | 
| 752 | 
            +
                                kwargs = defn.type.type.required_keywords.keys + defn.type.type.optional_keywords.keys
         | 
| 753 | 
            +
                              end
         | 
| 754 | 
            +
             | 
| 749 755 | 
             
                              kwargs.each do |name|
         | 
| 750 756 | 
             
                                if name.to_s.start_with?(prefix) && !used_kwargs.include?(name)
         | 
| 751 757 | 
             
                                  items << KeywordArgumentItem.new(identifier: "#{name}:", range: range)
         | 
| @@ -121,14 +121,24 @@ module Steep | |
| 121 121 | 
             
                          context = typing.context_at(line: line, column: column)
         | 
| 122 122 | 
             
                          var_type = context.type_env[var_name] || AST::Types::Any.new(location: nil)
         | 
| 123 123 |  | 
| 124 | 
            -
                          return VariableContent.new( | 
| 124 | 
            +
                          return VariableContent.new(
         | 
| 125 | 
            +
                            node: node,
         | 
| 126 | 
            +
                            name: var_name,
         | 
| 127 | 
            +
                            type: var_type,
         | 
| 128 | 
            +
                            location: node.location.name # steep:ignore NoMethod
         | 
| 129 | 
            +
                          )
         | 
| 125 130 |  | 
| 126 131 | 
             
                        when :lvasgn
         | 
| 127 132 | 
             
                          var_name, rhs = node.children
         | 
| 128 133 | 
             
                          context = typing.context_at(line: line, column: column)
         | 
| 129 134 | 
             
                          type = context.type_env[var_name] || typing.type_of(node: node)
         | 
| 130 135 |  | 
| 131 | 
            -
                          return VariableContent.new( | 
| 136 | 
            +
                          return VariableContent.new(
         | 
| 137 | 
            +
                            node: node,
         | 
| 138 | 
            +
                            name: var_name,
         | 
| 139 | 
            +
                            type: type,
         | 
| 140 | 
            +
                            location: node.location.name # steep:ignore NoMethod
         | 
| 141 | 
            +
                          )
         | 
| 132 142 |  | 
| 133 143 | 
             
                        when :send, :csend
         | 
| 134 144 | 
             
                          result_node =
         | 
| @@ -149,7 +159,7 @@ module Steep | |
| 149 159 | 
             
                              return MethodCallContent.new(
         | 
| 150 160 | 
             
                                node: result_node,
         | 
| 151 161 | 
             
                                method_call: call,
         | 
| 152 | 
            -
                                location: node.location.selector
         | 
| 162 | 
            +
                                location: node.location.selector # steep:ignore NoMethod
         | 
| 153 163 | 
             
                              )
         | 
| 154 164 | 
             
                            end
         | 
| 155 165 | 
             
                          end
         | 
| @@ -159,13 +169,15 @@ module Steep | |
| 159 169 | 
             
                          method_context = context.method_context
         | 
| 160 170 |  | 
| 161 171 | 
             
                          if method_context && method_context.method
         | 
| 162 | 
            -
                             | 
| 163 | 
            -
                               | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 172 | 
            +
                            if method_context.method_type
         | 
| 173 | 
            +
                              return DefinitionContent.new(
         | 
| 174 | 
            +
                                node: node,
         | 
| 175 | 
            +
                                method_name: method_name_from_method(method_context, builder: context.factory.definition_builder),
         | 
| 176 | 
            +
                                method_type: method_context.method_type,
         | 
| 177 | 
            +
                                definition: method_context.method,
         | 
| 178 | 
            +
                                location: node.loc.name # steep:ignore NoMethod
         | 
| 179 | 
            +
                              )
         | 
| 180 | 
            +
                            end
         | 
| 169 181 | 
             
                          end
         | 
| 170 182 |  | 
| 171 183 | 
             
                        when :const, :casgn
         | 
| @@ -178,7 +190,7 @@ module Steep | |
| 178 190 | 
             
                            entry = context.env.constant_entry(const_name) or return
         | 
| 179 191 |  | 
| 180 192 | 
             
                            return ConstantContent.new(
         | 
| 181 | 
            -
                              location: node.location.name,
         | 
| 193 | 
            +
                              location: node.location.name, # steep:ignore NoMethod
         | 
| 182 194 | 
             
                              full_name: const_name,
         | 
| 183 195 | 
             
                              type: type,
         | 
| 184 196 | 
             
                              decl: entry
         | 
| @@ -11,7 +11,7 @@ module Steep | |
| 11 11 | 
             
                        arguments = [] #: Array[String]
         | 
| 12 12 | 
             
                        arguments.push(*method_type.type.required_positionals.map(&:to_s))
         | 
| 13 13 | 
             
                        arguments.push(*method_type.type.optional_positionals.map {|p| "?#{p}"})
         | 
| 14 | 
            -
                        arguments.push("*#{ | 
| 14 | 
            +
                        arguments.push("*#{method_type.type.rest_positionals}") if method_type.type.rest_positionals
         | 
| 15 15 | 
             
                        arguments.push(*method_type.type.trailing_positionals.map(&:to_s))
         | 
| 16 16 | 
             
                        arguments.push(*method_type.type.required_keywords.map {|name, param| "#{name}: #{param}" })
         | 
| 17 17 | 
             
                        arguments.push(*method_type.type.optional_keywords.map {|name, param| "?#{name}: #{param}" })
         | 
| @@ -136,6 +136,7 @@ module Steep | |
| 136 136 |  | 
| 137 137 | 
             
                  def active_parameter_for(method_type, argument_nodes, last_argument_nodes, node)
         | 
| 138 138 | 
             
                    return unless method_type
         | 
| 139 | 
            +
                    return unless method_type.type.is_a?(RBS::Types::Function)
         | 
| 139 140 |  | 
| 140 141 | 
             
                    positionals = method_type.type.required_positionals.size + method_type.type.optional_positionals.size + (method_type.type.rest_positionals ? 1 : 0) + method_type.type.trailing_positionals.size
         | 
| 141 142 |  | 
| @@ -139,8 +139,11 @@ module Steep | |
| 139 139 |  | 
| 140 140 | 
             
                      case service.status
         | 
| 141 141 | 
             
                      when SignatureService::SyntaxErrorStatus, SignatureService::AncestorErrorStatus
         | 
| 142 | 
            -
                        service.status.diagnostics.group_by {|diag|  | 
| 143 | 
            -
                           | 
| 142 | 
            +
                        service.status.diagnostics.group_by {|diag| diag.location&.buffer&.name&.to_s }.each do |path_string, diagnostics|
         | 
| 143 | 
            +
                          if path_string
         | 
| 144 | 
            +
                            path = Pathname(path_string)
         | 
| 145 | 
            +
                            signature_diagnostics[path].push(*diagnostics)
         | 
| 146 | 
            +
                          end
         | 
| 144 147 | 
             
                        end
         | 
| 145 148 | 
             
                      when SignatureService::LoadedStatus
         | 
| 146 149 | 
             
                        validation_diagnostics = signature_validation_diagnostics[target.name] || {}
         | 
| @@ -230,6 +233,7 @@ module Steep | |
| 230 233 | 
             
                          case service.status
         | 
| 231 234 | 
             
                          when SignatureService::SyntaxErrorStatus
         | 
| 232 235 | 
             
                            diagnostics = service.status.diagnostics.select do |diag|
         | 
| 236 | 
            +
                              diag.location or raise
         | 
| 233 237 | 
             
                              Pathname(diag.location.buffer.name) == path &&
         | 
| 234 238 | 
             
                                (diag.is_a?(Diagnostic::Signature::SyntaxError) || diag.is_a?(Diagnostic::Signature::UnexpectedError))
         | 
| 235 239 | 
             
                            end
         | 
| @@ -239,12 +243,15 @@ module Steep | |
| 239 243 | 
             
                            end
         | 
| 240 244 |  | 
| 241 245 | 
             
                          when SignatureService::AncestorErrorStatus
         | 
| 242 | 
            -
                            diagnostics = service.status.diagnostics.select  | 
| 246 | 
            +
                            diagnostics = service.status.diagnostics.select do |diag|
         | 
| 247 | 
            +
                              diag.location or raise
         | 
| 248 | 
            +
                              Pathname(diag.location.buffer.name) == path
         | 
| 249 | 
            +
                            end
         | 
| 243 250 | 
             
                            accumulated_diagnostics.push(*diagnostics)
         | 
| 244 251 | 
             
                            yield [path, accumulated_diagnostics]
         | 
| 245 252 |  | 
| 246 253 | 
             
                          when SignatureService::LoadedStatus
         | 
| 247 | 
            -
                            validator = Signature::Validator.new(checker: service.current_subtyping)
         | 
| 254 | 
            +
                            validator = Signature::Validator.new(checker: service.current_subtyping || raise)
         | 
| 248 255 | 
             
                            type_names = service.type_names(paths: Set[path], env: service.latest_env).to_set
         | 
| 249 256 |  | 
| 250 257 | 
             
                            unless type_names.empty?
         | 
| @@ -286,7 +293,10 @@ module Steep | |
| 286 293 | 
             
                              end
         | 
| 287 294 | 
             
                            end
         | 
| 288 295 |  | 
| 289 | 
            -
                            diagnostics = validator.each_error.select  | 
| 296 | 
            +
                            diagnostics = validator.each_error.select do |error|
         | 
| 297 | 
            +
                              error.location or raise
         | 
| 298 | 
            +
                              Pathname(error.location.buffer.name) == path
         | 
| 299 | 
            +
                            end
         | 
| 290 300 | 
             
                            accumulated_diagnostics.push(*diagnostics)
         | 
| 291 301 | 
             
                            yield [path, accumulated_diagnostics]
         | 
| 292 302 | 
             
                          end
         | 
| @@ -361,7 +371,7 @@ module Steep | |
| 361 371 | 
             
                    error = Diagnostic::Ruby::SyntaxError.new(message: exn.message, location: exn.location)
         | 
| 362 372 | 
             
                    SourceFile.with_syntax_error(path: path, content: text, error: error)
         | 
| 363 373 | 
             
                  rescue ::Parser::SyntaxError => exn
         | 
| 364 | 
            -
                    error = Diagnostic::Ruby::SyntaxError.new(message: exn.message, location: exn.diagnostic.location)
         | 
| 374 | 
            +
                    error = Diagnostic::Ruby::SyntaxError.new(message: exn.message, location: (_ = exn).diagnostic.location)
         | 
| 365 375 | 
             
                    SourceFile.with_syntax_error(path: path, content: text, error: error)
         | 
| 366 376 | 
             
                  rescue EncodingError => exn
         | 
| 367 377 | 
             
                    SourceFile.no_data(path: path, content: "")
         | 
    
        data/lib/steep/source.rb
    CHANGED
    
    | @@ -8,6 +8,7 @@ module Steep | |
| 8 8 | 
             
                attr_reader :ignores
         | 
| 9 9 |  | 
| 10 10 | 
             
                extend NodeHelper
         | 
| 11 | 
            +
                extend ModuleHelper
         | 
| 11 12 |  | 
| 12 13 | 
             
                def initialize(buffer:, path:, node:, mapping:, comments:, ignores:)
         | 
| 13 14 | 
             
                  @buffer = buffer
         | 
| @@ -295,8 +296,14 @@ module Steep | |
| 295 296 | 
             
                end
         | 
| 296 297 |  | 
| 297 298 | 
             
                def annotations(block:, factory:, context:)
         | 
| 299 | 
            +
                  annotations =
         | 
| 300 | 
            +
                    if block
         | 
| 301 | 
            +
                      mapping.fetch(block, [])
         | 
| 302 | 
            +
                    else
         | 
| 303 | 
            +
                      []
         | 
| 304 | 
            +
                    end #: Array[AST::Annotation::t]
         | 
| 298 305 | 
             
                  AST::Annotation::Collection.new(
         | 
| 299 | 
            -
                    annotations:  | 
| 306 | 
            +
                    annotations: annotations,
         | 
| 300 307 | 
             
                    factory: factory,
         | 
| 301 308 | 
             
                    context: context
         | 
| 302 309 | 
             
                  )
         | 
| @@ -444,6 +451,32 @@ module Steep | |
| 444 451 | 
             
                  end
         | 
| 445 452 | 
             
                end
         | 
| 446 453 |  | 
| 454 | 
            +
                def self.skip_arg_assertions(node)
         | 
| 455 | 
            +
                  send_node, _ = deconstruct_sendish_and_block_nodes(node)
         | 
| 456 | 
            +
                  return false unless send_node
         | 
| 457 | 
            +
             | 
| 458 | 
            +
                  if send_node.type == :send
         | 
| 459 | 
            +
                    receiver, method, args = deconstruct_send_node!(send_node)
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                    return false unless receiver
         | 
| 462 | 
            +
             | 
| 463 | 
            +
                    if receiver.type == :const
         | 
| 464 | 
            +
                      if type_name = module_name_from_node(receiver.children[0], receiver.children[1])
         | 
| 465 | 
            +
                        if type_name.namespace.empty?
         | 
| 466 | 
            +
                          if type_name.name == :Data && method == :define
         | 
| 467 | 
            +
                            return true
         | 
| 468 | 
            +
                          end
         | 
| 469 | 
            +
                          if type_name.name == :Struct && method == :new
         | 
| 470 | 
            +
                            return true
         | 
| 471 | 
            +
                          end
         | 
| 472 | 
            +
                        end
         | 
| 473 | 
            +
                      end
         | 
| 474 | 
            +
                    end
         | 
| 475 | 
            +
                  end
         | 
| 476 | 
            +
             | 
| 477 | 
            +
                  false
         | 
| 478 | 
            +
                end
         | 
| 479 | 
            +
             | 
| 447 480 | 
             
                def self.insert_type_node(node, comments)
         | 
| 448 481 | 
             
                  if node.location.expression
         | 
| 449 482 | 
             
                    first_line = node.location.expression.first_line
         | 
| @@ -567,6 +600,19 @@ module Steep | |
| 567 600 | 
             
                    body = insert_type_node(body, comments) if body
         | 
| 568 601 | 
             
                    return adjust_location(node.updated(nil, [object, name, args, body]))
         | 
| 569 602 | 
             
                  else
         | 
| 603 | 
            +
                    if skip_arg_assertions(node)
         | 
| 604 | 
            +
                      # Data.define, Struct.new, ...??
         | 
| 605 | 
            +
                      if node.location.expression
         | 
| 606 | 
            +
                        first_line = node.location.expression.first_line
         | 
| 607 | 
            +
                        last_line = node.location.expression.last_line
         | 
| 608 | 
            +
             | 
| 609 | 
            +
                        child_assertions = comments.delete_if {|line, _ | first_line < line && line < last_line }
         | 
| 610 | 
            +
                        node = map_child_node(node) {|child| insert_type_node(child, child_assertions) }
         | 
| 611 | 
            +
             | 
| 612 | 
            +
                        return adjust_location(node)
         | 
| 613 | 
            +
                      end
         | 
| 614 | 
            +
                    end
         | 
| 615 | 
            +
             | 
| 570 616 | 
             
                    adjust_location(
         | 
| 571 617 | 
             
                      map_child_node(node, nil) {|child| insert_type_node(child, comments) }
         | 
| 572 618 | 
             
                    )
         | 
| @@ -28,7 +28,7 @@ module Steep | |
| 28 28 | 
             
                      attr_reader :lower_bound
         | 
| 29 29 | 
             
                      attr_reader :upper_bound
         | 
| 30 30 |  | 
| 31 | 
            -
                      def initialize(var | 
| 31 | 
            +
                      def initialize(var:, lower_bound:, upper_bound:)
         | 
| 32 32 | 
             
                        @var = var
         | 
| 33 33 | 
             
                        @lower_bound = lower_bound
         | 
| 34 34 | 
             
                        @upper_bound = upper_bound
         | 
| @@ -96,7 +96,7 @@ module Steep | |
| 96 96 | 
             
                    unless Set.new(vars).disjoint?(unknowns)
         | 
| 97 97 | 
             
                      raise UnsatisfiedInvariantError.new(
         | 
| 98 98 | 
             
                        reason: UnsatisfiedInvariantError::VariablesUnknownsNotDisjoint.new(vars: vars),
         | 
| 99 | 
            -
                        constraints:  | 
| 99 | 
            +
                        constraints: self
         | 
| 100 100 | 
             
                      )
         | 
| 101 101 | 
             
                    end
         | 
| 102 102 | 
             
                  end
         | 
| @@ -1375,6 +1375,12 @@ module Steep | |
| 1375 1375 | 
             
                    when :float
         | 
| 1376 1376 | 
             
                      add_typing(node, type: AST::Builtin::Float.instance_type)
         | 
| 1377 1377 |  | 
| 1378 | 
            +
                    when :rational
         | 
| 1379 | 
            +
                      add_typing(node, type: AST::Types::Name::Instance.new(name: TypeName("::Rational"), args: []))
         | 
| 1380 | 
            +
             | 
| 1381 | 
            +
                    when :complex
         | 
| 1382 | 
            +
                      add_typing(node, type: AST::Types::Name::Instance.new(name: TypeName("::Complex"), args: []))
         | 
| 1383 | 
            +
             | 
| 1378 1384 | 
             
                    when :nil
         | 
| 1379 1385 | 
             
                      add_typing(node, type: AST::Builtin.nil_type)
         | 
| 1380 1386 |  | 
    
        data/lib/steep/typing.rb
    CHANGED
    
    | @@ -110,13 +110,13 @@ module Steep | |
| 110 110 | 
             
                    begin_pos = if send_node.type != :lambda && args_node.loc.expression
         | 
| 111 111 | 
             
                                  args_node.loc.expression.end_pos
         | 
| 112 112 | 
             
                                else
         | 
| 113 | 
            -
                                  node.loc.begin.end_pos
         | 
| 113 | 
            +
                                  node.loc.begin.end_pos # steep:ignore NoMethod
         | 
| 114 114 | 
             
                                end
         | 
| 115 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 115 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 116 116 | 
             
                  when :numblock
         | 
| 117 117 | 
             
                    send_node, _ = node.children
         | 
| 118 | 
            -
                    begin_pos = node.loc.begin.end_pos
         | 
| 119 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 118 | 
            +
                    begin_pos = node.loc.begin.end_pos # steep:ignore NoMethod
         | 
| 119 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 120 120 | 
             
                  end
         | 
| 121 121 |  | 
| 122 122 | 
             
                  begin_pos..end_pos
         | 
| @@ -131,20 +131,20 @@ module Steep | |
| 131 131 | 
             
                                else
         | 
| 132 132 | 
             
                                  name_node.loc.expression.end_pos
         | 
| 133 133 | 
             
                                end
         | 
| 134 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 134 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 135 135 |  | 
| 136 136 | 
             
                    add_context(begin_pos..end_pos, context: context)
         | 
| 137 137 |  | 
| 138 138 | 
             
                  when :module
         | 
| 139 139 | 
             
                    name_node = node.children[0]
         | 
| 140 140 | 
             
                    begin_pos = name_node.loc.expression.end_pos
         | 
| 141 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 141 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 142 142 | 
             
                    add_context(begin_pos..end_pos, context: context)
         | 
| 143 143 |  | 
| 144 144 | 
             
                  when :sclass
         | 
| 145 145 | 
             
                    name_node = node.children[0]
         | 
| 146 146 | 
             
                    begin_pos = name_node.loc.expression.end_pos
         | 
| 147 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 147 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 148 148 | 
             
                    add_context(begin_pos..end_pos, context: context)
         | 
| 149 149 |  | 
| 150 150 | 
             
                  when :def, :defs
         | 
| @@ -159,20 +159,20 @@ module Steep | |
| 159 159 |  | 
| 160 160 | 
             
                      body_begin_pos =
         | 
| 161 161 | 
             
                        case
         | 
| 162 | 
            -
                        when node.loc.assignment
         | 
| 162 | 
            +
                        when node.loc.assignment # steep:ignore NoMethod
         | 
| 163 163 | 
             
                          # endless def
         | 
| 164 | 
            -
                          node.loc.assignment.end_pos
         | 
| 164 | 
            +
                          node.loc.assignment.end_pos # steep:ignore NoMethod
         | 
| 165 165 | 
             
                        when args_node.loc.expression
         | 
| 166 166 | 
             
                          # with args
         | 
| 167 167 | 
             
                          args_node.loc.expression.end_pos
         | 
| 168 168 | 
             
                        else
         | 
| 169 169 | 
             
                          # without args
         | 
| 170 | 
            -
                          node.loc.name.end_pos
         | 
| 170 | 
            +
                          node.loc.name.end_pos # steep:ignore NoMethod
         | 
| 171 171 | 
             
                        end
         | 
| 172 172 |  | 
| 173 173 | 
             
                      body_end_pos =
         | 
| 174 | 
            -
                        if node.loc.end
         | 
| 175 | 
            -
                          node.loc.end.begin_pos
         | 
| 174 | 
            +
                        if node.loc.end # steep:ignore NoMethod
         | 
| 175 | 
            +
                          node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 176 176 | 
             
                        else
         | 
| 177 177 | 
             
                          node.loc.expression.end_pos
         | 
| 178 178 | 
             
                        end
         | 
| @@ -188,7 +188,7 @@ module Steep | |
| 188 188 | 
             
                    _, collection, _ = node.children
         | 
| 189 189 |  | 
| 190 190 | 
             
                    begin_pos = collection.loc.expression.end_pos
         | 
| 191 | 
            -
                    end_pos = node.loc.end.begin_pos
         | 
| 191 | 
            +
                    end_pos = node.loc.end.begin_pos # steep:ignore NoMethod
         | 
| 192 192 |  | 
| 193 193 | 
             
                    add_context(begin_pos..end_pos, context: context)
         | 
| 194 194 | 
             
                  else
         | 
| @@ -202,6 +202,7 @@ module Steep | |
| 202 202 | 
             
                end
         | 
| 203 203 |  | 
| 204 204 | 
             
                def dump(io)
         | 
| 205 | 
            +
                  # steep:ignore:start
         | 
| 205 206 | 
             
                  io.puts "Typing: "
         | 
| 206 207 | 
             
                  nodes.each_value do |node|
         | 
| 207 208 | 
             
                    io.puts "  #{Typing.summary(node)} => #{type_of(node: node).inspect}"
         | 
| @@ -211,6 +212,7 @@ module Steep | |
| 211 212 | 
             
                  errors.each do |error|
         | 
| 212 213 | 
             
                    io.puts "  #{Typing.summary(error.node)} => #{error.inspect}"
         | 
| 213 214 | 
             
                  end
         | 
| 215 | 
            +
                  # steep:ignore:end
         | 
| 214 216 | 
             
                end
         | 
| 215 217 |  | 
| 216 218 | 
             
                def self.summary(node)
         | 
    
        data/lib/steep/version.rb
    CHANGED
    
    
    
        data/lib/steep.rb
    CHANGED
    
    | @@ -76,11 +76,11 @@ require "steep/diagnostic/ruby" | |
| 76 76 | 
             
            require "steep/diagnostic/signature"
         | 
| 77 77 | 
             
            require "steep/diagnostic/lsp_formatter"
         | 
| 78 78 | 
             
            require "steep/signature/validator"
         | 
| 79 | 
            +
            require "steep/module_helper"
         | 
| 79 80 | 
             
            require "steep/source"
         | 
| 80 81 | 
             
            require "steep/source/ignore_ranges"
         | 
| 81 82 | 
             
            require "steep/annotation_parser"
         | 
| 82 83 | 
             
            require "steep/typing"
         | 
| 83 | 
            -
            require "steep/module_helper"
         | 
| 84 84 | 
             
            require "steep/type_construction"
         | 
| 85 85 | 
             
            require "steep/type_inference/context"
         | 
| 86 86 | 
             
            require "steep/type_inference/context_array"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: steep
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.8.0.dev. | 
| 4 | 
            +
              version: 1.8.0.dev.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Soutaro Matsumoto
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-08-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: parser
         | 
| @@ -401,7 +401,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 401 401 | 
             
                - !ruby/object:Gem::Version
         | 
| 402 402 | 
             
                  version: '0'
         | 
| 403 403 | 
             
            requirements: []
         | 
| 404 | 
            -
            rubygems_version: 3.5. | 
| 404 | 
            +
            rubygems_version: 3.5.11
         | 
| 405 405 | 
             
            signing_key:
         | 
| 406 406 | 
             
            specification_version: 4
         | 
| 407 407 | 
             
            summary: Gradual Typing for Ruby
         |