コード例 #1
0
 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;
 }
コード例 #2
0
ファイル: JsEmitter.cs プロジェクト: hallvar/Joddes.CS
        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(");
        }
コード例 #3
0
ファイル: JsEmitter.cs プロジェクト: hallvar/Joddes.CS
        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());
        }
コード例 #4
0
ファイル: JsEmitter.cs プロジェクト: hallvar/Joddes.CS
 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);
 }