Ejemplo n.º 1
0
        public static int Main(string[] args)
        {
            var trace     = false;
            var show_help = false;
            var options   = new OptionSet {
                { "t|trace-parsing", "Produce a trace of the parse process.", v => trace = v != null },
                { "h|help", "show this message and exit", v => show_help = v != null }
            };

            List <string> files;

            try {
                files = options.Parse(args);
            } catch (OptionException e) {
                Console.Write(AppDomain.CurrentDomain.FriendlyName + ": ");
                Console.WriteLine(e.Message);
                Console.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information.");
                return(1);
            }

            if (show_help)
            {
                Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " files ...");
                Console.WriteLine("Compile a Flabbergast file to native CLR.");
                Console.WriteLine();
                Console.WriteLine("Options:");
                options.WriteOptionDescriptions(Console.Out);
                return(0);
            }
            if (files.Count == 0)
            {
                Console.WriteLine("Perhaps you wish to compile some source files?");
                return(1);
            }
            var collector = new ConsoleCollector();

            foreach (var filename in files)
            {
                var parser = Parser.Open(filename);
                parser.Trace = trace;

                var dll_name      = Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll");
                var type_name     = Regex.Replace("Flabbergast.Library." + Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.') + Path.GetFileNameWithoutExtension(filename), "\\.+", ".");
                var assembly_name = new AssemblyName(type_name)
                {
                    CodeBase = "file://" + Path.GetDirectoryName(filename)
                };
                var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave);
                CompilationUnit.MakeDebuggable(assembly_builder);
                var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true);
                var unit           = new CompilationUnit(module_builder, true);
                var type           = parser.ParseFile(collector, unit, type_name);
                if (type != null)
                {
                    assembly_builder.Save(dll_name);
                }
            }
            return(0);
        }
Ejemplo n.º 2
0
        public DynamicallyCompiledLibraries(ErrorCollector collector)
        {
            this.collector = collector;
            var name             = "DynamicallyCompiledLibraries" + GetHashCode();
            var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run);

            CompilationUnit.MakeDebuggable(assembly_builder);
            var module_builder = assembly_builder.DefineDynamicModule(name, true);

            unit = new CompilationUnit(module_builder, true);
        }
Ejemplo n.º 3
0
        public static int Main(string[] args)
        {
            if (args.Length != 0)
            {
                return(1);
            }

            var known_dlls = new Dictionary <string, bool>();
            var sources    = new List <string>();

            Discover(".", sources, known_dlls);

            var  collector = new ConsoleCollector();
            bool success   = true;

            foreach (var filename in sources)
            {
                var parser = Parser.Open(Path.GetFullPath(filename));

                var dir_prefix = Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.');
                var dll_name   = RemoveBadDots(dir_prefix + "." + Path.GetFileNameWithoutExtension(filename) + ".dll");
                known_dlls.Remove(Path.Combine(".", dll_name));
                known_dlls.Remove(Path.Combine(".", Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll.mdb")));
                var type_name     = RemoveBadDots("Flabbergast.Library." + dir_prefix + "." + Path.GetFileNameWithoutExtension(filename));
                var assembly_name = new AssemblyName(type_name)
                {
                    CodeBase = "file://" + Path.GetDirectoryName(filename)
                };
                var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave);
                CompilationUnit.MakeDebuggable(assembly_builder);
                var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true);
                var unit           = new CompilationUnit(module_builder, true);
                var type           = parser.ParseFile(collector, unit, type_name);
                if (type != null)
                {
                    assembly_builder.Save(dll_name);
                }
                else
                {
                    success = false;
                }
            }
            foreach (var dead in known_dlls.Keys)
            {
                File.Delete(dead);
            }
            return(success ? 0 : 1);
        }