Skip to content

Commit 63e964b

Browse files
committed
Adds TypeFilter to TraitMap.
1 parent 465d3fc commit 63e964b

File tree

2 files changed

+119
-15
lines changed

2 files changed

+119
-15
lines changed

sway-core/src/semantic_analysis/namespace/trait_map.rs

+119-3
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,37 @@ enum TypeRootFilter {
190190
TraitType(String),
191191
}
192192

193+
#[derive(Clone, Hash, Eq, PartialEq, Debug)]
194+
enum TypeFilter {
195+
Unknown,
196+
Never,
197+
Placeholder,
198+
TypeParam(usize),
199+
StringSlice,
200+
StringArray(usize),
201+
U8,
202+
U16,
203+
U32,
204+
U64,
205+
U256,
206+
Bool,
207+
Custom(String),
208+
B256,
209+
Contract,
210+
ErrorRecovery,
211+
Tuple(usize, Vec<Box<TypeFilter>>),
212+
Enum(ParsedDeclId<EnumDeclaration>, Vec<Box<TypeFilter>>),
213+
Struct(ParsedDeclId<StructDeclaration>, Vec<Box<TypeFilter>>),
214+
ContractCaller(String),
215+
Array(usize, Box<TypeFilter>),
216+
Storage,
217+
RawUntypedPtr,
218+
RawUntypedSlice,
219+
Ptr(Box<TypeFilter>),
220+
Slice(Box<TypeFilter>),
221+
TraitType(String),
222+
}
223+
193224
/// Map holding trait implementations for types.
194225
///
195226
/// Note: "impl self" blocks are considered traits and are stored in the
@@ -198,7 +229,7 @@ enum TypeRootFilter {
198229
pub(crate) struct TraitMap {
199230
trait_impls: TraitImpls,
200231
satisfied_cache: im::HashSet<u64>,
201-
insert_for_type_cache: im::HashMap<TypeRootFilter, im::Vector<TypeId>>,
232+
insert_for_type_cache: im::HashMap<TypeFilter, im::Vector<TypeId>>,
202233
}
203234

204235
pub(crate) enum IsImplSelf {
@@ -542,7 +573,7 @@ impl TraitMap {
542573
let trait_map = TraitMap {
543574
trait_impls,
544575
satisfied_cache: im::HashSet::default(),
545-
insert_for_type_cache: im::HashMap::<TypeRootFilter, im::Vector<TypeId>>::new(),
576+
insert_for_type_cache: im::HashMap::<TypeFilter, im::Vector<TypeId>>::new(),
546577
};
547578

548579
self.extend(trait_map, engines);
@@ -640,7 +671,7 @@ impl TraitMap {
640671
type_id: TypeId,
641672
code_block_first_pass: CodeBlockFirstPass,
642673
) {
643-
let root_filter = TraitMap::get_type_root_filter(engines, type_id);
674+
let root_filter = TraitMap::get_type_filter(engines, type_id);
644675
if let Some(values) = self.insert_for_type_cache.get_mut(&root_filter) {
645676
let unify_checker = UnifyCheck::non_dynamic_equality(engines).with_unify_ref_mut(false);
646677
if values.iter().any(|v| unify_checker.check(type_id, *v)) {
@@ -1732,4 +1763,89 @@ impl TraitMap {
17321763
} => Self::get_type_root_filter(engines, referenced_type.type_id),
17331764
}
17341765
}
1766+
1767+
// This is used by the trait map to filter the entries into a HashMap with the return type string as key.
1768+
fn get_type_filter(engines: &Engines, type_id: TypeId) -> TypeFilter {
1769+
use TypeInfo::*;
1770+
match &*engines.te().get(type_id) {
1771+
Unknown => TypeFilter::Unknown,
1772+
Never => TypeFilter::Never,
1773+
UnknownGeneric { .. } | Placeholder(_) => TypeFilter::Placeholder,
1774+
TypeParam(n) => TypeFilter::TypeParam(*n),
1775+
StringSlice => TypeFilter::StringSlice,
1776+
StringArray(x) => TypeFilter::StringArray(x.val()),
1777+
UnsignedInteger(x) => match x {
1778+
IntegerBits::Eight => TypeFilter::U8,
1779+
IntegerBits::Sixteen => TypeFilter::U16,
1780+
IntegerBits::ThirtyTwo => TypeFilter::U32,
1781+
IntegerBits::SixtyFour => TypeFilter::U64,
1782+
IntegerBits::V256 => TypeFilter::U256,
1783+
},
1784+
Boolean => TypeFilter::Bool,
1785+
Custom {
1786+
qualified_call_path: call_path,
1787+
..
1788+
} => TypeFilter::Custom(call_path.call_path.suffix.to_string()),
1789+
B256 => TypeFilter::B256,
1790+
Numeric => TypeFilter::U64, // u64 is the default
1791+
Contract => TypeFilter::Contract,
1792+
ErrorRecovery(_) => TypeFilter::ErrorRecovery,
1793+
Tuple(fields) => TypeFilter::Tuple(
1794+
fields.len(),
1795+
fields
1796+
.iter()
1797+
.map(|f| Box::new(Self::get_type_filter(engines, f.type_id)))
1798+
.collect::<Vec<_>>(),
1799+
),
1800+
UntypedEnum(_) => unreachable!(),
1801+
UntypedStruct(_) => unreachable!(),
1802+
Enum(decl_id) => {
1803+
// TODO Remove unwrap once #6475 is fixed
1804+
TypeFilter::Enum(
1805+
engines.de().get_parsed_decl_id(decl_id).unwrap(),
1806+
engines
1807+
.de()
1808+
.get_enum(decl_id)
1809+
.type_parameters
1810+
.iter()
1811+
.map(|f| Box::new(Self::get_type_filter(engines, f.type_id)))
1812+
.collect::<Vec<_>>(),
1813+
)
1814+
}
1815+
Struct(decl_id) => {
1816+
// TODO Remove unwrap once #6475 is fixed
1817+
TypeFilter::Struct(
1818+
engines.de().get_parsed_decl_id(decl_id).unwrap(),
1819+
engines
1820+
.de()
1821+
.get_struct(decl_id)
1822+
.type_parameters
1823+
.iter()
1824+
.map(|f| Box::new(Self::get_type_filter(engines, f.type_id)))
1825+
.collect::<Vec<_>>(),
1826+
)
1827+
}
1828+
ContractCaller { abi_name, .. } => TypeFilter::ContractCaller(abi_name.to_string()),
1829+
Array(type_argument, length) => TypeFilter::Array(
1830+
length.val(),
1831+
Box::new(Self::get_type_filter(engines, type_argument.type_id)),
1832+
),
1833+
Storage { .. } => TypeFilter::Storage,
1834+
RawUntypedPtr => TypeFilter::RawUntypedPtr,
1835+
RawUntypedSlice => TypeFilter::RawUntypedSlice,
1836+
Ptr(type_argument) => TypeFilter::Ptr(Box::new(Self::get_type_filter(
1837+
engines,
1838+
type_argument.type_id,
1839+
))),
1840+
Slice(type_argument) => TypeFilter::Slice(Box::new(Self::get_type_filter(
1841+
engines,
1842+
type_argument.type_id,
1843+
))),
1844+
Alias { ty, .. } => Self::get_type_filter(engines, ty.type_id),
1845+
TraitType { name, .. } => TypeFilter::TraitType(name.to_string()),
1846+
Ref {
1847+
referenced_type, ..
1848+
} => Self::get_type_filter(engines, referenced_type.type_id),
1849+
}
1850+
}
17351851
}

sway-core/src/semantic_analysis/type_check_context.rs

-12
Original file line numberDiff line numberDiff line change
@@ -1224,18 +1224,6 @@ impl<'a> TypeCheckContext<'a> {
12241224
.values()
12251225
.filter_map(|method_ref| {
12261226
let method = decl_engine.get_function(method_ref);
1227-
1228-
//if method.name.clone().as_str() == "new" {
1229-
println!(
1230-
"find_method_for_type {:?} {:?}",
1231-
method.implementing_for_typeid.map(|t| {
1232-
self.engines
1233-
.help_out((*self.engines.te().get(t)).clone())
1234-
}),
1235-
method.name.clone(),
1236-
);
1237-
//}
1238-
12391227
method
12401228
.span()
12411229
.to_string_path_with_line_col(self.engines().se())

0 commit comments

Comments
 (0)