mirror of
https://github.com/luau-lang/luau.git
synced 2025-05-04 10:33:46 +01:00
Fix typechecker
This commit is contained in:
parent
11787e8336
commit
be781b5083
4 changed files with 3782 additions and 3762 deletions
|
@ -157,6 +157,7 @@ struct TypeChecker
|
||||||
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprTypeAssertion& expr);
|
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprTypeAssertion& expr);
|
||||||
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprError& expr);
|
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprError& expr);
|
||||||
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprIfElse& expr, std::optional<TypeId> expectedType = std::nullopt);
|
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprIfElse& expr, std::optional<TypeId> expectedType = std::nullopt);
|
||||||
|
WithPredicate<TypeId> checkExpr(const ScopePtr& scope, const AstExprInterpString& expr);
|
||||||
|
|
||||||
TypeId checkExprTable(const ScopePtr& scope, const AstExprTable& expr, const std::vector<std::pair<TypeId, TypeId>>& fieldTypes,
|
TypeId checkExprTable(const ScopePtr& scope, const AstExprTable& expr, const std::vector<std::pair<TypeId, TypeId>>& fieldTypes,
|
||||||
std::optional<TypeId> expectedType);
|
std::optional<TypeId> expectedType);
|
||||||
|
|
|
@ -1804,7 +1804,7 @@ WithPredicate<TypeId> TypeChecker::checkExpr(const ScopePtr& scope, const AstExp
|
||||||
else if (auto a = expr.as<AstExprIfElse>())
|
else if (auto a = expr.as<AstExprIfElse>())
|
||||||
result = checkExpr(scope, *a, expectedType);
|
result = checkExpr(scope, *a, expectedType);
|
||||||
else if (auto a = expr.as<AstExprInterpString>())
|
else if (auto a = expr.as<AstExprInterpString>())
|
||||||
result = {stringType};
|
result = checkExpr(scope, *a);
|
||||||
else
|
else
|
||||||
ice("Unhandled AstExpr?");
|
ice("Unhandled AstExpr?");
|
||||||
|
|
||||||
|
@ -3023,6 +3023,14 @@ WithPredicate<TypeId> TypeChecker::checkExpr(const ScopePtr& scope, const AstExp
|
||||||
return {types.size() == 1 ? types[0] : addType(UnionTypeVar{std::move(types)})};
|
return {types.size() == 1 ? types[0] : addType(UnionTypeVar{std::move(types)})};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WithPredicate<TypeId> TypeChecker::checkExpr(const ScopePtr& scope, const AstExprInterpString& expr)
|
||||||
|
{
|
||||||
|
for (AstExpr* expr : expr.expressions)
|
||||||
|
checkExpr(scope, *expr);
|
||||||
|
|
||||||
|
return {stringType};
|
||||||
|
}
|
||||||
|
|
||||||
TypeId TypeChecker::checkLValue(const ScopePtr& scope, const AstExpr& expr)
|
TypeId TypeChecker::checkLValue(const ScopePtr& scope, const AstExpr& expr)
|
||||||
{
|
{
|
||||||
return checkLValueBinding(scope, expr);
|
return checkLValueBinding(scope, expr);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -822,6 +822,17 @@ TEST_CASE_FIXTURE(Fixture, "tc_interpolated_string_basic")
|
||||||
LUAU_REQUIRE_NO_ERRORS(result);
|
LUAU_REQUIRE_NO_ERRORS(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE_FIXTURE(Fixture, "tc_interpolated_string_with_invalid_expression")
|
||||||
|
{
|
||||||
|
CheckResult result = check(R"(
|
||||||
|
local function f(x: number) end
|
||||||
|
|
||||||
|
local foo: string = `hello {f("uh oh")}`
|
||||||
|
)");
|
||||||
|
|
||||||
|
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If it wasn't instantly obvious, we have the fuzzer to thank for this gem of a test.
|
* If it wasn't instantly obvious, we have the fuzzer to thank for this gem of a test.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue