public void ShouldProcessRequestWithDeleteStatus()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var          loader  = new StaticLoader(mockAttributesLoader.Object);
            const string content = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class FooBar\n" +
                                   "    {\n" +
                                   "        [Step(\"goodbye\",\"adieu\", \"sayonara\")]\n" +
                                   "        public void farewell()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";

            loader.LoadStepsFromText(content, "Foo.cs");

            var processor = new CacheFileProcessor(loader);
            var request   = new CacheFileRequest
            {
                FilePath = "Foo.cs",
                Status   = CacheFileRequest.Types.FileStatus.Deleted
            };

            Assert.True(loader.GetStepRegistry().ContainsStep("goodbye"));

            processor.Process(request);

            Assert.False(loader.GetStepRegistry().ContainsStep("goodbye"));
        }
Esempio n. 2
0
        public void ShouldProcessMessage()
        {
            var loader = new StaticLoader();

            var processor = new CacheFileProcessor(loader);
            var request   = new Message
            {
                CacheFileRequest = new CacheFileRequest
                {
                    Content = "using Gauge.CSharp.Lib.Attributes;\n" +
                              "namespace foobar\n" +
                              "{\n" +
                              "    public class FooBar\n" +
                              "    {\n" +
                              "        [Step(\"goodbye\",\"adieu\", \"sayonara\")]\n" +
                              "        public void farewell()\n" +
                              "        {\n" +
                              "        }\n" +
                              "    }\n" +
                              "}\n",
                    FilePath = "Foo.cs",
                    Status   = CacheFileRequest.Types.FileStatus.Opened
                }
            };

            processor.Process(request);

            Assert.True(loader.GetStepRegistry().ContainsStep("goodbye"));
        }
        public void ShouldProcessRequestForAliasSteps()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var          loader  = new StaticLoader(mockAttributesLoader.Object);
            const string content = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class FooBar\n" +
                                   "    {\n" +
                                   "        [Step(\"goodbye\",\"sayonara\")]\n" +
                                   "        public void farewell()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";
            const string file = "Foo.cs";

            loader.LoadStepsFromText(content, file);

            var processor = new StepPositionsProcessor(loader.GetStepRegistry());
            var request   = new Message {
                StepPositionsRequest = new StepPositionsRequest {
                    FilePath = "Foo.cs"
                }
            };

            var response = processor.Process(request).StepPositionsResponse;

            Assert.AreEqual(response.StepPositions.Count, 2);
        }
Esempio n. 4
0
        public void ShouldProcessRequest()
        {
            var          loader  = new StaticLoader();
            const string content = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class FooBar\n" +
                                   "    {\n" +
                                   "        [Step(\"goodbye\")]\n" +
                                   "        public void farewell()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";
            const string file = "Foo.cs";

            loader.LoadStepsFromText(content, file);

            var processor = new StepPositionsProcessor(loader.GetStepRegistry());
            var request   = new Message {
                StepPositionsRequest = new StepPositionsRequest {
                    FilePath = "Foo.cs"
                }
            };

            var response = processor.Process(request).StepPositionsResponse;

            Assert.AreEqual(response.StepPositions.Count, 1);
            Assert.AreEqual(response.StepPositions.First().StepValue, "goodbye");
            Assert.AreEqual(response.StepPositions.First().Span.Start, 6);
        }
Esempio n. 5
0
        public void ShouldNotReloadStepOfRemovedFile()
        {
            Environment.SetEnvironmentVariable("GAUGE_PROJECT_ROOT", Directory.GetCurrentDirectory());
            var mockAttributesLoader = new Mock <IAttributesLoader>();
            var csprojText           = XDocument.Parse("<Compile Remove=\"foo.cs\" />");
            var attributes           = csprojText.Descendants().Attributes("Remove");
            var list = new List <XAttribute>();

            list.AddRange(attributes);
            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(list);
            var loader = new StaticLoader(mockAttributesLoader.Object);

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class FooBar\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";
            const string fileName = @"foo.cs";
            var          filePath = Path.Combine(Utils.GaugeProjectRoot, fileName);

            loader.ReloadSteps(text, filePath);
            Assert.False(loader.GetStepRegistry().ContainsStep("hello"));
            Environment.SetEnvironmentVariable("GAUGE_PROJECT_ROOT", null);
        }
Esempio n. 6
0
        public void ShouldAddStepsFromGivenContent()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var mockDirectoryWrapper = new Mock <IDirectoryWrapper>();

            mockDirectoryWrapper.Setup(x => x.EnumerateFiles(dummyProjectRoot, "*.cs", SearchOption.AllDirectories)).Returns(Enumerable.Empty <string>);
            var loader = new StaticLoader(mockAttributesLoader.Object, mockDirectoryWrapper.Object);

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class FooBar\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";
            const string fileName = @"foo.cs";

            loader.LoadStepsFromText(text, fileName);
            Assert.True(loader.GetStepRegistry().ContainsStep("hello"));
        }
Esempio n. 7
0
        public void ShouldAddAliasesSteps()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var          loader = new StaticLoader(mockAttributesLoader.Object);
            const string text   = "using Gauge.CSharp.Lib.Attributes;\n" +
                                  "namespace foobar\n" +
                                  "{\n" +
                                  "    public class FooBar\n" +
                                  "    {\n" +
                                  "        [Step(\"goodbye\",\"adieu\", \"sayonara\")]\n" +
                                  "        public void farewell()\n" +
                                  "        {\n" +
                                  "        }\n" +
                                  "    }\n" +
                                  "}\n";
            const string fileName = @"foo.cs";

            loader.LoadStepsFromText(text, fileName);
            var registry = loader.GetStepRegistry();

            Assert.True(registry.ContainsStep("goodbye"));
            Assert.True(registry.ContainsStep("adieu"));
            Assert.True(registry.ContainsStep("sayonara"));
        }
Esempio n. 8
0
            public void ShouldNotLoadWhenCustomBuildPathIsSet()
            {
                var mockAttributesLoader = new Mock <IAttributesLoader>();

                mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Verifiable();
                var mockDirectoryWrapper = new Mock <IDirectoryWrapper>();

                mockDirectoryWrapper.Setup(x => x.EnumerateFiles(It.IsAny <string>(), "*.cs", SearchOption.AllDirectories));

                var loader = new StaticLoader(mockAttributesLoader.Object, mockDirectoryWrapper.Object);

                mockAttributesLoader.Verify(x => x.GetRemovedAttributes(), Times.Never());
                Environment.SetEnvironmentVariable("GAUGE_CUSTOM_BUILD_PATH", old);
            }
Esempio n. 9
0
        public void ShouldLoadStepsWithPosition()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var mockDirectoryWrapper = new Mock <IDirectoryWrapper>();

            mockDirectoryWrapper.Setup(x => x.EnumerateFiles(dummyProjectRoot, "*.cs", SearchOption.AllDirectories)).Returns(Enumerable.Empty <string>);
            var          loader = new StaticLoader(mockAttributesLoader.Object, mockDirectoryWrapper.Object);
            const string file1  = @"Foo.cs";

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class Foo\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";

            loader.LoadStepsFromText(text, file1);

            const string file2   = @"Bar.cs";
            const string newText = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class Bar\n" +
                                   "    {\n" +
                                   "        [Step(\"hola\")]\n" +
                                   "        public void hola()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";

            loader.ReloadSteps(newText, file2);

            var positions = loader.GetStepRegistry().GetStepPositions(file1).ToList();

            Assert.AreEqual(1, positions.Count);
            Assert.AreEqual(6, positions.First().Span.Start);
            Assert.AreEqual(9, positions.First().Span.End);
        }
        public static IGaugeCommand GetExecutor(string phase)
        {
            switch (phase)
            {
            case "--init":
                return(new SetupCommand());

            default:
                return(new StartCommand(() =>
                {
                    var loader = new StaticLoader();
                    loader.LoadImplementations();
                    var messageProcessorFactory = new MessageProcessorFactory(loader.GetStepRegistry());
                    return new GaugeListener(messageProcessorFactory);
                },
                                        () => new GaugeProjectBuilder()));
            }
        }
Esempio n. 11
0
        public static IGaugeCommand GetExecutor(string phase)
        {
            switch (phase)
            {
            case "--init":
                return(new SetupCommand());

            default:
                return(new StartCommand(() =>
                {
                    var attributesLoader = new AttributesLoader();
                    var loader = new StaticLoader(attributesLoader);
                    loader.LoadImplementations();
                    return new GaugeListener(loader);
                },
                                        () => new GaugeProjectBuilder()));
            }
        }
Esempio n. 12
0
        public void ShouldRemoveSteps()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var          loader = new StaticLoader(mockAttributesLoader.Object);
            const string file1  = @"Foo.cs";

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class Foo\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";

            loader.LoadStepsFromText(text, file1);

            const string file2   = @"Bar.cs";
            const string newText = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class Bar\n" +
                                   "    {\n" +
                                   "        [Step(\"hola\")]\n" +
                                   "        public void hola()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";

            loader.ReloadSteps(newText, file2);

            Assert.True(loader.GetStepRegistry().ContainsStep("hello"));
            Assert.True(loader.GetStepRegistry().ContainsStep("hola"));

            loader.RemoveSteps(file2);

            Assert.False(loader.GetStepRegistry().ContainsStep("hola"));
        }
Esempio n. 13
0
        public void ShouldAddStepsFromGivenContent()
        {
            var          loader = new StaticLoader();
            const string text   = "using Gauge.CSharp.Lib.Attributes;\n" +
                                  "namespace foobar\n" +
                                  "{\n" +
                                  "    public class FooBar\n" +
                                  "    {\n" +
                                  "        [Step(\"hello\")]\n" +
                                  "        public void hello()\n" +
                                  "        {\n" +
                                  "        }\n" +
                                  "    }\n" +
                                  "}\n";
            const string fileName = @"foo.cs";

            loader.LoadStepsFromText(text, fileName);
            Assert.True(loader.GetStepRegistry().ContainsStep("hello"));
        }
Esempio n. 14
0
        public void ShouldLoadStepsWithPositin()
        {
            var          loader = new StaticLoader();
            const string file1  = @"Foo.cs";

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class Foo\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";

            loader.LoadStepsFromText(text, file1);

            const string file2   = @"Bar.cs";
            const string newText = "using Gauge.CSharp.Lib.Attributes;\n" +
                                   "namespace foobar\n" +
                                   "{\n" +
                                   "    public class Bar\n" +
                                   "    {\n" +
                                   "        [Step(\"hola\")]\n" +
                                   "        public void hola()\n" +
                                   "        {\n" +
                                   "        }\n" +
                                   "    }\n" +
                                   "}\n";

            loader.ReloadSteps(newText, file2);

            var positions = loader.GetStepRegistry().GetStepPositions(file1).ToList();

            Assert.AreEqual(1, positions.Count);
            Assert.AreEqual(6, positions.First().Span.Start);
            Assert.AreEqual(9, positions.First().Span.End);
        }
Esempio n. 15
0
        public void ShouldAddStepsFromGivenContent()
        {
            var mockAttributesLoader = new Mock <IAttributesLoader>();

            mockAttributesLoader.Setup(x => x.GetRemovedAttributes()).Returns(new List <XAttribute>());
            var loader = new StaticLoader(mockAttributesLoader.Object);

            const string text = "using Gauge.CSharp.Lib.Attributes;\n" +
                                "namespace foobar\n" +
                                "{\n" +
                                "    public class FooBar\n" +
                                "    {\n" +
                                "        [Step(\"hello\")]\n" +
                                "        public void hello()\n" +
                                "        {\n" +
                                "        }\n" +
                                "    }\n" +
                                "}\n";
            const string fileName = @"foo.cs";

            loader.LoadStepsFromText(text, fileName);
            Assert.True(loader.GetStepRegistry().ContainsStep("hello"));
        }
Esempio n. 16
0
		//
		// Main compilation method
		//
		public bool Compile ()
		{
			var settings = ctx.Settings;

			//
			// If we are an exe, require a source file for the entry point or
			// if there is nothing to put in the assembly, and we are not a library
			//
			if (settings.FirstSourceFile == null &&
				((settings.Target == Target.Exe || settings.Target == Target.WinExe || settings.Target == Target.Module) ||
				settings.Resources == null)) {
				Report.Error (2008, "No files to compile were specified");
				return false;
			}

			if (settings.Platform == Platform.AnyCPU32Preferred && (settings.Target == Target.Library || settings.Target == Target.Module)) {
				Report.Error (4023, "Platform option `anycpu32bitpreferred' is valid only for executables");
				return false;
			}

			TimeReporter tr = new TimeReporter (settings.Timestamps);
			ctx.TimeReporter = tr;
			tr.StartTotal ();

			var module = new ModuleContainer (ctx);
			RootContext.ToplevelTypes = module;

			tr.Start (TimeReporter.TimerType.ParseTotal);
			Parse (module);
			tr.Stop (TimeReporter.TimerType.ParseTotal);

			if (Report.Errors > 0)
				return false;

			if (settings.TokenizeOnly || settings.ParseOnly) {
				tr.StopTotal ();
				tr.ShowStats ();
				return true;
			}

			var output_file = settings.OutputFile;
			string output_file_name;
			if (output_file == null) {
				var source_file = settings.FirstSourceFile;

				if (source_file == null) {
					Report.Error (1562, "If no source files are specified you must specify the output file with -out:");
					return false;
				}

				output_file_name = source_file.Name;
				int pos = output_file_name.LastIndexOf ('.');

				if (pos > 0)
					output_file_name = output_file_name.Substring (0, pos);
				
				output_file_name += settings.TargetExt;
				output_file = output_file_name;
			} else {
				output_file_name = Path.GetFileName (output_file);

				if (string.IsNullOrEmpty (Path.GetFileNameWithoutExtension (output_file_name)) ||
					output_file_name.IndexOfAny (Path.GetInvalidFileNameChars ()) >= 0) {
					Report.Error (2021, "Output file name is not valid");
					return false;
				}
			}

#if STATIC
			var importer = new StaticImporter (module);
			var references_loader = new StaticLoader (importer, ctx);

			tr.Start (TimeReporter.TimerType.AssemblyBuilderSetup);
			var assembly = new AssemblyDefinitionStatic (module, references_loader, output_file_name, output_file);
			assembly.Create (references_loader.Domain);
			tr.Stop (TimeReporter.TimerType.AssemblyBuilderSetup);

			// Create compiler types first even before any referenced
			// assembly is loaded to allow forward referenced types from
			// loaded assembly into compiled builder to be resolved
			// correctly
			tr.Start (TimeReporter.TimerType.CreateTypeTotal);
			module.CreateContainer ();
			importer.AddCompiledAssembly (assembly);
			tr.Stop (TimeReporter.TimerType.CreateTypeTotal);

			references_loader.LoadReferences (module);

			tr.Start (TimeReporter.TimerType.PredefinedTypesInit);
			if (!ctx.BuiltinTypes.CheckDefinitions (module))
				return false;

			tr.Stop (TimeReporter.TimerType.PredefinedTypesInit);

			references_loader.LoadModules (assembly, module.GlobalRootNamespace);
#else
			var assembly = new AssemblyDefinitionDynamic (module, output_file_name, output_file);
			module.SetDeclaringAssembly (assembly);

			var importer = new ReflectionImporter (module, ctx.BuiltinTypes);
			assembly.Importer = importer;

			var loader = new DynamicLoader (importer, ctx);
			loader.LoadReferences (module);

			if (!ctx.BuiltinTypes.CheckDefinitions (module))
				return false;

			if (!assembly.Create (AppDomain.CurrentDomain, AssemblyBuilderAccess.Save))
				return false;

			module.CreateContainer ();

			loader.LoadModules (assembly, module.GlobalRootNamespace);
#endif
			module.InitializePredefinedTypes ();

			tr.Start (TimeReporter.TimerType.ModuleDefinitionTotal);
			module.Define ();
			tr.Stop (TimeReporter.TimerType.ModuleDefinitionTotal);

			if (Report.Errors > 0)
				return false;

			if (settings.DocumentationFile != null) {
				var doc = new DocumentationBuilder (module);
				doc.OutputDocComment (output_file, settings.DocumentationFile);
			}

			assembly.Resolve ();
			
			if (Report.Errors > 0)
				return false;


			tr.Start (TimeReporter.TimerType.EmitTotal);
			assembly.Emit ();
			tr.Stop (TimeReporter.TimerType.EmitTotal);

			if (Report.Errors > 0){
				return false;
			}

			tr.Start (TimeReporter.TimerType.CloseTypes);
			module.CloseContainer ();
			tr.Stop (TimeReporter.TimerType.CloseTypes);

			tr.Start (TimeReporter.TimerType.Resouces);
			if (!settings.WriteMetadataOnly)
				assembly.EmbedResources ();
			tr.Stop (TimeReporter.TimerType.Resouces);

			if (Report.Errors > 0)
				return false;

			assembly.Save ();

#if STATIC
			references_loader.Dispose ();
#endif
			tr.StopTotal ();
			tr.ShowStats ();

			return Report.Errors == 0;
		}
Esempio n. 17
0
        //public static string GetPackageFlags (string packages, Report report)
        //{
        //    ProcessStartInfo pi = new ProcessStartInfo ();
        //    pi.FileName = "pkg-config";
        //    pi.RedirectStandardOutput = true;
        //    pi.UseShellExecute = false;
        //    pi.Arguments = "--libs " + packages;
        //    Process p = null;
        //    try {
        //        p = Process.Start (pi);
        //    } catch (Exception e) {
        //        if (report == null)
        //            throw;
        //        report.Error (-27, "Couldn't run pkg-config: " + e.Message);
        //        return null;
        //    }
        //    if (p.StandardOutput == null) {
        //        if (report == null)
        //            throw new ApplicationException ("Specified package did not return any information");
        //        report.Warning (-27, 1, "Specified package did not return any information");
        //        p.Close ();
        //        return null;
        //    }
        //    string pkgout = p.StandardOutput.ReadToEnd ();
        //    p.WaitForExit ();
        //    if (p.ExitCode != 0) {
        //        if (report == null)
        //            throw new ApplicationException (pkgout);
        //        report.Error (-27, "Error running pkg-config. Check the above output.");
        //        p.Close ();
        //        return null;
        //    }
        //    p.Close ();
        //    return pkgout;
        //}
        //
        // Main compilation method
        //
        public bool Compile()
        {
            var settings = ctx.Settings;

            //
            // If we are an exe, require a source file for the entry point or
            // if there is nothing to put in the assembly, and we are not a library
            //
            if (Location.FirstFile == null &&
                ((settings.Target == Target.Exe || settings.Target == Target.WinExe || settings.Target == Target.Module) ||
                settings.Resources == null)) {
                Report.Error (2008, "No files to compile were specified");
                return false;
            }

            TimeReporter tr = new TimeReporter (settings.Timestamps);
            ctx.TimeReporter = tr;
            tr.StartTotal ();

            var module = new ModuleContainer (ctx);
            RootContext.ToplevelTypes = module;

            tr.Start (TimeReporter.TimerType.ParseTotal);
            Parse (module);
            tr.Stop (TimeReporter.TimerType.ParseTotal);

            if (Report.Errors > 0)
                return false;

            if (settings.TokenizeOnly || settings.ParseOnly)
                return true;

            if (RootContext.ToplevelTypes.NamespaceEntry != null)
                throw new InternalErrorException ("who set it?");

            var output_file = settings.OutputFile;
            string output_file_name;
            if (output_file == null) {
                output_file_name = Location.FirstFile;

                if (output_file_name == null) {
                    Report.Error (1562, "If no source files are specified you must specify the output file with -out:");
                    return false;
                }

                int pos = output_file_name.LastIndexOf ('.');

                if (pos > 0)
                    output_file_name = output_file_name.Substring (0, pos);

                output_file_name += settings.TargetExt;
                output_file = output_file_name;
            } else {
                output_file_name = Path.GetFileName (output_file);
            }

            #if STATIC
            var importer = new StaticImporter (module);
            var references_loader = new StaticLoader (importer, ctx);

            tr.Start (TimeReporter.TimerType.AssemblyBuilderSetup);
            var assembly = new AssemblyDefinitionStatic (module, references_loader, output_file_name, output_file);
            assembly.Create (references_loader.Domain);
            tr.Stop (TimeReporter.TimerType.AssemblyBuilderSetup);

            // Create compiler types first even before any referenced
            // assembly is loaded to allow forward referenced types from
            // loaded assembly into compiled builder to be resolved
            // correctly
            tr.Start (TimeReporter.TimerType.CreateTypeTotal);
            module.CreateType ();
            importer.AddCompiledAssembly (assembly);
            tr.Stop (TimeReporter.TimerType.CreateTypeTotal);

            references_loader.LoadReferences (module);

            tr.Start (TimeReporter.TimerType.PredefinedTypesInit);
            if (!ctx.BuildinTypes.CheckDefinitions (module))
                return false;

            tr.Stop (TimeReporter.TimerType.PredefinedTypesInit);

            references_loader.LoadModules (assembly, module.GlobalRootNamespace);
            #else
            var assembly = new AssemblyDefinitionDynamic (module, output_file_name, output_file);
            module.SetDeclaringAssembly (assembly);

            var importer = new ReflectionImporter (module, ctx.BuildinTypes);
            assembly.Importer = importer;

            var loader = new DynamicLoader (importer, ctx);
            loader.LoadReferences (module);

            if (!ctx.BuildinTypes.CheckDefinitions (module))
                return false;

            if (!assembly.Create (AppDomain.CurrentDomain, AssemblyBuilderAccess.Run))
                return false;

            module.CreateType ();

            loader.LoadModules (assembly, module.GlobalRootNamespace);
            #endif
            tr.Start (TimeReporter.TimerType.ModuleDefinitionTotal);
            module.Define ();
            tr.Stop (TimeReporter.TimerType.ModuleDefinitionTotal);

            if (Report.Errors > 0)
                return false;

            //if (settings.Documentation != null &&
            //    !settings.Documentation.OutputDocComment (
            //        output_file, Report))
            //    return false;

            //
            // Verify using aliases now
            //
            tr.Start (TimeReporter.TimerType.UsingVerification);
            NamespaceEntry.VerifyAllUsing ();
            tr.Stop (TimeReporter.TimerType.UsingVerification);

            if (Report.Errors > 0){
                return false;
            }

            assembly.Resolve ();

            if (Report.Errors > 0)
                return false;

            tr.Start (TimeReporter.TimerType.EmitTotal);
            assembly.Emit ();
            tr.Stop (TimeReporter.TimerType.EmitTotal);

            if (Report.Errors > 0){
                return false;
            }

            tr.Start (TimeReporter.TimerType.CloseTypes);
            module.CloseType ();
            tr.Stop (TimeReporter.TimerType.CloseTypes);

            tr.Start (TimeReporter.TimerType.Resouces);
            assembly.EmbedResources ();
            tr.Stop (TimeReporter.TimerType.Resouces);

            if (Report.Errors > 0)
                return false;

            assembly.Save ();

            #if STATIC
            references_loader.Dispose ();
            #endif
            tr.StopTotal ();
            tr.ShowStats ();

            return Report.Errors == 0;
        }
Esempio n. 18
0
        //
        // Main compilation method
        //
        public bool Compile()
        {
#if NETSTANDARD2_0
            throw new PlatformNotSupportedException();
#else
            var settings = ctx.Settings;

            //
            // If we are an exe, require a source file for the entry point or
            // if there is nothing to put in the assembly, and we are not a library
            //
            if (settings.FirstSourceFile == null &&
                ((settings.Target == Target.Exe || settings.Target == Target.WinExe || settings.Target == Target.Module) ||
                 settings.Resources == null))
            {
                Report.Error(2008, "No files to compile were specified");
                return(false);
            }

            if (settings.Platform == Platform.AnyCPU32Preferred && (settings.Target == Target.Library || settings.Target == Target.Module))
            {
                Report.Error(4023, "Platform option `anycpu32bitpreferred' is valid only for executables");
                return(false);
            }

            TimeReporter tr = new TimeReporter(settings.Timestamps);
            ctx.TimeReporter = tr;
            tr.StartTotal();

            var module = new ModuleContainer(ctx);
            RootContext.ToplevelTypes = module;

            tr.Start(TimeReporter.TimerType.ParseTotal);
            Parse(module);
            tr.Stop(TimeReporter.TimerType.ParseTotal);

            if (Report.Errors > 0)
            {
                return(false);
            }

            if (settings.TokenizeOnly || settings.ParseOnly)
            {
                tr.StopTotal();
                tr.ShowStats();
                return(true);
            }

            var    output_file = settings.OutputFile;
            string output_file_name;
            if (output_file == null)
            {
                var source_file = settings.FirstSourceFile;

                if (source_file == null)
                {
                    Report.Error(1562, "If no source files are specified you must specify the output file with -out:");
                    return(false);
                }

                output_file_name = source_file.Name;
                int pos = output_file_name.LastIndexOf('.');

                if (pos > 0)
                {
                    output_file_name = output_file_name.Substring(0, pos);
                }

                output_file_name += settings.TargetExt;
                output_file       = output_file_name;
            }
            else
            {
                output_file_name = Path.GetFileName(output_file);

                if (string.IsNullOrEmpty(Path.GetFileNameWithoutExtension(output_file_name)) ||
                    output_file_name.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
                {
                    Report.Error(2021, "Output file name is not valid");
                    return(false);
                }
            }

#if STATIC
            var importer          = new StaticImporter(module);
            var references_loader = new StaticLoader(importer, ctx);

            tr.Start(TimeReporter.TimerType.AssemblyBuilderSetup);
            var assembly = new AssemblyDefinitionStatic(module, references_loader, output_file_name, output_file);
            assembly.Create(references_loader.Domain);
            tr.Stop(TimeReporter.TimerType.AssemblyBuilderSetup);

            // Create compiler types first even before any referenced
            // assembly is loaded to allow forward referenced types from
            // loaded assembly into compiled builder to be resolved
            // correctly
            tr.Start(TimeReporter.TimerType.CreateTypeTotal);
            module.CreateContainer();
            importer.AddCompiledAssembly(assembly);
            references_loader.CompiledAssembly = assembly;
            tr.Stop(TimeReporter.TimerType.CreateTypeTotal);

            references_loader.LoadReferences(module);

            tr.Start(TimeReporter.TimerType.PredefinedTypesInit);
            if (!ctx.BuiltinTypes.CheckDefinitions(module))
            {
                return(false);
            }

            tr.Stop(TimeReporter.TimerType.PredefinedTypesInit);

            references_loader.LoadModules(assembly, module.GlobalRootNamespace);
#else
            var assembly = new AssemblyDefinitionDynamic(module, output_file_name, output_file);
            module.SetDeclaringAssembly(assembly);

            var importer = new ReflectionImporter(module, ctx.BuiltinTypes);
            assembly.Importer = importer;

            var loader = new DynamicLoader(importer, ctx);
            loader.LoadReferences(module);

            if (!ctx.BuiltinTypes.CheckDefinitions(module))
            {
                return(false);
            }

            if (!assembly.Create(AppDomain.CurrentDomain, AssemblyBuilderAccess.Save))
            {
                return(false);
            }

            module.CreateContainer();

            loader.LoadModules(assembly, module.GlobalRootNamespace);
#endif
            module.InitializePredefinedTypes();

            tr.Start(TimeReporter.TimerType.ModuleDefinitionTotal);
            module.Define();
            tr.Stop(TimeReporter.TimerType.ModuleDefinitionTotal);

            if (Report.Errors > 0)
            {
                return(false);
            }

            if (settings.DocumentationFile != null)
            {
                var doc = new DocumentationBuilder(module);
                doc.OutputDocComment(output_file, settings.DocumentationFile);
            }

            assembly.Resolve();

            if (Report.Errors > 0)
            {
                return(false);
            }


            tr.Start(TimeReporter.TimerType.EmitTotal);
            assembly.Emit();
            tr.Stop(TimeReporter.TimerType.EmitTotal);

            if (Report.Errors > 0)
            {
                return(false);
            }

            tr.Start(TimeReporter.TimerType.CloseTypes);
            module.CloseContainer();
            tr.Stop(TimeReporter.TimerType.CloseTypes);

            tr.Start(TimeReporter.TimerType.Resouces);
            if (!settings.WriteMetadataOnly)
            {
                assembly.EmbedResources();
            }
            tr.Stop(TimeReporter.TimerType.Resouces);

            if (Report.Errors > 0)
            {
                return(false);
            }

            assembly.Save();

#if STATIC
            references_loader.Dispose();
#endif
            tr.StopTotal();
            tr.ShowStats();

            return(Report.Errors == 0);
        }
Esempio n. 19
0
		//
		// Main compilation method
		//
		public bool Compile ()
		{
			var module = new ModuleContainer (ctx);
			RootContext.ToplevelTypes = module;

			if (timestamps) {
				stopwatch = Stopwatch.StartNew ();
				first_time = DateTime.Now;
			}

			Parse (module);
			ShowTime ("Parsing source files");

			if (Report.Errors > 0)
				return false;

			if (RootContext.TokenizeOnly || RootContext.ParseOnly)
				return true;

			if (RootContext.ToplevelTypes.NamespaceEntry != null)
				throw new InternalErrorException ("who set it?");

			//
			// Quick hack
			//
			var output_file = RootContext.OutputFile;
			string output_file_name;
			if (output_file == null) {
				if (first_source == null) {
					Report.Error (1562, "If no source files are specified you must specify the output file with -out:");
					return false;
				}

				int pos = first_source.LastIndexOf ('.');

				if (pos > 0)
					output_file = first_source.Substring (0, pos) + RootContext.TargetExt;
				else
					output_file = first_source + RootContext.TargetExt;

				output_file_name = output_file;
			} else {
				output_file_name = Path.GetFileName (output_file);
			}

			//
			// Load assemblies required
			//
			if (timestamps)
				stopwatch = Stopwatch.StartNew ();

#if STATIC
			var assembly = new AssemblyDefinitionStatic (module, output_file_name, output_file);
			module.SetDeclaringAssembly (assembly);

			var importer = new StaticImporter ();
			assembly.Importer = importer;

			var loader = new StaticLoader (importer, ctx);
			loader.LoadReferences (module);

			ShowTime ("Imporing referenced assemblies");

			if (!ctx.BuildinTypes.CheckDefinitions (module))
				return false;

			ShowTime ("Initializing predefined types");

			if (!assembly.Create (loader))
				return false;

			// System.Object was not loaded, use compiled assembly as corlib
			if (loader.Corlib == null)
				loader.Corlib = assembly.Builder;

			loader.LoadModules (assembly, module.GlobalRootNamespace);
#else
			var assembly = new AssemblyDefinitionDynamic (module, output_file_name, output_file);
			module.SetDeclaringAssembly (assembly);

			var importer = new ReflectionImporter (ctx.BuildinTypes);
			assembly.Importer = importer;

			var loader = new DynamicLoader (importer, ctx);
			loader.LoadReferences (module);

			ShowTime ("Imporing referenced assemblies");

			if (!ctx.BuildinTypes.CheckDefinitions (module))
				return false;

			ShowTime ("Initializing predefined types");

			if (!assembly.Create (AppDomain.CurrentDomain, AssemblyBuilderAccess.Save))
				return false;

			loader.LoadModules (assembly, module.GlobalRootNamespace);
#endif
			module.Define ();

			ShowTime ("Types definition");

			if (Report.Errors > 0)
				return false;

			if (Report.Errors == 0 &&
				RootContext.Documentation != null &&
				!RootContext.Documentation.OutputDocComment (
					output_file, Report))
				return false;

			//
			// Verify using aliases now
			//
			NamespaceEntry.VerifyAllUsing ();
			
			if (Report.Errors > 0){
				return false;
			}

			assembly.Resolve ();
			
			if (Report.Errors > 0)
				return false;
			
			//
			// The code generator
			//
			if (timestamps)
				stopwatch = Stopwatch.StartNew ();

			assembly.Emit ();

			ShowTime ("Resolving and emitting members blocks");

			if (Report.Errors > 0){
				return false;
			}

			module.CloseType ();

			ShowTime ("Closing types");

			if (timestamps)
				stopwatch = Stopwatch.StartNew ();

			assembly.EmbedResources ();
			ShowTime ("Embedding resources");

			if (Report.Errors > 0)
				return false;

			if (timestamps)
				stopwatch = Stopwatch.StartNew ();
			
			assembly.Save ();

#if STATIC
			loader.Dispose ();
#endif

			ShowTime ("Saving output assembly");

			ShowTotalTime ("Total");

			Timer.ShowTimers ();

			return (Report.Errors == 0);
		}