mirror of
https://github.com/luau-lang/luau.git
synced 2024-12-13 13:30:40 +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_FASTFLAG(LuauTypestateBuiltins2)
|
||||||
|
|
||||||
LUAU_FASTFLAGVARIABLE(LuauNewSolverVisitErrorExprLvalues)
|
LUAU_FASTFLAGVARIABLE(LuauNewSolverVisitErrorExprLvalues)
|
||||||
|
LUAU_FASTFLAGVARIABLE(LuauNewSolverPopulateTableLocations)
|
||||||
|
|
||||||
namespace Luau
|
namespace Luau
|
||||||
{
|
{
|
||||||
|
@ -2844,6 +2845,10 @@ Inference ConstraintGenerator::check(const ScopePtr& scope, AstExprTable* expr,
|
||||||
|
|
||||||
ttv->state = TableState::Unsealed;
|
ttv->state = TableState::Unsealed;
|
||||||
ttv->definitionModuleName = module->name;
|
ttv->definitionModuleName = module->name;
|
||||||
|
if (FFlag::LuauNewSolverPopulateTableLocations)
|
||||||
|
{
|
||||||
|
ttv->definitionLocation = expr->location;
|
||||||
|
}
|
||||||
ttv->scope = scope.get();
|
ttv->scope = scope.get();
|
||||||
|
|
||||||
interiorTypes.back().push_back(ty);
|
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)));
|
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(
|
TypeId ConstraintGenerator::resolveFunctionType(
|
||||||
|
|
|
@ -33,6 +33,7 @@ LUAU_FASTFLAGVARIABLE(DebugLuauLogBindings)
|
||||||
LUAU_FASTINTVARIABLE(LuauSolverRecursionLimit, 500)
|
LUAU_FASTINTVARIABLE(LuauSolverRecursionLimit, 500)
|
||||||
LUAU_DYNAMIC_FASTINT(LuauTypeSolverRelease)
|
LUAU_DYNAMIC_FASTINT(LuauTypeSolverRelease)
|
||||||
LUAU_FASTFLAGVARIABLE(LuauRemoveNotAnyHack)
|
LUAU_FASTFLAGVARIABLE(LuauRemoveNotAnyHack)
|
||||||
|
LUAU_FASTFLAG(LuauNewSolverPopulateTableLocations)
|
||||||
|
|
||||||
namespace Luau
|
namespace Luau
|
||||||
{
|
{
|
||||||
|
@ -1108,10 +1109,15 @@ bool ConstraintSolver::tryDispatch(const TypeAliasExpansionConstraint& c, NotNul
|
||||||
|
|
||||||
target = follow(instantiated);
|
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->instantiatedTypeParams = typeArguments;
|
||||||
ttv->instantiatedTypePackParams = packArguments;
|
ttv->instantiatedTypePackParams = packArguments;
|
||||||
// TODO: Fill in definitionModuleName.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bindResult(target);
|
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}};
|
Unifier2 u2{arena, builtinTypes, constraint->scope, NotNull{&iceReporter}};
|
||||||
u2.unify(actualArgTy, expectedArgTy);
|
u2.unify(actualArgTy, expectedArgTy);
|
||||||
|
@ -2326,12 +2333,7 @@ bool ConstraintSolver::tryDispatchIterableTable(TypeId iteratorTy, const Iterabl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConstraintSolver::tryDispatchIterableFunction(
|
bool ConstraintSolver::tryDispatchIterableFunction(TypeId nextTy, TypeId tableTy, const IterableConstraint& c, NotNull<const Constraint> constraint)
|
||||||
TypeId nextTy,
|
|
||||||
TypeId tableTy,
|
|
||||||
const IterableConstraint& c,
|
|
||||||
NotNull<const Constraint> constraint
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
const FunctionType* nextFn = get<FunctionType>(nextTy);
|
const FunctionType* nextFn = get<FunctionType>(nextTy);
|
||||||
// If this does not hold, we should've never called `tryDispatchIterableFunction` in the first place.
|
// 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(LuauRequireCyclesDontAlwaysReturnAny)
|
||||||
LUAU_FASTFLAG(LuauSolverV2)
|
LUAU_FASTFLAG(LuauSolverV2)
|
||||||
LUAU_FASTFLAG(LuauTypestateBuiltins2)
|
LUAU_FASTFLAG(LuauTypestateBuiltins2)
|
||||||
|
LUAU_FASTFLAG(LuauNewSolverPopulateTableLocations)
|
||||||
|
|
||||||
using namespace Luau;
|
using namespace Luau;
|
||||||
|
|
||||||
|
@ -466,7 +467,15 @@ local b: B.T = a
|
||||||
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
||||||
|
|
||||||
if (FFlag::LuauSolverV2)
|
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
|
else
|
||||||
{
|
{
|
||||||
const std::string expected = R"(Type 'T' from 'game/A' could not be converted into 'T' from 'game/B'
|
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);
|
LUAU_REQUIRE_ERROR_COUNT(1, result);
|
||||||
|
|
||||||
if (FFlag::LuauSolverV2)
|
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
|
else
|
||||||
{
|
{
|
||||||
const std::string expected = R"(Type 'T' from 'game/B' could not be converted into 'T' from 'game/C'
|
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