Exemple #1
0
        private static void Generate(Express.ExpressListener listener, string outDir, string outDirTests, ILanguageGenerator generator, ITestGenerator testGenerator)
        {
            var codePath = Path.Combine(outDir, generator.FileName);
            var testPath = Path.Combine(outDirTests, testGenerator.FileName);

            var codeSb = new StringBuilder();
            var testSb = new StringBuilder();

            codeSb.AppendLine(generator.Begin());
            testSb.AppendLine(testGenerator.Begin());
            foreach (var kvp in listener.TypeGraph)
            {
                var td = kvp.Value;
                codeSb.AppendLine(td.ToString());

                // Only write tests for entities.
                var entity = td as Express.Entity;
                if (entity != null)
                {
                    testSb.AppendLine(entity.ToTestString());
                }
            }
            codeSb.AppendLine(generator.End());
            testSb.AppendLine(testGenerator.End());

            File.WriteAllText(codePath, codeSb.ToString());
            File.WriteAllText(testPath, testSb.ToString());
        }
Exemple #2
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("The syntax for the command is:");
                Console.WriteLine("IFC-gen <express schema path> <output directory>");
                return;
            }

            var expressPath = args[0];

            if (!File.Exists(expressPath))
            {
                Console.WriteLine($"The specified express file path, {expressPath}, does not exist.");
                return;
            }

            var outputDir = args[1];

            if (!Directory.Exists(outputDir))
            {
                Console.WriteLine($"The specified output directory, {outputDir}, does not exist.");
                return;
            }

            using (FileStream fs = new FileStream(expressPath, FileMode.Open))
            {
                var input  = new AntlrInputStream(fs);
                var lexer  = new Express.ExpressLexer(input);
                var tokens = new CommonTokenStream(lexer);

                var parser = new Express.ExpressParser(tokens);
                parser.BuildParseTree = true;

                var tree     = parser.schemaDecl();
                var walker   = new ParseTreeWalker();
                var sb       = new StringBuilder();
                var listener = new Express.ExpressListener(sb);
                walker.Walk(listener, tree);

                var outPath = Path.Combine(outputDir, "IFC.cs");
                File.WriteAllText(outPath, sb.ToString());

                // Write tokens to a file for debugging.

                /*var tokenStr = new StringBuilder();
                 * foreach(var t in tokens.GetTokens())
                 * {
                 *      tokenStr.AppendLine(t.ToString());
                 * }
                 * File.WriteAllText("tokens.txt",tokenStr.ToString());*/
            }
        }
Exemple #3
0
        static void Main(string[] args)
        {
            ParseOptions(args);
            if (showHelp)
            {
                return;
            }

            var generators = new List <Tuple <ILanguageGenerator, ITestGenerator> >();

            if (language == "csharp")
            {
                generators.Add(new Tuple <ILanguageGenerator, ITestGenerator>(new CsharpLanguageGenerator(), new CsharpTestGenerator()));
            }
            else if (language == "proto")
            {
                generators.Add(new Tuple <ILanguageGenerator, ITestGenerator>(new ProtobufGenerator(), new ProtobufTestGenerator()));
            }

            using (FileStream fs = new FileStream(expressPath, FileMode.Open))
            {
                var input  = new AntlrInputStream(fs);
                var lexer  = new Express.ExpressLexer(input);
                var tokens = new CommonTokenStream(lexer);

                var parser = new Express.ExpressParser(tokens);
                parser.BuildParseTree = true;

                var tree   = parser.schemaDecl();
                var walker = new ParseTreeWalker();

                var testSb = new StringBuilder();

                foreach (var generator in generators)
                {
                    var listener = new Express.ExpressListener(generator.Item1, generator.Item2);
                    walker.Walk(listener, tree);
                    Generate(listener, outDir, outDirTests, generator.Item1, generator.Item2);
                }

                // Write tokens to a file for debugging.

                /*var tokenStr = new StringBuilder();
                 * foreach(var t in tokens.GetTokens())
                 * {
                 *      tokenStr.AppendLine(t.ToString());
                 * }
                 * File.WriteAllText("tokens.txt",tokenStr.ToString());*/
            }
        }
Exemple #4
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("The syntax for the command is:");
                Console.WriteLine("IFC-gen <express schema path> <output directory>");
                return;
            }

            var expressPath = args[0];

            if (!File.Exists(expressPath))
            {
                Console.WriteLine($"The specified express file path, {expressPath}, does not exist.");
                return;
            }

            var outputDir = args[1];

            if (!Directory.Exists(outputDir))
            {
                Console.WriteLine($"The specified output directory, {outputDir}, does not exist.");
                return;
            }

            using (FileStream fs = new FileStream(expressPath, FileMode.Open))
            {
                var input  = new AntlrInputStream(fs);
                var lexer  = new Express.ExpressLexer(input);
                var tokens = new CommonTokenStream(lexer);

                var parser = new Express.ExpressParser(tokens);
                parser.BuildParseTree = true;

                var tree     = parser.schemaDeclaration();
                var walker   = new ParseTreeWalker();
                var listener = new Express.ExpressListener();
                walker.Walk(listener, tree);

                var sb = new StringBuilder();
                // Write types, excluding selects.
                foreach (var t in listener.Types)
                {
                    sb.Append(t.ToString());
                }

                // Build the inheritance graph by using the string
                // type names in SupertypeOf and SubtypeOf to find
                // the mathing EntityDeclarations.
                foreach (var e in listener.Entities)
                {
                    if (e.SubtypeOf.Any())
                    {
                        e.ParentEntity = listener.Entities.First(ent => ent.Name == e.SubtypeOf.First());
                    }
                    if (e.SupertypeOf.Any())
                    {
                        e.ChildEntities.AddRange(listener.Entities.Where(ent => e.SupertypeOf.Contains(ent.Name)));
                    }

                    // Do a pass over all attributes on the entity, ensuring
                    // that the type info on the attribute has its corresponding entity value;
                    // THIS IS STUPID AND SLOW.
                    foreach (var a in e.Attributes)
                    {
                        a.TypeInfo.Entity = listener.Entities.FirstOrDefault(ent => ent.Name == a.TypeInfo.ValueType);
                    }
                }

                //Write entities.
                foreach (var e in listener.Entities)
                {
                    sb.Append(e.ToString());
                }
                var types =
                    $@"/*
This code was generated by a tool. DO NOT MODIFY this code manually, unless you really know what you are doing.
 */
using System;
using System.Collections.Generic;
				
namespace IFC4
{{
{sb.ToString()}
}}";
                var outPath = Path.Combine(outputDir, "IFC.cs");
                File.WriteAllText(outPath, types);

                var maxSelectParams = listener.Types
                                      .Where(t => t.TypeInfo is Express.SelectInfo)
                                      .Select(t => t.TypeInfo).Cast <Express.SelectInfo>()
                                      .Max(si => si.Values.Count());

                var selectConstructors = new StringBuilder();
                for (var i = 2; i <= maxSelectParams; i++)
                {
                    selectConstructors.AppendLine(WriteSelect(i));
                }
                var selects =
                    $@"/*
/*
This code was generated by a tool. DO NOT MODIFY this code manually, unless you really know what you are doing.
*/
using System.Collections.Generic;

namespace IFC4
{{
	public abstract class Select
	{{
		public dynamic Value {{get;protected set;}}
	}}
	{selectConstructors.ToString()}
}}";
                outPath = Path.Combine(outputDir, "IfcSelect.cs");
                File.WriteAllText(outPath, selects);

                /*var tokenStr = new StringBuilder();
                 * foreach(var t in tokens.GetTokens())
                 * {
                 *      tokenStr.AppendLine(t.ToString());
                 * }
                 * File.WriteAllText("tokens.txt",tokenStr.ToString());*/
            }
        }