public static bool HasTypeParameters(IType type) { if (type.Kind == TypeKind.TypeParameter) { return(true); } if (type.TypeArguments.Count > 0) { foreach (var typeArgument in type.TypeArguments) { var typeDef = typeArgument.GetDefinition(); if (typeDef != null && Helpers.IsIgnoreGeneric(typeDef)) { continue; } if (Helpers.HasTypeParameters(typeArgument)) { return(true); } } } return(false); }
public static bool IsTypeParameterType(IType type) { var typeDef = type.GetDefinition(); if (typeDef != null && Helpers.IsIgnoreGeneric(typeDef)) { return(false); } return(type.TypeArguments.Any(Helpers.HasTypeParameters)); }
public static bool IsIgnoreGeneric(MethodDeclaration method, IEmitter emitter) { MemberResolveResult resolveResult = emitter.Resolver.ResolveNode(method, emitter) as MemberResolveResult; if (resolveResult != null && resolveResult.Member != null) { return(Helpers.IsIgnoreGeneric(resolveResult.Member, emitter)); } return(false); }
public static string TranslateTypeReference(AstType astType, IEmitter emitter) { var composedType = astType as ComposedType; if (composedType != null && composedType.ArraySpecifiers != null && composedType.ArraySpecifiers.Count > 0) { return("Array"); } var simpleType = astType as SimpleType; if (simpleType != null && simpleType.Identifier == "dynamic") { return("Object"); } string type = emitter.ResolveType(Helpers.GetScriptName(astType, true), astType); if (String.IsNullOrEmpty(type)) { throw (Exception)emitter.CreateException(astType, "Cannot resolve type " + astType.ToString()); } var name = type; if (emitter.TypeDefinitions.ContainsKey(name)) { name = emitter.ShortenTypeName(type); } if (simpleType != null && simpleType.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(simpleType, emitter)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in simpleType.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(Helpers.TranslateTypeReference(typeArg, emitter)); } sb.Append(")"); name = sb.ToString(); } return(name); }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false) { if (type.Kind == TypeKind.Array) { return("Array"); } if (type.Kind == TypeKind.Dynamic) { return("Object"); } if (NullableType.IsNullable(type)) { return(BridgeTypes.ToJsName(NullableType.GetUnderlyingType(type), emitter)); } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); string name = BridgeTypes.ConvertName(type.FullName); bool isCustomName = false; if (bridgeType != null) { name = BridgeTypes.AddModule(name, bridgeType, out isCustomName); } if (!isCustomName && type.TypeArguments.Count > 0) { name += "$" + type.TypeArguments.Count; } if (!asDefinition && type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToJsName(typeArg, emitter)); } sb.Append(")"); name = sb.ToString(); } return(name); }
public static bool NeedCreateAlias(MemberResolveResult rr) { if (rr == null || rr.Member.ImplementedInterfaceMembers.Count == 0) { return(false); } if (rr.Member.IsExplicitInterfaceImplementation) { var explicitInterfaceMember = rr.Member.ImplementedInterfaceMembers.First(); var typeDef = explicitInterfaceMember.DeclaringTypeDefinition; var type = explicitInterfaceMember.DeclaringType; return(typeDef != null && !Helpers.IsIgnoreGeneric(typeDef) && type != null && type.TypeArguments.Count > 0 && Helpers.IsTypeParameterType(type)); } return(true); }
public static bool IsIgnoreGeneric(IType type, IEmitter emitter, bool allowInTypeScript = false) { var attr = type.GetDefinition().Attributes.FirstOrDefault(a => a.AttributeType.FullName == "Bridge.IgnoreGenericAttribute"); if (attr != null) { var member = allowInTypeScript ? attr.NamedArguments.FirstOrDefault(arg => arg.Key.Name == "AllowInTypeScript").Value : null; if (member != null) { return(!(bool)member.ConstantValue); } return(true); } return(type.DeclaringType != null && Helpers.IsIgnoreGeneric(type.DeclaringType, emitter, allowInTypeScript)); }
public static bool ExcludeTypeParameterForDefinition(IMember member) { if (member.ImplementedInterfaceMembers.Count == 0) { return(false); } if (member.ImplementedInterfaceMembers.Any(im => { var typeDef = im.DeclaringTypeDefinition; var type = im.DeclaringType; return(typeDef != null && !Helpers.IsIgnoreGeneric(typeDef) && type != null && type.TypeArguments.Count > 0 && Helpers.IsTypeParameterType(type)); })) { return(true); } return(false); }
public static bool NeedCreateAlias(MemberResolveResult rr) { if (rr == null || rr.Member.ImplementedInterfaceMembers.Count == 0) { return false; } if (rr.Member.ImplementedInterfaceMembers.Count > 0 && rr.Member.ImplementedInterfaceMembers.Any(im => im.DeclaringTypeDefinition.TypeParameters.Any(tp => tp.Variance != VarianceModifier.Invariant))) { return true; } if (rr.Member.IsExplicitInterfaceImplementation) { var explicitInterfaceMember = rr.Member.ImplementedInterfaceMembers.First(); var typeDef = explicitInterfaceMember.DeclaringTypeDefinition; var type = explicitInterfaceMember.DeclaringType; return typeDef != null && !Helpers.IsIgnoreGeneric(typeDef) && type != null && type.TypeArguments.Count > 0 && Helpers.IsTypeParameterType(type); } return true; }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false, bool isAlias = false, bool skipMethodTypeParam = false) { var itypeDef = type.GetDefinition(); if (itypeDef != null) { string globalTarget = BridgeTypes.GetGlobalTarget(itypeDef, null); if (globalTarget != null) { return(globalTarget); } } if (itypeDef != null && itypeDef.Attributes.Any(a => a.AttributeType.FullName == "Bridge.NonScriptableAttribute")) { throw new EmitterException(emitter.Translator.EmitNode, "Type " + type.FullName + " is marked as not usable from script"); } if (type.Kind == TypeKind.Array) { return(JS.Types.ARRAY); } if (type.Kind == TypeKind.Delegate) { return(JS.Types.FUNCTION); } if (type.Kind == TypeKind.Dynamic) { return(JS.Types.Object.NAME); } /*if (NullableType.IsNullable(type)) * { * return BridgeTypes.ToJsName(NullableType.GetUnderlyingType(type), emitter, asDefinition, excludens, isAlias, skipMethodTypeParam); * }*/ if (type is ByReferenceType) { return(BridgeTypes.ToJsName(((ByReferenceType)type).ElementType, emitter, asDefinition, excludens, isAlias, skipMethodTypeParam)); } if (type.Kind == TypeKind.Anonymous) { var at = type as AnonymousType; if (at != null && emitter.AnonymousTypes.ContainsKey(at)) { return(emitter.AnonymousTypes[at].Name); } else { return("Object"); } } var typeParam = type as ITypeParameter; if (typeParam != null) { if (skipMethodTypeParam && (typeParam.OwnerType == SymbolKind.Method) || Helpers.IsIgnoreGeneric(typeParam.Owner, emitter)) { return("Object"); } } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); var name = excludens ? "" : type.Namespace; var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = BridgeTypes.ToJsName(typeDef.DeclaringType, emitter, true); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(typeDef.Name); } else { if (type.DeclaringType != null && !excludens) { name = BridgeTypes.ToJsName(type.DeclaringType, emitter, true); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null) { name = BridgeTypes.AddModule(name, bridgeType, out isCustomName); } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } if (isAlias) { name = OverloadsCollection.NormalizeInterfaceName(name); } if (type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter)) { if (isAlias) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append(JS.Vars.D); bool isStr = false; foreach (var typeArg in type.TypeArguments) { if (sb.ToString().EndsWith(")")) { sb.Append(" + \""); } if (needComma && !sb.ToString().EndsWith(JS.Vars.D.ToString())) { sb.Append(JS.Vars.D); } needComma = true; bool needGet = typeArg.Kind == TypeKind.TypeParameter && !asDefinition; if (needGet) { if (!isStr) { sb.Insert(0, "\""); isStr = true; } sb.Append("\" + " + JS.Types.Bridge.GET_TYPE_ALIAS + "("); } var typeArgName = BridgeTypes.ToJsName(typeArg, emitter, false, false, true, skipMethodTypeParam); if (!needGet && typeArgName.StartsWith("\"")) { sb.Append(typeArgName.Substring(1)); if (!isStr) { isStr = true; sb.Insert(0, "\""); } } else { sb.Append(typeArgName); } if (needGet) { sb.Append(")"); } } if (isStr && sb.Length >= 1) { var sbEnd = sb.ToString(sb.Length - 1, 1); if (!sbEnd.EndsWith(")") && !sbEnd.EndsWith("\"")) { sb.Append("\""); } } name = sb.ToString(); } else if (!asDefinition) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToJsName(typeArg, emitter, skipMethodTypeParam: skipMethodTypeParam)); } sb.Append(")"); name = sb.ToString(); } } return(name); }
public static bool IsIgnoreGeneric(IType type, IEmitter emitter) { return(emitter.Validator.HasAttribute(type.GetDefinition().Attributes, "Bridge.IgnoreGenericAttribute") || type.DeclaringType != null && Helpers.IsIgnoreGeneric(type.DeclaringType, emitter)); }
public static bool IsIgnoreGeneric(ITypeDefinition type) { return(type.Attributes.Any(a => a.AttributeType.FullName == "Bridge.IgnoreGenericAttribute") || type.DeclaringTypeDefinition != null && Helpers.IsIgnoreGeneric(type.DeclaringTypeDefinition)); }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false) { if (type.Kind == TypeKind.Array) { return("Array"); } if (type.Kind == TypeKind.Dynamic) { return("Object"); } if (NullableType.IsNullable(type)) { return(BridgeTypes.ToJsName(NullableType.GetUnderlyingType(type), emitter)); } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); var name = excludens ? "" : type.Namespace; var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(typeDef); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(typeDef.Name); } else { if (type.DeclaringType != null && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(type); if (type.DeclaringType.TypeArguments.Count > 0) { name += "$" + type.TypeArguments.Count; } } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null) { name = BridgeTypes.AddModule(name, bridgeType, out isCustomName); } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += "$" + type.TypeArguments.Count; } if (!asDefinition && type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToJsName(typeArg, emitter)); } sb.Append(")"); name = sb.ToString(); } return(name); }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false, ToNameTypeEnum kind = ToNameTypeEnum.None) { if (NullableType.IsNullable(type)) { return(BridgeTypes.ToJsName(NullableType.GetUnderlyingType(type), emitter)); } if (type.Kind == TypeKind.Delegate) { return("System.Delegate"); } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); var name = excludens ? "" : XmlMetaMaker.GetNamespace(bridgeType != null ? bridgeType.Type.Namespace : type.Namespace); var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(typeDef); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(typeDef.Name); } else { if (type.DeclaringType != null && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(type); if (type.DeclaringType.TypeArguments.Count > 0) { name += "_" + type.TypeArguments.Count; } } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null) { name = BridgeTypes.AddModule(name, bridgeType, out isCustomName); } if (kind == ToNameTypeEnum.None) { int pos = name.LastIndexOf('.'); if (pos != -1) { string prefix = name.Substring(0, pos); if (prefix != "System") { TransformCtx.CurUsingNamespaces.Add(prefix); string newPrefix = prefix.Replace(".", ""); if (newPrefix == prefix) { newPrefix = '_' + newPrefix; } name = newPrefix + name.Substring(pos); } } } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += "_" + type.TypeArguments.Count; } if (!asDefinition && type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(", "); } needComma = true; sb.Append(BridgeTypes.ToNameIgnoreEnum(typeArg, emitter, kind)); } sb.Append(")"); name = sb.ToString(); } else if (type.Kind == TypeKind.Array) { name += "(" + BridgeTypes.ToNameIgnoreEnum(((ICSharpCode.NRefactory.TypeSystem.ArrayType)type).ElementType, emitter) + ")"; } return(name); }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false, bool isAlias = false, bool skipMethodTypeParam = false, bool removeScope = true, bool nomodule = false, bool ignoreLiteralName = true, bool ignoreVirtual = false) { var itypeDef = type.GetDefinition(); BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); if (itypeDef != null) { string globalTarget = BridgeTypes.GetGlobalTarget(itypeDef, null, removeScope); if (globalTarget != null) { if (bridgeType != null && !nomodule) { bool customName; globalTarget = BridgeTypes.AddModule(globalTarget, bridgeType, excludens, out customName); } return(globalTarget); } } if (itypeDef != null && itypeDef.Attributes.Any(a => a.AttributeType.FullName == "Bridge.NonScriptableAttribute")) { throw new EmitterException(emitter.Translator.EmitNode, "Type " + type.FullName + " is marked as not usable from script"); } if (type.Kind == TypeKind.Array) { var arrayType = type as ArrayType; if (arrayType != null && arrayType.ElementType != null) { var elementAlias = BridgeTypes.ToJsName(arrayType.ElementType, emitter, asDefinition, excludens, isAlias, skipMethodTypeParam); if (isAlias) { return($"{elementAlias}$Array{(arrayType.Dimensions > 1 ? "$" + arrayType.Dimensions : "")}"); } if (arrayType.Dimensions > 1) { return(string.Format(JS.Types.System.Array.TYPE + "({0}, {1})", elementAlias, arrayType.Dimensions)); } return(string.Format(JS.Types.System.Array.TYPE + "({0})", elementAlias)); } return(JS.Types.ARRAY); } if (type.Kind == TypeKind.Delegate) { return(JS.Types.FUNCTION); } if (type.Kind == TypeKind.Dynamic) { return(JS.Types.System.Object.NAME); } if (type is ByReferenceType) { return(BridgeTypes.ToJsName(((ByReferenceType)type).ElementType, emitter, asDefinition, excludens, isAlias, skipMethodTypeParam)); } if (ignoreLiteralName) { var isObjectLiteral = itypeDef != null && emitter.Validator.IsObjectLiteral(itypeDef); var isPlainMode = isObjectLiteral && emitter.Validator.GetObjectCreateMode(emitter.GetTypeDefinition(type)) == 0; if (isPlainMode) { return("System.Object"); } } if (type.Kind == TypeKind.Anonymous) { var at = type as AnonymousType; if (at != null && emitter.AnonymousTypes.ContainsKey(at)) { return(emitter.AnonymousTypes[at].Name); } else { return(JS.Types.System.Object.NAME); } } var typeParam = type as ITypeParameter; if (typeParam != null) { if (skipMethodTypeParam && (typeParam.OwnerType == SymbolKind.Method) || Helpers.IsIgnoreGeneric(typeParam.Owner, emitter)) { return(JS.Types.System.Object.NAME); } } var name = excludens ? "" : type.Namespace; var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = BridgeTypes.ToJsName(typeDef.DeclaringType, emitter, true, ignoreVirtual: true); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(emitter.GetTypeName(itypeDef, typeDef)); } else { if (type.DeclaringType != null && !excludens) { name = BridgeTypes.ToJsName(type.DeclaringType, emitter, true, ignoreVirtual: true); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null && !nomodule) { name = BridgeTypes.AddModule(name, bridgeType, excludens, out isCustomName); } var tDef = type.GetDefinition(); var skipSuffix = tDef != null && tDef.ParentAssembly.AssemblyName != CS.NS.BRIDGE && emitter.Validator.IsExternalType(tDef) && Helpers.IsIgnoreGeneric(tDef); if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0 && !skipSuffix) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } var genericSuffix = "$" + type.TypeArguments.Count; if (skipSuffix && !isCustomName && type.TypeArguments.Count > 0 && name.EndsWith(genericSuffix)) { name = name.Substring(0, name.Length - genericSuffix.Length); } if (isAlias) { name = OverloadsCollection.NormalizeInterfaceName(name); } if (type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter) && !asDefinition) { if (isAlias) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append(JS.Vars.D); bool isStr = false; foreach (var typeArg in type.TypeArguments) { if (sb.ToString().EndsWith(")")) { sb.Append(" + \""); } if (needComma && !sb.ToString().EndsWith(JS.Vars.D.ToString())) { sb.Append(JS.Vars.D); } needComma = true; bool needGet = typeArg.Kind == TypeKind.TypeParameter && !asDefinition; if (needGet) { if (!isStr) { sb.Insert(0, "\""); isStr = true; } sb.Append("\" + " + JS.Types.Bridge.GET_TYPE_ALIAS + "("); } var typeArgName = BridgeTypes.ToJsName(typeArg, emitter, asDefinition, false, true, skipMethodTypeParam, ignoreVirtual: true); if (!needGet && typeArgName.StartsWith("\"")) { var tName = typeArgName.Substring(1); if (tName.EndsWith("\"")) { tName = tName.Remove(tName.Length - 1); } sb.Append(tName); if (!isStr) { isStr = true; sb.Insert(0, "\""); } } else { sb.Append(typeArgName); } if (needGet) { sb.Append(")"); } } if (isStr && sb.Length >= 1) { var sbEnd = sb.ToString(sb.Length - 1, 1); if (!sbEnd.EndsWith(")") && !sbEnd.EndsWith("\"")) { sb.Append("\""); } } name = sb.ToString(); } else { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToJsName(typeArg, emitter, skipMethodTypeParam: skipMethodTypeParam)); } sb.Append(")"); name = sb.ToString(); } } if (!ignoreVirtual && !isAlias) { var td = type.GetDefinition(); if (td != null && emitter.Validator.IsVirtualType(td)) { string fnName = td.Kind == TypeKind.Interface ? JS.Types.Bridge.GET_INTERFACE : JS.Types.Bridge.GET_CLASS; name = fnName + "(\"" + name + "\")"; } else if (!isAlias && itypeDef != null && itypeDef.Kind == TypeKind.Interface) { var externalInterface = emitter.Validator.IsExternalInterface(itypeDef); if (externalInterface != null && externalInterface.IsVirtual) { name = JS.Types.Bridge.GET_INTERFACE + "(\"" + name + "\")"; } } } return(name); }
public static string ToTypeScriptName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false, bool ignoreDependency = false, List <string> guard = null) { if (type.Kind == TypeKind.Delegate) { if (guard == null) { guard = new List <string>(); } if (guard.Contains(type.FullName)) { return("Function"); } guard.Add(type.FullName); var method = type.GetDelegateInvokeMethod(); StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("("); var last = method.Parameters.LastOrDefault(); foreach (var p in method.Parameters) { var ptype = BridgeTypes.ToTypeScriptName(p.Type, emitter, guard: guard); if (p.IsOut || p.IsRef) { ptype = "{v: " + ptype + "}"; } sb.Append(p.Name + ": " + ptype); if (p != last) { sb.Append(", "); } } sb.Append(")"); sb.Append(": "); sb.Append(BridgeTypes.ToTypeScriptName(method.ReturnType, emitter, guard: guard)); sb.Append("}"); guard.Remove(type.FullName); return(sb.ToString()); } var oname = ObjectLiteralSignature(type, emitter); if (oname != null) { return(oname); } if (type.IsKnownType(KnownTypeCode.String)) { return("string"); } if (type.IsKnownType(KnownTypeCode.Boolean)) { return("boolean"); } if (type.IsKnownType(KnownTypeCode.Void)) { return("void"); } if (type.IsKnownType(KnownTypeCode.Byte) || type.IsKnownType(KnownTypeCode.Char) || type.IsKnownType(KnownTypeCode.Decimal) || type.IsKnownType(KnownTypeCode.Double) || type.IsKnownType(KnownTypeCode.Int16) || type.IsKnownType(KnownTypeCode.Int32) || type.IsKnownType(KnownTypeCode.Int64) || type.IsKnownType(KnownTypeCode.SByte) || type.IsKnownType(KnownTypeCode.Single) || type.IsKnownType(KnownTypeCode.UInt16) || type.IsKnownType(KnownTypeCode.UInt32) || type.IsKnownType(KnownTypeCode.UInt64)) { return("number"); } if (type.Kind == TypeKind.Array) { ICSharpCode.NRefactory.TypeSystem.ArrayType arrayType = (ICSharpCode.NRefactory.TypeSystem.ArrayType)type; return(BridgeTypes.ToTypeScriptName(arrayType.ElementType, emitter, asDefinition, excludens, guard: guard) + "[]"); } if (type.Kind == TypeKind.Dynamic) { return("any"); } if (type.Kind == TypeKind.Enum && type.DeclaringType != null && !excludens) { return("number"); } if (NullableType.IsNullable(type)) { return(BridgeTypes.ToTypeScriptName(NullableType.GetUnderlyingType(type), emitter, asDefinition, excludens, guard: guard)); } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); //string name = BridgeTypes.ConvertName(excludens ? type.Name : type.FullName); var name = excludens ? "" : type.Namespace; var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(emitter, typeDef); } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(emitter.GetTypeName(bridgeType.Type.GetDefinition(), typeDef)); } else { if (type.DeclaringType != null && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(emitter, type); if (type.DeclaringType.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null) { if (!ignoreDependency && emitter.AssemblyInfo.OutputBy != OutputBy.Project && bridgeType.TypeInfo != null && bridgeType.TypeInfo.Namespace != emitter.TypeInfo.Namespace) { var info = BridgeTypes.GetNamespaceFilename(bridgeType.TypeInfo, emitter); var ns = info.Item1; var fileName = info.Item2; if (!emitter.CurrentDependencies.Any(d => d.DependencyName == fileName)) { emitter.CurrentDependencies.Add(new ModuleDependency() { DependencyName = fileName }); } } name = BridgeTypes.AddModule(name, bridgeType, excludens, out isCustomName); } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } if (!asDefinition && type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter, true)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("<"); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToTypeScriptName(typeArg, emitter, asDefinition, excludens, guard: guard)); } sb.Append(">"); name = sb.ToString(); } return(name); }
public static string ToJsName(IType type, IEmitter emitter, bool asDefinition = false, bool excludens = false) { if (type.Kind == TypeKind.Array) { return("Array"); } if (type.Kind == TypeKind.Delegate) { return("Function"); } if (type.Kind == TypeKind.Dynamic) { return("Object"); } if (NullableType.IsNullable(type)) { return(BridgeTypes.ToJsName(NullableType.GetUnderlyingType(type), emitter)); } BridgeType bridgeType = emitter.BridgeTypes.Get(type, true); var name = excludens ? "" : type.Namespace; var hasTypeDef = bridgeType != null && bridgeType.TypeDefinition != null; if (hasTypeDef) { var typeDef = bridgeType.TypeDefinition; if (typeDef.IsNested && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(typeDef); } //don't use parameter count for generics, as they cause problems for Jint var typeName = typeDef.Name; if (typeDef.HasGenericParameters) { typeName = type.Name; } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(typeName); } else { if (type.DeclaringType != null && !excludens) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.GetParentNames(type); if (type.DeclaringType.TypeArguments.Count > 0) { name += "$" + type.TypeArguments.Count; } } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + BridgeTypes.ConvertName(type.Name); } bool isCustomName = false; if (bridgeType != null) { name = BridgeTypes.AddModule(name, bridgeType, out isCustomName); } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += "$" + type.TypeArguments.Count; } if (!asDefinition && type.TypeArguments.Count > 0 && !Helpers.IsIgnoreGeneric(type, emitter)) { StringBuilder sb = new StringBuilder(name); bool needComma = false; sb.Append("("); foreach (var typeArg in type.TypeArguments) { if (needComma) { sb.Append(","); } needComma = true; sb.Append(BridgeTypes.ToJsName(typeArg, emitter)); } sb.Append(")"); //jint requires parens around the generic classes to get the constructor, then call it name = "(" + sb.ToString() + ")"; } return(name); }