finally compiled codegen/typegen
This commit is contained in:
		
							parent
							
								
									a9cceefaa4
								
							
						
					
					
						commit
						3f5382d52c
					
				| @ -34,6 +34,7 @@ use syntax::ext::build::AstBuilder; | |||||||
| use syntax::ptr::P; | use syntax::ptr::P; | ||||||
| 
 | 
 | ||||||
| use super::typegen; | use super::typegen; | ||||||
|  | use std::collections::HashMap; | ||||||
| 
 | 
 | ||||||
| pub struct Error; | pub struct Error; | ||||||
| 
 | 
 | ||||||
| @ -94,6 +95,7 @@ fn push_invoke_signature_aster( | |||||||
| 	builder: &aster::AstBuilder, | 	builder: &aster::AstBuilder, | ||||||
| 	implement: &ImplItem, | 	implement: &ImplItem, | ||||||
| 	signature: &MethodSig, | 	signature: &MethodSig, | ||||||
|  | 	replacements: &HashMap<String, P<Ty>>, | ||||||
| 	push: &mut FnMut(Annotatable), | 	push: &mut FnMut(Annotatable), | ||||||
| ) -> Dispatch { | ) -> Dispatch { | ||||||
| 
 | 
 | ||||||
| @ -108,17 +110,25 @@ fn push_invoke_signature_aster( | |||||||
| 			let mut arg_names = Vec::new(); | 			let mut arg_names = Vec::new(); | ||||||
| 			let mut arg_tys = Vec::new(); | 			let mut arg_tys = Vec::new(); | ||||||
| 			let arg_name = format!("{}", field_name(builder, &inputs[skip-1]).name); | 			let arg_name = format!("{}", field_name(builder, &inputs[skip-1]).name); | ||||||
| 			let arg_ty = inputs[skip-1].ty.clone(); | 
 | ||||||
|  | 			let mut arg_ty = inputs[skip-1].ty.clone(); | ||||||
|  | 			arg_ty = typegen::argument_replacement(builder, replacements, &arg_ty).unwrap_or(arg_ty); | ||||||
|  | 
 | ||||||
| 			let mut tree = builder.item() | 			let mut tree = builder.item() | ||||||
| 				.attr().word("derive(Serialize, Deserialize)") | 				.attr().word("derive(Serialize, Deserialize)") | ||||||
| 				.attr().word("allow(non_camel_case_types)") | 				.attr().word("allow(non_camel_case_types)") | ||||||
| 				.struct_(name_str.as_str()) | 				.struct_(name_str.as_str()) | ||||||
| 				.field(arg_name.as_str()).ty().build(arg_ty.clone()); | 				.field(arg_name.as_str()).ty() | ||||||
|  | 				.build(arg_ty.clone()); | ||||||
|  | 
 | ||||||
| 			arg_names.push(arg_name); | 			arg_names.push(arg_name); | ||||||
| 			arg_tys.push(arg_ty.clone()); | 			arg_tys.push(arg_ty); | ||||||
| 			for arg in inputs.iter().skip(skip) { | 			for arg in inputs.iter().skip(skip) { | ||||||
| 				let arg_name = format!("{}", field_name(builder, &arg)); | 				let arg_name = format!("{}", field_name(builder, &arg)); | ||||||
| 				let arg_ty = arg.ty.clone(); | 
 | ||||||
|  | 				let mut arg_ty = arg.ty.clone(); | ||||||
|  | 				arg_ty = typegen::argument_replacement(builder, replacements, &arg_ty).unwrap_or(arg_ty); | ||||||
|  | 
 | ||||||
| 				tree = tree.field(arg_name.as_str()).ty().build(arg_ty.clone()); | 				tree = tree.field(arg_name.as_str()).ty().build(arg_ty.clone()); | ||||||
| 				arg_names.push(arg_name); | 				arg_names.push(arg_name); | ||||||
| 				arg_tys.push(arg_ty); | 				arg_tys.push(arg_ty); | ||||||
| @ -339,8 +349,6 @@ fn implement_client_method_body( | |||||||
| { | { | ||||||
| 	let request = if dispatch.input_arg_names.len() > 0 { | 	let request = if dispatch.input_arg_names.len() > 0 { | ||||||
| 
 | 
 | ||||||
| 		let substitutes = typegen::match_unknown_tys(cx, builder, dispatch.input_arg_tys |  | ||||||
| 
 |  | ||||||
| 		let arg_name = dispatch.input_arg_names[0].as_str(); | 		let arg_name = dispatch.input_arg_names[0].as_str(); | ||||||
| 		let arg_ty = builder | 		let arg_ty = builder | ||||||
| 			.ty().ref_() | 			.ty().ref_() | ||||||
| @ -645,7 +653,7 @@ fn implement_interface( | |||||||
| 	let mut dispatch_table = Vec::new(); | 	let mut dispatch_table = Vec::new(); | ||||||
| 	for impl_item in impl_items { | 	for impl_item in impl_items { | ||||||
| 		if let ImplItemKind::Method(ref signature, _) = impl_item.node { | 		if let ImplItemKind::Method(ref signature, _) = impl_item.node { | ||||||
| 			dispatch_table.push(push_invoke_signature_aster(builder, &impl_item, signature, push)); | 			dispatch_table.push(push_invoke_signature_aster(builder, &impl_item, signature, &HashMap::<String, P<Ty>>::new(), push)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ use syntax::ast::{ | |||||||
| 	Ty, | 	Ty, | ||||||
| 	TyKind, | 	TyKind, | ||||||
| 	Path, | 	Path, | ||||||
|  | 	DUMMY_NODE_ID, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use syntax::ast; | use syntax::ast; | ||||||
| @ -56,7 +57,7 @@ fn is_new_entry(builder: &aster::AstBuilder, path: &Path) -> Option<String> { | |||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	if known { None } | 	if known { None } | ||||||
| 	else { Some(path_str(path)) } | 	else { Some(::syntax::print::pprust::path_to_string(path)) } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn path_str(path: &Path) -> String { | fn path_str(path: &Path) -> String { | ||||||
| @ -67,6 +68,57 @@ fn path_str(path: &Path) -> String { | |||||||
| 	res | 	res | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | pub fn argument_replacement( | ||||||
|  | 	builder: &aster::AstBuilder, | ||||||
|  | 	replacements: &HashMap<String, P<Ty>>, | ||||||
|  | 	ty: &P<Ty>, | ||||||
|  | ) -> Option<P<Ty>> { | ||||||
|  | 	match ty.node { | ||||||
|  | 		TyKind::Vec(ref nested_ty) => { | ||||||
|  | 			argument_replacement(builder, replacements, nested_ty).and_then(|replaced_with| { | ||||||
|  | 				let mut inplace_ty = nested_ty.deref().clone(); | ||||||
|  | 				inplace_ty.node = TyKind::Vec(replaced_with); | ||||||
|  | 				inplace_ty.id = DUMMY_NODE_ID; | ||||||
|  | 				Some(P(inplace_ty)) | ||||||
|  | 			}) | ||||||
|  | 		}, | ||||||
|  | 		TyKind::FixedLengthVec(ref nested_ty, ref len_expr) => { | ||||||
|  | 			argument_replacement(builder, replacements, nested_ty).and_then(|replaced_with| { | ||||||
|  | 				let mut inplace_ty = nested_ty.deref().clone(); | ||||||
|  | 				inplace_ty.node = TyKind::FixedLengthVec(replaced_with, len_expr.clone()); | ||||||
|  | 				inplace_ty.id = DUMMY_NODE_ID; | ||||||
|  | 				Some(P(inplace_ty)) | ||||||
|  | 			}) | ||||||
|  | 		}, | ||||||
|  | 		TyKind::Path(_, ref path) => { | ||||||
|  | 			if path.segments.len() > 0 && path.segments[0].identifier.name.as_str() == "Option" || | ||||||
|  | 				path.segments[0].identifier.name.as_str() == "Result" { | ||||||
|  | 
 | ||||||
|  | 				let nested_ty = &path.segments[0].parameters.types()[0]; | ||||||
|  | 				argument_replacement(builder, replacements, nested_ty).and_then(|replaced_with| { | ||||||
|  | 					let mut inplace_path = path.clone(); | ||||||
|  | 					match inplace_path.segments[0].parameters { | ||||||
|  | 						::syntax::ast::PathParameters::AngleBracketed(ref mut data) => { | ||||||
|  | 							data.types = data.types.map(|_| replaced_with.clone()); | ||||||
|  | 						}, | ||||||
|  | 						_ => {} | ||||||
|  | 					} | ||||||
|  | 					let mut inplace_ty = nested_ty.deref().deref().clone(); | ||||||
|  | 					inplace_ty.node = TyKind::Path(None, inplace_path); | ||||||
|  | 					inplace_ty.id = DUMMY_NODE_ID; | ||||||
|  | 					Some(P(inplace_ty)) | ||||||
|  | 				}) | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				replacements.get(&::syntax::print::pprust::path_to_string(path)).and_then(|replaced_with| { | ||||||
|  | 					Some(replaced_with.clone()) | ||||||
|  | 				}) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		_ => { None } | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub fn push_bin_box( | pub fn push_bin_box( | ||||||
| 	cx: &ExtCtxt, | 	cx: &ExtCtxt, | ||||||
| 	builder: &aster::AstBuilder, | 	builder: &aster::AstBuilder, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user