Class: RLSL::Prism::ExpressionInferer
- Inherits:
-
Object
- Object
- RLSL::Prism::ExpressionInferer
- Defined in:
- lib/rlsl/prism/type_inference/expression_inferer.rb
Instance Method Summary collapse
- #infer_array_index(node) ⇒ Object
- #infer_array_literal(node) ⇒ Object
- #infer_binary_op(node) ⇒ Object
- #infer_bool_literal(node) ⇒ Object
- #infer_field_access(node) ⇒ Object
- #infer_func_call(node) ⇒ Object
- #infer_literal(node) ⇒ Object
- #infer_parenthesized(node) ⇒ Object
- #infer_swizzle(node) ⇒ Object
- #infer_unary_op(node) ⇒ Object
- #infer_var_ref(node) ⇒ Object
-
#initialize(infer:, lookup:, call_type_resolver:, field_type_resolver:, collection_type_resolver:) ⇒ ExpressionInferer
constructor
A new instance of ExpressionInferer.
Constructor Details
#initialize(infer:, lookup:, call_type_resolver:, field_type_resolver:, collection_type_resolver:) ⇒ ExpressionInferer
Returns a new instance of ExpressionInferer.
6 7 8 9 10 11 12 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 6 def initialize(infer:, lookup:, call_type_resolver:, field_type_resolver:, collection_type_resolver:) @infer = infer @lookup = lookup @call_type_resolver = call_type_resolver @field_type_resolver = field_type_resolver @collection_type_resolver = collection_type_resolver end |
Instance Method Details
#infer_array_index(node) ⇒ Object
84 85 86 87 88 89 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 84 def infer_array_index(node) @infer.call(node.array) @infer.call(node.index) node.type = @collection_type_resolver.resolve_array_index(node) node end |
#infer_array_literal(node) ⇒ Object
78 79 80 81 82 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 78 def infer_array_literal(node) node.elements.each { |element| @infer.call(element) } node.type = @collection_type_resolver.resolve_array_literal(node) node end |
#infer_binary_op(node) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 28 def infer_binary_op(node) @infer.call(node.left) @infer.call(node.right) node.type = Builtins.binary_op_result_type( node.operator, node.left.type, node.right.type ) node end |
#infer_bool_literal(node) ⇒ Object
23 24 25 26 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 23 def infer_bool_literal(node) node.type = :bool node end |
#infer_field_access(node) ⇒ Object
60 61 62 63 64 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 60 def infer_field_access(node) @infer.call(node.receiver) node.type = @field_type_resolver.resolve(node) node end |
#infer_func_call(node) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 52 def infer_func_call(node) node.args.each { |arg| @infer.call(arg) } @infer.call(node.receiver) if node.receiver node.type = @call_type_resolver.resolve(node) node end |
#infer_literal(node) ⇒ Object
19 20 21 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 19 def infer_literal(node) node end |
#infer_parenthesized(node) ⇒ Object
72 73 74 75 76 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 72 def infer_parenthesized(node) @infer.call(node.expression) node.type = node.expression.type node end |
#infer_swizzle(node) ⇒ Object
66 67 68 69 70 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 66 def infer_swizzle(node) @infer.call(node.receiver) node.type = Builtins.swizzle_type(node.components) node end |
#infer_unary_op(node) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 40 def infer_unary_op(node) @infer.call(node.operand) case node.operator.to_s when "-" node.type = node.operand.type when "!" node.type = :bool end node end |
#infer_var_ref(node) ⇒ Object
14 15 16 17 |
# File 'lib/rlsl/prism/type_inference/expression_inferer.rb', line 14 def infer_var_ref(node) node.type ||= @lookup.call(node.name) node end |