mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 14:25:44 +08:00
7105c81579
# What's changed? * Fixed a bug in type cloning by maintaining persistent types. * We now parse imprecise integer literals to report the imprecision as a warning to developers. * Add a compiler flag to specify the name of the statistics output file. ### New type solver * Renamed `ConstraintGraphBuilder` to `ConstraintGenerator` * LValues now take into account the type being assigned during constraint generation. * Normalization performance has been improved by 33% by replacing the an internal usage of `std::unordered_set` with `DenseHashMap`. * Normalization now has a helper to identify types that are equivalent to `unknown`, which is being used to fix some bugs in subtyping. * Uses of the old unifier in the new type solver have been eliminated. * Improved error explanations for subtyping errors in `TypeChecker2`. ### Native code generation * Expanded some of the statistics recorded during compilation to include the number of instructions and blocks. * Introduce instruction and block count limiters for controlling what bytecode is translated into native code. * Implement code generation for byteswap instruction. ### Internal Contributors 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>
102 lines
2.2 KiB
C++
102 lines
2.2 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
#include "Luau/Location.h"
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
bool Position::operator==(const Position& rhs) const
|
|
{
|
|
return this->column == rhs.column && this->line == rhs.line;
|
|
}
|
|
|
|
bool Position::operator!=(const Position& rhs) const
|
|
{
|
|
return !(*this == rhs);
|
|
}
|
|
|
|
bool Position::operator<(const Position& rhs) const
|
|
{
|
|
if (line == rhs.line)
|
|
return column < rhs.column;
|
|
else
|
|
return line < rhs.line;
|
|
}
|
|
|
|
bool Position::operator>(const Position& rhs) const
|
|
{
|
|
if (line == rhs.line)
|
|
return column > rhs.column;
|
|
else
|
|
return line > rhs.line;
|
|
}
|
|
|
|
bool Position::operator<=(const Position& rhs) const
|
|
{
|
|
return *this == rhs || *this < rhs;
|
|
}
|
|
|
|
bool Position::operator>=(const Position& rhs) const
|
|
{
|
|
return *this == rhs || *this > rhs;
|
|
}
|
|
|
|
void Position::shift(const Position& start, const Position& oldEnd, const Position& newEnd)
|
|
{
|
|
if (*this >= start)
|
|
{
|
|
if (this->line > oldEnd.line)
|
|
this->line += (newEnd.line - oldEnd.line);
|
|
else
|
|
{
|
|
this->line = newEnd.line;
|
|
this->column += (newEnd.column - oldEnd.column);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Location::operator==(const Location& rhs) const
|
|
{
|
|
return this->begin == rhs.begin && this->end == rhs.end;
|
|
}
|
|
|
|
bool Location::operator!=(const Location& rhs) const
|
|
{
|
|
return !(*this == rhs);
|
|
}
|
|
|
|
bool Location::encloses(const Location& l) const
|
|
{
|
|
return begin <= l.begin && end >= l.end;
|
|
}
|
|
|
|
bool Location::overlaps(const Location& l) const
|
|
{
|
|
return (begin <= l.begin && end >= l.begin) || (begin <= l.end && end >= l.end) || (begin >= l.begin && end <= l.end);
|
|
}
|
|
|
|
bool Location::contains(const Position& p) const
|
|
{
|
|
return begin <= p && p < end;
|
|
}
|
|
|
|
bool Location::containsClosed(const Position& p) const
|
|
{
|
|
return begin <= p && p <= end;
|
|
}
|
|
|
|
void Location::extend(const Location& other)
|
|
{
|
|
if (other.begin < begin)
|
|
begin = other.begin;
|
|
if (other.end > end)
|
|
end = other.end;
|
|
}
|
|
|
|
void Location::shift(const Position& start, const Position& oldEnd, const Position& newEnd)
|
|
{
|
|
begin.shift(start, oldEnd, newEnd);
|
|
end.shift(start, oldEnd, newEnd);
|
|
}
|
|
|
|
} // namespace Luau
|