private static JObject ConstructConstructorInfo(IMethod constructor, IEmitter emitter, bool includeDeclaringType, bool isGenericSpecialization, SyntaxTree tree) { var properties = MetadataUtils.GetCommonMemberInfoProperties(constructor, emitter, includeDeclaringType, isGenericSpecialization, tree); if (Helpers.IsNonScriptable(constructor)) { return(null); } properties.Add("t", (int)MemberTypes.Constructor); if (constructor.Parameters.Count > 0) { properties.Add("p", new JArray(constructor.Parameters.Select(p => new JRaw(MetadataUtils.GetTypeName(p.Type, emitter, isGenericSpecialization))))); } var parametersInfo = constructor.Parameters.Select(p => MetadataUtils.ConstructParameterInfo(p, emitter, false, false, tree)).ToList(); if (parametersInfo.Count > 0) { properties.Add("pi", new JArray(parametersInfo)); } var inline = emitter.GetInline(constructor); var typeDef = constructor.DeclaringTypeDefinition; IAttribute customCtor = null; if (typeDef != null) { customCtor = emitter.Validator.GetAttribute(typeDef.Attributes, Translator.Bridge_ASSEMBLY + ".ConstructorAttribute"); } if (string.IsNullOrEmpty(inline) && customCtor == null) { string sname; if (constructor.IsStatic || constructor.DeclaringType.Kind == TypeKind.Anonymous) { sname = JS.Funcs.CONSTRUCTOR; } else { sname = OverloadsCollection.Create(emitter, constructor).GetOverloadName(); } properties.Add("sn", sname); } if (constructor.IsStatic) { properties.Add("sm", true); } if (string.IsNullOrEmpty(inline) && constructor.Attributes.Any(a => a.AttributeType.FullName == "Bridge.ExpandParamsAttribute")) { properties.Add("exp", true); } if (!string.IsNullOrEmpty(inline)) { var block = new InlineArgumentsBlock(emitter, new ArgumentsInfo(emitter, constructor), inline, constructor); var oldWriter = block.SaveWriter(); block.NewWriter(); block.EmitFunctionReference(true); var str = emitter.Output.ToString(); block.RestoreWriter(oldWriter); properties.Add("def", new JRaw(str)); } else if (customCtor != null) { inline = customCtor.PositionalArguments[0].ConstantValue.ToString(); if (Regex.Match(inline, @"\s*\{\s*\}\s*").Success) { var names = constructor.Parameters.Select(p => p.Name); StringBuilder sb = new StringBuilder("function (" + string.Join(", ", names.ToArray()) + ") { return {"); bool needComma = false; foreach (var name in names) { if (needComma) { sb.Append(", "); } needComma = true; sb.Append(name + ": " + name); } sb.Append("};}"); properties.Add("def", new JRaw(sb.ToString())); } else { var block = new InlineArgumentsBlock(emitter, new ArgumentsInfo(emitter, constructor), inline, constructor); var oldWriter = block.SaveWriter(); block.NewWriter(); block.EmitFunctionReference(true); var str = emitter.Output.ToString(); block.RestoreWriter(oldWriter); properties.Add("def", new JRaw(str)); } } return(properties); }
public static JObject ConstructMemberInfo(IMember m, IEmitter emitter, bool includeDeclaringType, bool isGenericSpecialization, SyntaxTree tree) { if (m is IMethod && ((IMethod)m).IsConstructor) { return(MetadataUtils.ConstructConstructorInfo((IMethod)m, emitter, includeDeclaringType, isGenericSpecialization, tree)); } var properties = MetadataUtils.GetCommonMemberInfoProperties(m, emitter, includeDeclaringType, isGenericSpecialization, tree); if (m.IsStatic) { properties.Add("is", true); } if (m is IMethod) { var method = (IMethod)m; var inline = emitter.GetInline(method); if (string.IsNullOrEmpty(inline) && method.Attributes.Any(a => a.AttributeType.FullName == "Bridge.ExpandParamsAttribute")) { properties.Add("exp", true); } properties.Add("t", (int)MemberTypes.Method); var parametersInfo = method.Parameters.Select(p => MetadataUtils.ConstructParameterInfo(p, emitter, false, false, tree)).ToList(); if (parametersInfo.Count > 0) { properties.Add("pi", new JArray(parametersInfo)); } if (!string.IsNullOrEmpty(inline)) { if (inline.StartsWith("<self>")) { inline = inline.Substring(6); } var block = new InlineArgumentsBlock(emitter, new ArgumentsInfo(emitter, method), inline, method); var oldWriter = block.SaveWriter(); block.NewWriter(); block.EmitFunctionReference(true); var str = emitter.Output.ToString(); block.RestoreWriter(oldWriter); properties.Add("tpc", method.TypeParameters.Count); properties.Add("def", new JRaw(str)); } else { if (MetadataUtils.IsJsGeneric(method, emitter)) { properties.Add("tpc", method.TypeParameters.Count); properties.Add("tprm", new JArray(method.TypeParameters.Select(tp => tp.Name).ToArray())); } string sname; if (method.IsAccessor) { if (method.AccessorOwner is IProperty) { sname = Helpers.GetPropertyRef(method.AccessorOwner, emitter, ((IProperty)method.AccessorOwner).Setter == method); } else if (method.AccessorOwner is IEvent) { sname = Helpers.GetEventRef(method.AccessorOwner, emitter, ((IEvent)method.AccessorOwner).RemoveAccessor == method); } else { sname = OverloadsCollection.Create(emitter, method).GetOverloadName(); } } else { sname = OverloadsCollection.Create(emitter, method).GetOverloadName(); } properties.Add("sn", sname); } properties.Add("rt", new JRaw(MetadataUtils.GetTypeName(method.ReturnType, emitter, isGenericSpecialization))); var attr = MetadataUtils.GetScriptableAttributes(method.ReturnTypeAttributes, emitter, tree).ToList(); if (attr.Count > 0) { JArray attrArr = new JArray(); foreach (var a in attr) { attrArr.Add(MetadataUtils.ConstructAttribute(a, null, emitter)); } properties.Add("rta", attrArr); } if (method.Parameters.Count > 0) { properties.Add("p", new JArray(method.Parameters.Select(p => new JRaw(MetadataUtils.GetTypeName(p.Type, emitter, isGenericSpecialization))))); } } else if (m is IField) { var field = (IField)m; properties.Add("t", (int)MemberTypes.Field); properties.Add("rt", new JRaw(MetadataUtils.GetTypeName(field.ReturnType, emitter, isGenericSpecialization))); properties.Add("sn", OverloadsCollection.Create(emitter, field).GetOverloadName()); if (field.IsReadOnly) { properties.Add("ro", field.IsReadOnly); } } else if (m is IProperty) { var prop = (IProperty)m; properties.Add("t", (int)MemberTypes.Property); properties.Add("rt", new JRaw(MetadataUtils.GetTypeName(prop.ReturnType, emitter, isGenericSpecialization))); if (prop.Parameters.Count > 0) { properties.Add("p", new JArray(prop.Parameters.Select(p => new JRaw(MetadataUtils.GetTypeName(p.Type, emitter, isGenericSpecialization))))); } if (prop.IsIndexer) { properties.Add("i", true); } if (prop.IsIndexer) { if (prop.Getter != null) { var parametersInfo = prop.Getter.Parameters.Select(p => MetadataUtils.ConstructParameterInfo(p, emitter, false, false, tree)).ToList(); if (parametersInfo.Count > 0) { properties.Add("ipi", new JArray(parametersInfo)); } } else if (prop.Setter != null) { var parametersInfo = prop.Setter.Parameters.Take(prop.Setter.Parameters.Count - 1).Select(p => MetadataUtils.ConstructParameterInfo(p, emitter, false, false, tree)).ToList(); if (parametersInfo.Count > 0) { properties.Add("ipi", new JArray(parametersInfo)); } } } var inlineGetter = prop.CanGet && (emitter.GetInline(prop.Getter) != null || Helpers.IsScript(prop.Getter)); var inlineSetter = prop.CanSet && (emitter.GetInline(prop.Setter) != null || Helpers.IsScript(prop.Setter)); if (inlineGetter || inlineSetter || prop.IsIndexer) { if (prop.CanGet) { properties.Add("g", MetadataUtils.ConstructMemberInfo(prop.Getter, emitter, includeDeclaringType, isGenericSpecialization, tree)); } if (prop.CanSet) { properties.Add("s", MetadataUtils.ConstructMemberInfo(prop.Setter, emitter, includeDeclaringType, isGenericSpecialization, tree)); } } else { var fieldName = OverloadsCollection.Create(emitter, prop).GetOverloadName(); if (prop.CanGet) { properties.Add("g", MetadataUtils.ConstructFieldPropertyAccessor(prop.Getter, emitter, fieldName, true, includeDeclaringType, isGenericSpecialization, tree)); } if (prop.CanSet) { properties.Add("s", MetadataUtils.ConstructFieldPropertyAccessor(prop.Setter, emitter, fieldName, false, includeDeclaringType, isGenericSpecialization, tree)); } properties.Add("fn", fieldName); } } else if (m is IEvent) { var evt = (IEvent)m; properties.Add("t", (int)MemberTypes.Event); properties.Add("ad", MetadataUtils.ConstructMemberInfo(evt.AddAccessor, emitter, includeDeclaringType, isGenericSpecialization, tree)); properties.Add("r", MetadataUtils.ConstructMemberInfo(evt.RemoveAccessor, emitter, includeDeclaringType, isGenericSpecialization, tree)); } else { throw new ArgumentException("Invalid member " + m); } return(properties); }