Ejemplo n.º 1
0
        public IList <JsStatement> Process(IList <JsType> types, IMethod entryPoint)
        {
            var result = new List <JsStatement>();

            result.AddRange(_emulator.GetCodeBeforeFirstType(types));

            var processed = new List <Tuple <JsType, TypeOOPEmulation> >();

            foreach (var t in types)
            {
                try {
                    processed.Add(Tuple.Create(t, _emulator.EmulateType(t)));
                }
                catch (Exception ex) {
                    _errorReporter.Region = t.CSharpTypeDefinition.Region;
                    _errorReporter.InternalError(ex, "Error formatting type " + t.CSharpTypeDefinition.FullName);
                }
            }

            if (processed.Count > 0)
            {
                int phases = processed.Max(x => x.Item2.Phases.Count);
                for (int i = 0; i < phases; i++)
                {
                    var currentPhase = Order(processed.Select(x => Tuple.Create(x.Item1, (x.Item2.Phases.Count > i ? x.Item2.Phases[i] : null) ?? new TypeOOPEmulationPhase(null, null))).ToList());
                    foreach (var c in currentPhase)
                    {
                        result.AddRange(c.Item2.Statements);
                    }
                }
            }

            result.AddRange(_emulator.GetCodeAfterLastType(types));

            result.AddRange(GetStaticInitCode(types));

            if (entryPoint != null)
            {
                result.Add(InvokeEntryPoint(entryPoint));
            }

            return(result);
        }
 public virtual IEnumerable <JsStatement> GetCodeAfterLastType(IEnumerable <JsType> types)
 {
     return(_prev.GetCodeAfterLastType(types));
 }