Skip to content

Commit

Permalink
Add StringLiteral#to_utf16
Browse files Browse the repository at this point in the history
  • Loading branch information
ysbaddaden committed Jun 8, 2024
1 parent 38be359 commit 8dd3187
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
5 changes: 5 additions & 0 deletions spec/compiler/macro/macro_methods_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions src/compiler/crystal/macros/methods.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 8dd3187

Please sign in to comment.