Example #1
0
        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));
        }
Example #2
0
        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);
        }