Skip to content

Commit

Permalink
Revert the deletion of StringLiteral comptime __mul__
Browse files Browse the repository at this point in the history
Signed-off-by: martinvuyk <martin.vuyklop@gmail.com>
  • Loading branch information
martinvuyk committed Mar 4, 2025
1 parent a01cb81 commit 368d055
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
28 changes: 28 additions & 0 deletions mojo/stdlib/src/builtin/string_literal.mojo
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,34 @@ struct StringLiteral(
"""
self = self + rhs

@always_inline("nodebug")
fn __mul__(self, n: IntLiteral) -> StringLiteral:
"""Concatenates the string literal `n` times. Can only be evaluated at
compile time using the `alias` keyword, which will write the result into
the binary.
Args:
n : The number of times to concatenate the string literal.
Returns:
The string concatenated `n` times.
Examples:
```mojo
alias concat = "mojo" * 3
print(concat) # mojomojomojo
```
.
"""

var concat = ""

for _ in range(Int(n)):
concat += self

return concat

fn __mul__(self, n: Int) -> String:
"""Concatenates the string `n` times.
Expand Down
15 changes: 12 additions & 3 deletions mojo/stdlib/test/builtin/test_string_literal.mojo
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ from builtin.string_literal import (
_compress,
_decompress,
)
from sys.intrinsics import _type_is_eq


def test_add():
Expand Down Expand Up @@ -60,9 +61,17 @@ def test_mul():
assert_equal(static_concat_1, static_concat_2)
assert_equal("mojomojomojo", static_concat_0)
assert_equal(static_concat_0, String("mojo") * 3)
var dynamic_concat = "mojo" * 3
assert_equal("mojomojomojo", dynamic_concat)
assert_equal(static_concat_0, dynamic_concat)
assert_true(_type_is_eq[__type_of(static_concat_0), StringLiteral]())
assert_true(_type_is_eq[__type_of(static_concat_1), String]())
assert_true(_type_is_eq[__type_of(static_concat_2), String]())
var dynamic_concat_0 = "mojo" * 3
var dynamic_concat_1 = "mojo" * `3`
var dynamic_concat_2 = "mojo" * `u3`
assert_equal("mojomojomojo", dynamic_concat_0)
assert_equal(static_concat_0, dynamic_concat_0)
assert_true(_type_is_eq[__type_of(dynamic_concat_0), StringLiteral]())
assert_true(_type_is_eq[__type_of(dynamic_concat_1), String]())
assert_true(_type_is_eq[__type_of(dynamic_concat_2), String]())


def test_equality():
Expand Down

0 comments on commit 368d055

Please sign in to comment.