From 54e190af5c1ac7ebc0069d30e4181cde80f586d5 Mon Sep 17 00:00:00 2001 From: checkraisefold Date: Wed, 30 Oct 2024 11:45:57 -0700 Subject: [PATCH] fflag gate --- Analysis/src/ConstraintGenerator.cpp | 23 ++++++++++++++++++----- tests/TypeInfer.definitions.test.cpp | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Analysis/src/ConstraintGenerator.cpp b/Analysis/src/ConstraintGenerator.cpp index 140a084ce..5686e1deb 100644 --- a/Analysis/src/ConstraintGenerator.cpp +++ b/Analysis/src/ConstraintGenerator.cpp @@ -34,6 +34,7 @@ LUAU_DYNAMIC_FASTINT(LuauTypeSolverRelease) LUAU_FASTFLAG(LuauTypestateBuiltins2) LUAU_FASTFLAGVARIABLE(LuauNewSolverVisitErrorExprLvalues) +LUAU_FASTFLAGVARIABLE(LuauNewSolverPrePopulateClasses) namespace Luau { @@ -753,6 +754,9 @@ void ConstraintGenerator::checkAliases(const ScopePtr& scope, AstStatBlock* bloc } else if (auto classDeclaration = stat->as()) { + if (!FFlag::LuauNewSolverPrePopulateClasses) + continue; + if (scope->exportedTypeBindings.count(classDeclaration->name.value)) { auto it = classDefinitionLocations.find(classDeclaration->name.value); @@ -1671,7 +1675,7 @@ ControlFlow ConstraintGenerator::visit(const ScopePtr& scope, AstStatDeclareClas { // If a class with the same name was already defined, we skip over auto bindingIt = scope->exportedTypeBindings.find(declaredClass->name.value); - if (bindingIt == scope->exportedTypeBindings.end()) + if (FFlag::LuauNewSolverPrePopulateClasses && bindingIt == scope->exportedTypeBindings.end()) return ControlFlow::None; std::optional superTy = std::make_optional(builtinTypes->classType); @@ -1688,9 +1692,12 @@ ControlFlow ConstraintGenerator::visit(const ScopePtr& scope, AstStatDeclareClas // We don't have generic classes, so this assertion _should_ never be hit. LUAU_ASSERT(lookupType->typeParams.size() == 0 && lookupType->typePackParams.size() == 0); - superTy = follow(lookupType->type); + if (FFlag::LuauNewSolverPrePopulateClasses) + superTy = follow(lookupType->type); + else + superTy = lookupType->type; - if (!get(*superTy)) + if (!get(follow(*superTy))) { reportError( declaredClass->location, @@ -1711,8 +1718,14 @@ ControlFlow ConstraintGenerator::visit(const ScopePtr& scope, AstStatDeclareClas ctv->metatable = metaTy; - TypeId classBindTy = bindingIt->second.type; - emplaceType(asMutable(classBindTy), classTy); + + if (FFlag::LuauNewSolverPrePopulateClasses) + { + TypeId classBindTy = bindingIt->second.type; + emplaceType(asMutable(classBindTy), classTy); + } + else + scope->exportedTypeBindings[className] = TypeFun{{}, classTy}; if (declaredClass->indexer) { diff --git a/tests/TypeInfer.definitions.test.cpp b/tests/TypeInfer.definitions.test.cpp index aa25de03a..2ab90ab51 100644 --- a/tests/TypeInfer.definitions.test.cpp +++ b/tests/TypeInfer.definitions.test.cpp @@ -9,6 +9,8 @@ using namespace Luau; +LUAU_FASTFLAG(LuauNewSolverPrePopulateClasses) + TEST_SUITE_BEGIN("DefinitionTests"); TEST_CASE_FIXTURE(Fixture, "definition_file_simple") @@ -492,6 +494,7 @@ TEST_CASE_FIXTURE(Fixture, "class_definition_indexer") TEST_CASE_FIXTURE(Fixture, "class_definitions_reference_other_classes") { + ScopedFastFlag _{FFlag::LuauNewSolverPrePopulateClasses, true}; loadDefinition(R"( declare class Channel Messages: { Message }