From 0b3eebb59448f83d70921114a12883b49b24d7b3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 29 Jul 2018 10:43:36 +0200 Subject: [PATCH 1/2] WIP: Upgrade to visual studio 2017 --- .gitignore | 2 +- ...ver.UI.TestDiscoverer.TestResources.csproj | 9 +- .../packages.config | 1 + .../MSTest/MSTestDiscovererTests.cs | 14 +- .../NUnit/NUnitDiscovererTests.cs | 36 +- .../OpenCover.UI.TestDiscoverer.Tests.csproj | 2 +- .../XUnit/XUnitDiscovererTests.cs | 32 +- .../OpenCover.UI.TestDiscoverer.csproj | 7 +- OpenCover.UI.TestDiscoverer/Program.cs | 120 ++- OpenCover.UI.TestDiscoverer/packages.config | 1 + OpenCover.UI.Tests/OpenCover.UI.Tests.csproj | 8 +- OpenCover.UI.Tests/packages.config | 1 + OpenCover.UI/Guids.cs | 23 +- OpenCover.UI/Helpers/IDEHelper.cs | 868 +++++++++--------- OpenCover.UI/OpenCover.UI.csproj | 128 ++- OpenCover.UI/OpenCoverUIPackage.cs | 92 +- OpenCover.UI/OpenCoverUISettings.Designer.cs | 2 +- OpenCover.UI/Processors/Discoverer.cs | 205 +++-- OpenCover.UI/Processors/MSTestExecutor.cs | 380 ++++---- OpenCover.UI/Processors/TestExecutor.cs | 738 +++++++-------- OpenCover.UI/Resources.Designer.cs | 2 +- OpenCover.UI/Views/Style.xaml | 156 ++-- .../Views/TestExplorerControl.xaml.cs | 498 +++++----- OpenCover.UI/app.config | 19 +- OpenCover.UI/packages.config | 26 + OpenCover.UI/source.extension.vsixmanifest | 47 +- ...VisualStudio.SDK.EmbedInteropTypes.targets | 52 ++ .../_desktop/xunit.execution.desktop.dll | Bin 0 -> 185344 bytes packages/xunit.core.2.1.0/build/dnx451/_._ | 0 .../xunit.core.2.1.0/build/monoandroid/_._ | 0 packages/xunit.core.2.1.0/build/monotouch/_._ | 0 packages/xunit.core.2.1.0/build/net45/_._ | 0 .../xunit.core.props | 10 + packages/xunit.core.2.1.0/build/win8/_._ | 0 .../build/win81/xunit.core.props | 10 + packages/xunit.core.2.1.0/build/wp8/_._ | 0 .../build/wpa81/xunit.core.props | 10 + .../xunit.core.2.1.0/build/xamarinios/_._ | 0 38 files changed, 1883 insertions(+), 1616 deletions(-) create mode 100644 packages/Microsoft.VisualStudio.SDK.EmbedInteropTypes.15.0.16/build/Microsoft.VisualStudio.SDK.EmbedInteropTypes.targets create mode 100644 packages/xunit.core.2.1.0/build/_desktop/xunit.execution.desktop.dll create mode 100644 packages/xunit.core.2.1.0/build/dnx451/_._ create mode 100644 packages/xunit.core.2.1.0/build/monoandroid/_._ create mode 100644 packages/xunit.core.2.1.0/build/monotouch/_._ create mode 100644 packages/xunit.core.2.1.0/build/net45/_._ create mode 100644 packages/xunit.core.2.1.0/build/portable-net45+win8+wp8+wpa81/xunit.core.props create mode 100644 packages/xunit.core.2.1.0/build/win8/_._ create mode 100644 packages/xunit.core.2.1.0/build/win81/xunit.core.props create mode 100644 packages/xunit.core.2.1.0/build/wp8/_._ create mode 100644 packages/xunit.core.2.1.0/build/wpa81/xunit.core.props create mode 100644 packages/xunit.core.2.1.0/build/xamarinios/_._ diff --git a/.gitignore b/.gitignore index e607b5b..73fe653 100644 --- a/.gitignore +++ b/.gitignore @@ -96,7 +96,7 @@ publish/ # NuGet Packages Directory ## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ +packages/ # Windows Azure Build Output csx diff --git a/OpenCover.UI.TestDiscoverer.TestResources/OpenCover.UI.TestDiscoverer.TestResources.csproj b/OpenCover.UI.TestDiscoverer.TestResources/OpenCover.UI.TestDiscoverer.TestResources.csproj index d8b174a..a4fd0b8 100644 --- a/OpenCover.UI.TestDiscoverer.TestResources/OpenCover.UI.TestDiscoverer.TestResources.csproj +++ b/OpenCover.UI.TestDiscoverer.TestResources/OpenCover.UI.TestDiscoverer.TestResources.csproj @@ -40,7 +40,12 @@ Key.snk - + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll @@ -97,4 +102,4 @@ --> - + \ No newline at end of file diff --git a/OpenCover.UI.TestDiscoverer.TestResources/packages.config b/OpenCover.UI.TestDiscoverer.TestResources/packages.config index a62ac3d..f90f5f3 100644 --- a/OpenCover.UI.TestDiscoverer.TestResources/packages.config +++ b/OpenCover.UI.TestDiscoverer.TestResources/packages.config @@ -1,5 +1,6 @@  + diff --git a/OpenCover.UI.TestDiscoverer.Tests/MSTest/MSTestDiscovererTests.cs b/OpenCover.UI.TestDiscoverer.Tests/MSTest/MSTestDiscovererTests.cs index 131d453..0c223f8 100644 --- a/OpenCover.UI.TestDiscoverer.Tests/MSTest/MSTestDiscovererTests.cs +++ b/OpenCover.UI.TestDiscoverer.Tests/MSTest/MSTestDiscovererTests.cs @@ -21,20 +21,20 @@ public void Discover_Finds_Sub_Test_Fixtures_And_Methods(Type testFixtureInAssem AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.MSTest); } - [Ignore("MsTest Discoverer doesn't find base class methods yet"), - TestCase(typeof(TestFixtureInheritingTraitMethods), - "TestMethod_TestFixtureWithTraits", + [Ignore("MsTest Discoverer doesn't find base class methods yet"), + TestCase(typeof(TestFixtureInheritingTraitMethods), + "TestMethod_TestFixtureWithTraits", new[] { "Category_TestMethod_TestFixtureWithTraits" })] public void Discover_Finds_Inherited_Fixtures_And_Methods_With_Traits(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod, string[] expectedTraits) { AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.MSTest, expectedTraits); } - [TestCase(typeof(TestFixtureWithTraits), - "TestMethod_TestFixtureWithTraits", + [TestCase(typeof(TestFixtureWithTraits), + "TestMethod_TestFixtureWithTraits", new[] { "Category_TestMethod_TestFixtureWithTraits" })] - [TestCase(typeof(TestFixtureInheritingTraitMethods), - "TestMethod_TestFixtureInheritingTraitMethods", + [TestCase(typeof(TestFixtureInheritingTraitMethods), + "TestMethod_TestFixtureInheritingTraitMethods", new[] { "Category_TestMethod_TestFixtureInheritingTraitMethods_1", "Category_TestMethod_TestFixtureInheritingTraitMethods_2" })] public void Discover_Finds_Fixtures_And_Methods_With_Traits(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod, string[] expectedTraits) diff --git a/OpenCover.UI.TestDiscoverer.Tests/NUnit/NUnitDiscovererTests.cs b/OpenCover.UI.TestDiscoverer.Tests/NUnit/NUnitDiscovererTests.cs index 081e743..d0743d3 100644 --- a/OpenCover.UI.TestDiscoverer.Tests/NUnit/NUnitDiscovererTests.cs +++ b/OpenCover.UI.TestDiscoverer.Tests/NUnit/NUnitDiscovererTests.cs @@ -5,23 +5,23 @@ namespace OpenCover.UI.TestDiscoverer.Tests.NUnit { - class NUnitDiscovererTests : DiscovererTestsBase - { - [TestCase(typeof(RegularTestFixture), "RegularTestMethod", null)] - [TestCase(typeof(TestFixtureWithoutExplicitTestFixtureAttribute), "TestMethodInTestFixtureWithoutExplicitTestFixtureAttribute", null)] - [TestCase(typeof(TestFixtureWithTestCase), "SomeTestCase", null)] - [TestCase(typeof(TestFixtureWithNamedTestCase), "SomeNamedTestCase", null)] - [TestCase(typeof(TestFixtureWithInheritedTraitTestCase), "SomeTraitTestMethod", new string[] { "InheritedTrait", "ClassTrait" })] - public void Discover_Finds_Regular_Test_Fixture_And_Method(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod, string[] expectedTraits) - { - AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.NUnit, expectedTraits); - } + //class NUnitDiscovererTests : DiscovererTestsBase + //{ + // [TestCase(typeof(RegularTestFixture), "RegularTestMethod", null)] + // [TestCase(typeof(TestFixtureWithoutExplicitTestFixtureAttribute), "TestMethodInTestFixtureWithoutExplicitTestFixtureAttribute", null)] + // [TestCase(typeof(TestFixtureWithTestCase), "SomeTestCase", null)] + // [TestCase(typeof(TestFixtureWithNamedTestCase), "SomeNamedTestCase", null)] + // [TestCase(typeof(TestFixtureWithInheritedTraitTestCase), "SomeTraitTestMethod", new string[] { "InheritedTrait", "ClassTrait" })] + // public void Discover_Finds_Regular_Test_Fixture_And_Method(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod, string[] expectedTraits) + // { + // AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.NUnit, expectedTraits); + // } - [TestCase(typeof(TestFixtureWithNestedTestClasses.SubTestClass), "RegularSubTestClassMethod")] - [TestCase(typeof(TestFixtureWithNestedTestClasses.SubTestClass.Sub2NdTestClass), "RegularSub2NdTestClassMethod")] - public void Discover_Finds_Sub_Test_Fixtures_And_Methods(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) - { - AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.NUnit); - } - } + // [TestCase(typeof(TestFixtureWithNestedTestClasses.SubTestClass), "RegularSubTestClassMethod")] + // [TestCase(typeof(TestFixtureWithNestedTestClasses.SubTestClass.Sub2NdTestClass), "RegularSub2NdTestClassMethod")] + // public void Discover_Finds_Sub_Test_Fixtures_And_Methods(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) + // { + // AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.NUnit); + // } + //} } diff --git a/OpenCover.UI.TestDiscoverer.Tests/OpenCover.UI.TestDiscoverer.Tests.csproj b/OpenCover.UI.TestDiscoverer.Tests/OpenCover.UI.TestDiscoverer.Tests.csproj index 94830c7..47455e6 100644 --- a/OpenCover.UI.TestDiscoverer.Tests/OpenCover.UI.TestDiscoverer.Tests.csproj +++ b/OpenCover.UI.TestDiscoverer.Tests/OpenCover.UI.TestDiscoverer.Tests.csproj @@ -13,7 +13,7 @@ 512 ..\ true - + true full diff --git a/OpenCover.UI.TestDiscoverer.Tests/XUnit/XUnitDiscovererTests.cs b/OpenCover.UI.TestDiscoverer.Tests/XUnit/XUnitDiscovererTests.cs index e2d8b5c..4cd18d5 100644 --- a/OpenCover.UI.TestDiscoverer.Tests/XUnit/XUnitDiscovererTests.cs +++ b/OpenCover.UI.TestDiscoverer.Tests/XUnit/XUnitDiscovererTests.cs @@ -9,23 +9,23 @@ namespace OpenCover.UI.TestDiscoverer.Tests.XUnit { - [Ignore] - [TestFixture] - class XUnitDiscovererTests : DiscovererTestsBase - { - [TestCase(typeof(RegularxUnitTestClass), "RegularTestMethod")] - public void Discover_Finds_Regular_Test_Fixture_And_Method(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) - { - AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.XUnit); - } + //[Ignore] + //[TestFixture] + //class XUnitDiscovererTests : DiscovererTestsBase + //{ + // [TestCase(typeof(RegularxUnitTestClass), "RegularTestMethod")] + // public void Discover_Finds_Regular_Test_Fixture_And_Method(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) + // { + // AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.XUnit); + // } - [TestCase(typeof(RegularxUnitTestClass.SubTestClass), "RegularSubTestClassMethod")] - [TestCase(typeof(RegularxUnitTestClass.SubTestClass.Sub2NdTestClass), "RegularSub2NdTestClassMethod")] - public void Discover_Finds_Sub_Test_Fixtures_And_Methods(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) - { - AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.XUnit); - } + // [TestCase(typeof(RegularxUnitTestClass.SubTestClass), "RegularSubTestClassMethod")] + // [TestCase(typeof(RegularxUnitTestClass.SubTestClass.Sub2NdTestClass), "RegularSub2NdTestClassMethod")] + // public void Discover_Finds_Sub_Test_Fixtures_And_Methods(Type testFixtureInAssemblyToDiscoverTestsIn, string expectedNameOfFirstTestMethod) + // { + // AssertDiscoveredMethod(testFixtureInAssemblyToDiscoverTestsIn, expectedNameOfFirstTestMethod, TestType.XUnit); + // } - } + //} } diff --git a/OpenCover.UI.TestDiscoverer/OpenCover.UI.TestDiscoverer.csproj b/OpenCover.UI.TestDiscoverer/OpenCover.UI.TestDiscoverer.csproj index dca879b..aa54918 100644 --- a/OpenCover.UI.TestDiscoverer/OpenCover.UI.TestDiscoverer.csproj +++ b/OpenCover.UI.TestDiscoverer/OpenCover.UI.TestDiscoverer.csproj @@ -42,7 +42,12 @@ Key.snk - + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + ..\OpenCover.UI\Lib\Mono.Cecil.dll diff --git a/OpenCover.UI.TestDiscoverer/Program.cs b/OpenCover.UI.TestDiscoverer/Program.cs index 57f1beb..f0bc6e5 100644 --- a/OpenCover.UI.TestDiscoverer/Program.cs +++ b/OpenCover.UI.TestDiscoverer/Program.cs @@ -9,52 +9,80 @@ namespace OpenCover.UI.TestDiscoverer { - class Program - { - static void Main(string[] args) - { - try - { - if (args.Length > 1) - { - NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", args[0], PipeDirection.InOut); - pipeClient.Connect(); - Discover(args, pipeClient); - - pipeClient.WaitForPipeDrain(); - - pipeClient.Close(); - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } - - private static void Discover(string[] args, NamedPipeClientStream stream) - { - if (args != null && args.Length > 0) - { + class Program + { + static void Main(string[] args) + { + try + { + Log("START"); + //args = $@"bdf0d464-5bcc-4a4f-aaa3-0d2d1bafe5e4, I:\ConsoleApp1\ConsoleApp1.Tests\bin\Debug\ConsoleApp1.Tests.dll".Split(',').Select(s => s.Trim()).ToArray(); + if (args.Length > 1) + { + Log(string.Join(", ", args)); + Log("Creating client"); + NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", args[0], PipeDirection.InOut); + Log("Client connecting"); + pipeClient.Connect(); + Log("Starting discovery"); + Discover(args, pipeClient); + + Log("Waiting for pipedrain"); + pipeClient.WaitForPipeDrain(); + + Log("Closing connection"); + pipeClient.Close(); + Log("Connection closed"); + } + } + catch (Exception ex) + { + Log("EXCEPTION"); + Log(ex.Message); + Console.WriteLine(ex.Message); + } + } + public static void Log(string logMessage) + { + string filePath = $@"C:\myFile.txt"; + if (!File.Exists(filePath)) + { + File.Create(filePath); + } + using (StreamWriter w = File.AppendText(filePath)) + { + w.WriteLine(logMessage + System.Environment.NewLine); + } + } + + private static void Discover(string[] args, NamedPipeClientStream stream) + { + Log("In discovery"); + if (args != null && args.Length > 0) + { var dlls = args.Skip(1); + + Log("DLLS: " + dlls); var tests = new Discoverer(dlls).Discover(); - string serialized = String.Empty; - - if (tests != null) - { - var jsSerializer = new JavaScriptSerializer(); - serialized = jsSerializer.Serialize(tests); - } - - Write(stream, serialized); - } - } - - private static void Write(Stream stream, string json) - { - var writer = new StreamWriter(stream); - writer.Write(json); - writer.Flush(); - } - } + Log("Tests" + tests ?? "Geen tests gevonden"); + string serialized = String.Empty; + + if (tests != null) + { + var jsSerializer = new JavaScriptSerializer(); + serialized = jsSerializer.Serialize(tests); + } + Log("Tests" + serialized); + + Write(stream, serialized); + } + } + + private static void Write(Stream stream, string json) + { + var writer = new StreamWriter(stream); + writer.Write(json); + writer.Flush(); + } + } } \ No newline at end of file diff --git a/OpenCover.UI.TestDiscoverer/packages.config b/OpenCover.UI.TestDiscoverer/packages.config index a62ac3d..f90f5f3 100644 --- a/OpenCover.UI.TestDiscoverer/packages.config +++ b/OpenCover.UI.TestDiscoverer/packages.config @@ -1,5 +1,6 @@  + diff --git a/OpenCover.UI.Tests/OpenCover.UI.Tests.csproj b/OpenCover.UI.Tests/OpenCover.UI.Tests.csproj index 4cbb740..7021011 100644 --- a/OpenCover.UI.Tests/OpenCover.UI.Tests.csproj +++ b/OpenCover.UI.Tests/OpenCover.UI.Tests.csproj @@ -49,9 +49,11 @@ False ..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll - - False - ..\..\..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v4.0\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\Microsoft.VisualStudio.TestPlatform.14.0.0.1\lib\net20\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll ..\packages\NSubstitute.1.8.1.0\lib\net45\NSubstitute.dll diff --git a/OpenCover.UI.Tests/packages.config b/OpenCover.UI.Tests/packages.config index 44b6c96..556a3f6 100644 --- a/OpenCover.UI.Tests/packages.config +++ b/OpenCover.UI.Tests/packages.config @@ -1,6 +1,7 @@  + diff --git a/OpenCover.UI/Guids.cs b/OpenCover.UI/Guids.cs index 53fdf4a..72c3734 100644 --- a/OpenCover.UI/Guids.cs +++ b/OpenCover.UI/Guids.cs @@ -2,20 +2,23 @@ // This source code is released under the MIT License; Please read license.md file for more details. // using System; +using System.IO; namespace OpenCover.UI { - static class GuidList - { - public const string GuidOpenCoverUIPkgString = "8baa86ee-ed13-4508-bccf-d580eaf81949"; - public const string GuidOpenCoverUICmdSetString = "c1d4257b-f994-4cfe-adb6-f780c29f7c48"; - public const string GuidToolWindowPersistanceString = "47dfb4eb-7c9f-45a8-938e-90fde05d0387"; - public const string GuidTestExplorerToolWindowString = "E1B7D1F8-9B3C-49B1-8F4F-BFC63A88835D"; - public const string GuidTestExplorerToolWindowContextMenu = "1E198C22-5980-4E7E-92F3-F73168D1FB63"; + static class GuidList + { + public const string GuidOpenCoverUIPkgString = "8baa86ee-ed13-4508-bccf-d580eaf81949"; + public const string GuidOpenCoverUICmdSetString = "c1d4257b-f994-4cfe-adb6-f780c29f7c48"; + public const string GuidToolWindowPersistanceString = "47dfb4eb-7c9f-45a8-938e-90fde05d0387"; + public const string GuidTestExplorerToolWindowString = "E1B7D1F8-9B3C-49B1-8F4F-BFC63A88835D"; + public const string GuidTestExplorerToolWindowContextMenu = "1E198C22-5980-4E7E-92F3-F73168D1FB63"; public const string GuidOpenCoverUIOptionPage = "D4BE3BE5-444A-4946-B6DF-CF422D3A1875"; - public static readonly Guid GuidOpenCoverUICmdSet = new Guid(GuidOpenCoverUICmdSetString); - public static Guid GuidOpenCoverTestExplorerContextMenuCommandSet = new Guid("81F1321F-B605-47F6-AD43-FB2EC4891225"); - }; + public static readonly Guid GuidOpenCoverUICmdSet = new Guid(GuidOpenCoverUICmdSetString); + public static Guid GuidOpenCoverTestExplorerContextMenuCommandSet = new Guid("81F1321F-B605-47F6-AD43-FB2EC4891225"); + + + }; } \ No newline at end of file diff --git a/OpenCover.UI/Helpers/IDEHelper.cs b/OpenCover.UI/Helpers/IDEHelper.cs index 9f494dc..c3747ca 100644 --- a/OpenCover.UI/Helpers/IDEHelper.cs +++ b/OpenCover.UI/Helpers/IDEHelper.cs @@ -17,438 +17,438 @@ namespace OpenCover.UI.Helpers { - internal static class IDEHelper - { - private const string BASE_IMAGE_PREFIX = "/OpenCover.UI;component/"; - - private static IVsOutputWindow _outputWindow; - private static IVsOutputWindowPane _pane; - private static EnvDTE.DTE DTE; - - /// - /// Initializes the class. - /// - static IDEHelper() - { - _outputWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; - - Guid guidGeneral = VSConstants.OutputWindowPaneGuid.GeneralPane_guid; - int hr = _outputWindow.CreatePane(guidGeneral, "OpenCover", 1, 1); - hr = _outputWindow.GetPane(guidGeneral, out _pane); - - DTE = (Package.GetGlobalService(typeof(EnvDTE.DTE))) as EnvDTE.DTE; - } - - /// - /// Opens the file in Visual Studio. - /// - /// The file path. - internal static void OpenFile(EnvDTE.DTE DTE, string file) - { - try - { - if (System.IO.File.Exists(file)) - { - DTE.ItemOperations.OpenFile(file); - } - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - } - } - - /// - /// Closes the file. - /// - /// The DTE. - /// Name of the file. - internal static void CloseFile(EnvDTE.DTE DTE, string fileName) - { - foreach (EnvDTE.Document document in DTE.Documents) - { - if (fileName.Equals(document.FullName, StringComparison.InvariantCultureIgnoreCase)) - { - document.Close(); - break; - } - } - } - - /// - /// Moves the caret to line number. - /// - /// The DTE. - /// The line number. - internal static void GoToLine(EnvDTE.DTE DTE, int lineNumber) - { - DTE.ExecuteCommand("GotoLn", lineNumber.ToString()); - } - - /// - /// Writes to the output window. - /// - /// The message. - internal static void WriteToOutputWindow(string message) - { - try - { - if (_pane != null) - { - _pane.OutputStringThreadSafe(message); - _pane.OutputStringThreadSafe(Environment.NewLine); - } - } - catch (Exception ex) - { - MessageBox.Show(String.Format("{0}\n{1}", ex.Message, ex.StackTrace), Resources.MessageBoxTitle, MessageBoxButton.OK); - } - } - - /// - /// Writes to output window. - /// - /// The string format. - /// The arguments to formatting. - internal static void WriteToOutputWindow(string format, params object[] arguments) - { - WriteToOutputWindow(String.Format(format, arguments)); - } - - - /// - /// Finds all the dlls in the project with reference to UnitTestFramework.dll - /// - /// List of all dlls which might contain tests - internal static IEnumerable GetPotentialTestDLLs() - { - string mstestPath = "Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll"; - string nunitPath = "nunit.Framework.dll"; - string xunitPath = "xunit.core.dll"; - - List projects = new List(); - - GetProjects(DTE.Solution.Projects, projects); - - foreach (var currentProject in projects) - { - var vsProject2 = currentProject.Object as VSProject2; - bool isTestProject = false; - - if (vsProject2 != null) - { - foreach (Reference reference in vsProject2.References) - { - var referenceFile = Path.GetFileName(reference.Path); - if (mstestPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase) - || nunitPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase) - || xunitPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase)) - { - isTestProject = true; - break; - } - } - - if (isTestProject) - { - yield return GetOutputPath(currentProject); - } - } - } - - } - - /// - /// Search for a class + method in the opened solution. When found, the corresponding file will - /// be opened, and the specified method will be shown. - /// - /// Fully qualified method to search for. - internal static void OpenFileByFullyQualifiedMethodName(string fullyQualifiedMethodName) - { - List projects = new List(); - - GetProjects(DTE.Solution.Projects, projects); - - foreach (EnvDTE.Project project in projects) - { - var projectItems = project.ProjectItems; - var found = ScanProjectItems(fullyQualifiedMethodName, projectItems); - if (found) - { - if (Debugger.IsAttached) - { - WriteToOutputWindow("Method found, stopping solution search"); - } - - return; - } - } - - WriteToOutputWindow("Could not find method '{0}' in the current solution", fullyQualifiedMethodName); - } - - private static bool ScanProjectItems(string fullyQualifiedMethodName, EnvDTE.ProjectItems projectItems) - { - foreach (EnvDTE.ProjectItem projectItem in projectItems) - { - if (Debugger.IsAttached) - { - WriteToOutputWindow("Processing projectItem: {0}", projectItem.Name); - } - - if (projectItem.FileCodeModel != null) - { - var codeModel = (EnvDTE.FileCodeModel)projectItem.FileCodeModel; - foreach (EnvDTE.CodeElement codeElement in codeModel.CodeElements) - { - EnvDTE.CodeElement discoveredMethodElement; - if (FindMethodInCodeElement(codeElement, fullyQualifiedMethodName, out discoveredMethodElement)) - { - var filepath = (string)projectItem.Properties.Item("FullPath").Value; - - WriteToOutputWindow("Method '{0}' found, opening file: '{1}'", fullyQualifiedMethodName, filepath); - OpenFile(DTE, filepath); - - int methodStartLine = discoveredMethodElement.StartPoint.Line; - WriteToOutputWindow("Moving to method on line: {0}", methodStartLine); - GoToLine(DTE, discoveredMethodElement.StartPoint.Line); - return true; - } - } - } - else if (projectItem.Kind == EnvDTE.Constants.vsProjectItemKindPhysicalFolder) - { - if (Debugger.IsAttached) - { - WriteToOutputWindow("Scanning subfolder: {0}", projectItem.Name); - } - - var found = ScanProjectItems(fullyQualifiedMethodName, projectItem.ProjectItems); - if (found) - { - return true; - } - } - } - return false; - } - - private static bool FindMethodInCodeElement(EnvDTE.CodeElement codeElement, string fullyQualifiedMethodName, - out EnvDTE.CodeElement discoveredMethodElement) - { - if (codeElement.Kind == EnvDTE.vsCMElement.vsCMElementClass) - { - if (Debugger.IsAttached) - { - WriteToOutputWindow("Processing class: {0}", codeElement.FullName); - } - - foreach (EnvDTE.CodeElement classChildCodeElement in codeElement.Children) - { - if (classChildCodeElement.Kind == EnvDTE.vsCMElement.vsCMElementFunction) - { - if (fullyQualifiedMethodName == classChildCodeElement.FullName) - { - discoveredMethodElement = classChildCodeElement; - return true; - } - } - } - } - - foreach (EnvDTE.CodeElement childElement in codeElement.Children) - { - if (FindMethodInCodeElement(childElement, fullyQualifiedMethodName, out discoveredMethodElement)) - { - return true; - } - } - - discoveredMethodElement = null; - return false; - } - - private static void GetProjects(EnvDTE.Projects projects, List projectList) - { - foreach (EnvDTE.Project project in projects) - GetProjects(project, projectList); - } - - private static void GetProjects(EnvDTE.Project project, List projectList) - { - if (project == null) - return; - - if (project.Kind.Contains("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC") || project.Kind.Contains("F184B08F-C81C-45F6-A57F-5ABD9991F28F")) - projectList.Add(project); - - if (project.ProjectItems == null || project.ProjectItems.Count == 0) - return; - - foreach (EnvDTE.ProjectItem proj in project.ProjectItems) - { - var DTEProject = proj.Object as EnvDTE.Project; - if (DTEProject != null) - GetProjects(DTEProject, projectList); - } - } - - internal static string GetImageURL(string url) - { - return String.Format("{0}{1}", BASE_IMAGE_PREFIX, url); - } - - /// - /// Returns the output path of the project. - /// - /// The project. - /// Output path - internal static string GetOutputPath(EnvDTE.Project project) - { - string outputPath = project.ConfigurationManager != null && project.ConfigurationManager.ActiveConfiguration != null - ? project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString() : null; - - if (outputPath == null) - { - return null; - } - - string absoluteOutputPath; - string projectFolder; - - if (outputPath.StartsWith(String.Format("{0}{0}", Path.DirectorySeparatorChar))) - { - // This is the case 1: "\\server\folder" - absoluteOutputPath = outputPath; - } - else if (outputPath.Length >= 2 && outputPath[1] == Path.VolumeSeparatorChar) - { - // This is the case 2: "drive:\folder" - absoluteOutputPath = outputPath; - } - else if (outputPath.IndexOf("..\\") != -1) - { - // This is the case 3: "..\..\folder" - projectFolder = Path.GetDirectoryName(project.FullName); - while (outputPath.StartsWith("..\\")) - { - outputPath = outputPath.Substring(3); - projectFolder = Path.GetDirectoryName(projectFolder); - } - - absoluteOutputPath = System.IO.Path.Combine(projectFolder, outputPath); - } - else - { - // This is the case 4: "folder" - projectFolder = System.IO.Path.GetDirectoryName(project.FullName); - absoluteOutputPath = System.IO.Path.Combine(projectFolder, outputPath); - } - - return Path.Combine(absoluteOutputPath, project.Properties.Item("OutputFileName").Value.ToString()); - } - - internal static string GetIcon(TestExecutionStatus status) - { - string icon = "Resources/{0}"; - - switch (status) - { - case TestExecutionStatus.NotRun: - return string.Format(icon, "NotRun.png"); - case TestExecutionStatus.Successful: - return string.Format(icon, "Successful.png"); - case TestExecutionStatus.Error: - return string.Format(icon, "Failed.png"); - case TestExecutionStatus.Inconclusive: - return string.Format(icon, "Inconclusive.png"); - default: - return string.Format(icon, "NotRun.png"); - } - } - - /// - /// Returns the property value . - /// - /// Generic Type for value of the property - /// The object. - /// Name of the property. - /// Value of the property as T - private static T GetPropertyValue(Object obj, string propertyName) where T : class - { - return obj.GetType().GetProperty(propertyName).GetValue(obj) as T; - } - - - /// - /// Returns the document file name of the text view. - /// - /// The view instance. - /// - internal static string GetFileName(ITextView view) - { - ITextBuffer TextBuffer = view.TextBuffer; - - ITextDocument TextDocument = GetTextDocument(TextBuffer); - - if (TextDocument == null || TextDocument.FilePath == null || TextDocument.FilePath.Equals("Temp.txt")) - { - return null; - } - - return TextDocument.FilePath; - } - - /// - /// Retrives the ITextDocument from the text buffer. - /// - /// The text buffer instance. - /// - private static ITextDocument GetTextDocument(ITextBuffer TextBuffer) - { - if (TextBuffer == null) - return null; - - ITextDocument textDoc; - var rc = TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out textDoc); - - if (rc == true) - return textDoc; - else - return null; - } - - /// Given an IWpfTextViewHost representing the currently selected editor pane, - /// return the ITextDocument for that view. That's useful for learning things - /// like the filename of the document, its creation date, and so on. - internal static ITextDocument GetTextDocumentForView(IWpfTextViewHost viewHost) - { - ITextDocument document; - viewHost.TextView.TextDataModel.DocumentBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document); - return document; - } - - ///// - ///// Refreshes/Repaints the active file in Visual Studio. - ///// - //internal static void RefreshActiveDocument(EnvDTE.DTE DTE) - //{ - // try - // { - // IWpfTextViewHost host = OpenCoverUIPackage.Instance.GetCurrentViewHost(); - // if (host != null) - // { - // var doc = GetTextDocumentForView(host); - // doc.UpdateDirtyState(true, DateTime.Now); - // } - - // } - // catch (Exception ex) - // { - // Debug.WriteLine(ex.Message); - // } - //} - - - } + internal static class IDEHelper + { + private const string BASE_IMAGE_PREFIX = "/OpenCover.UI;component/"; + + private static IVsOutputWindow _outputWindow; + private static IVsOutputWindowPane _pane; + private static EnvDTE.DTE DTE; + + /// + /// Initializes the class. + /// + static IDEHelper() + { + _outputWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; + + Guid guidGeneral = VSConstants.OutputWindowPaneGuid.GeneralPane_guid; + int hr = _outputWindow.CreatePane(guidGeneral, "OpenCover", 1, 1); + hr = _outputWindow.GetPane(guidGeneral, out _pane); + + DTE = (Package.GetGlobalService(typeof(EnvDTE.DTE))) as EnvDTE.DTE; + } + + /// + /// Opens the file in Visual Studio. + /// + /// The file path. + internal static void OpenFile(EnvDTE.DTE DTE, string file) + { + try + { + if (System.IO.File.Exists(file)) + { + DTE.ItemOperations.OpenFile(file); + } + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + } + } + + /// + /// Closes the file. + /// + /// The DTE. + /// Name of the file. + internal static void CloseFile(EnvDTE.DTE DTE, string fileName) + { + foreach (EnvDTE.Document document in DTE.Documents) + { + if (fileName.Equals(document.FullName, StringComparison.InvariantCultureIgnoreCase)) + { + document.Close(); + break; + } + } + } + + /// + /// Moves the caret to line number. + /// + /// The DTE. + /// The line number. + internal static void GoToLine(EnvDTE.DTE DTE, int lineNumber) + { + DTE.ExecuteCommand("GotoLn", lineNumber.ToString()); + } + + /// + /// Writes to the output window. + /// + /// The message. + internal static void WriteToOutputWindow(string message) + { + try + { + if (_pane != null) + { + _pane.OutputStringThreadSafe(message); + _pane.OutputStringThreadSafe(Environment.NewLine); + } + } + catch (Exception ex) + { + MessageBox.Show(String.Format("{0}\n{1}", ex.Message, ex.StackTrace), Resources.MessageBoxTitle, MessageBoxButton.OK); + } + } + + /// + /// Writes to output window. + /// + /// The string format. + /// The arguments to formatting. + internal static void WriteToOutputWindow(string format, params object[] arguments) + { + WriteToOutputWindow(String.Format(format, arguments)); + } + + + /// + /// Finds all the dlls in the project with reference to UnitTestFramework.dll + /// + /// List of all dlls which might contain tests + internal static IEnumerable GetPotentialTestDLLs() + { + string mstestPath = "Microsoft.VisualStudio.TestPlatform.TestFramework.dll"; + string nunitPath = "nunit.Framework.dll"; + string xunitPath = "xunit.core.dll"; + + List projects = new List(); + + GetProjects(DTE.Solution.Projects, projects); + + foreach (var currentProject in projects) + { + var vsProject2 = currentProject.Object as VSProject2; + bool isTestProject = false; + + if (vsProject2 != null) + { + foreach (Reference reference in vsProject2.References) + { + var referenceFile = Path.GetFileName(reference.Path); + if (mstestPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase) + || nunitPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase) + || xunitPath.Equals(referenceFile, StringComparison.InvariantCultureIgnoreCase)) + { + isTestProject = true; + break; + } + } + + if (isTestProject) + { + yield return GetOutputPath(currentProject); + } + } + } + + } + + /// + /// Search for a class + method in the opened solution. When found, the corresponding file will + /// be opened, and the specified method will be shown. + /// + /// Fully qualified method to search for. + internal static void OpenFileByFullyQualifiedMethodName(string fullyQualifiedMethodName) + { + List projects = new List(); + + GetProjects(DTE.Solution.Projects, projects); + + foreach (EnvDTE.Project project in projects) + { + var projectItems = project.ProjectItems; + var found = ScanProjectItems(fullyQualifiedMethodName, projectItems); + if (found) + { + if (Debugger.IsAttached) + { + WriteToOutputWindow("Method found, stopping solution search"); + } + + return; + } + } + + WriteToOutputWindow("Could not find method '{0}' in the current solution", fullyQualifiedMethodName); + } + + private static bool ScanProjectItems(string fullyQualifiedMethodName, EnvDTE.ProjectItems projectItems) + { + foreach (EnvDTE.ProjectItem projectItem in projectItems) + { + if (Debugger.IsAttached) + { + WriteToOutputWindow("Processing projectItem: {0}", projectItem.Name); + } + + if (projectItem.FileCodeModel != null) + { + var codeModel = (EnvDTE.FileCodeModel)projectItem.FileCodeModel; + foreach (EnvDTE.CodeElement codeElement in codeModel.CodeElements) + { + EnvDTE.CodeElement discoveredMethodElement; + if (FindMethodInCodeElement(codeElement, fullyQualifiedMethodName, out discoveredMethodElement)) + { + var filepath = (string)projectItem.Properties.Item("FullPath").Value; + + WriteToOutputWindow("Method '{0}' found, opening file: '{1}'", fullyQualifiedMethodName, filepath); + OpenFile(DTE, filepath); + + int methodStartLine = discoveredMethodElement.StartPoint.Line; + WriteToOutputWindow("Moving to method on line: {0}", methodStartLine); + GoToLine(DTE, discoveredMethodElement.StartPoint.Line); + return true; + } + } + } + else if (projectItem.Kind == EnvDTE.Constants.vsProjectItemKindPhysicalFolder) + { + if (Debugger.IsAttached) + { + WriteToOutputWindow("Scanning subfolder: {0}", projectItem.Name); + } + + var found = ScanProjectItems(fullyQualifiedMethodName, projectItem.ProjectItems); + if (found) + { + return true; + } + } + } + return false; + } + + private static bool FindMethodInCodeElement(EnvDTE.CodeElement codeElement, string fullyQualifiedMethodName, + out EnvDTE.CodeElement discoveredMethodElement) + { + if (codeElement.Kind == EnvDTE.vsCMElement.vsCMElementClass) + { + if (Debugger.IsAttached) + { + WriteToOutputWindow("Processing class: {0}", codeElement.FullName); + } + + foreach (EnvDTE.CodeElement classChildCodeElement in codeElement.Children) + { + if (classChildCodeElement.Kind == EnvDTE.vsCMElement.vsCMElementFunction) + { + if (fullyQualifiedMethodName == classChildCodeElement.FullName) + { + discoveredMethodElement = classChildCodeElement; + return true; + } + } + } + } + + foreach (EnvDTE.CodeElement childElement in codeElement.Children) + { + if (FindMethodInCodeElement(childElement, fullyQualifiedMethodName, out discoveredMethodElement)) + { + return true; + } + } + + discoveredMethodElement = null; + return false; + } + + private static void GetProjects(EnvDTE.Projects projects, List projectList) + { + foreach (EnvDTE.Project project in projects) + GetProjects(project, projectList); + } + + private static void GetProjects(EnvDTE.Project project, List projectList) + { + if (project == null) + return; + + if (project.Kind.Contains("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC") || project.Kind.Contains("F184B08F-C81C-45F6-A57F-5ABD9991F28F")) + projectList.Add(project); + + if (project.ProjectItems == null || project.ProjectItems.Count == 0) + return; + + foreach (EnvDTE.ProjectItem proj in project.ProjectItems) + { + var DTEProject = proj.Object as EnvDTE.Project; + if (DTEProject != null) + GetProjects(DTEProject, projectList); + } + } + + internal static string GetImageURL(string url) + { + return String.Format("{0}{1}", BASE_IMAGE_PREFIX, url); + } + + /// + /// Returns the output path of the project. + /// + /// The project. + /// Output path + internal static string GetOutputPath(EnvDTE.Project project) + { + string outputPath = project.ConfigurationManager != null && project.ConfigurationManager.ActiveConfiguration != null + ? project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString() : null; + + if (outputPath == null) + { + return null; + } + + string absoluteOutputPath; + string projectFolder; + + if (outputPath.StartsWith(String.Format("{0}{0}", Path.DirectorySeparatorChar))) + { + // This is the case 1: "\\server\folder" + absoluteOutputPath = outputPath; + } + else if (outputPath.Length >= 2 && outputPath[1] == Path.VolumeSeparatorChar) + { + // This is the case 2: "drive:\folder" + absoluteOutputPath = outputPath; + } + else if (outputPath.IndexOf("..\\") != -1) + { + // This is the case 3: "..\..\folder" + projectFolder = Path.GetDirectoryName(project.FullName); + while (outputPath.StartsWith("..\\")) + { + outputPath = outputPath.Substring(3); + projectFolder = Path.GetDirectoryName(projectFolder); + } + + absoluteOutputPath = System.IO.Path.Combine(projectFolder, outputPath); + } + else + { + // This is the case 4: "folder" + projectFolder = System.IO.Path.GetDirectoryName(project.FullName); + absoluteOutputPath = System.IO.Path.Combine(projectFolder, outputPath); + } + + return Path.Combine(absoluteOutputPath, project.Properties.Item("OutputFileName").Value.ToString()); + } + + internal static string GetIcon(TestExecutionStatus status) + { + string icon = "Resources/{0}"; + + switch (status) + { + case TestExecutionStatus.NotRun: + return string.Format(icon, "NotRun.png"); + case TestExecutionStatus.Successful: + return string.Format(icon, "Successful.png"); + case TestExecutionStatus.Error: + return string.Format(icon, "Failed.png"); + case TestExecutionStatus.Inconclusive: + return string.Format(icon, "Inconclusive.png"); + default: + return string.Format(icon, "NotRun.png"); + } + } + + /// + /// Returns the property value . + /// + /// Generic Type for value of the property + /// The object. + /// Name of the property. + /// Value of the property as T + private static T GetPropertyValue(Object obj, string propertyName) where T : class + { + return obj.GetType().GetProperty(propertyName).GetValue(obj) as T; + } + + + /// + /// Returns the document file name of the text view. + /// + /// The view instance. + /// + internal static string GetFileName(ITextView view) + { + ITextBuffer TextBuffer = view.TextBuffer; + + ITextDocument TextDocument = GetTextDocument(TextBuffer); + + if (TextDocument == null || TextDocument.FilePath == null || TextDocument.FilePath.Equals("Temp.txt")) + { + return null; + } + + return TextDocument.FilePath; + } + + /// + /// Retrives the ITextDocument from the text buffer. + /// + /// The text buffer instance. + /// + private static ITextDocument GetTextDocument(ITextBuffer TextBuffer) + { + if (TextBuffer == null) + return null; + + ITextDocument textDoc; + var rc = TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out textDoc); + + if (rc == true) + return textDoc; + else + return null; + } + + /// Given an IWpfTextViewHost representing the currently selected editor pane, + /// return the ITextDocument for that view. That's useful for learning things + /// like the filename of the document, its creation date, and so on. + internal static ITextDocument GetTextDocumentForView(IWpfTextViewHost viewHost) + { + ITextDocument document; + viewHost.TextView.TextDataModel.DocumentBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document); + return document; + } + + ///// + ///// Refreshes/Repaints the active file in Visual Studio. + ///// + //internal static void RefreshActiveDocument(EnvDTE.DTE DTE) + //{ + // try + // { + // IWpfTextViewHost host = OpenCoverUIPackage.Instance.GetCurrentViewHost(); + // if (host != null) + // { + // var doc = GetTextDocumentForView(host); + // doc.UpdateDirtyState(true, DateTime.Now); + // } + + // } + // catch (Exception ex) + // { + // Debug.WriteLine(ex.Message); + // } + //} + + + } } diff --git a/OpenCover.UI/OpenCover.UI.csproj b/OpenCover.UI/OpenCover.UI.csproj index b89081a..fba56d8 100644 --- a/OpenCover.UI/OpenCover.UI.csproj +++ b/OpenCover.UI/OpenCover.UI.csproj @@ -1,7 +1,7 @@  - 14.0 + 15.0 11.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -11,6 +11,9 @@ 12.0 ..\ true + + + @@ -25,7 +28,7 @@ OpenCover.UI True Key.snk - v4.5 + v4.6 Program @@ -67,30 +70,88 @@ ..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll - - False - C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\Editor\Microsoft.VisualStudio.CoreUtility.dll + + ..\packages\Microsoft.VisualStudio.CoreUtility.15.6.27740\lib\net46\Microsoft.VisualStudio.CoreUtility.dll + True + + + ..\packages\Microsoft.VisualStudio.ImageCatalog.15.7.27703\lib\net45\Microsoft.VisualStudio.ImageCatalog.dll + True + + + ..\packages\Microsoft.VisualStudio.Imaging.15.7.27703\lib\net45\Microsoft.VisualStudio.Imaging.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.14.3.26930\lib\net20\Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll + True + + + ..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6071\lib\Microsoft.VisualStudio.OLE.Interop.dll + True - False C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Microsoft.VisualStudio.Platform.WindowManagement.dll - - - - - - true + + ..\packages\Microsoft.VisualStudio.Shell.15.0.15.7.27703\lib\net45\Microsoft.VisualStudio.Shell.15.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Framework.15.7.27703\lib\net45\Microsoft.VisualStudio.Shell.Framework.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6072\lib\net11\Microsoft.VisualStudio.Shell.Interop.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30320\lib\net20\Microsoft.VisualStudio.Shell.Interop.10.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61031\lib\net20\Microsoft.VisualStudio.Shell.Interop.11.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.12.0.12.0.30111\lib\net20\Microsoft.VisualStudio.Shell.Interop.12.0.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime.14.3.26929\lib\net20\Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime.dll + True + + + True + ..\packages\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.15.0.26929\lib\net20\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.15.6.DesignTime.15.6.27413\lib\net20\Microsoft.VisualStudio.Shell.Interop.15.6.DesignTime.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50728\lib\net11\Microsoft.VisualStudio.Shell.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30730\lib\net11\Microsoft.VisualStudio.Shell.Interop.9.0.dll + True False C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Microsoft.VisualStudio.Shell.ViewManager.dll - - False - C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\Editor\Microsoft.VisualStudio.Text.Data.dll + + ..\packages\Microsoft.VisualStudio.Text.Data.15.6.27740\lib\net46\Microsoft.VisualStudio.Text.Data.dll + True False @@ -104,10 +165,34 @@ False C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\Editor\Microsoft.VisualStudio.Text.UI.Wpf.dll - + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6071\lib\net11\Microsoft.VisualStudio.TextManager.Interop.dll + True + + + ..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50728\lib\net11\Microsoft.VisualStudio.TextManager.Interop.8.0.dll + True + + + ..\packages\Microsoft.VisualStudio.Threading.15.6.31\lib\net46\Microsoft.VisualStudio.Threading.dll + + + ..\packages\Microsoft.VisualStudio.Utilities.15.7.27703\lib\net46\Microsoft.VisualStudio.Utilities.dll + True + + + ..\packages\Microsoft.VisualStudio.Validation.15.3.15\lib\net45\Microsoft.VisualStudio.Validation.dll + True + + + ..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll + + + ..\packages\StreamJsonRpc.1.3.23\lib\net45\StreamJsonRpc.dll + @@ -115,6 +200,7 @@ + @@ -376,11 +462,21 @@ OpenCover.UI.TestDiscoverer + + + true + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + true + + + + \ No newline at end of file diff --git a/packages/xunit.core.2.1.0/build/_desktop/xunit.execution.desktop.dll b/packages/xunit.core.2.1.0/build/_desktop/xunit.execution.desktop.dll new file mode 100644 index 0000000000000000000000000000000000000000..e5ca3bf2e888bfc0f5263a11baa1b2e8d90db31f GIT binary patch literal 185344 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

K3)tk$BY6 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�&GqtGhi;0tv=g=dWOhR z*&?efb}x^mOfs1*W{b#>!xarw?*Q{8v*owg+DUGni#clk?+B*#Vqt$OP~S0&V4e!8h0W9%ZWCfT1YX2=@Mk7QRzdUdKvV463b)~eD? z#-uw^%^7wEQkX#viTSj`pMv1DQ-Fm*L0)u_o|!f66rT z)}Kl>W1gVHUlJIBnb3L`eA!%m1*iOzeG4X;Bvnr z&{r&URjMVsF_%ea@5q*)2f`pJ`~CM*??qe&wn`SE4gxpaNRGjit{}rib+mbYAFX_%y z6R^H0?Po`2{#pKdB0Ea;Z12D_yRkpDisJD-NMbsjY(l5AMZ|xQ zNN0;gt0|2-AU!~~9TycPa4+NqSL(8&6|Z6viq^>&HQO@~7MUVZSt^f=)Ly(pfV0al zCNj9OVNe&Mlu9MD)rW$xCfA@guZCQ8Y;Xw731JoGih`?Ctr=2YPzIYhbTSm_VkT{x zfH!6r3!hFlgMphmQaVcLbrXg(k%2g)r~9BpTQKHpjb>*LK!1!tJ2XOPQ+6*Pm|1#c zj_9zkY^7UtXQewpdKJbashI!Laq%ESRLqdB@rOkE9CkBS*MV70kU2p z>jPwiLN)}*CWUMYkT!+11;}QFYz~mE3fUSUg9;f8kR1xy5g*F+ipjG94ht6ml#;78SA>AWI5a3Xqcu zIT;`og;WCMv_eh?$Qgy436Qf2ISU~f0sF~3RC&C)HCuU{Gi~K@g?tGzn&{_bQ8_1a zQF*HW%2YcTKU;t-!y>3$z?@FO&S1X9B$NcJFYjpQ`~<0ixr*w#mtSei(>TZ=A5=Yq z_-oC>I?VN7lWNXZXC*T&LYCWy36!CXw=pWucpIbgjN<+b8^FX{c}6p1e)Qo`?%7c8 zSuOXhEB9=qoDE;q$atY;M{7Y)f)R*DEqXfRFTWNH8cC())`rtvA$PPpJ{?=eGve$%HBlM>#~60j8=J_dRhXlQ0s_eHc5A-#cVyrMzfW-IEiOR zSHaAx{&a75<%cpc>YXbZhJXPK*F@J^18s|JGKE%t0C;-}Y(hqWMUO>;taxbR0y{#r zx653HtWqlgIjh|=qo+aoG|U0$?`j|LL@oqCd(1MpW6n-@S927R z48f3Rh@+(tlmM}Flwr(PvYx75k2%ir(&rSrD(_%`@};I$EK^%^{W1~aidNUPX?HMp zr|m*P6FMciSFY=68^|1w5*q}xNv@kYNf)!#&9+4 zs4QE?vH{JP&jL(i0(nOL6bofuRYZJjclqhyZisL<~hPhd@~Tr zE@rC-vP%^5${JvitzsF9;Y0#2OUfiE7a#vP>t}q8}2I8|}8WNWeNdk!shvdbD22Ep_3t zTB?nJr0Gb!+IK~5G4ei;<8qRLkh!;}u%=(%)dV!5J%OPcEXk-CqBjU6d)rB(X^b>F ziHnw9jkc+GU7X~s_F`&@0y`)Kr>GKp5`q;-A|>?RLqw~^Pzlnm5CkMsG^GcV8=H#4 zx;Q6A0o{BpH~O>QX+19GDBU)swtS zhtt_=C5M0B;n0ET2~Sr~ifvIniM*Y$%&lCgS1S-fQ1K*-b@g}2Y8~X`VDldi7^cWT z9$16bk~CR89om%can)1(3NY^S+*g!>8IcI4tisyNBf44!)JHR`Xc(Ybwv|y*{Tj-+ z(cp+NE~Fx1lvD(1=HIBv%(&)Z$g800NqU>W!srDT8N91{BtZ1-Nz$HUptSEJz5BG0 zuhulexM0NW+8RNc`D-X=uc;Jip+LNTK$YE#=~Tj0DHg1gYxzY*>Sc!%a+9WvOAm-kvK5m(*&m5k5Ev5X zW=6~lnAtCBP2Z@giE+)!5WC00Q5p_wr=DP6c&QF+9p7|yK=OzUGXMu${l&eb;?#md}%1B>+6~4!=gquf%f6u|_p|&md=kjS(y@XmKJzNCt zGTFj3%U1u2c!TvpzUaN;WTMg!`3Fw@9*|K09ZFz^CujyNH(LW>xmltxu*4o%7BAcK zDi>WP=C^BSm?&PEZ$%^TrbIS41|Ui2bsd93Y(*g&K(-F)pOb9>oA1O&-sXSR5(3NVhl3Njda7&R;-@8 zIuAUm!=NwNT1tV5&;`^A&hjG*wpz4}U6F5#qX5=H?j92HX5kP~f{;3__b7=zO14?P zS%<0oGISWocv2{^(NSO{8Ett>l+l*AkW>{RSoKRf4?LMwTc`SD3bq$qF~VY}`edCn zq&)j%3htqyEIs42lTit;v}L!_IIQL}tP6Mits?=!a5OuGV!(OY#(V(Smd^!;_PJyh zS)qklWEF21y4B#cXuM0Zg!JSp&g?FCZE8kq3>i=tu+N^#-P+Z}Ar5BO+ZZ)se|6Ec zaqX~MTpHWrE_#7OqunH3#P+svJ4m#~wTmJ$s6~crS9cYwLs0d+4CyYhvM8SuOy-D7->r5$-_B+D)7j+* zp?4UBQSlTO*I065Wkk~yevii`@C>-8TSbymxgHWwgb|HA@DHCAURuIZ5$l5tw`!W! z8mt5PD@uZbcanZbnT;Wiawibp)NJ+ZxfVEp>4j-WFLEty(40+ac!*nM5^bVK2OKF% z8FWM=ISdh9j`Sk4TnosF?GC|X7!A?sob0DbkgdLwxh2&ug|UV~_tC7(0HR*j2|Zi_ zUDpU(^(niEK(>6=>JF^E^7QLq{y2@bmlQ<-iF3Hlpk3ZC;QkXSc$3eP)ne^!5CEnf zYzIiKQ)4RRmzZV<+GH_Z_=yE2_jqFBtz8)+N?`~X8S@% zg>;eyB|f7_$(k;yeJ!8u$?IYU-3Pmf9+YlVcM2iUjcTFWsn_yp&>&mE28iF*I-Rt- zwtU*r>$G^JH^Fg$u>uE?*~*uMIiD8sdDscg!>}N$uTctL$D;AAez+`@zSL;I_ZgUy z4`LCHEBWX_UE?nzq{{O_UFt7_%V~NrVT~+&P@mYoY5^xx?OMHv-((7oj$HQCwIHEu z7Yx`Vrev3{BrBKDJTS|a-=c_=-^z|=E6)K2zY1a?U*!%o3Xv77rE(YUP^##xtm2oC z24nT2n{_X$X&T}>3t!A&(8QR%n5|w)bEam1+Mq~7h&sus2RN7yy|x2`$x_CO zcbN!iF*-)5WS8575g1@I%WX({ShYCvL)|a`G^$o-p0r|%vh^oeR04wG6B#ItqF_Ud zsUQ1c@H`fw(@<|`_i{HlEteU9;<}67wwgveBYZ#w0)C(l^V$i``K+t3jg*E!mCs=h z$@4u}6}z=?4gpAS9xN34#<1_)0_@H~O`hvtjZHNclmF!w8u!b+FuSq8kHu2kDg(J5(rNs$W^mXkUdwM{fbBVi7TDBsUZE!e1h9XMDWgB#$_+nk zq`^T?M;)lp4^<=THG2oAH5C>WOWiSK z={=yh0@*7R=Qy!2_c)?(SsyPf3w>#pjtZZV>(zKhLf)TBD@nloFrcs;k#QPEIE)RL zL00X^7O#HqXW{Acer=YsN2(h??aqE{{ zf4m=DF#B$PwXU0lkXxU_oiZqaoM#2HWIU&0Kjd#tuVXD6a+{Ne=5o2%uo$Jl-+3xYq?nw?ToO`>MKMxRAUa%b` zD4l0Hiq)977zEx2T3|VcN?C`kn+!*JtZ=tr7Je~^wyWIn-pk0|lWJjMmC$2!%fR#} zm5DN?^^6~yZvY~e6}pXlvTGwD6<&a>@UlKD4+ui4SdtBaC*y1xlbUZLSFet1&3J-f z!rw#;+@`J=-q9~N3boQ(-g5nxbamln(f1`PzI$SvPYqY-SoDb>X}UEAhDP|Ro869VCS zk~R&jEf{q<*csRl8x8nvR85JwM{Pjf^E$rp3xm*ZaB;_y=45vH4iwf%`Q_*cFK@BS zo|D|w1BUX4>Yd|*YZ6!-uDiQ>aiVN7yS&?C4iwKpciRyzpYv-u=Qk^#>xA{l5}Ffp zE&`cWnzGdj4^KH<1EtV`?&XKOVCT`gC-a?gmc0*LAcVAEo`q3|tzH~6qG1YeA|1CF zsVhJb%)FHg!dco1Xy|mM=w)yyg=mySfQ>|5qJb_a1*1;0|K=wjy1#GZ8)wpITQ2)Iygac~{aEvt{_M4x=0AS!n$I@>;S1xxk8ZJJRJd{? zv$+-AiM0+7|M6%jr5z3>%xLGhze4W%>(t`N98N#Miwt9{sb@?CTbKFRu| zr8hWL=NSD{W}wfF8J;5KG%l6qRRDWGQVaSFmtyOCsxKfPd`HapLzZ}jmjdk?=T;$L zGt<9mn|_eyOUzxtEN@C}Nx}U!NXJ_s(Sy<_aTOpo#B2mlGjNdz9e~ak%|=M2o%rb5 z2l2`U96e}BLe;dkA=Ds9swV6sac%$Lsbt8?Ra*N=ky|x-e{yR8p%Z?*G40WXyp26WL-3} zJ{s8&jckfW+M+B>1gCkG;)^1SK%&Qg`!eD%Fvg1p&U#A-8OvW~Zc2akPep?K+7bds=yzSCFfpvS zSNFBIdRxcAD$INmm-5$eSvI~{Mfq0k3*tgsf%$%i`TB9Gin91UT7}UK8RmHzm&z(; zyw$F1pdsLkvC_fGnc2Pp`8^3ikttaUE#GC&b|8P4al0KY+!UOwgJk@f5SIrvxXxg9 zB`({k*Uq!y@9-k}?7K{O2$#xrBC*g3s_M|ha_C0c%Yd08D2i;a#SxS;fG1$;3c+N zht}XU4OC%x_Jm$r96fA?Q5py8shZU|*}xMv`UnZEP?V3wVT|LE1UN{tqqKcsF~IkO zGs-Y7&|aYx9;8er$)q7nemI>DFC-qH!G=kZKo}lfrnMhCjND&bq&c?KNjKCn7lVhI z&NWc(^lG<a z7(7Cs&cPbv^GM}4u^|jF18qQt(^w`$jLUCkN3S;63a0xhddOaOVbZNw=-~Ml)P0XfF)?b zn*`ixu${SCg4pHG_!yRG)vd$d5XP_IZ*z^~&@$3%{o;-17VoroP7xR z09#-ARSn&5ELMB`q1W2%f>T~l9>%=l+>rrm&@0#9X+1?)B_d^Q9=jXS;~d~n?Yq?G zGGkqf_?kd15*DbUMv@-Z0(TnAkK-i9lRCEC4%NZImKjt6s95D_!B?>)nK}Ac$jTV! zG)o`GMzi#FQ?+x|fK1fo^j5s~;pK*S|Ur(EQbc9?B|cX9}69=wT;4PokgY$ncIT zIIv1~$hOd7vliW~WQGu62%aLpS2uA>2c7t)4bg*` zN^qWws=!4>-3@7j7n@P{v_NnL-(BpoGobf!qztflD_iXJwgD#oOt-Py>`+AFg?fwF zPNM=;+z-3T9|xl|sglV?@{4g%eajgK6)4IioiF@Xv?_v21^Qh*PenoEOL!uT$Xr4z zQuqnf%)l~sl`6~v87+3R13U;St3^<}qEr95PCRo79-?LfXQVNAa5E1>kC6s|x|O1F zj_EiPjg%(Yb7o5VoSc*Qaqv0C-lV=hJ6A;&|SyqR%G3{_h24zP2+h_ z{tAyen4HzYo-G+Mm%ak0?|e#it1IA7{Q!UThC6q$d}s$2U9>6Wf?ENm864r|mlT(m zGMv*Y*u+&d(j*!x#L*6cYb|jUmR#mI3QM&pENS6R)^yC3Ny(^WN8?rYx#W12IM5&O zRi9Sb&3R2I>dH|$E2OsSVV5Od^>A&~!&)`S0%Z<~gLWDcRr9KFMEO-Pi9Onry+fZ6 zxgak;AVHCt4{#<$dB9r(GA6~T;sU)c(B}d<7r5315-xDP3#@a2^)9f%1#l=xn`m=^ z%`ULj1qNMUhYNVbh8<*|3mkBPgD!vrY}&+_3lv8AWtO=@VZJ~0W zcPeMcMtJHAN1!UZ@W;HOz!@l0r8nP*C(wAo#B4H6H{ulnH@YGZ8imS_DxA^utcpOG8bp z6UkiQwbCNt&64YztZ#^yX@On@l}HE-t{_9r4qMLl7iEzZZy>-Wjht!ZghG^>UPZjW zIRQs{8lH4I)ZwpyQ+*_P1;3+yZ)wJVj!r%bIiEm2?kyN|HBNZrvzvuEeBtzXA-@wJ z8^!k{@j-ZF@(FXzi32mmg@KvELZ089!$&XkJLm9uNPa%im>U!3ef&zHe8f0^55K!sJ3t{+pNi8z&3%k1UjC*BR47e9ch8Ts?5_juGF;&G#4P=7G)D;~NJyp+lK9 zKFNOkkzcFKvP{4%kG!`g%uVuP!GZmgj|}+k+pqE6v_(Fvyt_D4n7?!K(4o!7+?6mN z4h0&0AM~az{4^szrMRs$Jv&t(ktCa~03_uI7*kA`$!%j(Q-#U=_)>o1XdypYSU+Ew zD~?U!tdyoC8c zO#^iWSdD&oG$42T9masMZmlWnKPK6@#oN$goMGafkCpP+7eceQq1nv|voYT6(9H4D zBRU2e3>XJ$e!!Rw33Ky`CByKIA3C&g)1h1MoNQD=2@ylow{bfL{X+?}Dc(kd64Esc zWa!xK80?!8=Kb-ajhoqcyD>Ww=B|)eLaa2-l){qImLHeU;s$W_V8U!^P>Xz%RNKC3 zi+&MRKs$>k78d7%TwpX;z#~?};9=-VL4&L%ALNCwda8kK?@5@uFNeq71xU4inU&S- zEY1|?kK&u){Kha<$%b3;8N`J7Xrp?3_g$v~NeP?r*4Bg?3G!F~^?FwK^V3aRI72~E%bR1CyZcR zN8MLAJXMgd{thlI%oWEmfe+0bE`iDQv+<6P_9e{j&?J$MsF*t^4jr z-xA2J0};~b|uWVhaSs=gA3E+n8>!~A9F%G-~xNc7LK00Igig+A1)qY z4xoq7&f-*o)Aq^yL-g zVhU)T)CbWzWhA9u>8aL!bAGzOuSl~7?P{de@=qm9xm;U^&34)9n8D_a*1RIpH|OUc zDb5m+{kY@9)bpho?Foo|-PgbMFFv>S#8l+ z|JA?#aO=Jg{Nn1nzPtS1|8ebw?~i@?@14H7?ccv=bN|QwB)9jMlArn7!Q_RF&+QvN ze(%@!yzsN1{KOkS^^5=fe|@DZv+=sh>&Jh%{GFe>t@3lXefIS~+yCUpzMI>&``;}5 ze&^0lpZ)3iM}Pmp4S%q`^$+g*BFFoh8`JmmPNT7m|C|3y(%k%F(%iRy`~Ls^d$(No zpYFVI&r|ttw|r&eUu`FcZ2QndcP|#FCI^q;!{ZOpTzqI^{PqtPHjhmlzV(hxlN)Zm z;X|eIPds#AVG4vOtdwV9c5>W&19-Tf|ITpU#p3rjBKeFt zw5>F^eQIiWtT_!3j>o=_%0uQ{?GNOqbpwe?_z&@DUc9mxJubRLI$<=F;|x( zKm=7k?n3B6(`0^&N1^P`Z#7}sGWVPP__FlyyG-s%Y&nBC?I!1;<({rn<7i|yaLkMuow z&o18^%1>VKP4>qT&ZB<544Utjk76^4?Yx9&75}#*^g)Bk9zPG7ev~6+ zwKse<`BbE*mwVkbU+o$&89>kZc^rfP>rgM>lzc>LBqe7-L-zUz-od(nJoPa4Z5#TN ze^>N + + + + xunit.execution.desktop.dll + PreserveNewest + False + + + \ No newline at end of file diff --git a/packages/xunit.core.2.1.0/build/win8/_._ b/packages/xunit.core.2.1.0/build/win8/_._ new file mode 100644 index 0000000..e69de29 diff --git a/packages/xunit.core.2.1.0/build/win81/xunit.core.props b/packages/xunit.core.2.1.0/build/win81/xunit.core.props new file mode 100644 index 0000000..a00a545 --- /dev/null +++ b/packages/xunit.core.2.1.0/build/win81/xunit.core.props @@ -0,0 +1,10 @@ + + + + + xunit.execution.desktop.dll + PreserveNewest + False + + + \ No newline at end of file diff --git a/packages/xunit.core.2.1.0/build/wp8/_._ b/packages/xunit.core.2.1.0/build/wp8/_._ new file mode 100644 index 0000000..e69de29 diff --git a/packages/xunit.core.2.1.0/build/wpa81/xunit.core.props b/packages/xunit.core.2.1.0/build/wpa81/xunit.core.props new file mode 100644 index 0000000..a00a545 --- /dev/null +++ b/packages/xunit.core.2.1.0/build/wpa81/xunit.core.props @@ -0,0 +1,10 @@ + + + + + xunit.execution.desktop.dll + PreserveNewest + False + + + \ No newline at end of file diff --git a/packages/xunit.core.2.1.0/build/xamarinios/_._ b/packages/xunit.core.2.1.0/build/xamarinios/_._ new file mode 100644 index 0000000..e69de29 From b6f2a5541a56450a8c1f1dc59b2d31b7f9d3a073 Mon Sep 17 00:00:00 2001 From: Stefan Koenen Date: Sun, 17 Feb 2019 11:32:23 +0100 Subject: [PATCH 2/2] Changed indicator to rectangles --- .gitignore | 2 ++ .../Glyphs/LineCoverageGlyphFactory.cs | 25 ++++++++++--------- OpenCover.UI/source.extension.vsixmanifest | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 73fe653..e3db126 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,5 @@ packages !packages/*/build/ /OpenCover.UI.VS2013.sln.DotSettings OpenCover/ + +\.vs/ diff --git a/OpenCover.UI/Glyphs/LineCoverageGlyphFactory.cs b/OpenCover.UI/Glyphs/LineCoverageGlyphFactory.cs index f1d777d..53d7aff 100644 --- a/OpenCover.UI/Glyphs/LineCoverageGlyphFactory.cs +++ b/OpenCover.UI/Glyphs/LineCoverageGlyphFactory.cs @@ -27,7 +27,7 @@ namespace OpenCover.UI.Glyphs public class LineCoverageGlyphFactory : TextViewCoverageProviderBase, IGlyphFactory { const double _glyphSize = 12.0; - + private static Brush _redBrush = new SolidColorBrush(Color.FromRgb(196, 64, 47)); private static Brush _greenBrush = new SolidColorBrush(Color.FromRgb(88, 196, 84)); private static Brush _orangeBrush = new SolidColorBrush(Color.FromRgb(196, 136, 41)); @@ -36,9 +36,9 @@ public class LineCoverageGlyphFactory : TextViewCoverageProviderBase, IGlyphFact /// Initializes a new instance. /// /// The current text editor. - public LineCoverageGlyphFactory(IWpfTextView view) :base(view) + public LineCoverageGlyphFactory(IWpfTextView view) : base(view) { - + } ///

@@ -61,10 +61,11 @@ public UIElement GenerateGlyph(IWpfTextViewLine line, IGlyphTag tag) if (brush == null) return null; - System.Windows.Shapes.Ellipse ellipse = new Ellipse(); + System.Windows.Shapes.Rectangle ellipse = new Rectangle(); ellipse.Fill = brush; - ellipse.Height = _glyphSize; - ellipse.Width = _glyphSize; + ellipse.Height = 14; + ellipse.Width = 3; + ellipse.HorizontalAlignment = HorizontalAlignment.Right; ellipse.ToolTip = GetToolTipText(state); @@ -76,7 +77,7 @@ public UIElement GenerateGlyph(IWpfTextViewLine line, IGlyphTag tag) } return ellipse; - } + } /// /// Determines the correct brush for the coverage state. @@ -86,7 +87,7 @@ public UIElement GenerateGlyph(IWpfTextViewLine line, IGlyphTag tag) private Brush GetBrushForState(LineCoverageState state) { switch (state) - { + { case LineCoverageState.Covered: return _greenBrush; case LineCoverageState.Uncovered: @@ -127,7 +128,7 @@ private LineCoverageState GetLineCoverageState(ITextViewLine line) { // get cover state for all spans included in this line var spans = GetSpansForLine(line, _currentSpans); - + if (spans.Any()) { IEnumerable coverageStates = spans.Select(s => _spanCoverage[s]); @@ -144,7 +145,7 @@ private LineCoverageState GetLineCoverageState(ITextViewLine line) return LineCoverageState.Partly; } } - + return LineCoverageState.Unknown; } @@ -158,7 +159,7 @@ public static IEnumerable GetSpansForLine(ITextViewLine line, IEnu { return spanContainer.Where(s => s.Snapshot.Version == line.Snapshot.Version) .Where(s => (s.Start >= line.Start && s.Start <= line.End) || (s.Start < line.Start && s.End >= line.Start)); - } + } /// /// Hide the colored line @@ -185,6 +186,6 @@ void OnGlyphMouseEnter(object sender, System.Windows.Input.MouseEventArgs e) if (tagger != null) tagger.ShowForLine(line); - } + } } } diff --git a/OpenCover.UI/source.extension.vsixmanifest b/OpenCover.UI/source.extension.vsixmanifest index e980be8..797a418 100644 --- a/OpenCover.UI/source.extension.vsixmanifest +++ b/OpenCover.UI/source.extension.vsixmanifest @@ -1,7 +1,7 @@  - + OpenCover UI Visual Studio Integration for OpenCover https://github.com/OpenCoverUI/OpenCover.UI