void VisitFunctionType(FunctionType functionType) { WriteCommaSeparatedListInParenthesis (functionType.Parameters, false); Space (); WriteToken ("=>", Roles.Assign); Space (); functionType.ReturnType.AcceptVisitor (this); }
public override void VisitSimpleType (SimpleType simpleType) { base.VisitSimpleType (simpleType); var td = GetTypeDef (simpleType); if (td == null || !IsDelegate (td)) { return; } var subs = new Dictionary<string, AstType> (); var invoke = td.Methods.First (x => x.Name == "Invoke"); if (simpleType.TypeArguments.Count > 0) { var ps = td.GenericParameters; var i = 0; foreach (var a in simpleType.TypeArguments) { subs [ps [i].Name] = a; i++; } } var nt = new FunctionType (); foreach (var p in invoke.Parameters) { var pt = p.ParameterType.IsGenericParameter ? subs [p.ParameterType.Name] : GetTsType (p.ParameterType); nt.Parameters.Add (new ParameterDeclaration (pt.Clone (), p.Name)); } nt.ReturnType = invoke.ReturnType.IsGenericParameter ? subs [invoke.ReturnType.Name] : GetTsType (invoke.ReturnType); if (nt.ReturnType is PrimitiveType) { nt.ReturnType = MakePrimitiveTypesJsTypes.GetPrimitiveTypeReplacement ((PrimitiveType)nt.ReturnType); } foreach (var p in nt.Parameters) { if (p.Type is PrimitiveType) { p.Type = MakePrimitiveTypesJsTypes.GetPrimitiveTypeReplacement ((PrimitiveType)p.Type); } } nt.AddAnnotation (td); simpleType.ReplaceWith (nt); }