protected virtual void AddNestedTypes(IEnumerable <TypeDefinition> types) { foreach (TypeDefinition type in types) { if (type.FullName.Contains("<")) { continue; } string key = BridgeTypes.GetTypeDefinitionKey(type); this.Validator.CheckType(type, this); if (this.TypeDefinitions.ContainsKey(key)) { throw new System.Exception(type + " is already exists"); } this.TypeDefinitions.Add(key, type); this.BridgeTypes.Add(key, new BridgeType(key) { TypeDefinition = type }); if (type.HasNestedTypes) { Translator.InheritAttributes(type); this.AddNestedTypes(type.NestedTypes); } } }
protected virtual void AddNestedTypes(IEnumerable <TypeDefinition> types) { bool skip_key; foreach (TypeDefinition type in types) { if (type.FullName.Contains("<")) { continue; } this.Validator.CheckType(type, this); string key = BridgeTypes.GetTypeDefinitionKey(type); BridgeType duplicateBridgeType = null; skip_key = false; if (this.BridgeTypes.TryGetValue(key, out duplicateBridgeType)) { var duplicate = duplicateBridgeType.TypeDefinition; var message = string.Format( Constants.Messages.Exceptions.DUPLICATE_BRIDGE_TYPE, type.Module.Assembly.FullName, type.FullName, duplicate.Module.Assembly.FullName, duplicate.FullName); if (!this.AssemblyInfo.IgnoreDuplicateTypes) { this.Log.Error(message); throw new System.InvalidOperationException(message); } else { this.Log.Warn(message); } skip_key = true; } if (!skip_key) { this.TypeDefinitions.Add(key, type); this.BridgeTypes.Add(key, new BridgeType(key) { TypeDefinition = type }); if (type.HasNestedTypes) { Translator.InheritAttributes(type); this.AddNestedTypes(type.NestedTypes); } } } }
protected virtual ITypeInfo EnsureTypeInfo(TypeDefinition type, ITranslator translator) { string key = BridgeTypes.GetTypeDefinitionKey(type); ITypeInfo typeInfo = null; if (translator.TypeInfoDefinitions.ContainsKey(key)) { typeInfo = translator.TypeInfoDefinitions[key]; } else { typeInfo = new TypeInfo(); translator.TypeInfoDefinitions[key] = typeInfo; } return(typeInfo); }
protected virtual void WriteObjectInitializer(IEnumerable <Expression> expressions, bool preserveMemberCase, TypeDefinition type, InvocationResolveResult rr) { bool needComma = false; List <string> names = new List <string>(); if (expressions != null) { foreach (Expression item in expressions) { NamedExpression namedExression = item as NamedExpression; NamedArgumentExpression namedArgumentExpression = item as NamedArgumentExpression; string name = namedExression != null ? namedExression.Name : namedArgumentExpression.Name; if (!preserveMemberCase) { name = Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); } var itemrr = this.Emitter.Resolver.ResolveNode(item, this.Emitter) as MemberResolveResult; if (itemrr != null) { var oc = OverloadsCollection.Create(this.Emitter, itemrr.Member); oc.CancelChangeCase = this.Emitter.IsNativeMember(itemrr.Member.FullName) ? false : preserveMemberCase; name = oc.GetOverloadName(); } if (needComma) { this.WriteComma(); } needComma = true; Expression expression = namedExression != null ? namedExression.Expression : namedArgumentExpression.Expression; this.Write(name, ": "); expression.AcceptVisitor(this.Emitter); names.Add(name); } } if (this.Emitter.Validator.IsObjectLiteral(type)) { var key = BridgeTypes.GetTypeDefinitionKey(type); var tinfo = this.Emitter.Types.FirstOrDefault(t => t.Key == key); if (tinfo == null) { return; } var itype = tinfo.Type as ITypeDefinition; var mode = 0; if (rr != null) { if (rr.Member.Parameters.Count == 1 && rr.Member.Parameters.First().Type.FullName == "Bridge.DefaultValueMode") { var arg = rr.Arguments.FirstOrDefault(); if (arg != null && arg.ConstantValue != null) { mode = (int)arg.ConstantValue; } } else if (itype != null) { var attr = this.Emitter.Validator.GetAttribute(itype.Attributes, Translator.Bridge_ASSEMBLY + ".ObjectLiteralAttribute"); if (attr.PositionalArguments.Count > 0) { var value = attr.PositionalArguments.First().ConstantValue; if (value != null && value is int) { mode = (int)value; } } } } if (mode != 0) { var members = tinfo.InstanceConfig.Fields.Concat(tinfo.InstanceConfig.Properties); if (members.Any()) { foreach (var member in members) { if (mode == 1 && (member.VarInitializer == null || member.VarInitializer.Initializer.IsNull)) { continue; } var name = member.GetName(this.Emitter); if (!preserveMemberCase) { name = Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); } if (names.Contains(name)) { continue; } if (needComma) { this.WriteComma(); } needComma = true; this.Write(name, ": "); var primitiveExpr = member.Initializer as PrimitiveExpression; if (primitiveExpr != null && primitiveExpr.Value is AstType) { this.Write(Inspector.GetStructDefaultValue((AstType)primitiveExpr.Value, this.Emitter)); } else { member.Initializer.AcceptVisitor(this.Emitter); } } } } } }
protected virtual void WriteObjectInitializer(IEnumerable <Expression> expressions, TypeDefinition type, InvocationResolveResult rr, bool withCtor) { bool needComma = false; List <string> names = new List <string>(); var isObjectLiteral = this.Emitter.Validator.IsObjectLiteral(type); if (!withCtor && rr != null && this.ObjectCreateExpression.Arguments.Count > 0) { var args = this.ObjectCreateExpression.Arguments.ToList(); var arrIsOpen = false; for (int i = 0; i < args.Count; i++) { Expression expression = args[i]; var p = rr.Member.Parameters[i < rr.Member.Parameters.Count ? i : (rr.Member.Parameters.Count - 1)]; var name = p.Name; if (p.Type.FullName == "Bridge.ObjectInitializationMode" || p.Type.FullName == "Bridge.ObjectCreateMode") { continue; } if (needComma) { this.WriteComma(); } needComma = true; if (p.IsParams && !arrIsOpen) { arrIsOpen = true; this.Write("["); } this.Write(name, ": "); expression.AcceptVisitor(this.Emitter); names.Add(name); } if (arrIsOpen) { this.Write("]"); } } if (expressions != null) { foreach (Expression item in expressions) { NamedExpression namedExression = item as NamedExpression; NamedArgumentExpression namedArgumentExpression = item as NamedArgumentExpression; string name = namedExression != null ? namedExression.Name : namedArgumentExpression.Name; var itemrr = this.Emitter.Resolver.ResolveNode(item, this.Emitter) as MemberResolveResult; if (itemrr != null) { var oc = OverloadsCollection.Create(this.Emitter, itemrr.Member); name = oc.GetOverloadName(); if (!this.Emitter.AssemblyInfo.PreserveMemberCase && itemrr.Member is IProperty && !itemrr.Member.Attributes.Any(attr => attr.AttributeType.FullName == "Bridge.NameAttribute") && !this.Emitter.Validator.IsObjectLiteral(itemrr.Member.DeclaringTypeDefinition)) { name = Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); } } if (needComma) { this.WriteComma(); } needComma = true; Expression expression = namedExression != null ? namedExression.Expression : namedArgumentExpression.Expression; this.Write(name, ": "); expression.AcceptVisitor(this.Emitter); names.Add(name); } } if (isObjectLiteral) { var key = BridgeTypes.GetTypeDefinitionKey(type); var tinfo = this.Emitter.Types.FirstOrDefault(t => t.Key == key); if (tinfo == null) { return; } var itype = tinfo.Type as ITypeDefinition; var mode = 0; if (rr != null) { if (rr.Member.Parameters.Count > 0) { var prm = rr.Member.Parameters.FirstOrDefault(p => p.Type.FullName == "Bridge.ObjectInitializationMode"); if (prm != null) { var prmIndex = rr.Member.Parameters.IndexOf(prm); var arg = rr.Arguments.FirstOrDefault(a => { if (a is NamedArgumentResolveResult) { return(((NamedArgumentResolveResult)a).ParameterName == prm.Name); } return(prmIndex == rr.Arguments.IndexOf(a)); }); if (arg != null && arg.ConstantValue != null && arg.ConstantValue is int) { mode = (int)arg.ConstantValue; } } } else if (itype != null) { mode = this.Emitter.Validator.GetObjectInitializationMode(type); } } if (mode != 0) { var members = tinfo.InstanceConfig.Fields.Concat(tinfo.InstanceConfig.Properties); if (members.Any()) { foreach (var member in members) { if (mode == 1 && (member.VarInitializer == null || member.VarInitializer.Initializer.IsNull) && !member.IsPropertyInitializer) { continue; } var name = member.GetName(this.Emitter); if (names.Contains(name)) { continue; } if (needComma) { this.WriteComma(); } needComma = true; this.Write(name, ": "); var primitiveExpr = member.Initializer as PrimitiveExpression; if (mode == 2 && (member.Initializer == null || member.Initializer.IsNull) && !(member.VarInitializer == null || member.VarInitializer.Initializer.IsNull)) { var argType = this.Emitter.Resolver.ResolveNode(member.VarInitializer, this.Emitter).Type; var defValue = Inspector.GetDefaultFieldValue(argType, null); if (defValue == argType) { this.Write(Inspector.GetStructDefaultValue(argType, this.Emitter)); } else { this.Write(defValue); } } else { if (primitiveExpr != null && primitiveExpr.Value is AstType) { this.Write(Inspector.GetStructDefaultValue((AstType)primitiveExpr.Value, this.Emitter)); } else if (member.Initializer != null) { member.Initializer.AcceptVisitor(this.Emitter); } else { this.Write("null"); } } } } } } }
protected virtual List <string> WriteObjectInitializer(IList <KeyValuePair <IMember, ResolveResult> > expressions, TypeDefinition type, IAttribute attr) { bool needComma = false; List <string> names = new List <string>(); List <string> inlineInit = new List <string>(); if (expressions != null) { foreach (KeyValuePair <IMember, ResolveResult> item in expressions) { var member = item.Key; var name = this.Emitter.GetEntityName(member); var inlineCode = AttributeCreateBlock.GetInlineInit(item, this); if (inlineCode != null) { inlineInit.Add(inlineCode); } else { if (member is IProperty) { name = Helpers.GetPropertyRef(member, this.Emitter, true); } else if (member is IEvent) { name = Helpers.GetEventRef(member, this.Emitter, false); } if (needComma) { this.WriteComma(); } needComma = true; this.Write(name, ": "); AttributeCreateBlock.WriteResolveResult(item.Value, this); names.Add(name); } } } if (this.Emitter.Validator.IsObjectLiteral(type)) { var key = BridgeTypes.GetTypeDefinitionKey(type); var tinfo = this.Emitter.Types.FirstOrDefault(t => t.Key == key); if (tinfo == null) { return(inlineInit); } var itype = tinfo.Type as ITypeDefinition; var mode = 0; if (attr.Constructor != null) { if (itype != null) { var oattr = this.Emitter.Validator.GetAttribute(itype.Attributes, Translator.Bridge_ASSEMBLY + ".ObjectLiteralAttribute"); if (oattr.PositionalArguments.Count > 0) { var value = oattr.PositionalArguments.First().ConstantValue; if (value is int) { mode = (int)value; } } } } if (mode != 0) { var members = tinfo.InstanceConfig.Fields.Concat(tinfo.InstanceConfig.Properties); if (members.Any()) { foreach (var member in members) { if (mode == 1 && (member.VarInitializer == null || member.VarInitializer.Initializer.IsNull)) { continue; } var name = member.GetName(this.Emitter); if (names.Contains(name)) { continue; } if (needComma) { this.WriteComma(); } needComma = true; this.Write(name, ": "); var primitiveExpr = member.Initializer as PrimitiveExpression; if (primitiveExpr != null && primitiveExpr.Value is AstType) { this.Write(Inspector.GetStructDefaultValue((AstType)primitiveExpr.Value, this.Emitter)); } else { member.Initializer.AcceptVisitor(this.Emitter); } } } } } return(inlineInit); }
protected virtual void WriteObjectInitializer(IEnumerable <Expression> expressions, bool changeCase, TypeDefinition type) { bool needComma = false; List <string> names = new List <string>(); if (expressions != null) { foreach (Expression item in expressions) { NamedExpression namedExression = item as NamedExpression; NamedArgumentExpression namedArgumentExpression = item as NamedArgumentExpression; if (needComma) { this.WriteComma(); } needComma = true; string name = namedExression != null ? namedExression.Name : namedArgumentExpression.Name; if (changeCase) { name = Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); } Expression expression = namedExression != null ? namedExression.Expression : namedArgumentExpression.Expression; this.Write(name, ": "); expression.AcceptVisitor(this.Emitter); names.Add(name); } } if (this.Emitter.Validator.IsObjectLiteral(type) && !this.Emitter.Validator.IsIgnoreType(type)) { var key = BridgeTypes.GetTypeDefinitionKey(type); var tinfo = this.Emitter.Types.FirstOrDefault(t => t.Key == key); if (tinfo != null) { var members = tinfo.InstanceConfig.Fields.Concat(tinfo.InstanceConfig.Properties); if (members.Any()) { foreach (var member in members) { var name = member.GetName(this.Emitter); if (changeCase) { name = Object.Net.Utilities.StringUtils.ToLowerCamelCase(name); } if (names.Contains(name)) { continue; } if (needComma) { this.WriteComma(); } needComma = true; this.Write(name, ": "); var primitiveExpr = member.Initializer as PrimitiveExpression; if (primitiveExpr != null && primitiveExpr.Value is AstType) { this.Write("new " + BridgeTypes.ToJsName((AstType)primitiveExpr.Value, this.Emitter) + "()"); } else { member.Initializer.AcceptVisitor(this.Emitter); } } } } } }