mt-lang 0.4.0 → 0.4.1
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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7e72d5a921ff9b83cef5fb60e89672e913daa367f7e64b7fd000664664c4bb22
|
|
4
|
+
data.tar.gz: 7876a95d45c0a11a801ea6ec3bef10adc448e69eacaccd5bc65df5c22e01786b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 641eb7f5a45dfd4b737342ccb89ef2e58036ff6e3a889032664b0136ba6a8c632d45180f9a18ce56061c9278e2bd7e68ad37374cf40dc6da2d626940f8457d95
|
|
7
|
+
data.tar.gz: 399e6943e1207afa3a14201e8a3f1984405810da46d245685b9b2a9b5fd74b92486f982377452f416caf5aa9d6878d6094ffb11c7382d35b37d11820c3df6a89
|
data/lib/milk_tea/base.rb
CHANGED
|
@@ -116,7 +116,7 @@ module MilkTea
|
|
|
116
116
|
func && func.respond_to?(:ast) && func.ast.respond_to?(:const) && func.ast.const
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
-
def comptime_const_method_body(binding, arguments, scopes:, receiver_value:)
|
|
119
|
+
def comptime_const_method_body(binding, arguments, scopes:, receiver_value:, arg_evaluator: nil)
|
|
120
120
|
method = binding.ast
|
|
121
121
|
return nil unless method.respond_to?(:body) && method.body
|
|
122
122
|
return nil if binding.type_params.any?
|
|
@@ -130,7 +130,11 @@ module MilkTea
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
method.params.each_with_index do |param, idx|
|
|
133
|
-
arg_value =
|
|
133
|
+
arg_value = if arg_evaluator
|
|
134
|
+
arg_evaluator.call(arguments[idx].value)
|
|
135
|
+
else
|
|
136
|
+
comptime_eval(arguments[idx].value, scopes)
|
|
137
|
+
end
|
|
134
138
|
return nil unless arg_value
|
|
135
139
|
|
|
136
140
|
initial_vars[param.name] = arg_value
|
|
@@ -713,20 +713,31 @@ module MilkTea
|
|
|
713
713
|
return unless @checker.respond_to?(:comptime_method_binding_for_receiver)
|
|
714
714
|
return unless @checker.respond_to?(:comptime_const_method_body)
|
|
715
715
|
|
|
716
|
+
arg_evaluator = ->(expr) { evaluate_expression(expr, scopes:) }
|
|
717
|
+
|
|
716
718
|
receiver = call_expr.callee.receiver
|
|
717
|
-
|
|
718
|
-
|
|
719
|
+
if receiver.is_a?(AST::Identifier) && @variables.key?(receiver.name)
|
|
720
|
+
receiver_value = @variables[receiver.name]
|
|
721
|
+
return nil if receiver_value.nil? || receiver_value.is_a?(Types::Base)
|
|
722
|
+
|
|
723
|
+
receiver_type = @variable_types[receiver.name]
|
|
724
|
+
return nil unless receiver_type
|
|
725
|
+
|
|
726
|
+
binding = @checker.comptime_method_binding_for_receiver(receiver_type, call_expr.callee.member)
|
|
727
|
+
return nil unless binding
|
|
719
728
|
|
|
720
|
-
|
|
721
|
-
|
|
729
|
+
return @checker.comptime_const_method_body(binding, call_expr.arguments, scopes:, receiver_value:, arg_evaluator:)
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
return nil unless @checker.respond_to?(:resolve_type_expression)
|
|
722
733
|
|
|
723
|
-
receiver_type = @
|
|
734
|
+
receiver_type = @checker.resolve_type_expression(receiver)
|
|
724
735
|
return nil unless receiver_type
|
|
725
736
|
|
|
726
737
|
binding = @checker.comptime_method_binding_for_receiver(receiver_type, call_expr.callee.member)
|
|
727
738
|
return nil unless binding
|
|
728
739
|
|
|
729
|
-
@checker.comptime_const_method_body(binding, call_expr.arguments, scopes:, receiver_value:)
|
|
740
|
+
@checker.comptime_const_method_body(binding, call_expr.arguments, scopes:, receiver_value: nil, arg_evaluator:)
|
|
730
741
|
end
|
|
731
742
|
|
|
732
743
|
def try_const_function_call(call_expr, scopes:)
|
|
@@ -774,9 +785,12 @@ module MilkTea
|
|
|
774
785
|
elsif call_expr.callee.respond_to?(:name)
|
|
775
786
|
call_expr.callee.name
|
|
776
787
|
end
|
|
777
|
-
return unless callee_name
|
|
778
788
|
|
|
779
|
-
type =
|
|
789
|
+
type = if callee_name
|
|
790
|
+
types[callee_name]
|
|
791
|
+
elsif call_expr.callee.is_a?(AST::MemberAccess) && @checker.respond_to?(:resolve_type_expression)
|
|
792
|
+
@checker.resolve_type_expression(call_expr.callee)
|
|
793
|
+
end
|
|
780
794
|
return unless type.is_a?(Types::Struct)
|
|
781
795
|
|
|
782
796
|
fields = {}
|
|
@@ -1875,6 +1875,10 @@ module MilkTea
|
|
|
1875
1875
|
@lowerer.resolve_type_ref(type_ref)
|
|
1876
1876
|
end
|
|
1877
1877
|
|
|
1878
|
+
def resolve_type_expression(expression)
|
|
1879
|
+
@lowerer.resolve_type_expression(expression)
|
|
1880
|
+
end
|
|
1881
|
+
|
|
1878
1882
|
def comptime_struct_field_names(type_name)
|
|
1879
1883
|
@lowerer.comptime_struct_field_names(type_name)
|
|
1880
1884
|
end
|
|
@@ -1883,8 +1887,8 @@ module MilkTea
|
|
|
1883
1887
|
@lowerer.comptime_method_binding_for_receiver(receiver_type, member)
|
|
1884
1888
|
end
|
|
1885
1889
|
|
|
1886
|
-
def comptime_const_method_body(binding, arguments, scopes: nil, receiver_value: nil)
|
|
1887
|
-
@lowerer.comptime_const_method_body(binding, arguments, scopes:, receiver_value:)
|
|
1890
|
+
def comptime_const_method_body(binding, arguments, scopes: nil, receiver_value: nil, arg_evaluator: nil)
|
|
1891
|
+
@lowerer.comptime_const_method_body(binding, arguments, scopes:, receiver_value:, arg_evaluator:)
|
|
1888
1892
|
end
|
|
1889
1893
|
|
|
1890
1894
|
def comptime_expression_type(expression, scopes: nil)
|
|
@@ -424,6 +424,17 @@ module MilkTea
|
|
|
424
424
|
receiver_value = comptime_member_receiver_value(expression.callee.receiver, scopes)
|
|
425
425
|
return comptime_const_method_body(method_binding, expression.arguments, scopes:, receiver_value:)
|
|
426
426
|
end
|
|
427
|
+
|
|
428
|
+
if (struct_type = resolve_type_expression(expression.callee)) && struct_type.is_a?(Types::Struct)
|
|
429
|
+
fields = {}
|
|
430
|
+
expression.arguments.each do |argument|
|
|
431
|
+
val = evaluate_compile_time_const_value(argument.value, scopes:)
|
|
432
|
+
return nil unless val
|
|
433
|
+
|
|
434
|
+
fields[argument.name] = val
|
|
435
|
+
end
|
|
436
|
+
return fields
|
|
437
|
+
end
|
|
427
438
|
when AST::Identifier
|
|
428
439
|
if (struct_type = @ctx.types[expression.callee.name]) && struct_type.is_a?(Types::Struct)
|
|
429
440
|
fields = {}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mt-lang
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Long (Teefan) Tran
|
|
@@ -629,7 +629,7 @@ metadata:
|
|
|
629
629
|
homepage_uri: https://teefan.github.io/mt-lang/
|
|
630
630
|
source_code_uri: https://github.com/teefan/mt-lang
|
|
631
631
|
post_install_message: |
|
|
632
|
-
Milk Tea 0.4.
|
|
632
|
+
Milk Tea 0.4.1 installed!
|
|
633
633
|
|
|
634
634
|
System requirements:
|
|
635
635
|
- A C compiler (gcc or clang) must be available on PATH
|