-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Sort DeclAttributeAndRange
s Deterministically
#26099
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@swift-ci please test |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! Just a couple of nitpicks, otherwise LGTM!
}); | ||
std::sort( | ||
SortedRanges.begin(), SortedRanges.end(), | ||
[&](DeclAttributeAndRange LHS, DeclAttributeAndRange RHS) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you add a comment that the comparison is like this because ranges may overlap along with a FIXME to investigate why there are overlapped ranges in the first place ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe it's not that there are overlapping ranges, but rather when comparing something against itself. So... a very specific instance of overlapping ranges.
Given that the ranges shouldn't overlap otherwise, would it be fair to just compare the start of each range rather than both the start and end?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, so a simpler return SM.isBeforeInBuffer(LHS.second.Start, RHS.second.Start);
would work as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that's what I changed it to. I didn't realize before that the ranges shouldn't overlap otherwise, but that makes sense give that they're source ranges of attributes.
lib/IDE/SyntaxModel.cpp
Outdated
[&](DeclAttributeAndRange LHS, DeclAttributeAndRange RHS) { | ||
return SM.isBeforeInBuffer(LHS.second.Start, RHS.second.Start) | ||
? true | ||
: SM.isBeforeInBuffer(RHS.second.Start, LHS.second.Start) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could simply use
: LHS.second.Start != RHS.second.Start
here.
b7c6b08
to
f6dae49
Compare
@swift-ci please test |
Build failed |
Build failed |
Comparing the start and end of ranges doesn't work in all cases since both a < b and b < a can be true if a = b. This behavior was causing an assertion fail in the Windows standard library which while sorting, asserts that if `a < b`, then `!(b < a)` in debug mode. Since ranges don't overlap otherwise, comparing just the starts of the ranges will properly sort them.
@swift-ci please test |
Build failed |
Build failed |
Comparing the start and end of ranges doesn't work in all cases since
both a < b and b < a can be true if a = b. This behavior was causing an
assertion fail in the Windows standard library which while sorting,
asserts that if
a < b
, then!(b < a)
in debug mode.Since ranges don't overlap otherwise, comparing just the starts of the
ranges will properly sort them.