-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Put negative implementors first and apply same ordering logic to foreign implementors #142380
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
base: master
Are you sure you want to change the base?
Conversation
Some changes occurred in HTML/CSS/JS. |
This comment has been minimized.
This comment has been minimized.
27e69ca
to
2b0bda6
Compare
This comment has been minimized.
This comment has been minimized.
2b0bda6
to
2dd2db9
Compare
This comment has been minimized.
This comment has been minimized.
2dd2db9
to
cc15898
Compare
Took me a while to figure out where the typescript definition was stored to fix the error. ^^' |
|
||
fn insert_if_needed(&mut self, w: &mut fmt::Formatter<'_>, implementor: &Impl) -> fmt::Result { | ||
if !self.inserted_negative_marker && !implementor.is_negative_trait_impl() { | ||
write!(w, "<div class=\"negative-marker\"></div>")?; |
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.
write!(w, "<div class=\"negative-marker\"></div>")?; | |
write!(w, "<span class=\"negative-marker\"></span>")?; |
Using a span
feels more idiomatic, as it's less likely to cause weird extra linebreaks in unstyled environments.
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.
Based on the docs/spec I read, it's exactly what div
is for. From MDN:
The <div> HTML element is the generic container for flow content. It has no effect on the content or layout until styled in some way using CSS (e.g., styling is directly applied to it, or some kind of layout model like Flexbox is applied to its parent element).
As for linebreaks, I couldn't find information about how div
is supposed to handle them by default.
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.
div
has a default style of display: block;
so its presence can in fact change layout quite easily, as it will cause line/paragraph breaks the same way any other block element will. I'm not sure why MDN says it can't impact layout.
span is essentially the equivalent of div
except it is used for inline content, which I believe a zero size marker with no impact on layout technically is?
let part = OrderedJson::array_sorted( | ||
implementors.sort_unstable(); | ||
|
||
let part = OrderedJson::array_unsorted( |
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.
This is definitely an improvement, as it eliminates an allocation, but we're still allocating an intermediate string for each element.
OrderedJson
could be much more efficient if it had a method that appended using serde_json::to_writer
.
I can open an issue for improving the OrderedJson
interface, if you want.
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.
An issue would be welcome indeed.
@@ -791,10 +797,12 @@ impl TraitAliasPart { | |||
} | |||
} | |||
|
|||
#[derive(PartialEq, Eq)] |
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.
logic error: Eq
and Ord
impls disagree on the definition of equality, as Ord
only checks the name.
this can easily be fixed by writing a PartialEq
impl that defers to Ord
:
impl PartialEq for Implementor {
fn eq(&self, other: &Self) -> bool {
self.cmp(other) == Ordering::Equal
}
}
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.
Interesting approach, I like it. Adding it.
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.
Wait, in which would it be an issue to have this difference? Ordering and equality don't have to be equivalent.
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.
it's a correctness requirement on PartialEq.
it doesn't cause any issue with the current code, bur it could cause issues with generic datastructures like BTreeMap, so I think it would be best to try to avoid something that can cause this type of sneaky logic error.
I think this is technically the same class of error as if you had Copy
and Clone
diverge, not unsound, just incorrect.
.negative-marker { | ||
display: none; | ||
} |
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.
Is there any meaningful difference between an inline span
with no content and the same span but hidden? if not, then I don't think this is needed.
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.
It makes the rendering engine completely discard the element. So close to no difference. But still better to have.
@@ -467,7 +467,7 @@ declare namespace rustdoc { | |||
* Provied by generated `trait.impl` files. | |||
*/ | |||
type Implementors = { | |||
[key: string]: Array<[string, number, Array<string>]> | |||
[key: string]: Array<[string, number, number, Array<string>]> |
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.
[key: string]: Array<[string, number, number, Array<string>]> | |
[key: string]: Array<[string, number, 0|1, Array<string>]> |
we can be a bit more specific here.
also, it would be nice to expand the comment to mention what the meaning of each field is.
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.
TIL.
cc15898
to
80a06df
Compare
This comment has been minimized.
This comment has been minimized.
80a06df
to
3028afb
Compare
alternate interface for OrderedJson to reduce allocations inspired by #142380 (comment) r? `@GuillaumeGomez` <!-- homu-ignore:start --> <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> <!-- homu-ignore:end -->
☔ The latest upstream changes (presumably #142667) made this pull request unmergeable. Please resolve the merge conflicts. |
Fixes #51129.
This PR changeda surprisingly small amount of things to put negative trait impls before the others: basically just adding a new information in the generated JS file for foreign implementors and a "negative marker" DOM element to know where to insert negative impls.
I also used this occasion to make the foreign implementors sort the same as the local ones by using
compare_names
.You can test it here.
r? @notriddle