Skip to content

Commit 29139ab

Browse files
committed
Use IR for type functions
1 parent e9d4403 commit 29139ab

2 files changed

Lines changed: 22 additions & 5 deletions

File tree

‎rule-preprocessor/src/ir.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl FnIr {
142142

143143
#[derive(Debug, Clone, Serialize, Deserialize)]
144144
pub struct TypeIr {
145-
pub init: String,
145+
pub init: Vec<BodyFragment>,
146146
#[serde(skip_serializing_if = "Option::is_none")]
147147
pub generic: Option<i32>,
148148
#[serde(flatten)]

‎rule-preprocessor/src/syntactic.rs‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,12 @@ impl<'a> FragmentCtx<'a> {
190190
self.emit_method_call(&call);
191191
return;
192192
}
193-
if let Some(generic) = ast::CallExpr::cast(node.clone())
194-
.and_then(|call| self.generic_default(&call))
193+
if let Some(generic) =
194+
ast::CallExpr::cast(node.clone()).and_then(|call| self.generic_default(&call))
195195
{
196196
self.flush_text();
197-
self.fragments.push(BodyFragment::Default { default: generic });
197+
self.fragments
198+
.push(BodyFragment::Default { default: generic });
198199
return;
199200
}
200201
for child in node.children_with_tokens() {
@@ -675,8 +676,24 @@ impl<'a> TypeIrBuilder<'a> {
675676
.find(|name| name.text() == ty_text)
676677
.map(|name| name.text()[1..].parse().expect("generic name is T<n>"));
677678

679+
let generic_names: Vec<String> = self
680+
.fn_item
681+
.generic_param_list()
682+
.into_iter()
683+
.flat_map(|gpl| gpl.generic_params())
684+
.filter_map(|param| match param {
685+
ast::GenericParam::TypeParam(tp) => tp.name(),
686+
ast::GenericParam::ConstParam(cp) => cp.name(),
687+
_ => None,
688+
})
689+
.map(|name| name.text().to_string())
690+
.collect();
691+
let builder = FnIrBuilder::new(self.fn_item);
692+
let mut init_ctx = FragmentCtx::new(&builder, &[], &generic_names);
693+
init_ctx.visit(ra_ap_syntax::NodeOrToken::Node(init.syntax().clone()));
694+
678695
TypeIr {
679-
init: init.syntax().text().to_string(),
696+
init: init_ctx.finish(),
680697
generic,
681698
type_info: TypeInfo {
682699
ty: ty.syntax().text().to_string(),

0 commit comments

Comments
 (0)