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")); }
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); }
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); }
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); }
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")); }
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")); }
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); }
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())); } }
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())); } }
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")); }
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")); }
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); }
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")); }
// // 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; }
//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; }
// // 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); }
// // 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); }