From a3fcb21f9221e89a237d08a73ea6d0f24357643f Mon Sep 17 00:00:00 2001 From: Tobias Ibounig Date: Wed, 26 Jun 2013 17:15:23 +0200 Subject: [PATCH 1/7] refactored Profiler to work with NewNR --- SharpDevelop.sln | 31 ++++ .../src/MSpecTestClass.cs | 5 + .../src/MSpecTestMember.cs | 5 + .../src/MSpecTestProject.cs | 5 + .../Controller/Profiler.Controller.csproj | 5 +- .../AddIn/ICSharpCode.Profiler.AddIn.addin | 2 +- .../Frontend/AddIn/Profiler.AddIn.csproj | 11 +- .../AddIn/Src/Commands/DomMenuCommand.cs | 23 +-- .../AddIn/Src/Commands/FindReferences.cs | 7 +- .../AddIn/Src/Commands/GoToDefinition.cs | 13 +- .../AddIn/Src/Commands/ProfileExecutable.cs | 3 +- .../Commands/RunTestWithProfilerCommand.cs | 16 +- .../Src/Dialogs/ProfileExecutableForm.xaml.cs | 2 +- .../Profiler/Frontend/AddIn/Src/Extensions.cs | 5 +- .../AddIn/Src/OptionPanels/OptionWrapper.cs | 3 +- .../AddIn/Src/ProfilerProcessRunner.cs | 139 ++++++++++++++++++ .../Frontend/AddIn/Src/ProfilerRunner.cs | 25 +++- .../Frontend/AddIn/Src/ProfilerTestRunner.cs | 112 ++++++++++---- .../AddIn/Src/Views/ProfilerDisplayBinding.cs | 12 +- .../AddIn/Src/Views/ProfilerView.xaml.cs | 18 +-- .../Frontend/AddIn/Src/Views/WpfViewer.cs | 1 + .../Controls/Profiler.Controls.csproj | 5 +- .../X64Converter/Profiler.X64Converter.csproj | 12 +- .../Analysis/Profiler/X64Converter/Program.cs | 135 ++++++++--------- .../Analysis/UnitTesting/Model/ITest.cs | 5 + .../Analysis/UnitTesting/Model/TestBase.cs | 3 + .../UnitTesting/Model/TestNamespace.cs | 10 ++ .../UnitTesting/Model/TestSolution.cs | 9 ++ .../UnitTesting/NUnit/NUnitTestClass.cs | 9 ++ .../UnitTesting/NUnit/NUnitTestMethod.cs | 11 ++ .../UnitTesting/NUnit/NUnitTestProject.cs | 12 +- .../TestRunner/TestExecutionOptions.cs | 3 + .../TestProcessRunnerBaseContext.cs | 2 +- 33 files changed, 500 insertions(+), 159 deletions(-) create mode 100644 src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerProcessRunner.cs diff --git a/SharpDevelop.sln b/SharpDevelop.sln index d9a9fa8200..e62f738de6 100644 --- a/SharpDevelop.sln +++ b/SharpDevelop.sln @@ -171,6 +171,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineSpecifications", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeQuality", "src\AddIns\Analysis\CodeQuality\CodeQuality.csproj", "{D1DF9C2D-3A5E-4985-ACA4-648C604DB562}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiler", "Profiler", "{E9BF2761-031F-4CDC-A7E6-F66F3B347311}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controller", "src\AddIns\Analysis\Profiler\Controller\Profiler.Controller.csproj", "{D788789A-4D43-42B9-B0F7-CB2CA761372B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.AddIn", "src\AddIns\Analysis\Profiler\Frontend\AddIn\Profiler.AddIn.csproj", "{2F5FBF6E-E9DD-48C0-A209-7241FE488FDF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.X64Converter", "src\AddIns\Analysis\Profiler\X64Converter\Profiler.X64Converter.csproj", "{600D7F63-DACE-4933-BE8C-B51A948A86D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controls", "src\AddIns\Analysis\Profiler\Frontend\Controls\Profiler.Controls.csproj", "{B063078F-17D2-4B0C-A01C-DBF440F1C24D}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "src\AddIns\Debugger\Debugger.Core\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}" @@ -473,6 +483,22 @@ Global {3DF4060F-5EE0-41CF-8096-F27355FD5511}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DF4060F-5EE0-41CF-8096-F27355FD5511}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DF4060F-5EE0-41CF-8096-F27355FD5511}.Release|Any CPU.Build.0 = Release|Any CPU + {D788789A-4D43-42B9-B0F7-CB2CA761372B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D788789A-4D43-42B9-B0F7-CB2CA761372B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D788789A-4D43-42B9-B0F7-CB2CA761372B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D788789A-4D43-42B9-B0F7-CB2CA761372B}.Release|Any CPU.Build.0 = Release|Any CPU + {2F5FBF6E-E9DD-48C0-A209-7241FE488FDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F5FBF6E-E9DD-48C0-A209-7241FE488FDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F5FBF6E-E9DD-48C0-A209-7241FE488FDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F5FBF6E-E9DD-48C0-A209-7241FE488FDF}.Release|Any CPU.Build.0 = Release|Any CPU + {600D7F63-DACE-4933-BE8C-B51A948A86D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {600D7F63-DACE-4933-BE8C-B51A948A86D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {600D7F63-DACE-4933-BE8C-B51A948A86D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {600D7F63-DACE-4933-BE8C-B51A948A86D4}.Release|Any CPU.Build.0 = Release|Any CPU + {B063078F-17D2-4B0C-A01C-DBF440F1C24D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B063078F-17D2-4B0C-A01C-DBF440F1C24D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B063078F-17D2-4B0C-A01C-DBF440F1C24D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B063078F-17D2-4B0C-A01C-DBF440F1C24D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -558,6 +584,11 @@ Global {08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} {D1DA3B8F-7313-4BDA-8880-461C5F007751} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} {D1DF9C2D-3A5E-4985-ACA4-648C604DB562} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} + {E9BF2761-031F-4CDC-A7E6-F66F3B347311} = {7019F43E-DFD7-4D1C-8C96-E75D55646DE7} + {D788789A-4D43-42B9-B0F7-CB2CA761372B} = {E9BF2761-031F-4CDC-A7E6-F66F3B347311} + {2F5FBF6E-E9DD-48C0-A209-7241FE488FDF} = {E9BF2761-031F-4CDC-A7E6-F66F3B347311} + {600D7F63-DACE-4933-BE8C-B51A948A86D4} = {E9BF2761-031F-4CDC-A7E6-F66F3B347311} + {B063078F-17D2-4B0C-A01C-DBF440F1C24D} = {E9BF2761-031F-4CDC-A7E6-F66F3B347311} {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E} = {39327899-ED91-4F7F-988C-4FE4E17C014D} {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E} {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {49CE38B8-0460-46BF-9DFF-5B33A0F9EB5E} diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs index 0d7fa166fc..e6343020ff 100644 --- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs +++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestClass.cs @@ -95,5 +95,10 @@ namespace ICSharpCode.MachineSpecifications IType type = compilation.MainAssembly.GetTypeDefinition(fullTypeName); return type.GetDefinition(); } + + public override IEnumerable GetUnitTestNames() + { + return NestedTestCollection.SelectMany(t => t.GetUnitTestNames()); + } } } diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs index ab2a6b8ba2..b8996c7a25 100644 --- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs +++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestMember.cs @@ -68,5 +68,10 @@ namespace ICSharpCode.MachineSpecifications { return member.DeclaringTypeDefinition.FullName; } + + public override System.Collections.Generic.IEnumerable GetUnitTestNames() + { + yield return member.ReflectionName; + } } } diff --git a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs index a603f823c2..2e6f9e91a3 100644 --- a/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs +++ b/src/AddIns/Analysis/MachineSpecifications/MachineSpecifications/src/MSpecTestProject.cs @@ -135,5 +135,10 @@ namespace ICSharpCode.MachineSpecifications return typeDefinition.Attributes.Any( attribute => MSpecBehaviorsAttributeFQName.Equals(attribute.AttributeType.FullName)); } + + public override IEnumerable GetUnitTestNames() + { + return NestedTestCollection.SelectMany(c => c.GetUnitTestNames()); + } } } diff --git a/src/AddIns/Analysis/Profiler/Controller/Profiler.Controller.csproj b/src/AddIns/Analysis/Profiler/Controller/Profiler.Controller.csproj index cc1c4e1afa..4bd298cc17 100644 --- a/src/AddIns/Analysis/Profiler/Controller/Profiler.Controller.csproj +++ b/src/AddIns/Analysis/Profiler/Controller/Profiler.Controller.csproj @@ -10,7 +10,7 @@ Properties ICSharpCode.Profiler.Controller ICSharpCode.Profiler.Controller - v4.0 + v4.5 512 True False @@ -46,7 +46,8 @@ false false true - Client + + true diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/ICSharpCode.Profiler.AddIn.addin b/src/AddIns/Analysis/Profiler/Frontend/AddIn/ICSharpCode.Profiler.AddIn.addin index 7f0261bd91..03c9fd4cc2 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/ICSharpCode.Profiler.AddIn.addin +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/ICSharpCode.Profiler.AddIn.addin @@ -99,7 +99,7 @@ + class = "ICSharpCode.Profiler.AddIn.Commands.RunSelectedTestsWithProfilerCommand"/> diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Profiler.AddIn.csproj b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Profiler.AddIn.csproj index 9223b8b91e..11c739a60a 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Profiler.AddIn.csproj +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Profiler.AddIn.csproj @@ -7,7 +7,7 @@ Library ICSharpCode.Profiler.AddIn ICSharpCode.Profiler.AddIn - v4.0 + v4.5 False False 4 @@ -90,6 +90,7 @@ General.xaml + @@ -140,6 +141,14 @@ + + {53DCA265-3C3C-42F9-B647-F72BA678122B} + ICSharpCode.NRefactory.CSharp + + + {3B2A5653-EC97-4001-BB9B-D90F1AF2C371} + ICSharpCode.NRefactory + {2748AD25-9C63-4E12-877B-4DCE96FBED54} ICSharpCode.SharpDevelop diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/DomMenuCommand.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/DomMenuCommand.cs index d37fdd0fed..4342ad833f 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/DomMenuCommand.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/DomMenuCommand.cs @@ -5,9 +5,11 @@ using System; using System.Collections.ObjectModel; using System.Linq; +using ICSharpCode.NRefactory; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Dom.CSharp; using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.Profiler.AddIn.Commands @@ -21,7 +23,7 @@ namespace ICSharpCode.Profiler.AddIn.Commands public abstract override void Run(); - protected IMember GetMemberFromName(IClass c, string name, ReadOnlyCollection parameters) + protected IMember GetMemberFromName(ITypeDefinition c, string name, ReadOnlyCollection parameters) { if (name == null || c == null) return null; @@ -54,7 +56,7 @@ namespace ICSharpCode.Profiler.AddIn.Commands matchWithSameParameterCount = method; bool isCorrect = true; for (int i = 0; i < method.Parameters.Count; i++) { - if (parameters[i] != ambience.Convert(method.Parameters[i])) { + if (parameters[i] != ambience.ConvertVariable(method.Parameters[i])) { isCorrect = false; break; } @@ -67,20 +69,19 @@ namespace ICSharpCode.Profiler.AddIn.Commands return matchWithSameParameterCount ?? matchWithSameName; } - protected IClass GetClassFromName(string name) + protected ITypeDefinition GetClassFromName(string name) { if (name == null) return null; if (ProjectService.OpenSolution == null) return null; - foreach (IProject project in ProjectService.OpenSolution.Projects) { - IProjectContent content = ParserService.GetProjectContent(project); - if (content != null) { - IClass c = content.GetClassByReflectionName(name, true); - if (c != null) - return c; - } + foreach (IProject project in SD.ProjectService.CurrentSolution.Projects) { + ICompilation compilation = SD.ParserService.GetCompilation(project); + IType type = compilation.FindType(new FullTypeName(name)); + ITypeDefinition definition = type.GetDefinition(); + if (definition != null) + return definition; } return null; diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/FindReferences.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/FindReferences.cs index 84e570fd70..c3b8fc07bf 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/FindReferences.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/FindReferences.cs @@ -4,6 +4,7 @@ using System; using System.Linq; using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Refactoring; @@ -22,7 +23,7 @@ namespace ICSharpCode.Profiler.AddIn.Commands if (selectedItem == null) return; - IClass c = GetClassFromName(selectedItem.FullyQualifiedClassName); + ITypeDefinition c = GetClassFromName(selectedItem.FullyQualifiedClassName); if (c == null) return; @@ -35,9 +36,7 @@ namespace ICSharpCode.Profiler.AddIn.Commands string memberName = member.DeclaringType.Name + "." + member.Name; using (AsynchronousWaitDialog monitor = AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.FindReferences}")) { - FindReferencesAndRenameHelper.ShowAsSearchResults( - StringParser.Parse("${res:SharpDevelop.Refactoring.ReferencesTo}", new StringTagPair("Name", memberName)), - RefactoringService.FindReferences(member, monitor)); + FindReferencesAndRenameHelper.RunFindReferences(member); } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/GoToDefinition.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/GoToDefinition.cs index e4d23f92f8..289bf185c3 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/GoToDefinition.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/GoToDefinition.cs @@ -3,6 +3,8 @@ using System; using System.Linq; +using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; @@ -19,14 +21,13 @@ namespace ICSharpCode.Profiler.AddIn.Commands public override void Run() { var selectedItem = GetSelectedItems().FirstOrDefault(); - if (selectedItem != null) { - IClass c = GetClassFromName(selectedItem.FullyQualifiedClassName); + ITypeDefinition c = GetClassFromName(selectedItem.FullyQualifiedClassName); if (c != null) { - IEntity member = GetMemberFromName(c, selectedItem.MethodName, selectedItem.Parameters); - FilePosition position = c.ProjectContent.GetPosition(member ?? c); - if (!position.IsEmpty && !string.IsNullOrEmpty(position.FileName)) { - FileService.JumpToFilePosition(position.FileName, position.Line, position.Column); + IMember member = GetMemberFromName(c, selectedItem.MethodName, selectedItem.Parameters); + if (!member.Region.IsEmpty && !string.IsNullOrEmpty(member.Region.FileName)) { + FileName fn = new FileName(member.Region.FileName); + SD.FileService.JumpToFilePosition(fn, member.Region.BeginLine, member.Region.BeginColumn); } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/ProfileExecutable.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/ProfileExecutable.cs index b18c3c27f2..fe979f06e5 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/ProfileExecutable.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/ProfileExecutable.cs @@ -4,6 +4,7 @@ using System; using ICSharpCode.Core; using ICSharpCode.Profiler.AddIn.Dialogs; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.Profiler.AddIn.Commands @@ -19,7 +20,7 @@ namespace ICSharpCode.Profiler.AddIn.Commands public override void Run() { ProfileExecutableForm form = new ProfileExecutableForm(); - form.Owner = WorkbenchSingleton.MainWindow; + form.Owner = SD.Workbench.MainWindow; form.ShowDialog(); } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/RunTestWithProfilerCommand.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/RunTestWithProfilerCommand.cs index 3c6f44892a..2a49e11159 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/RunTestWithProfilerCommand.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Commands/RunTestWithProfilerCommand.cs @@ -1,16 +1,26 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using System.Collections.Generic; +using System.Linq; +using ICSharpCode.Core; +using ICSharpCode.Profiler.Controller; +using ICSharpCode.Profiler.Controller.Data; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.UnitTesting; +using Mono.CSharp.Linq; namespace ICSharpCode.Profiler.AddIn.Commands { - public class RunTestWithProfilerCommand : AbstractRunTestCommand + public class RunSelectedTestsWithProfilerCommand : AbstractMenuCommand { - protected override ITestRunner CreateTestRunner(IProject project) + public override void Run() { - return new ProfilerTestRunner(); + ITestService testService = SD.GetRequiredService(); + IEnumerable tests = TestableCondition.GetTests(testService.OpenSolution, Owner); + string path = tests.FirstOrDefault().ParentProject.Project.GetSessionFileName(); + testService.RunTestsAsync(tests, new TestExecutionOptions { ProcessRunner = new ProfilerProcessRunner(new UnitTestWriter(new ProfilingDataSQLiteWriter(path), tests.SelectMany(t => t.GetUnitTestNames()).ToArray()), new ProfilerOptions()) }).FireAndForget(); } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Dialogs/ProfileExecutableForm.xaml.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Dialogs/ProfileExecutableForm.xaml.cs index c0e62ee062..5a283f86f8 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Dialogs/ProfileExecutableForm.xaml.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Dialogs/ProfileExecutableForm.xaml.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.Profiler.AddIn.Dialogs if (runner != null) { runner.RunFinished += delegate { - WorkbenchSingleton.SafeThreadCall(() => FileService.OpenFile(outputPath)); + SD.MainThread.InvokeIfRequired(() => FileService.OpenFile(outputPath)); }; runner.Run(); diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs index f064201fd3..434dcb10ee 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Extensions.cs @@ -34,15 +34,14 @@ namespace ICSharpCode.Profiler.AddIn if (!File.Exists(path)) return; FileService.OpenFile(path); - if (!project.ReadOnly) { + if (!project.IsReadOnly) { FileProjectItem file = new FileProjectItem(project, ItemType.Content, "ProfilingSessions\\" + Path.GetFileName(path)); ProjectService.AddProjectItem(project, file); ProjectBrowserPad.RefreshViewAsync(); project.Save(); } }; - - WorkbenchSingleton.SafeThreadCall(updater); + SD.MainThread.InvokeIfRequired(updater); } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/OptionPanels/OptionWrapper.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/OptionPanels/OptionWrapper.cs index fa8feb2fbe..771e003e36 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/OptionPanels/OptionWrapper.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/OptionPanels/OptionWrapper.cs @@ -5,12 +5,13 @@ using System; using ICSharpCode.Core; using ICSharpCode.Profiler.Controller; using ICSharpCode.Profiler.Controller.Data; +using ICSharpCode.SharpDevelop; namespace ICSharpCode.Profiler.AddIn.OptionPanels { public static class OptionWrapper { - static Properties properties = PropertyService.Get("ProfilerOptions", new Properties()); + static Properties properties = SD.PropertyService.Get("ProfilerOptions", new Properties()); public static int SharedMemorySize { get { return properties.Get("SharedMemorySize", ProfilerOptions.DefaultSharedMemorySize) / 1024 / 1024; } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerProcessRunner.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerProcessRunner.cs new file mode 100644 index 0000000000..9a7d98568b --- /dev/null +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerProcessRunner.cs @@ -0,0 +1,139 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using ICSharpCode.Profiler.Controller; +using ICSharpCode.Profiler.Controller.Data; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.Profiler.AddIn +{ + /// + /// Description of ProfilerProcessRunner. + /// + public class ProfilerProcessRunner : IProcessRunner + { + ProcessStartInfo psi; + ProfilerRunner profilerRunner; + Process runningProcess; + IProfilingDataWriter writer; + ProfilerOptions options; + readonly object lockObj = new object(); + bool wasStarted; + + public ProfilerProcessRunner(IProfilingDataWriter writer, ProfilerOptions options) + { + if (writer == null) + throw new ArgumentNullException("writer"); + if (options == null) + throw new ArgumentNullException("options"); + this.writer = writer; + this.options = options; + this.psi = new ProcessStartInfo(); + wasStarted = false; + } + + public Task RunInOutputPadAsync(MessageViewCategory outputCategory, string program, params string[] arguments) + { + throw new NotImplementedException(); + } + + public void Start(string program, params string[] arguments) + { + lock (lockObj) { + if (wasStarted) + throw new InvalidOperationException(); + + profilerRunner = new ProfilerRunner(psi, true, writer); + profilerRunner.RunFinished += delegate { hasExited = true; }; + runningProcess = profilerRunner.Run(); + wasStarted = true; + } + } + + public void StartCommandLine(string commandLine) + { + string[] args = ProcessRunner.CommandLineToArgumentArray(commandLine); + Start(args.FirstOrDefault() ?? "", args.Skip(1).ToArray()); + } + + public void Kill() + { + profilerRunner.Stop(); + } + + TaskCompletionSource waitForExitTCS; + bool hasExited; + + public Task WaitForExitAsync() + { + if (hasExited) + return Task.FromResult(true); + if (!wasStarted) + throw new InvalidOperationException("Process was not yet started"); + lock (lockObj) { + if (waitForExitTCS != null) { + waitForExitTCS = new TaskCompletionSource(); + profilerRunner.RunFinished += delegate { waitForExitTCS.SetResult(null); }; + } + } + return waitForExitTCS.Task; + } + + public StreamReader OpenStandardOutputReader() + { + return runningProcess.StandardOutput; + } + + public StreamReader OpenStandardErrorReader() + { + return runningProcess.StandardError; + } + + public string WorkingDirectory { + get { return psi.WorkingDirectory; } + set { psi.WorkingDirectory = value; } + } + + public ProcessCreationFlags CreationFlags { get; set; } + + public IDictionary EnvironmentVariables { get; set; } + + public bool RedirectStandardOutput { get; set; } + + public bool RedirectStandardError { get; set; } + + public bool RedirectStandardOutputAndErrorToSingleStream { get; set; } + + public Stream StandardOutput { + get { + if (runningProcess == null) + throw new InvalidOperationException("Cannot access StdOut of process, because it is not yet started!"); + return null;//runningProcess.StandardOutput; + } + } + public Stream StandardError { + get { + if (runningProcess == null) + throw new InvalidOperationException("Cannot access StdErr of process, because it is not yet started!"); + return null;//runningProcess.StandardError; + } + } + + bool disposed = false; + + public void Dispose() + { + if (!disposed) { + profilerRunner.Dispose(); + disposed = true; + } + } + } +} diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerRunner.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerRunner.cs index 42e2f77049..c54744452b 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerRunner.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerRunner.cs @@ -9,6 +9,7 @@ using ICSharpCode.Core; using ICSharpCode.Profiler.AddIn.Dialogs; using ICSharpCode.Profiler.AddIn.OptionPanels; using ICSharpCode.Profiler.Controller.Data; +using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; @@ -17,7 +18,7 @@ namespace ICSharpCode.Profiler.AddIn /// /// Description of ProfilerRunner. /// - public class ProfilerRunner + public class ProfilerRunner : IDisposable { public event EventHandler RunFinished; ProfilerControlWindow controlWindow; @@ -80,8 +81,7 @@ namespace ICSharpCode.Profiler.AddIn try { using (AsynchronousWaitDialog dlg = AsynchronousWaitDialog.ShowWaitDialog(StringParser.Parse("${res:AddIns.Profiler.Messages.PreparingForAnalysis}"), true)) { profiler.Dispose(); - - WorkbenchSingleton.SafeThreadAsyncCall(() => { controlWindow.AllowClose = true; this.controlWindow.Close(); }); + SD.MainThread.InvokeAsyncAndForget(() => { controlWindow.AllowClose = true; this.controlWindow.Close(); }); if (database != null) { database.WriteTo(writer, progress => { dlg.Progress = progress; @@ -101,12 +101,13 @@ namespace ICSharpCode.Profiler.AddIn } } - public void Run() + public Process Run() { - WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView)).BringPadToFront(); + SD.Workbench.GetPad(typeof(CompilerMessageView)).BringPadToFront(); this.controlWindow = new ProfilerControlWindow(this); - profiler.Start(); + Process p = profiler.Start(); this.controlWindow.Show(); + return p; } public void Stop() @@ -175,5 +176,17 @@ namespace ICSharpCode.Profiler.AddIn profileCategory.AppendLine(StringParser.Parse(text)); } #endregion + + bool isDisposed = false; + + public void Dispose() + { + if (!isDisposed) { + profiler.Dispose(); + controlWindow.Close(); + + isDisposed = true; + } + } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs index f189bb7f90..9062e35d03 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/ProfilerTestRunner.cs @@ -6,11 +6,14 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.Profiler.AddIn; using ICSharpCode.Profiler.Controller.Data; using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; using ICSharpCode.UnitTesting; namespace ICSharpCode.Profiler.AddIn @@ -18,52 +21,63 @@ namespace ICSharpCode.Profiler.AddIn public class ProfilerTestRunner : TestRunnerBase { ProfilerRunner runner; - UnitTestingOptions options = new UnitTestingOptions(); - TestResultsMonitor testResultsMonitor; + //UnitTestingOptions options = new UnitTestingOptions(); + TestResultsReader testResultsReader; public ProfilerTestRunner() { } - public override void Start(SelectedTests selectedTests) + public override void Start(IEnumerable selectedTests) { ProcessStartInfo startInfo = GetProcessStartInfo(selectedTests); Start(startInfo, selectedTests); } - protected override ProcessStartInfo GetProcessStartInfo(SelectedTests selectedTests) + protected override ProcessStartInfo GetProcessStartInfo(IEnumerable selectedTests) { - NUnitConsoleApplication app = new NUnitConsoleApplication(selectedTests, options); - testResultsMonitor = new TestResultsMonitor(); - app.Results = testResultsMonitor.FileName; + NUnitConsoleApplication app = new NUnitConsoleApplication(selectedTests, UnitTestingOptions.Instance); + testResultsReader = new TestResultsReader(); + app.ResultsPipe = testResultsReader.PipeName; return app.GetProcessStartInfo(); } - void Start(ProcessStartInfo startInfo, SelectedTests selectedTests) + void Start(ProcessStartInfo startInfo, IEnumerable selectedTests) { LogCommandLine(startInfo); - - string path = selectedTests.Project.GetSessionFileName(); + + string path = selectedTests.FirstOrDefault().ParentProject.Project.GetSessionFileName(); LoggingService.Info("starting profiler..."); runner = new ProfilerRunner(startInfo, true, new UnitTestWriter(new ProfilingDataSQLiteWriter(path), GetUnitTestNames(selectedTests).ToArray())); runner.RunFinished += delegate { - WorkbenchSingleton.SafeThreadCall(() => FileService.OpenFile(path)); + SD.MainThread.InvokeIfRequired(() => FileService.OpenFile(path)); AfterFinish(selectedTests, path); }; - testResultsMonitor.TestFinished += OnTestFinished; - testResultsMonitor.Start(); + testResultsReader.TestFinished += OnTestFinished; + testResultsReader.Start(); runner.Run(); } - IEnumerable GetUnitTestNames(SelectedTests selectedTests) + IEnumerable GetUnitTestNames(IEnumerable selectedTests) { - IProjectContent content = ParserService.GetProjectContent(selectedTests.Project); - - if (selectedTests.Class == null) { + foreach (var project in selectedTests.Select(l => l.ParentProject)) { + foreach (var name in project.GetUnitTestNames()) { + yield return name; + } + } + /* + foreach (ITest test in selectedTests) { + IProject project = test.ParentProject.Project; + ICompilation compilation = SD.ParserService.GetCompilation(project); + compilation.FindType + } + IProjectContent content = selectedTests.FirstOrDefault().ParentProject.Project.ProjectContent; + IEnumerable selectedNunitTests = (IEnumerable) selectedTests; + if (selectedNunitTests.FirstOrDefault() == null) { var testClasses = content.Classes .Where(c => c.Attributes.Any(a => a.AttributeType.FullyQualifiedName == "NUnit.Framework.TestFixtureAttribute")); return testClasses @@ -71,40 +85,80 @@ namespace ICSharpCode.Profiler.AddIn .Where(m => m.Attributes.Any(a2 => a2.AttributeType.FullyQualifiedName == "NUnit.Framework.TestAttribute")) .Select(m2 => m2.FullyQualifiedName); } - if (selectedTests.Member == null) { - return content.Classes.First(c => c.FullyQualifiedName == selectedTests.Class.DotNetName).Methods + return content.Classes.First(c => c.FullyQualifiedName == selectedNunitTests.FirstOrDefault().ClassName).Methods .Where(m => m.Attributes.Any(a2 => a2.AttributeType.FullyQualifiedName == "NUnit.Framework.TestAttribute")) .Select(m2 => m2.FullyQualifiedName); } - - return new[] { selectedTests.Class.DotNetName + "." + selectedTests.Member.Name }; + return new[] { selectedTests.Class.DotNetName + "." + selectedTests.Member.Name };*/ } - void AfterFinish(SelectedTests selectedTests, string path) + void AfterFinish(IEnumerable selectedTests, string path) { - selectedTests.Project.AddSessionToProject(path); - OnAllTestsFinished(this, new EventArgs()); + selectedTests.FirstOrDefault().ParentProject.Project.AddSessionToProject(path); + OnAllTestsFinished(); LoggingService.Info("shutting profiler down..."); } - public override void Stop() + /*public override void Stop() { if (this.runner != null && this.runner.Profiler.IsRunning) { LoggingService.Info("stopping profiler..."); runner.Stop(); } - if (testResultsMonitor != null) { - testResultsMonitor.Stop(); - testResultsMonitor.Read(); - testResultsMonitor = null; + if (testResultsReader != null) { + testResultsReader.Dispose(); + //testResultsReader.Stop(); + //testResultsReader.Read(); + testResultsReader = null; } } public override void Dispose() { Stop(); + }*/ + + protected override void OnAllTestsFinished() + { + testResultsReader.Join(); + base.OnAllTestsFinished(); + } + + public override void Stop() + { + if (this.runner != null && this.runner.Profiler.IsRunning) { + LoggingService.Info("stopping profiler..."); + runner.Stop(); + } + if (testResultsReader != null) { + testResultsReader.Dispose(); + testResultsReader = null; + } + } + + public override void Dispose() + { + testResultsReader.Dispose(); + testResultsReader.TestFinished -= OnTestFinished; + } + + public override int GetExpectedNumberOfTestResults(IEnumerable selectedTests) + { + return GetNumberOfTestMethods(selectedTests); + } + + public static int GetNumberOfTestMethods(IEnumerable selectedTests) + { + int count = 0; + foreach (ITest test in selectedTests) { + if (test is NUnitTestMethod) + count++; + else + count += GetNumberOfTestMethods(test.NestedTests); + } + return count; } } } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerDisplayBinding.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerDisplayBinding.cs index e7230c3ea1..b44bf76f29 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerDisplayBinding.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerDisplayBinding.cs @@ -7,6 +7,7 @@ using ICSharpCode.Core; using ICSharpCode.Profiler.Controller.Data; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Workbench; namespace ICSharpCode.Profiler.AddIn.Views { @@ -24,7 +25,7 @@ namespace ICSharpCode.Profiler.AddIn.Views return true; // definition in .addin does extension-based filtering } - public ICSharpCode.SharpDevelop.Gui.IViewContent CreateContentForFile(OpenedFile file) + public IViewContent CreateContentForFile(OpenedFile file) { ProfilingDataSQLiteProvider provider; try { @@ -46,12 +47,17 @@ namespace ICSharpCode.Profiler.AddIn.Views return new WpfViewer(file, provider); } - public bool IsPreferredBindingForFile(string fileName) + public bool IsPreferredBindingForFile(FileName fileName) { return true; } - public double AutoDetectFileContent(string fileName, Stream fileContent, string detectedMimeType) + public bool CanCreateContentForFile(FileName fileName) + { + return fileName.GetExtension().Equals(".sdps", StringComparison.OrdinalIgnoreCase); + } + + public double AutoDetectFileContent(FileName fileName, Stream fileContent, string detectedMimeType) { return 1; } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerView.xaml.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerView.xaml.cs index ee232948b8..d484b997a1 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerView.xaml.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/ProfilerView.xaml.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.Profiler.AddIn.Views } } - this.dummyTab.Header = new Image { Source = PresentationResourceService.GetImage("Icons.16x16.NewDocumentIcon").Source, Height = 16, Width = 16 }; + this.dummyTab.Header = new Image { Source = SD.ResourceService.GetImage("Icons.16x16.NewDocumentIcon").ImageSource, Height = 16, Width = 16 }; this.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, ExecuteSelectAll, CanExecuteSelectAll)); @@ -104,16 +104,14 @@ namespace ICSharpCode.Profiler.AddIn.Views void UpdateErrorList(IEnumerable errors) { Dispatcher.Invoke( - (Action)( - () => { - var tasks = errors.Select(error => new Task(null, error.ErrorText, error.Column, error.Line, (error.IsWarning) ? TaskType.Warning : TaskType.Error)).ToList(); - if (tasks.Count > 0) { - WorkbenchSingleton.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); - TaskService.ClearExceptCommentTasks(); - TaskService.AddRange(tasks); - } + (Action)delegate { + List tasks = errors.Select(error => new SDTask(null, error.ErrorText, error.Column, error.Line, (error.IsWarning) ? TaskType.Warning : TaskType.Error)).ToList(); + if (tasks.Count > 0) { + SD.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); + TaskService.ClearExceptCommentTasks(); + TaskService.AddRange(tasks); } - ) + } ); } diff --git a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/WpfViewer.cs b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/WpfViewer.cs index 1a2ff64711..f1ebeabe1d 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/WpfViewer.cs +++ b/src/AddIns/Analysis/Profiler/Frontend/AddIn/Src/Views/WpfViewer.cs @@ -10,6 +10,7 @@ using ICSharpCode.Core.Presentation; using ICSharpCode.Profiler.Controller.Data; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Workbench; namespace ICSharpCode.Profiler.AddIn.Views { diff --git a/src/AddIns/Analysis/Profiler/Frontend/Controls/Profiler.Controls.csproj b/src/AddIns/Analysis/Profiler/Frontend/Controls/Profiler.Controls.csproj index 589f3ad450..7fc301caf7 100644 --- a/src/AddIns/Analysis/Profiler/Frontend/Controls/Profiler.Controls.csproj +++ b/src/AddIns/Analysis/Profiler/Frontend/Controls/Profiler.Controls.csproj @@ -7,7 +7,7 @@ Library ICSharpCode.Profiler.Controls ICSharpCode.Profiler.Controls - v4.0 + v4.5 Properties C:\Dokumente und Einstellungen\HP\Anwendungsdaten\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis False @@ -34,7 +34,8 @@ false false true - Client + + true diff --git a/src/AddIns/Analysis/Profiler/X64Converter/Profiler.X64Converter.csproj b/src/AddIns/Analysis/Profiler/X64Converter/Profiler.X64Converter.csproj index d74c1f8a69..8f9e4a7b00 100644 --- a/src/AddIns/Analysis/Profiler/X64Converter/Profiler.X64Converter.csproj +++ b/src/AddIns/Analysis/Profiler/X64Converter/Profiler.X64Converter.csproj @@ -10,7 +10,7 @@ Properties X64Converter Profiler.X64Converter - v4.0 + v4.5 512 C:\Users\Siegfried\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis False @@ -33,7 +33,8 @@ false false true - Client + + true @@ -88,11 +89,18 @@ + + {53DCA265-3C3C-42F9-B647-F72BA678122B} + ICSharpCode.NRefactory.CSharp + {3B2A5653-EC97-4001-BB9B-D90F1AF2C371} ICSharpCode.NRefactory + + +