Avoid iterating over hashmaps in astconv
This commit is contained in:
parent
097261f241
commit
13959bf376
@ -4,7 +4,7 @@
|
|||||||
ParenthesizedFnTraitExpansion,
|
ParenthesizedFnTraitExpansion,
|
||||||
};
|
};
|
||||||
use crate::traits::error_reporting::report_object_safety_error;
|
use crate::traits::error_reporting::report_object_safety_error;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet};
|
||||||
use rustc_errors::{pluralize, struct_span_err, Applicability, Diagnostic, ErrorGuaranteed};
|
use rustc_errors::{pluralize, struct_span_err, Applicability, Diagnostic, ErrorGuaranteed};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
@ -16,8 +16,6 @@
|
|||||||
use rustc_span::{Span, Symbol, DUMMY_SP};
|
use rustc_span::{Span, Symbol, DUMMY_SP};
|
||||||
use rustc_trait_selection::traits::object_safety_violations_for_assoc_item;
|
use rustc_trait_selection::traits::object_safety_violations_for_assoc_item;
|
||||||
|
|
||||||
use std::collections::BTreeSet;
|
|
||||||
|
|
||||||
impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
/// On missing type parameters, emit an E0393 error and provide a structured suggestion using
|
/// On missing type parameters, emit an E0393 error and provide a structured suggestion using
|
||||||
/// the type parameter's name as a placeholder.
|
/// the type parameter's name as a placeholder.
|
||||||
@ -504,7 +502,7 @@ pub(crate) fn complain_about_inherent_assoc_type_not_found(
|
|||||||
/// emit a generic note suggesting using a `where` clause to constraint instead.
|
/// emit a generic note suggesting using a `where` clause to constraint instead.
|
||||||
pub(crate) fn complain_about_missing_associated_types(
|
pub(crate) fn complain_about_missing_associated_types(
|
||||||
&self,
|
&self,
|
||||||
associated_types: FxHashMap<Span, BTreeSet<DefId>>,
|
associated_types: FxIndexMap<Span, FxIndexSet<DefId>>,
|
||||||
potential_assoc_types: Vec<Span>,
|
potential_assoc_types: Vec<Span>,
|
||||||
trait_bounds: &[hir::PolyTraitRef<'_>],
|
trait_bounds: &[hir::PolyTraitRef<'_>],
|
||||||
) {
|
) {
|
||||||
@ -514,13 +512,13 @@ pub(crate) fn complain_about_missing_associated_types(
|
|||||||
let tcx = self.tcx();
|
let tcx = self.tcx();
|
||||||
// FIXME: Marked `mut` so that we can replace the spans further below with a more
|
// FIXME: Marked `mut` so that we can replace the spans further below with a more
|
||||||
// appropriate one, but this should be handled earlier in the span assignment.
|
// appropriate one, but this should be handled earlier in the span assignment.
|
||||||
let mut associated_types: FxHashMap<Span, Vec<_>> = associated_types
|
let mut associated_types: FxIndexMap<Span, Vec<_>> = associated_types
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(span, def_ids)| {
|
.map(|(span, def_ids)| {
|
||||||
(span, def_ids.into_iter().map(|did| tcx.associated_item(did)).collect())
|
(span, def_ids.into_iter().map(|did| tcx.associated_item(did)).collect())
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
let mut names: FxHashMap<String, Vec<Symbol>> = Default::default();
|
let mut names: FxIndexMap<String, Vec<Symbol>> = Default::default();
|
||||||
let mut names_len = 0;
|
let mut names_len = 0;
|
||||||
|
|
||||||
// Account for things like `dyn Foo + 'a`, like in tests `issue-22434.rs` and
|
// Account for things like `dyn Foo + 'a`, like in tests `issue-22434.rs` and
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::astconv::{GenericArgCountMismatch, GenericArgCountResult, OnlySelfBounds};
|
use crate::astconv::{GenericArgCountMismatch, GenericArgCountResult, OnlySelfBounds};
|
||||||
use crate::bounds::Bounds;
|
use crate::bounds::Bounds;
|
||||||
use crate::errors::TraitObjectDeclaredWithNoTraits;
|
use crate::errors::TraitObjectDeclaredWithNoTraits;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
|
||||||
use rustc_errors::struct_span_err;
|
use rustc_errors::struct_span_err;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
@ -14,7 +14,6 @@
|
|||||||
use rustc_trait_selection::traits::{self, astconv_object_safety_violations};
|
use rustc_trait_selection::traits::{self, astconv_object_safety_violations};
|
||||||
|
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
use std::collections::BTreeSet;
|
|
||||||
|
|
||||||
use super::AstConv;
|
use super::AstConv;
|
||||||
|
|
||||||
@ -148,8 +147,7 @@ trait here instead: `trait NewTrait: {} {{}}`",
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use a `BTreeSet` to keep output in a more consistent order.
|
let mut associated_types: FxIndexMap<Span, FxIndexSet<DefId>> = FxIndexMap::default();
|
||||||
let mut associated_types: FxHashMap<Span, BTreeSet<DefId>> = FxHashMap::default();
|
|
||||||
|
|
||||||
let regular_traits_refs_spans = trait_bounds
|
let regular_traits_refs_spans = trait_bounds
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -49,7 +49,7 @@ LL | type B;
|
|||||||
LL | type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>;
|
LL | type Bar<Rhs> = dyn Add<Rhs> + Sub<Rhs> + X<Rhs> + Z<Rhs>;
|
||||||
| ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^^^^^^ associated types `A`, `B`, `Output` must be specified
|
| ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^^^^^^ associated types `A`, `B`, `Output` must be specified
|
||||||
| | | |
|
| | | |
|
||||||
| | | associated types `Output` (from trait `Mul`), `Output` (from trait `Div`) must be specified
|
| | | associated types `Output` (from trait `Div`), `Output` (from trait `Mul`) must be specified
|
||||||
| | associated type `Output` must be specified
|
| | associated type `Output` must be specified
|
||||||
| associated type `Output` must be specified
|
| associated type `Output` must be specified
|
||||||
|
|
|
|
||||||
@ -119,7 +119,7 @@ error[E0191]: the value of the associated types `Output` in `Div`, `Output` in `
|
|||||||
--> $DIR/missing-associated-types.rs:24:21
|
--> $DIR/missing-associated-types.rs:24:21
|
||||||
|
|
|
|
||||||
LL | type Bal<Rhs> = dyn X<Rhs>;
|
LL | type Bal<Rhs> = dyn X<Rhs>;
|
||||||
| ^^^^^^ associated types `Output` (from trait `Mul`), `Output` (from trait `Div`) must be specified
|
| ^^^^^^ associated types `Output` (from trait `Div`), `Output` (from trait `Mul`) must be specified
|
||||||
|
|
|
|
||||||
= help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types
|
= help: consider introducing a new type parameter, adding `where` constraints using the fully-qualified path to the associated types
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user