parlour 5.0.0.beta.4 → 5.0.0.beta.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28a746eeb5c6322d0dfbfc53336bde66a65a35462f8e7685098aadd8720d3ade
4
- data.tar.gz: 5cd5e9fe8cd248e1b7685134b3116f04c28e481d30ed6ac01b77b6f82aa7236b
3
+ metadata.gz: 954aae86deb14e48d6fd3e1491bfc90e511e06f2339697b41f06bb137f93ae84
4
+ data.tar.gz: 5720e034546be195412725a2c5cb58dc14325485eb9720491db4b29b49e83026
5
5
  SHA512:
6
- metadata.gz: 51d1cdde17b3d84ae927343e7627efc2ef832440907b8f3ae40ec3cf20edcd20a8f7f76f3991933251a7542ccc7b6ac1269a98a268603e34eaaf043322e05625
7
- data.tar.gz: d84ae4f6260e82de62dafdc67a7715c9cd74f01a68bbce8f5e89d0aa1f00509bd4a5230ec0fa7c850898f57936e29aee07c8f607935dbc1c784f4212ff709246
6
+ metadata.gz: c2ff5915c768f8fa5432b0fcb7f0ae89fb3385c6a500ab9f46dedab301f44084620203219e7bac044b48ec2659b9ca729b2d5f2ce0b15e6222c9d3ddec4ca2a2
7
+ data.tar.gz: e0edbaf4e923f7b80956072ebc82e1ef1075e6791e8ef7e147da0b533709b62e421e786a0dbd36b8bd11473c59b5f302972deb91d7590d4acae69caebcac1887
@@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
5
 
6
+ ## [5.0.0.beta.5] - 2020-10-03
7
+ ### Added
8
+ - Added `Types::Generic` for user-defined generic types
9
+
6
10
  ## [5.0.0.beta.4] - 2020-09-22
7
11
  ### Added
8
12
  - Added support for parsing type aliases from RBI
@@ -721,7 +721,7 @@ module Parlour
721
721
  end
722
722
 
723
723
  sig { params(node: Parser::AST::Node).returns(Types::Type) }
724
- # Given an AST node representing an RBI type (such as 'T::Array[String]'),
724
+ # Given an AST node representing an RBI type (such as 'T::Array[String]'),
725
725
  # parses it into a generic type.
726
726
  #
727
727
  # @param [Parser::AST::Node] node
@@ -736,9 +736,9 @@ module Parlour
736
736
  names = constant_names(target)
737
737
  known_single_element_collections = [:Array, :Set, :Range, :Enumerator, :Enumerable]
738
738
 
739
- if names.length == 2 && names[0] == :T &&
739
+ if names.length == 2 && names[0] == :T &&
740
740
  known_single_element_collections.include?(names[1])
741
-
741
+
742
742
  parse_err "no type in T::#{names[1]}[...]", node if args.nil? || args.empty?
743
743
  parse_err "too many types in T::#{names[1]}[...]", node unless args.length == 1
744
744
  return T.must(Types.const_get(T.must(names[1]))).new(parse_node_to_type(T.must(args.first)))
@@ -749,9 +749,17 @@ module Parlour
749
749
  parse_node_to_type(args[0]), parse_node_to_type(args[1])
750
750
  )
751
751
  else
752
- # TODO
753
- warning "user-defined generic types not implemented, treating #{names.last} as untyped", node
754
- return Types::Untyped.new
752
+ type = names.join('::')
753
+ if args.nil?
754
+ parse_err(
755
+ "user defined generic '#{type}' requires at least one type parameter",
756
+ node
757
+ )
758
+ end
759
+ return Types::Generic.new(
760
+ type,
761
+ args.map { |arg| parse_node_to_type(arg) }
762
+ )
755
763
  end
756
764
  end
757
765
 
@@ -760,7 +768,7 @@ module Parlour
760
768
  # something pretty cursed with procs to break this
761
769
  # This checks for (send (send (send (const nil :T) :proc) ...) ...)
762
770
  # That's the right amount of nesting for T.proc.params(...).returns(...)
763
- if node.to_a[0].type == :send &&
771
+ if node.to_a[0].type == :send &&
764
772
  node.to_a[0].to_a[0].type == :send &&
765
773
  node.to_a[0].to_a[0].to_a[1] == :proc &&
766
774
  node.to_a[0].to_a[0].to_a[0].type == :const &&
@@ -797,7 +805,7 @@ module Parlour
797
805
  # The other options for a valid call are all "T.something" methods
798
806
  parse_err "unexpected call #{node_to_s(node).inspect} in type", node \
799
807
  unless target.type == :const && target.to_a == [nil, :T]
800
-
808
+
801
809
  case message
802
810
  when :nilable
803
811
  parse_err 'no argument to T.nilable', node if args.nil? || args.empty?
@@ -828,7 +836,7 @@ module Parlour
828
836
  else
829
837
  warning "unknown method T.#{message}, treating as untyped", node
830
838
  Types::Untyped.new
831
- end
839
+ end
832
840
  when :const
833
841
  # Special case: T::Boolean
834
842
  if constant_names(node) == [:T, :Boolean]
@@ -196,6 +196,45 @@ module Parlour
196
196
  end
197
197
  end
198
198
 
199
+ # A user-defined generic class with an arbitrary number of type
200
+ # parameters. This class assumes at least one type_param is
201
+ # provided, otherwise output will have empty type param lists.
202
+ class Generic < Type
203
+ sig { params(type: TypeLike, type_params: T::Array[TypeLike]).void }
204
+ def initialize(type, type_params)
205
+ @type = to_type(type)
206
+ @type_params = type_params.map { |p| to_type(p) }
207
+ end
208
+
209
+ sig { params(other: Object).returns(T::Boolean) }
210
+ def ==(other)
211
+ self.class === other &&
212
+ type == other.type &&
213
+ type_params == other.type_params
214
+ end
215
+
216
+ sig { returns(Type) }
217
+ attr_reader :type
218
+
219
+ sig { returns(T::Array[Type]) }
220
+ attr_reader :type_params
221
+
222
+ sig { override.returns(String) }
223
+ def generate_rbi
224
+ "#{type.generate_rbi}[#{type_params.map(&:generate_rbi).join(', ')}]"
225
+ end
226
+
227
+ sig { override.returns(String) }
228
+ def generate_rbs
229
+ "#{type.generate_rbs}[#{type_params.map(&:generate_rbs).join(', ')}]"
230
+ end
231
+
232
+ sig { override.returns(String) }
233
+ def describe
234
+ "#{type.describe}<#{type_params.map(&:describe).join(', ')}>"
235
+ end
236
+ end
237
+
199
238
  class SingleElementCollection < Type
200
239
  abstract!
201
240
 
@@ -436,9 +475,9 @@ module Parlour
436
475
  def describe
437
476
  "self"
438
477
  end
439
- end
478
+ end
440
479
 
441
- # The explicit lack of a type.
480
+ # The explicit lack of a type.
442
481
  class Untyped < Type
443
482
  sig { params(other: Object).returns(T::Boolean) }
444
483
  def ==(other)
@@ -487,9 +526,9 @@ module Parlour
487
526
  def ==(other)
488
527
  Parameter === other && name == other.name && type == other.type &&
489
528
  default == other.default
490
- end
529
+ end
491
530
  end
492
-
531
+
493
532
  sig { params(parameters: T::Array[Parameter], return_type: T.nilable(TypeLike)).void }
494
533
  def initialize(parameters, return_type)
495
534
  @parameters = parameters
@@ -536,4 +575,4 @@ module Parlour
536
575
  end
537
576
  end
538
577
  end
539
-
578
+
@@ -1,5 +1,5 @@
1
1
  # typed: strong
2
2
  module Parlour
3
3
  # The library version.
4
- VERSION = '5.0.0.beta.4'
4
+ VERSION = '5.0.0.beta.5'
5
5
  end
@@ -427,6 +427,29 @@ module Parlour
427
427
  def describe; end
428
428
  end
429
429
 
430
+ class Generic < Type
431
+ sig { params(type: TypeLike, type_params: T::Array[TypeLike]).void }
432
+ def initialize(type, type_params); end
433
+
434
+ sig { params(other: Object).returns(T::Boolean) }
435
+ def ==(other); end
436
+
437
+ sig { returns(Type) }
438
+ attr_reader :type
439
+
440
+ sig { returns(T::Array[Type]) }
441
+ attr_reader :type_params
442
+
443
+ sig { override.returns(String) }
444
+ def generate_rbi; end
445
+
446
+ sig { override.returns(String) }
447
+ def generate_rbs; end
448
+
449
+ sig { override.returns(String) }
450
+ def describe; end
451
+ end
452
+
430
453
  class SingleElementCollection < Type
431
454
  abstract!
432
455
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parlour
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.beta.4
4
+ version: 5.0.0.beta.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Christiansen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-22 00:00:00.000000000 Z
11
+ date: 2020-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime