18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# File 'lib/yoda/typing/types/converter.rb', line 18
def convert_from_expression(type_expression)
case type_expression
when Model::TypeExpressions::AnyType, Model::TypeExpressions::UnknownType
Any.new
when Model::TypeExpressions::InstanceType
Instance.new(
klass: generator.find_or_build(type_expression.path),
)
when Model::TypeExpressions::ModuleType
is_class = %i(class meta_class).include?(generator.find(type_expression.path)&.kind)
Instance.new(
klass: generator.find_or_build_meta_class(type_expression.path),
)
when Model::TypeExpressions::SequenceType
generator.array_type
when Model::TypeExpressions::DuckType
generator.any_type
when Model::TypeExpressions::SelfType
self_type || generator.any_type
when Model::TypeExpressions::ValueType
value_class = type_expression.value_class
value_class ? Instance.new(klass: generator.find_or_build(value_class)) : generator.any_type
when Model::TypeExpressions::UnionType
Union.new(*type_expression.types.map(&method(:convert_from_expression)))
when Model::TypeExpressions::GenericType
Generic.new(
base: convert_from_expression(type_expression.base_type),
type_args: type_expression.type_arguments.map(&method(:convert_from_expression)),
)
when Model::TypeExpressions::FunctionType
Function.new(
context: type_expression.context && convert_from_expression(type_expression.context),
return_type: convert_from_expression(type_expression.return_type),
parameters: type_expression.required_parameters.map(&:type).map(&method(:convert_from_expression)),
rest_parameter: type_expression.rest_parameter && convert_from_expression(type_expression.rest_parameter.type),
post_parameters: type_expression.post_parameters.map(&:type).map(&method(:convert_from_expression)),
keyword_parameters: (type_expression.required_keyword_parameters + type_expression.optional_keyword_parameters).map { |param| [param.name, convert_from_expression(param.type)] },
keyword_rest_parameter: type_expression.keyword_rest_parameter && convert_from_expression(type_expression.keyword_rest_parameter.type),
block_parameter: type_expression.block_parameter && convert_from_expression(type_expression.block_parameter.type),
)
else
fail ArgumentError, type_expression
end
end
|