diff --git a/mojo/stdlib/src/builtin/string_literal.mojo b/mojo/stdlib/src/builtin/string_literal.mojo index f72938df4b..80903a2038 100644 --- a/mojo/stdlib/src/builtin/string_literal.mojo +++ b/mojo/stdlib/src/builtin/string_literal.mojo @@ -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. diff --git a/mojo/stdlib/test/builtin/test_string_literal.mojo b/mojo/stdlib/test/builtin/test_string_literal.mojo index a8da563eb3..221a020b78 100644 --- a/mojo/stdlib/test/builtin/test_string_literal.mojo +++ b/mojo/stdlib/test/builtin/test_string_literal.mojo @@ -28,6 +28,7 @@ from builtin.string_literal import ( _compress, _decompress, ) +from sys.intrinsics import _type_is_eq def test_add(): @@ -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():