public override object VisitTypeDeclaration (TypeDeclaration node, object data) { if (CurrentType != null) { Console.WriteLine ("Nested types are not supported"); //throw CreateException (node, "Nested types are not supported"); } if (IsHiddenClass (node)) return null; if ((node.Modifier & Modifiers.Partial) > 0) { Console.WriteLine ("Partial classes are not supported: " + node); //throw CreateException (node, "Partial classes are not supported"); } CurrentType = new JsTypeInfo { Name = GenericsHelper.GetScriptName (node), ClassType = node.Type, Namespace = Namespace, Usings = new HashSet<string> (Usings) }; Usings = new HashSet<string> (); CurrentType.IsStatic = node.Type == ClassType.Enum || HasModifier (node.Modifier, Modifiers.Static); if (node.Type != ClassType.Interface) node.AcceptChildren (this, null); if (CachedCctor != null) { if (!ProcessCctor ()) throw CreateException (node, "Static constructor may only contain primitive or array static field initializations"); CachedCctor = null; } CollectedTypes.Add (CurrentType); CurrentType = null; return null; }
public void EmitInterface (JsTypeInfo type) { //EmitUsings (); var td = KnownTypes[GenericsHelper.GetScriptFullName (type.FullName)]; Write (");"); NewLine (); NewLine(); Write ("JDS.defineInterface('", type.FullName, "'"); if (td.HasInterfaces) { Write (", function() { return ["); foreach (var i in td.Interfaces) { Output.Insert (0, "\"" + GenericsHelper.GetScriptFullName (i.FullName) + "\",\n "); Write (GenericsHelper.GetScriptFullName (i.FullName)); Write (", "); } Write ("];}"); } Write (");"); Output.Insert(0, "JDS.using("); }
public void Emit (JsTypeInfo type) { List<string> names; TypeInfo = type; Console.WriteLine ("Emitting {0}", TypeInfo.FullName); //EmitUsings (); if (type.ClassType == ClassType.Interface) { EmitInterface (type); return; } EmitCtor (); if (TypeInfo.InstanceMethods.Count () > 0 || TypeInfo.InstanceProperties.Count () > 0) { Write ("_.prototype = {"); NewLine (); Indent (); Write ("constructor: _"); bool first = false; var types = TypeInfo.InstanceIndexers.Keys; //types.Sort (); foreach (var t in types) { if (first) { first = false; } else { Write (","); NewLine (); NewLine (); } TypeInfo.InstanceIndexers[t].AcceptVisitor (this, null); } names = new List<string> (TypeInfo.InstanceProperties.Keys); names.Sort (); foreach (var name in names) { if (first) { first = false; } else { Write (","); NewLine (); NewLine (); } //Write (name, ": "); TypeInfo.InstanceProperties[name].AcceptVisitor (this, null); } names = new List<string> (TypeInfo.InstanceEvents.Keys); names.Sort (); foreach (var name in names) { if (first) { first = false; } else { Write (","); NewLine (); NewLine (); } //Write (name, ": "); TypeInfo.InstanceEvents[name].AcceptVisitor (this, null); } names = new List<string> (type.InstanceMethods.Keys); foreach (var name in names) { if (first) { first = false; } else { Write (","); NewLine (); NewLine (); } VisitMethodDeclaration (type.InstanceMethods[name], null); } Outdent (); NewLine (); Write ("};"); NewLine (); NewLine (); } if (type.StaticFields.Count > 0) { names = new List<string> (type.StaticFields.Keys); foreach (var name in names) { Write ("_.", name, " = "); type.StaticFields[name].Key.AcceptVisitor (this, null); Write (";"); NewLine (); } NewLine (); } if (type.StaticProperties.Count > 0) { names = new List<string> (TypeInfo.StaticProperties.Keys); names.Sort (); foreach (var name in names) { Write ("Object.defineProperty(_, '", name, "', {"); NewLine (); Indent (); TypeInfo.StaticProperties[name].AcceptVisitor (this, null); Outdent (); NewLine (); Write ("});"); NewLine (); } } names = new List<string> (type.StaticMethods.Keys); names.Sort (); foreach (var name in names) { VisitMethodDeclaration (type.StaticMethods[name], null); } var baseType = GetBaseTypeDefinition (); if (baseType != null && !UsedTypes.ContainsKey (GenericsHelper.GetScriptFullName (baseType.FullName))) { UsedTypes[GenericsHelper.GetScriptFullName (baseType.FullName)] = baseType; } var hasUsings = false; foreach (var k in UsedTypes.Keys.OrderBy (s => s)) { if (!IsHidden (UsedTypes[k]) && UsedTypes[k].FullName != TypeInfo.FullName) { if (!hasUsings) { hasUsings = true; Output.Insert (0, "\n"); Output.Insert (0, "\n"); Output.Insert (0, ");"); } else { Output.Insert (0, "\n"); Output.Insert (0, ","); } Output.Insert (0, "\"" + k + "\""); //Write (k); } } if (hasUsings) { Output.Insert (0, "JDS.using("); } //Console.WriteLine("::::::::::USEDTYPES: {0}", UsedTypes.Keys.ToArray().ToString()); }
int CompareTypeInfos (JsTypeInfo x, JsTypeInfo y) { if (x == y) return 0; if (x.FullName == RUNTIME_HELPER_NAME) return -1; if (y.FullName == RUNTIME_HELPER_NAME) return 1; return Comparer.Default.Compare (x.FullName, y.FullName); }