diff --git a/Analysis/src/Linter.cpp b/Analysis/src/Linter.cpp index fb952f5e..07f97328 100644 --- a/Analysis/src/Linter.cpp +++ b/Analysis/src/Linter.cpp @@ -203,6 +203,24 @@ static bool similar(AstExpr* lhs, AstExpr* rhs) return true; } CASE(AstExprIfElse) return similar(le->condition, re->condition) && similar(le->trueExpr, re->trueExpr) && similar(le->falseExpr, re->falseExpr); + CASE(AstExprInterpString) + { + if (le->strings.size != re->strings.size) + return false; + + if (le->expressions.size != re->expressions.size) + return false; + + for (size_t i = 0; i < le->strings.size; ++i) + if (le->strings.data[i].size != re->strings.data[i].size || memcmp(le->strings.data[i].data, re->strings.data[i].data, le->strings.data[i].size) != 0) + return false; + + for (size_t i = 0; i < le->expressions.size; ++i) + if (!similar(le->expressions.data[i], re->expressions.data[i])) + return false; + + return true; + } else { LUAU_ASSERT(!"Unknown expression type"); diff --git a/Compiler/src/CostModel.cpp b/Compiler/src/CostModel.cpp index 56b6c36f..ce0d5617 100644 --- a/Compiler/src/CostModel.cpp +++ b/Compiler/src/CostModel.cpp @@ -217,6 +217,15 @@ struct CostVisitor : AstVisitor { return model(expr->condition) + model(expr->trueExpr) + model(expr->falseExpr) + 2; } + else if (AstExprInterpString* expr = node->as()) + { + Cost cost = 0; + + for (auto innerExpression : expr->expressions) + cost += model(innerExpression); + + return cost; + } else { LUAU_ASSERT(!"Unknown expression type"); diff --git a/tests/Conformance.test.cpp b/tests/Conformance.test.cpp index 42a670e8..21d1782e 100644 --- a/tests/Conformance.test.cpp +++ b/tests/Conformance.test.cpp @@ -296,6 +296,7 @@ TEST_CASE("Strings") TEST_CASE("StringInterp") { + ScopedFastFlag sff{"LuauInterpolatedStringBaseSupport", true}; runConformance("stringinterp.lua"); } diff --git a/tests/Linter.test.cpp b/tests/Linter.test.cpp index 488ade9f..e101f78d 100644 --- a/tests/Linter.test.cpp +++ b/tests/Linter.test.cpp @@ -1662,7 +1662,7 @@ TEST_CASE_FIXTURE(Fixture, "WrongCommentOptimize") { LintResult result = lint(R"( --!optimize ---!optimize +--!optimize --!optimize me --!optimize 100500 --!optimize 2 @@ -1675,4 +1675,15 @@ TEST_CASE_FIXTURE(Fixture, "WrongCommentOptimize") CHECK_EQ(result.warnings[3].text, "optimize directive uses unknown optimization level '100500', 0..2 expected"); } +TEST_CASE_FIXTURE(Fixture, "TestStringInterpolation") +{ + ScopedFastFlag sff{"LuauInterpolatedStringBaseSupport", true}; + + LintResult result = lint(R"( + local _ = `unknown {foo}` + )"); + + REQUIRE_EQ(result.warnings.size(), 1); +} + TEST_SUITE_END();