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: 990a1e0ede945713a31152caccc4a7de798dc6ead6078d46d5a376f19054a52a
4
- data.tar.gz: 97d7877587ca50ab673212d1d0d80d6d60ad8f97a74c439965feb32c2f5a4e37
3
+ metadata.gz: 7e72d5a921ff9b83cef5fb60e89672e913daa367f7e64b7fd000664664c4bb22
4
+ data.tar.gz: 7876a95d45c0a11a801ea6ec3bef10adc448e69eacaccd5bc65df5c22e01786b
5
5
  SHA512:
6
- metadata.gz: c04b4d611724c8b4f42ae14929b3d8d98b4aa4da5157f7c3ee765afb6356be643b6ada8c96ed45a8e61103e71792c7855c25d87f65865b9609cdb0cc85544507
7
- data.tar.gz: 82416c2665d49928f0d6dd5e9b8f225177f9df0f782e973339545a6375cc673e082bccc3bbb6126cbdc50875dc6fa29880b5e23b8e3ccd458934b32f5d2f6718
6
+ metadata.gz: 641eb7f5a45dfd4b737342ccb89ef2e58036ff6e3a889032664b0136ba6a8c632d45180f9a18ce56061c9278e2bd7e68ad37374cf40dc6da2d626940f8457d95
7
+ data.tar.gz: 399e6943e1207afa3a14201e8a3f1984405810da46d245685b9b2a9b5fd74b92486f982377452f416caf5aa9d6878d6094ffb11c7382d35b37d11820c3df6a89
data/lib/milk_tea/base.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require "pathname"
4
4
 
5
5
  module MilkTea
6
- VERSION = "0.4.0"
6
+ VERSION = "0.4.1"
7
7
 
8
8
  def self.root
9
9
  @root ||= Pathname.new(File.expand_path("../..", __dir__))
@@ -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 = comptime_eval(arguments[idx].value, scopes)
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
- return unless receiver.is_a?(AST::Identifier)
718
- return unless @variables.key?(receiver.name)
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
- receiver_value = @variables[receiver.name]
721
- return nil if receiver_value.nil? || receiver_value.is_a?(Types::Base)
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 = @variable_types[receiver.name]
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 = types[callee_name]
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.0
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.0 installed!
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