private static void TransformProgram(WholeProgram wholeProgram, string transformedBinariesPath, string reportsPath, MethodRemoval methodRemoval, TargetProfile profile) { System.IO.Directory.CreateDirectory(transformedBinariesPath); StubMethodBodyEmitter stubEmitter = GetStubMethodBodyEmitterForProfile(profile, wholeProgram); foreach (IAssembly assembly in wholeProgram.AllAssemblies()) { if (AssemblyShouldBeRewritten(assembly)) { if (assembly.PublicKeyToken.Count() > 0) { Console.WriteLine("Warning: rewriting assembly with a public key token. {0}", assembly); } string outputBinary = transformedBinariesPath + @"\" + Path.GetFileName(assembly.Location); var copy = new MetadataDeepCopier(wholeProgram.Host()).Copy(assembly); DocumentationCommentDefinitionIdStringMap idMap = new DocumentationCommentDefinitionIdStringMap(new IAssembly[] { copy }); AssemblyReport assemblyReport = AssemblyReport.CreateAssemblyReportFromPath(copy, reportsPath, idMap); stopwatch.Start(); RewriteBinary(copy, assemblyReport, wholeProgram.Host(), outputBinary, methodRemoval, stubEmitter); stopwatch.Start(); } else { //Console.WriteLine("Skipping rewrite of of assembly {0}", assembly.Name.Value); } } }
public void TestCreateEntryPointListFromString() { // Test parsing whitespace separated entrypoint string. string source = @" namespace Ns { class Foo { static void A() {} static void B() {} static void C() {} } } "; ConstructWholeProgramForSources(new string[] { source }, (compilerResults, wholeProgram) => { DocumentationCommentDefinitionIdStringMap idStringMap = new DocumentationCommentDefinitionIdStringMap(wholeProgram.AllAssemblies()); IEnumerable<IMethodReference> emptyList = idStringMap.CreateEntryPointListFromString(""); Assert.AreEqual(0, emptyList.Count()); IEnumerable<IMethodReference> singletonList = idStringMap.CreateEntryPointListFromString("M:Ns.Foo.A"); Assert.AreEqual(1, singletonList.Count()); Assert.AreEqual("A", singletonList.ElementAt(0).Name.Value); IEnumerable<IMethodReference> singletonListWithTerminatingNewline = idStringMap.CreateEntryPointListFromString("M:Ns.Foo.A\n"); Assert.AreEqual(1, singletonListWithTerminatingNewline.Count()); Assert.AreEqual("A", singletonListWithTerminatingNewline.ElementAt(0).Name.Value); IEnumerable<IMethodReference> newlineSeparatedList = idStringMap.CreateEntryPointListFromString("M:Ns.Foo.A\nM:Ns.Foo.B\nM:Ns.Foo.C\n"); Assert.AreEqual(3, newlineSeparatedList.Count()); Assert.AreEqual("A", newlineSeparatedList.ElementAt(0).Name.Value); Assert.AreEqual("B", newlineSeparatedList.ElementAt(1).Name.Value); Assert.AreEqual("C", newlineSeparatedList.ElementAt(2).Name.Value); IEnumerable<IMethodReference> spaceSeparatedList = idStringMap.CreateEntryPointListFromString("M:Ns.Foo.A M:Ns.Foo.B M:Ns.Foo.C"); Assert.AreEqual(3, newlineSeparatedList.Count()); Assert.AreEqual("A", newlineSeparatedList.ElementAt(0).Name.Value); Assert.AreEqual("B", newlineSeparatedList.ElementAt(1).Name.Value); Assert.AreEqual("C", newlineSeparatedList.ElementAt(2).Name.Value); }); }
public void TestStaticMethodIDStrings() { // Tests for static method IDs. These are methods // that can be actual entry points string source = @" namespace Ns { class Foo { static void Main(string[] args) {} static void Main() {} static void MyMain(int i) {} static int OtherEntry() { return 0;} } class Bar { static void Main(string[] args) { } } } "; ConstructWholeProgramForSources(new string[] { source }, (compilerResults, wholeProgram) => { DocumentationCommentDefinitionIdStringMap idStringMap = new DocumentationCommentDefinitionIdStringMap(wholeProgram.AllAssemblies()); IMethodReference Ns_Foo_Main_strings = idStringMap.GetMethodDefinitionsWithIdentifier("M:Ns.Foo.Main(System.String[])").First(); Assert.IsNotNull(Ns_Foo_Main_strings); Assert.AreEqual("Main", Ns_Foo_Main_strings.Name.Value); Assert.AreEqual("Foo", ((INamedTypeReference)Ns_Foo_Main_strings.ContainingType).Name.Value); Assert.AreEqual(1, Ns_Foo_Main_strings.ParameterCount); IMethodReference Ns_Foo_Main_void = idStringMap.GetMethodDefinitionsWithIdentifier("M:Ns.Foo.Main").First(); Assert.IsNotNull(Ns_Foo_Main_void); Assert.AreEqual("Main", Ns_Foo_Main_void.Name.Value); Assert.AreEqual("Foo", ((INamedTypeReference)Ns_Foo_Main_void.ContainingType).Name.Value); Assert.AreEqual(0, Ns_Foo_Main_void.ParameterCount); IMethodReference Ns_Foo_MyMain_int = idStringMap.GetMethodDefinitionsWithIdentifier("M:Ns.Foo.MyMain(System.Int32)").First(); Assert.IsNotNull(Ns_Foo_MyMain_int); Assert.AreEqual("MyMain", Ns_Foo_MyMain_int.Name.Value); Assert.AreEqual("Foo", ((INamedTypeReference)Ns_Foo_MyMain_int.ContainingType).Name.Value); Assert.AreEqual(1, Ns_Foo_MyMain_int.ParameterCount); IMethodReference Ns_Foo_OtherEntry_void = idStringMap.GetMethodDefinitionsWithIdentifier("M:Ns.Foo.OtherEntry").First(); Assert.IsNotNull(Ns_Foo_OtherEntry_void); Assert.AreEqual("OtherEntry", Ns_Foo_OtherEntry_void.Name.Value); Assert.AreEqual("Foo", ((INamedTypeReference)Ns_Foo_OtherEntry_void.ContainingType).Name.Value); Assert.AreEqual(0, Ns_Foo_OtherEntry_void.ParameterCount); IMethodReference Ns_Bar_Main_strings = idStringMap.GetMethodDefinitionsWithIdentifier("M:Ns.Bar.Main(System.String[])").First(); Assert.IsNotNull(Ns_Bar_Main_strings); Assert.AreEqual("Main", Ns_Bar_Main_strings.Name.Value); Assert.AreEqual("Bar", ((INamedTypeReference)Ns_Bar_Main_strings.ContainingType).Name.Value); Assert.AreEqual(1, Ns_Bar_Main_strings.ParameterCount); }); }