mirror of
https://github.com/luau-lang/luau.git
synced 2024-12-12 13:00:38 +00:00
Fix definition module name & location (#1495)
Closes #1441 Brings behavior to parity with the old solver by filling in definitionLocation and definitionModuleName for Luau-consuming programs/libraries to use.
This commit is contained in:
parent
a251bc68a2
commit
9a4bc6aeb8
3 changed files with 44 additions and 11 deletions
|
@ -34,6 +34,7 @@ LUAU_DYNAMIC_FASTINT(LuauTypeSolverRelease)
|
|||
LUAU_FASTFLAG(LuauTypestateBuiltins2)
|
||||
|
||||
LUAU_FASTFLAGVARIABLE(LuauNewSolverVisitErrorExprLvalues)
|
||||
LUAU_FASTFLAGVARIABLE(LuauNewSolverPopulateTableLocations)
|
||||
|
||||
namespace Luau
|
||||
{
|
||||
|
@ -2844,6 +2845,10 @@ Inference ConstraintGenerator::check(const ScopePtr& scope, AstExprTable* expr,
|
|||
|
||||
ttv->state = TableState::Unsealed;
|
||||
ttv->definitionModuleName = module->name;
|
||||
if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||
{
|
||||
ttv->definitionLocation = expr->location;
|
||||
}
|
||||
ttv->scope = scope.get();
|
||||
|
||||
interiorTypes.back().push_back(ty);
|
||||
|
@ -3301,7 +3306,16 @@ TypeId ConstraintGenerator::resolveTableType(const ScopePtr& scope, AstType* ty,
|
|||
ice->ice("Unexpected property access " + std::to_string(int(astIndexer->access)));
|
||||
}
|
||||
|
||||
return arena->addType(TableType{props, indexer, scope->level, scope.get(), TableState::Sealed});
|
||||
TypeId tableTy = arena->addType(TableType{props, indexer, scope->level, scope.get(), TableState::Sealed});
|
||||
TableType* ttv = getMutable<TableType>(tableTy);
|
||||
|
||||
if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||
{
|
||||
ttv->definitionModuleName = module->name;
|
||||
ttv->definitionLocation = tab->location;
|
||||
}
|
||||
|
||||
return tableTy;
|
||||
}
|
||||
|
||||
TypeId ConstraintGenerator::resolveFunctionType(
|
||||
|
|
|
@ -33,6 +33,7 @@ LUAU_FASTFLAGVARIABLE(DebugLuauLogBindings)
|
|||
LUAU_FASTINTVARIABLE(LuauSolverRecursionLimit, 500)
|
||||
LUAU_DYNAMIC_FASTINT(LuauTypeSolverRelease)
|
||||
LUAU_FASTFLAGVARIABLE(LuauRemoveNotAnyHack)
|
||||
LUAU_FASTFLAG(LuauNewSolverPopulateTableLocations)
|
||||
|
||||
namespace Luau
|
||||
{
|
||||
|
@ -1108,10 +1109,15 @@ bool ConstraintSolver::tryDispatch(const TypeAliasExpansionConstraint& c, NotNul
|
|||
|
||||
target = follow(instantiated);
|
||||
}
|
||||
else if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||
{
|
||||
// This is a new type - redefine the location.
|
||||
ttv->definitionLocation = constraint->location;
|
||||
ttv->definitionModuleName = currentModuleName;
|
||||
}
|
||||
|
||||
ttv->instantiatedTypeParams = typeArguments;
|
||||
ttv->instantiatedTypePackParams = packArguments;
|
||||
// TODO: Fill in definitionModuleName.
|
||||
}
|
||||
|
||||
bindResult(target);
|
||||
|
@ -1433,7 +1439,8 @@ bool ConstraintSolver::tryDispatch(const FunctionCheckConstraint& c, NotNull<con
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (expr->is<AstExprConstantBool>() || expr->is<AstExprConstantString>() || expr->is<AstExprConstantNumber>() || expr->is<AstExprConstantNil>())
|
||||
else if (expr->is<AstExprConstantBool>() || expr->is<AstExprConstantString>() || expr->is<AstExprConstantNumber>() ||
|
||||
expr->is<AstExprConstantNil>())
|
||||
{
|
||||
Unifier2 u2{arena, builtinTypes, constraint->scope, NotNull{&iceReporter}};
|
||||
u2.unify(actualArgTy, expectedArgTy);
|
||||
|
@ -2326,12 +2333,7 @@ bool ConstraintSolver::tryDispatchIterableTable(TypeId iteratorTy, const Iterabl
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ConstraintSolver::tryDispatchIterableFunction(
|
||||
TypeId nextTy,
|
||||
TypeId tableTy,
|
||||
const IterableConstraint& c,
|
||||
NotNull<const Constraint> constraint
|
||||
)
|
||||
bool ConstraintSolver::tryDispatchIterableFunction(TypeId nextTy, TypeId tableTy, const IterableConstraint& c, NotNull<const Constraint> constraint)
|
||||
{
|
||||
const FunctionType* nextFn = get<FunctionType>(nextTy);
|
||||
// If this does not hold, we should've never called `tryDispatchIterableFunction` in the first place.
|
||||
|
|
|
@ -14,6 +14,7 @@ LUAU_FASTFLAG(LuauInstantiateInSubtyping)
|
|||
LUAU_FASTFLAG(LuauRequireCyclesDontAlwaysReturnAny)
|
||||
LUAU_FASTFLAG(LuauSolverV2)
|
||||
LUAU_FASTFLAG(LuauTypestateBuiltins2)
|
||||
LUAU_FASTFLAG(LuauNewSolverPopulateTableLocations)
|
||||
|
||||
using namespace Luau;
|
||||
|
||||
|
@ -466,7 +467,15 @@ local b: B.T = a
|
|||
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
||||
|
||||
if (FFlag::LuauSolverV2)
|
||||
CHECK(toString(result.errors.at(0)) == "Type 'T' could not be converted into 'T'; at [read \"x\"], number is not exactly string");
|
||||
{
|
||||
if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||
CHECK(
|
||||
toString(result.errors.at(0)) ==
|
||||
"Type 'T' from 'game/A' could not be converted into 'T' from 'game/B'; at [read \"x\"], number is not exactly string"
|
||||
);
|
||||
else
|
||||
CHECK(toString(result.errors.at(0)) == "Type 'T' could not be converted into 'T'; at [read \"x\"], number is not exactly string");
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::string expected = R"(Type 'T' from 'game/A' could not be converted into 'T' from 'game/B'
|
||||
|
@ -507,7 +516,15 @@ local b: B.T = a
|
|||
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
||||
|
||||
if (FFlag::LuauSolverV2)
|
||||
CHECK(toString(result.errors.at(0)) == "Type 'T' could not be converted into 'T'; at [read \"x\"], number is not exactly string");
|
||||
{
|
||||
if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||
CHECK(
|
||||
toString(result.errors.at(0)) ==
|
||||
"Type 'T' from 'game/B' could not be converted into 'T' from 'game/C'; at [read \"x\"], number is not exactly string"
|
||||
);
|
||||
else
|
||||
CHECK(toString(result.errors.at(0)) == "Type 'T' could not be converted into 'T'; at [read \"x\"], number is not exactly string");
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::string expected = R"(Type 'T' from 'game/B' could not be converted into 'T' from 'game/C'
|
||||
|
|
Loading…
Reference in a new issue