sig/variance_calculator.rbs in rbs-1.7.1 vs sig/variance_calculator.rbs in rbs-1.8.0
- old
+ new
@@ -1,9 +1,49 @@
module RBS
+ # Calculate the use variances of type variables in declaration.
+ #
+ # ```rb
+ # calculator = VarianceCalculator.new(builder: builder)
+ #
+ # # Calculates variances in a method type
+ # result = calculator.in_method_type(method_type: method_type, variables: variables)
+ #
+ # # Calculates variances in a inheritance/mixin/...
+ # result = calculator.in_inherit(name: name, args: args, variables: variables)
+ #
+ # # Calculates variances in a type alias
+ # result = calculator.in_type_alias(name: name, args: args, variables: variables)
+ # ```
+ #
+ # See `RBS::VarianceCaluculator::Result` for information recorded in the `Result` object.
+ #
class VarianceCalculator
type variance = :unused | :covariant | :contravariant | :invariant
+ # Result contains the set of type variables and it's variance in a occurrence.
+ #
+ # ```rb
+ # # Enumerates recorded type variables
+ # result.each do |name, variance|
+ # # name is the name of a type variable
+ # # variance is one of :unused | :covariant | :contravariant | :invariant
+ # end
+ # ```
+ #
+ # You can test with `compatible?` method if the type variable occurrences are compatible with specified (annotated) variance.
+ #
+ # ```rb
+ # # When T is declared as `out T`
+ # result.compatible?(:T, with_annotation: :covariant)
+ #
+ # # When T is declared as `in T`
+ # result.compatible?(:T, with_annotation: :contravariant)
+ #
+ # # When T is declared as `T`
+ # result.compatible?(:T, with_annotation: :invariant)
+ # ```
+ #
class Result
attr_reader result: Hash[Symbol, variance]
def initialize: (variables: Array[Symbol]) -> void
@@ -16,10 +56,12 @@
def each: () { ([Symbol, variance]) -> void } -> void
def include?: (Symbol) -> bool
def compatible?: (Symbol, with_annotation: variance) -> bool
+
+ def incompatible?: (AST::Declarations::ModuleTypeParams) -> Set[Symbol]?
end
attr_reader builder: DefinitionBuilder
def initialize: (builder: DefinitionBuilder) -> void
@@ -28,8 +70,16 @@
def in_method_type: (method_type: MethodType, variables: Array[Symbol]) -> Result
def in_inherit: (name: TypeName, args: Array[Types::t], variables: Array[Symbol]) -> Result
+ def in_type_alias: (name: TypeName) -> Result
+
+ private
+
def type: (Types::t, result: Result, context: variance) -> void
+
+ def function: (Types::Function, result: Result, context: variance) -> void
+
+ def negate: (variance) -> variance
end
end