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 TypeOOPEmulation EmulateType(JsType type) { return(_prev.EmulateType(type)); }