mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 14:25:44 +08:00
fd6250cf9d
### What's Changed - Improve readability of unions and intersections by limiting the number of elements of those types that can be presented on a single line (gated under `FFlag::LuauToStringSimpleCompositeTypesSingleLine`) - Adds a new option to the compiler `--record-stats` to record and output compilation statistics - `if...then...else` expressions are now optimized into `AND/OR` form when possible. ### VM - Add a new `buffer` type to Luau based on the [buffer RFC](https://github.com/Roblox/luau/pull/739) and additional C API functions to work with it; this release does not include the library. - Internal C API to work with string buffers has been updated to align with Lua version more closely ### Native Codegen - Added support for new X64 instruction (rev) and new A64 instruction (bswap) in the assembler - Simplified the way numerical loop condition is translated to IR ### New Type Solver - Operator inference now handled by type families - Created a new system called `Type Paths` to explain why subtyping tests fail in order to improve the quality of error messages. - Systematic changes to implement Data Flow analysis in the new solver (`Breadcrumb` removed and replaced with `RefinementKey`) --- Co-authored-by: Aaron Weiss <aaronweiss@roblox.com> Co-authored-by: Alexander McCord <amccord@roblox.com> Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: Aviral Goel <agoel@roblox.com> Co-authored-by: Lily Brown <lbrown@roblox.com> Co-authored-by: Vighnesh Vijay <vvijay@roblox.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com> --------- Co-authored-by: Arseny Kapoulkine <arseny.kapoulkine@gmail.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com> Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: Lily Brown <lbrown@roblox.com> Co-authored-by: Aaron Weiss <aaronweiss@roblox.com> Co-authored-by: Alexander McCord <amccord@roblox.com> Co-authored-by: Aviral Goel <agoel@roblox.com>
157 lines
5.3 KiB
C++
157 lines
5.3 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
#pragma once
|
|
|
|
#include "Luau/Common.h"
|
|
#include "Luau/TypeFwd.h"
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
LUAU_FASTINT(LuauTableTypeMaximumStringifierLength)
|
|
LUAU_FASTINT(LuauTypeMaximumStringifierLength)
|
|
LUAU_FASTFLAG(LuauToStringSimpleCompositeTypesSingleLine)
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
class AstExpr;
|
|
|
|
struct Scope;
|
|
|
|
struct Constraint;
|
|
|
|
struct Position;
|
|
struct Location;
|
|
|
|
struct ToStringNameMap
|
|
{
|
|
std::unordered_map<TypeId, std::string> types;
|
|
std::unordered_map<TypePackId, std::string> typePacks;
|
|
};
|
|
|
|
struct ToStringOptions
|
|
{
|
|
ToStringOptions(bool exhaustive = false)
|
|
: exhaustive(exhaustive)
|
|
, compositeTypesSingleLineLimit(FFlag::LuauToStringSimpleCompositeTypesSingleLine ? 5 : 0)
|
|
{
|
|
}
|
|
|
|
bool exhaustive = false; // If true, we produce complete output rather than comprehensible output
|
|
bool useLineBreaks = false; // If true, we insert new lines to separate long results such as table entries/metatable.
|
|
bool functionTypeArguments = false; // If true, output function type argument names when they are available
|
|
bool hideTableKind = false; // If true, all tables will be surrounded with plain '{}'
|
|
bool hideNamedFunctionTypeParameters = false; // If true, type parameters of functions will be hidden at top-level.
|
|
bool hideFunctionSelfArgument = false; // If true, `self: X` will be omitted from the function signature if the function has self
|
|
size_t maxTableLength = size_t(FInt::LuauTableTypeMaximumStringifierLength); // Only applied to TableTypes
|
|
size_t maxTypeLength = size_t(FInt::LuauTypeMaximumStringifierLength);
|
|
size_t compositeTypesSingleLineLimit = 5; // The number of type elements permitted on a single line when printing type unions/intersections
|
|
ToStringNameMap nameMap;
|
|
std::shared_ptr<Scope> scope; // If present, module names will be added and types that are not available in scope will be marked as 'invalid'
|
|
std::vector<std::string> namedFunctionOverrideArgNames; // If present, named function argument names will be overridden
|
|
};
|
|
|
|
struct ToStringResult
|
|
{
|
|
std::string name;
|
|
|
|
bool invalid = false;
|
|
bool error = false;
|
|
bool cycle = false;
|
|
bool truncated = false;
|
|
};
|
|
|
|
ToStringResult toStringDetailed(TypeId ty, ToStringOptions& opts);
|
|
ToStringResult toStringDetailed(TypePackId ty, ToStringOptions& opts);
|
|
|
|
std::string toString(TypeId ty, ToStringOptions& opts);
|
|
std::string toString(TypePackId ty, ToStringOptions& opts);
|
|
|
|
// These overloads are selected when a temporary ToStringOptions is passed. (eg
|
|
// via an initializer list)
|
|
inline std::string toString(TypePackId ty, ToStringOptions&& opts)
|
|
{
|
|
// Delegate to the overload (TypePackId, ToStringOptions&)
|
|
return toString(ty, opts);
|
|
}
|
|
inline std::string toString(TypeId ty, ToStringOptions&& opts)
|
|
{
|
|
// Delegate to the overload (TypeId, ToStringOptions&)
|
|
return toString(ty, opts);
|
|
}
|
|
|
|
// These are offered as overloads rather than a default parameter so that they can be easily invoked from within the MSVC debugger.
|
|
// You can use them in watch expressions!
|
|
inline std::string toString(TypeId ty)
|
|
{
|
|
return toString(ty, ToStringOptions{});
|
|
}
|
|
inline std::string toString(TypePackId ty)
|
|
{
|
|
return toString(ty, ToStringOptions{});
|
|
}
|
|
|
|
std::string toString(const Constraint& c, ToStringOptions& opts);
|
|
|
|
inline std::string toString(const Constraint& c, ToStringOptions&& opts)
|
|
{
|
|
return toString(c, opts);
|
|
}
|
|
|
|
std::string toString(const Constraint& c);
|
|
|
|
std::string toString(const Type& tv, ToStringOptions& opts);
|
|
std::string toString(const TypePackVar& tp, ToStringOptions& opts);
|
|
|
|
inline std::string toString(const Type& tv)
|
|
{
|
|
ToStringOptions opts;
|
|
return toString(tv, opts);
|
|
}
|
|
|
|
inline std::string toString(const TypePackVar& tp)
|
|
{
|
|
ToStringOptions opts;
|
|
return toString(tp, opts);
|
|
}
|
|
|
|
std::string toStringNamedFunction(const std::string& funcName, const FunctionType& ftv, ToStringOptions& opts);
|
|
|
|
inline std::string toStringNamedFunction(const std::string& funcName, const FunctionType& ftv)
|
|
{
|
|
ToStringOptions opts;
|
|
return toStringNamedFunction(funcName, ftv, opts);
|
|
}
|
|
|
|
std::optional<std::string> getFunctionNameAsString(const AstExpr& expr);
|
|
|
|
// It could be useful to see the text representation of a type during a debugging session instead of exploring the content of the class
|
|
// These functions will dump the type to stdout and can be evaluated in Watch/Immediate windows or as gdb/lldb expression
|
|
std::string dump(TypeId ty);
|
|
std::string dump(const std::optional<TypeId>& ty);
|
|
std::string dump(TypePackId ty);
|
|
std::string dump(const std::optional<TypePackId>& ty);
|
|
std::string dump(const Constraint& c);
|
|
|
|
std::string dump(const std::shared_ptr<Scope>& scope, const char* name);
|
|
|
|
std::string generateName(size_t n);
|
|
|
|
std::string toString(const Position& position);
|
|
std::string toString(const Location& location, int offset = 0, bool useBegin = true);
|
|
|
|
std::string toString(const TypeOrPack& tyOrTp, ToStringOptions& opts);
|
|
|
|
inline std::string toString(const TypeOrPack& tyOrTp)
|
|
{
|
|
ToStringOptions opts{};
|
|
return toString(tyOrTp, opts);
|
|
}
|
|
|
|
std::string dump(const TypeOrPack& tyOrTp);
|
|
|
|
} // namespace Luau
|