From 8dd318729c81c7e1fb7b44fae7fbb18864e9878a Mon Sep 17 00:00:00 2001 From: Julien Portalier Date: Sat, 8 Jun 2024 19:57:50 +0200 Subject: [PATCH] Add StringLiteral#to_utf16 closes #14670 --- spec/compiler/macro/macro_methods_spec.cr | 5 +++++ src/compiler/crystal/macros/methods.cr | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/spec/compiler/macro/macro_methods_spec.cr b/spec/compiler/macro/macro_methods_spec.cr index 493fd070744a..72a60d1e106b 100644 --- a/spec/compiler/macro/macro_methods_spec.cr +++ b/spec/compiler/macro/macro_methods_spec.cr @@ -591,6 +591,11 @@ module Crystal assert_macro %({{"hello world".titleize}}), %("Hello World") end + it "executes to_utf16" do + assert_macro %({{"hello".to_utf16}}), "::Slice(UInt16).literal(104_u16, 101_u16, 108_u16, 108_u16, 111_u16, 0_u16)" + assert_macro %({{"TEST 😐🐙 ±∀ の".to_utf16}}), "::Slice(UInt16).literal(84_u16, 69_u16, 83_u16, 84_u16, 32_u16, 55357_u16, 56848_u16, 55357_u16, 56345_u16, 32_u16, 177_u16, 8704_u16, 32_u16, 12398_u16, 0_u16)" + end + it "executes to_i" do assert_macro %({{"1234".to_i}}), %(1234) end diff --git a/src/compiler/crystal/macros/methods.cr b/src/compiler/crystal/macros/methods.cr index 2c45f49701fd..c386da998e1e 100644 --- a/src/compiler/crystal/macros/methods.cr +++ b/src/compiler/crystal/macros/methods.cr @@ -820,6 +820,16 @@ module Crystal else raise "StringLiteral#to_i: #{@value} is not an integer" end + when "to_utf16" + interpret_check_args do + slice = @value.to_utf16 + # include the trailing zero that isn't counted in the slice but was + # generated by String#to_utf16 so the literal can be passed to C + # functions that expect a null terminated UInt16* + slice = Slice(UInt16).new(slice.to_unsafe, slice.size + 1) + args = slice.to_a { |codepoint| NumberLiteral.new(codepoint).as(ASTNode) } + Call.new(Path.global("Slice(UInt16)"), "literal", args) + end when "tr" interpret_check_args do |first, second| raise "first argument to StringLiteral#tr must be a string, not #{first.class_desc}" unless first.is_a?(StringLiteral)