public static Tuple <Dictionary <string, ResolvedDefinition>, List <string> > Resolve(IEnumerable <Definitions> definitions) { var r = new WebIDLResolver(definitions.SelectMany(d => d.Items).ToList()); return(Tuple.Create(r._resolved, r._errors)); }
private static bool Process(Arguments args) { var parseResult = Parse(args.Sources); if (parseResult.Item2.Count > 0) { foreach (var e in parseResult.Item2) { Console.Error.WriteLine(e); } return(false); } var metadata = MetadataParser.Parse(args.Metadata); if (metadata.Item2.Count > 0) { foreach (var e in metadata.Item2) { Console.Error.WriteLine(e); } return(false); } var resolvedDefinitionsAndErrors = WebIDLResolver.Resolve(parseResult.Item1); if (resolvedDefinitionsAndErrors.Item2.Count > 0) { foreach (var e in resolvedDefinitionsAndErrors.Item2) { Console.Error.WriteLine(e); } return(false); } var model = Converter.BuildCSharpModel(resolvedDefinitionsAndErrors.Item1, metadata.Item1); if (model.Item2.Count > 0) { foreach (var e in model.Item2) { Console.Error.WriteLine(e); } return(false); } var generated = model.Item1.Select(t => Tuple.Create(t.Namespace, t.EntityDeclaration.Name, Formatter.Format(t))).ToList(); var errors = new ConcurrentStack <string>(); Parallel.ForEach(generated, c => { var rootLength = args.RootNamespaces.DefaultIfEmpty("").Max(r => c.Item1 == r ? c.Item1.Length : (c.Item1.StartsWith(r + ".") ? r.Length + 1 : 0)); string filepath = Path.Combine(args.OutputDirectory, c.Item1.Substring(rootLength).Replace('.', Path.DirectorySeparatorChar), c.Item2 + ".cs"); try { Directory.CreateDirectory(Path.GetDirectoryName(filepath)); File.WriteAllText(filepath, c.Item3, Encoding.UTF8); } catch (IOException ex) { errors.Push("Error writing file " + filepath + ": " + ex.Message); } }); if (errors.Count > 0) { foreach (var e in model.Item2) { Console.Error.WriteLine(e); } return(false); } return(true); }