parlour 4.0.0 → 5.0.0.beta.4

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  3. data/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  4. data/.gitignore +1 -1
  5. data/.parlour +0 -0
  6. data/.rspec +0 -0
  7. data/.travis.yml +0 -0
  8. data/CHANGELOG.md +52 -0
  9. data/CODE_OF_CONDUCT.md +0 -0
  10. data/Gemfile +0 -0
  11. data/LICENSE.txt +0 -0
  12. data/README.md +208 -20
  13. data/Rakefile +0 -0
  14. data/exe/parlour +45 -6
  15. data/lib/parlour.rb +27 -1
  16. data/lib/parlour/conflict_resolver.rb +31 -9
  17. data/lib/parlour/conversion/converter.rb +34 -0
  18. data/lib/parlour/conversion/rbi_to_rbs.rb +229 -0
  19. data/lib/parlour/debugging.rb +0 -0
  20. data/lib/parlour/detached_rbi_generator.rb +0 -0
  21. data/lib/parlour/detached_rbs_generator.rb +25 -0
  22. data/lib/parlour/generator.rb +34 -0
  23. data/lib/parlour/kernel_hack.rb +0 -0
  24. data/lib/parlour/options.rb +71 -0
  25. data/lib/parlour/parse_error.rb +0 -0
  26. data/lib/parlour/plugin.rb +0 -0
  27. data/lib/parlour/rbi_generator.rb +24 -37
  28. data/lib/parlour/rbi_generator/arbitrary.rb +5 -2
  29. data/lib/parlour/rbi_generator/attribute.rb +14 -5
  30. data/lib/parlour/rbi_generator/class_namespace.rb +8 -3
  31. data/lib/parlour/rbi_generator/constant.rb +17 -6
  32. data/lib/parlour/rbi_generator/enum_class_namespace.rb +8 -3
  33. data/lib/parlour/rbi_generator/extend.rb +5 -2
  34. data/lib/parlour/rbi_generator/include.rb +5 -2
  35. data/lib/parlour/rbi_generator/method.rb +15 -10
  36. data/lib/parlour/rbi_generator/module_namespace.rb +7 -2
  37. data/lib/parlour/rbi_generator/namespace.rb +40 -13
  38. data/lib/parlour/rbi_generator/parameter.rb +11 -5
  39. data/lib/parlour/rbi_generator/rbi_object.rb +19 -78
  40. data/lib/parlour/rbi_generator/struct_class_namespace.rb +9 -2
  41. data/lib/parlour/rbi_generator/struct_prop.rb +12 -9
  42. data/lib/parlour/rbi_generator/type_alias.rb +101 -0
  43. data/lib/parlour/rbs_generator.rb +24 -0
  44. data/lib/parlour/rbs_generator/arbitrary.rb +92 -0
  45. data/lib/parlour/rbs_generator/attribute.rb +82 -0
  46. data/lib/parlour/rbs_generator/block.rb +49 -0
  47. data/lib/parlour/rbs_generator/class_namespace.rb +106 -0
  48. data/lib/parlour/rbs_generator/constant.rb +95 -0
  49. data/lib/parlour/rbs_generator/extend.rb +92 -0
  50. data/lib/parlour/rbs_generator/include.rb +92 -0
  51. data/lib/parlour/rbs_generator/interface_namespace.rb +34 -0
  52. data/lib/parlour/rbs_generator/method.rb +146 -0
  53. data/lib/parlour/rbs_generator/method_signature.rb +104 -0
  54. data/lib/parlour/rbs_generator/module_namespace.rb +35 -0
  55. data/lib/parlour/rbs_generator/namespace.rb +627 -0
  56. data/lib/parlour/rbs_generator/parameter.rb +146 -0
  57. data/lib/parlour/rbs_generator/rbs_object.rb +78 -0
  58. data/lib/parlour/rbs_generator/type_alias.rb +96 -0
  59. data/lib/parlour/type_loader.rb +0 -0
  60. data/lib/parlour/type_parser.rb +174 -5
  61. data/lib/parlour/typed_object.rb +87 -0
  62. data/lib/parlour/types.rb +539 -0
  63. data/lib/parlour/version.rb +1 -1
  64. data/parlour.gemspec +1 -1
  65. data/plugin_examples/foobar_plugin.rb +0 -0
  66. data/rbi/parlour.rbi +1404 -441
  67. metadata +33 -10
  68. data/lib/parlour/rbi_generator/options.rb +0 -74
@@ -1,13 +1,13 @@
1
1
  # typed: true
2
2
  module Parlour
3
- class RbiGenerator
3
+ class RbiGenerator < Generator
4
4
  # Represents a module definition.
5
5
  class ModuleNamespace < Namespace
6
6
  extend T::Sig
7
7
 
8
8
  sig do
9
9
  params(
10
- generator: RbiGenerator,
10
+ generator: Generator,
11
11
  name: String,
12
12
  final: T::Boolean,
13
13
  interface: T::Boolean,
@@ -96,6 +96,11 @@ module Parlour
96
96
  "Module #{name} - #{"interface, " if interface}#{children.length} " +
97
97
  "children, #{includes.length} includes, #{extends.length} extends"
98
98
  end
99
+
100
+ sig { override.void }
101
+ def generalize_from_rbi!
102
+ super
103
+ end
99
104
  end
100
105
  end
101
106
  end
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
  module Parlour
3
- class RbiGenerator
3
+ class RbiGenerator < Generator
4
4
  # A generic namespace. This shouldn't be used, except as the type of
5
5
  # {RbiGenerator#root}.
6
6
  class Namespace < RbiObject
@@ -24,7 +24,7 @@ module Parlour
24
24
 
25
25
  sig do
26
26
  params(
27
- generator: RbiGenerator,
27
+ generator: Generator,
28
28
  name: T.nilable(String),
29
29
  final: T::Boolean,
30
30
  block: T.nilable(T.proc.params(x: Namespace).void)
@@ -77,6 +77,17 @@ module Parlour
77
77
  )
78
78
  end
79
79
 
80
+ sig { returns(T::Array[RbiGenerator::TypeAlias]) }
81
+ # The {RbiGenerator::TypeAlias} objects from {children}.
82
+ # @return [Array<RbiGenerator::TypeAlias>]
83
+ def aliases
84
+ T.cast(
85
+ children.select { |c| c.is_a?(RbiGenerator::TypeAlias) },
86
+ T::Array[RbiGenerator::TypeAlias]
87
+ )
88
+ end
89
+ alias type_aliases aliases
90
+
80
91
  sig { returns(T::Array[RbiGenerator::Constant]) }
81
92
  # The {RbiGenerator::Constant} objects from {children}.
82
93
  # @return [Array<RbiGenerator::Constant>]
@@ -260,8 +271,8 @@ module Parlour
260
271
  params(
261
272
  name: String,
262
273
  parameters: T.nilable(T::Array[Parameter]),
263
- return_type: T.nilable(String),
264
- returns: T.nilable(String),
274
+ return_type: T.nilable(Types::TypeLike),
275
+ returns: T.nilable(Types::TypeLike),
265
276
  abstract: T::Boolean,
266
277
  implementation: T::Boolean,
267
278
  override: T::Boolean,
@@ -320,7 +331,7 @@ module Parlour
320
331
  params(
321
332
  name: String,
322
333
  kind: Symbol,
323
- type: String,
334
+ type: Types::TypeLike,
324
335
  class_attribute: T::Boolean,
325
336
  block: T.nilable(T.proc.params(x: Attribute).void)
326
337
  ).returns(Attribute)
@@ -376,7 +387,7 @@ module Parlour
376
387
  sig do
377
388
  params(
378
389
  name: String,
379
- type: String,
390
+ type: Types::TypeLike,
380
391
  class_attribute: T::Boolean,
381
392
  block: T.nilable(T.proc.params(x: Attribute).void)
382
393
  ).returns(Attribute)
@@ -397,7 +408,7 @@ module Parlour
397
408
  sig do
398
409
  params(
399
410
  name: String,
400
- type: String,
411
+ type: Types::TypeLike,
401
412
  class_attribute: T::Boolean,
402
413
  block: T.nilable(T.proc.params(x: Attribute).void)
403
414
  ).returns(Attribute)
@@ -418,7 +429,7 @@ module Parlour
418
429
  sig do
419
430
  params(
420
431
  name: String,
421
- type: String,
432
+ type: Types::TypeLike,
422
433
  class_attribute: T::Boolean,
423
434
  block: T.nilable(T.proc.params(x: Attribute).void)
424
435
  ).returns(Attribute)
@@ -552,7 +563,7 @@ module Parlour
552
563
  new_constant
553
564
  end
554
565
 
555
- sig { params(name: String, type: String, block: T.nilable(T.proc.params(x: Constant).void)).returns(Constant) }
566
+ sig { params(name: String, type: Types::TypeLike, block: T.nilable(T.proc.params(x: TypeAlias).void)).returns(TypeAlias) }
556
567
  # Adds a new type alias, in the form of a constant, to this namespace.
557
568
  #
558
569
  # @example Add a +MyType+ type alias, to +Integer+, to the class.
@@ -563,7 +574,15 @@ module Parlour
563
574
  # @param block A block which the new instance yields itself to.
564
575
  # @return [RbiGenerator::Constant]
565
576
  def create_type_alias(name, type:, &block)
566
- create_constant(name, value: "T.type_alias { #{type} }", &block)
577
+ new_type_alias = RbiGenerator::TypeAlias.new(
578
+ generator,
579
+ name: name,
580
+ type: type,
581
+ &block
582
+ )
583
+ move_next_comments(new_type_alias)
584
+ children << new_type_alias
585
+ new_type_alias
567
586
  end
568
587
 
569
588
  sig do
@@ -615,12 +634,17 @@ module Parlour
615
634
  "includes, #{extends.length} extends, #{constants.length} constants"
616
635
  end
617
636
 
637
+ sig { override.void }
638
+ def generalize_from_rbi!
639
+ children.each(&:generalize_from_rbi!)
640
+ end
641
+
618
642
  private
619
643
 
620
644
  sig do
621
645
  overridable.params(
622
646
  indent_level: Integer,
623
- options: Options
647
+ options: Options,
624
648
  ).returns(T::Array[String])
625
649
  end
626
650
  # Generates the RBI lines for the body of this namespace. This consists of
@@ -639,13 +663,16 @@ module Parlour
639
663
  eigen_constants, non_eigen_constants = constants.partition(&:eigen_constant)
640
664
  eigen_constants.sort_by!(&:name) if options.sort_namespaces
641
665
 
642
- if includes.any? || extends.any? || non_eigen_constants.any?
666
+ if includes.any? || extends.any? || aliases.any? || non_eigen_constants.any?
643
667
  result += (options.sort_namespaces ? includes.sort_by(&:name) : includes)
644
668
  .flat_map { |x| x.generate_rbi(indent_level, options) }
645
669
  .reject { |x| x.strip == '' }
646
670
  result += (options.sort_namespaces ? extends.sort_by(&:name) : extends)
647
671
  .flat_map { |x| x.generate_rbi(indent_level, options) }
648
672
  .reject { |x| x.strip == '' }
673
+ result += (options.sort_namespaces ? aliases.sort_by(&:name) : aliases)
674
+ .flat_map { |x| x.generate_rbi(indent_level, options) }
675
+ .reject { |x| x.strip == '' }
649
676
  result += (options.sort_namespaces ? non_eigen_constants.sort_by(&:name) : non_eigen_constants)
650
677
  .flat_map { |x| x.generate_rbi(indent_level, options) }
651
678
  .reject { |x| x.strip == '' }
@@ -695,7 +722,7 @@ module Parlour
695
722
 
696
723
  first, *rest = remaining_children.reject do |child|
697
724
  # We already processed these kinds of children
698
- child.is_a?(Include) || child.is_a?(Extend) || child.is_a?(Constant)
725
+ child.is_a?(Include) || child.is_a?(Extend) || child.is_a?(Constant) || child.is_a?(TypeAlias)
699
726
  end
700
727
  unless first
701
728
  # Remove any trailing whitespace due to includes or class attributes
@@ -1,6 +1,7 @@
1
1
  # typed: true
2
+ require 'rainbow'
2
3
  module Parlour
3
- class RbiGenerator
4
+ class RbiGenerator < Generator
4
5
  # Represents a method parameter with a Sorbet type signature.
5
6
  class Parameter
6
7
  extend T::Sig
@@ -8,7 +9,7 @@ module Parlour
8
9
  sig do
9
10
  params(
10
11
  name: String,
11
- type: T.nilable(String),
12
+ type: T.nilable(Types::TypeLike),
12
13
  default: T.nilable(String)
13
14
  ).void
14
15
  end
@@ -80,7 +81,7 @@ module Parlour
80
81
  T.must(name[prefix.length..-1])
81
82
  end
82
83
 
83
- sig { returns(String) }
84
+ sig { returns(Types::TypeLike) }
84
85
  # A Sorbet string of this parameter's type, such as +"String"+ or
85
86
  # +"T.untyped"+.
86
87
  # @return [String]
@@ -118,8 +119,8 @@ module Parlour
118
119
  #
119
120
  # @return [String]
120
121
  def to_sig_param
121
- "#{name_without_kind}: #{type}"
122
- end#
122
+ "#{name_without_kind}: #{String === @type ? @type : @type.generate_rbi}"
123
+ end
123
124
 
124
125
  # A mapping of {kind} values to the characteristic prefixes each kind has.
125
126
  PREFIXES = {
@@ -128,6 +129,11 @@ module Parlour
128
129
  double_splat: '**',
129
130
  block: '&'
130
131
  }.freeze
132
+
133
+ sig { void }
134
+ def generalize_from_rbi!
135
+ @type = TypeParser.parse_single_type(@type) if String === @type
136
+ end
131
137
  end
132
138
  end
133
139
  end
@@ -1,17 +1,15 @@
1
1
  # typed: true
2
2
  module Parlour
3
- class RbiGenerator
3
+ class RbiGenerator < Generator
4
4
  # An abstract class which is subclassed by any classes which can generate
5
5
  # entire lines of an RBI, such as {Namespace} and {Method}. (As an example,
6
6
  # {Parameter} is _not_ a subclass because it does not generate lines, only
7
7
  # segments of definition and signature lines.)
8
8
  # @abstract
9
- class RbiObject
10
- extend T::Helpers
11
- extend T::Sig
9
+ class RbiObject < TypedObject
12
10
  abstract!
13
-
14
- sig { params(generator: RbiGenerator, name: String).void }
11
+
12
+ sig { params(generator: Generator, name: String).void }
15
13
  # Creates a new RBI object.
16
14
  # @note Don't call this directly.
17
15
  #
@@ -19,60 +17,16 @@ module Parlour
19
17
  # @param name [String] The name of this module.
20
18
  # @return [void]
21
19
  def initialize(generator, name)
20
+ super(name)
22
21
  @generator = generator
23
- @generated_by = generator.current_plugin
24
- @name = name
25
- @comments = []
22
+ @generated_by = RbiGenerator === generator ? generator.current_plugin : nil
26
23
  end
27
24
 
28
- sig { returns(RbiGenerator) }
25
+ sig { returns(Generator) }
29
26
  # The generator which this object belongs to.
30
- # @return [RbiGenerator]
27
+ # @return [Generator]
31
28
  attr_reader :generator
32
29
 
33
- sig { returns(T.nilable(Plugin)) }
34
- # The {Plugin} which was controlling the {generator} when this object was
35
- # created.
36
- # @return [Plugin, nil]
37
- attr_reader :generated_by
38
-
39
- sig { returns(String) }
40
- # The name of this object.
41
- # @return [String]
42
- attr_reader :name
43
-
44
- sig { returns(T::Array[String]) }
45
- # An array of comments which will be placed above the object in the RBI
46
- # file.
47
- # @return [Array<String>]
48
- attr_reader :comments
49
-
50
- sig { params(comment: T.any(String, T::Array[String])).void }
51
- # Adds one or more comments to this RBI object. Comments always go above
52
- # the definition for this object, not in the definition's body.
53
- #
54
- # @example Creating a module with a comment.
55
- # namespace.create_module('M') do |m|
56
- # m.add_comment('This is a module')
57
- # end
58
- #
59
- # @example Creating a class with a multi-line comment.
60
- # namespace.create_class('C') do |c|
61
- # c.add_comment(['This is a multi-line comment!', 'It can be as long as you want!'])
62
- # end
63
- #
64
- # @param comment [String, Array<String>] The new comment(s).
65
- # @return [void]
66
- def add_comment(comment)
67
- if comment.is_a?(String)
68
- comments << comment
69
- elsif comment.is_a?(Array)
70
- comments.concat(comment)
71
- end
72
- end
73
-
74
- alias_method :add_comments, :add_comment
75
-
76
30
  sig do
77
31
  abstract.params(
78
32
  indent_level: Integer,
@@ -115,32 +69,19 @@ module Parlour
115
69
  # @return [void]
116
70
  def merge_into_self(others); end
117
71
 
118
- sig { abstract.returns(String) }
119
- # Returns a human-readable brief string description of this object. This
120
- # is displayed during manual conflict resolution with the +parlour+ CLI.
121
- #
122
- # @abstract
123
- # @return [String]
124
- def describe; end
125
-
126
- private
127
-
128
- sig do
129
- params(
130
- indent_level: Integer,
131
- options: Options
132
- ).returns(T::Array[String])
72
+ sig { override.overridable.returns(String) }
73
+ def describe
74
+ 'RBI object'
133
75
  end
134
- # Generates the RBI lines for this object's comments.
76
+
77
+ sig { abstract.void }
78
+ # Assuming that the types throughout this object and its children have
79
+ # been specified as RBI-style types, generalises them into type instances
80
+ # from the {Parlour::Types} module.
135
81
  #
136
- # @param indent_level [Integer] The indentation level to generate the lines at.
137
- # @param options [Options] The formatting options to use.
138
- # @return [Array<String>] The RBI lines for each comment, formatted as specified.
139
- def generate_comments(indent_level, options)
140
- comments.any? \
141
- ? comments.map { |c| options.indented(indent_level, "# #{c}") }
142
- : []
143
- end
82
+ # @abstract
83
+ # @return [void]
84
+ def generalize_from_rbi!; end
144
85
  end
145
86
  end
146
87
  end
@@ -8,7 +8,7 @@ module Parlour
8
8
 
9
9
  sig do
10
10
  params(
11
- generator: RbiGenerator,
11
+ generator: Generator,
12
12
  name: String,
13
13
  final: T::Boolean,
14
14
  props: T::Array[StructProp],
@@ -39,7 +39,7 @@ module Parlour
39
39
  sig do
40
40
  override.params(
41
41
  indent_level: Integer,
42
- options: Options
42
+ options: Options,
43
43
  ).returns(T::Array[String])
44
44
  end
45
45
  # Generates the RBI lines for the body of this struct. This consists of
@@ -98,6 +98,13 @@ module Parlour
98
98
  @props = other.props if props.empty?
99
99
  end
100
100
  end
101
+
102
+ sig { override.void }
103
+ def generalize_from_rbi!
104
+ super
105
+
106
+ props.each(&:generalize_from_rbi!)
107
+ end
101
108
  end
102
109
  end
103
110
  end
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
  module Parlour
3
- class RbiGenerator
3
+ class RbiGenerator < Generator
4
4
  # Represents a +T::Struct+ property.
5
5
  class StructProp
6
6
  extend T::Sig
@@ -8,7 +8,7 @@ module Parlour
8
8
  sig do
9
9
  params(
10
10
  name: String,
11
- type: String,
11
+ type: Types::TypeLike,
12
12
  optional: T.nilable(T.any(T::Boolean, Symbol)),
13
13
  enum: T.nilable(String),
14
14
  dont_store: T.nilable(T::Boolean),
@@ -28,8 +28,7 @@ module Parlour
28
28
  # https://github.com/sorbet/sorbet/blob/master/gems/sorbet-runtime/lib/types/props/_props.rb#L31-L106
29
29
  #
30
30
  # @param name [String] The name of this property.
31
- # @param type [String] A Sorbet string of this property's type, such as
32
- # +"String"+.
31
+ # @param type [String] This property's type.
33
32
  # @return [void]
34
33
  def initialize(name, type, optional: nil, enum: nil, dont_store: nil,
35
34
  foreign: nil, default: nil, factory: nil, immutable: nil, array: nil,
@@ -77,10 +76,9 @@ module Parlour
77
76
  # @return [String]
78
77
  attr_reader :name
79
78
 
80
- sig { returns(T.nilable(String)) }
81
- # A Sorbet string of this parameter's type, such as +"String"+ or
82
- # +"T.untyped"+.
83
- # @return [String, nil]
79
+ sig { returns(Types::TypeLike) }
80
+ # This parameter's type.
81
+ # @return [Types::TypeLike, nil]
84
82
  attr_reader :type
85
83
 
86
84
  sig { returns(T.nilable(T.any(T::Boolean, Symbol))) }
@@ -122,7 +120,7 @@ module Parlour
122
120
  # Returns the +prop+ call required to create this property.
123
121
  # @return [String]
124
122
  def to_prop_call
125
- call = "prop :#{name}, #{type}"
123
+ call = "prop :#{name}, #{String === @type ? @type : @type.generate_rbi}"
126
124
 
127
125
  EXTRA_PROPERTIES.each do |extra_property|
128
126
  value = send extra_property
@@ -131,6 +129,11 @@ module Parlour
131
129
 
132
130
  call
133
131
  end
132
+
133
+ sig { void }
134
+ def generalize_from_rbi!
135
+ @type = TypeParser.parse_single_type(@type) if String === @type
136
+ end
134
137
  end
135
138
  end
136
139
  end
@@ -0,0 +1,101 @@
1
+ # typed: true
2
+ module Parlour
3
+ class RbiGenerator < Generator
4
+ # Represents a type alias.
5
+ class TypeAlias < RbiObject
6
+ sig do
7
+ params(
8
+ generator: Generator,
9
+ name: String,
10
+ type: Types::TypeLike,
11
+ block: T.nilable(T.proc.params(x: TypeAlias).void)
12
+ ).void
13
+ end
14
+ # Creates a new type alias.
15
+ #
16
+ # @param name [String] The name of the alias.
17
+ # @param value [String] The type to alias to.
18
+ def initialize(generator, name:, type:, &block)
19
+ super(generator, name)
20
+ @type = type
21
+ yield_self(&block) if block
22
+ end
23
+
24
+ # @return [Types::TypeLike] The type to alias to.
25
+ sig { returns(Types::TypeLike) }
26
+ attr_reader :type
27
+
28
+ sig { params(other: Object).returns(T::Boolean) }
29
+ # Returns true if this instance is equal to another type alias.
30
+ #
31
+ # @param other [Object] The other instance. If this is not a {TypeAlias} (or a
32
+ # subclass of it), this will always return false.
33
+ # @return [Boolean]
34
+ def ==(other)
35
+ TypeAlias === other && name == other.name && type == other.type
36
+ end
37
+
38
+ sig do
39
+ override.params(
40
+ indent_level: Integer,
41
+ options: Options
42
+ ).returns(T::Array[String])
43
+ end
44
+ # Generates the RBI lines for this type alias.
45
+ #
46
+ # @param indent_level [Integer] The indentation level to generate the lines at.
47
+ # @param options [Options] The formatting options to use.
48
+ # @return [Array<String>] The RBI lines, formatted as specified.
49
+ def generate_rbi(indent_level, options)
50
+ [options.indented(indent_level,
51
+ "#{name} = T.type_alias { #{String === @type ? @type : @type.generate_rbi} }"
52
+ )]
53
+ end
54
+
55
+ sig do
56
+ override.params(
57
+ others: T::Array[RbiGenerator::RbiObject]
58
+ ).returns(T::Boolean)
59
+ end
60
+ # Given an array of {TypeAlias} instances, returns true if they may be
61
+ # merged into this instance using {merge_into_self}. This is always false.
62
+ #
63
+ # @param others [Array<RbiGenerator::RbiObject>] An array of other
64
+ # {TypeAlias} instances.
65
+ # @return [Boolean] Whether this instance may be merged with them.
66
+ def mergeable?(others)
67
+ others.all? { |other| self == other }
68
+ end
69
+
70
+ sig do
71
+ override.params(
72
+ others: T::Array[RbiGenerator::RbiObject]
73
+ ).void
74
+ end
75
+ # Given an array of {TypeAlias} instances, merges them into this one.
76
+ # This particular implementation will simply do nothing, as instances
77
+ # are only mergeable if they are indentical.
78
+ # You MUST ensure that {mergeable?} is true for those instances.
79
+ #
80
+ # @param others [Array<RbiGenerator::RbiObject>] An array of other
81
+ # {TypeAlias} instances.
82
+ # @return [void]
83
+ def merge_into_self(others)
84
+ # We don't need to change anything! We only merge identical type alias
85
+ end
86
+
87
+ sig { override.returns(String) }
88
+ # Returns a human-readable brief string description of this code.
89
+ #
90
+ # @return [String]
91
+ def describe
92
+ "Type Alias (#{name} = #{type})"
93
+ end
94
+
95
+ sig { override.void }
96
+ def generalize_from_rbi!
97
+ @type = TypeParser.parse_single_type(@type) if String === @type
98
+ end
99
+ end
100
+ end
101
+ end