Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikayla Hutchinson <m.j.hutchinson@gmail.com>2017-01-26 19:35:44 +0300
committerMikayla Hutchinson <m.j.hutchinson@gmail.com>2017-01-26 20:33:09 +0300
commit9baeaf6cdcddfc61bd8641c5b85b118a5734fb39 (patch)
tree51c5f3511df74d1962923ffd448fa342926ca9a6
parentbfe719850a431ab688e674bcaa4379c04f8f9e3f (diff)
parent239def51e3a1addbad9cffc818e978a8fc6d8afb (diff)
Merge remote-tracking branch 'xamarin/vNext' into roslyn-ivt
-rw-r--r--main/Main.sln32
m---------main/external/debugger-libs0
-rw-r--r--main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj7
-rw-r--r--main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpBinding.addin.xml11
-rw-r--r--main/src/addins/CSharpBinding/CSharpBinding.addin.xml5
-rw-r--r--main/src/addins/CSharpBinding/CSharpBinding.csproj6
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs261
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/IExtensionContextHandler.cs (renamed from main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IBuildEngine.cs)39
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolCompletionData.cs186
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolMemberContextHandler.cs176
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CodeGenerationPanel.cs2
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs34
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs8
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyResourceFolderNodeBuilder.cs10
-rw-r--r--main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs6
-rw-r--r--main/src/addins/MonoDevelop.ConnectedServices/Gui.ServicesTab/ServiceDetailsWidget.cs2
-rw-r--r--main/src/addins/MonoDevelop.ConnectedServices/Gui.SolutionPad/ConnectedServicesFolderNodeBuilder.cs4
-rw-r--r--main/src/addins/MonoDevelop.Debugger.VSCodeDebugProtocol/MonoDevelop.Debugger.VsCodeDebugProtocol/VSCodeDebuggerSession.cs20
-rw-r--r--main/src/addins/MonoDevelop.Debugger.Win32/Mono.Debugging.Win32/CorDebuggerSession.cs15
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.Tests/MonoDevelop.DotNetCore.Tests/DotNetCoreMSBuildProjectTests.cs19
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.csproj17
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreCanReferenceProjectExtension.cs74
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreMSBuildProject.cs18
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectExtension.cs32
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectReader.cs4
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/MSBuildProjectExtensions.cs10
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerEngine.cs87
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerSession.cs337
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/Properties/MonoDevelop.DotNetCore.addin.xml9
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Console/ConsoleProject.csproj5
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/EmptyWeb/EmptyWebProject.csproj14
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Library/LibraryProject.csproj5
-rw-r--r--main/src/addins/MonoDevelop.DotNetCore/packages.config5
-rw-r--r--main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/StockIconsNodeBuilder.cs5
-rw-r--r--main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/WindowsFolderNodeBuilder.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/DependenciesNodeBuilder.cs8
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesFolderNodeBuilder.cs12
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectReferencesFromPackagesFolderNodeBuilder.cs9
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreFrameworkCompatibility.cs8
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs3
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs7
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildProjectExtensions.cs21
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectPackageReference.cs15
-rw-r--r--main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs40
-rw-r--r--main/src/addins/MonoDevelop.UnitTesting.NUnit/MonoDevelop.UnitTesting.NUnit/ExternalTestRunner.cs3
-rw-r--r--main/src/addins/MonoDevelop.UnitTesting.NUnit/NUnitRunner/ExternalTestRunner.cs24
-rw-r--r--main/src/addins/MonoDevelop.UnitTesting/Services/UnitTestResultsStore.cs62
-rw-r--r--main/src/addins/MonoDevelop.WebReferences/MonoDevelop.WebReferences.NodeBuilders/WebReferenceFolderNodeBuilder.cs6
-rw-r--r--main/src/addins/VBNetBinding/MonoDevelop.VBNet/VBNetTextEditorExtension.cs2
-rw-r--r--main/src/addins/VBNetBinding/VBNetBinding.addin.xml11
-rw-r--r--main/src/core/MonoDevelop.Core/CoreExtensions.cs15
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessConnection.cs75
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessServer.cs22
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj19
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core/IconId.cs8
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvent.cs (renamed from main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildEvaluatedItem.cs)40
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs93
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/RemoteProjectBuilder.cs448
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ChainedExtension.cs10
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MSBuildLogger.cs87
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MonoExecutionParameters.cs4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs5
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/TargetEvaluationContext.cs14
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs24
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbarController.cs1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchPopupWindow.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.GettingStarted/GettingStartedNodeBuilder.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs34
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeBuilder.cs15
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/ClassNodeBuilder.cs8
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/CombineNodeBuilder.cs11
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/PortableFrameworkSubsetNodeBuilder.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs3
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs6
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectReferenceFolderNodeBuilder.cs8
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs8
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs13
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs8
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs14
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs19
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs35
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService_WorkspaceHandling.cs17
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs3
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.csproj10
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v12.0.csproj11
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.0.csproj10
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj10
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v4.0.csproj11
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v12.0.csproj11
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v14.0.csproj11
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v4.0.csproj11
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.Shared.cs181
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs7
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.v4.0.cs9
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ILogWriter.cs66
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs53
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/LocalLogger.cs2
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildTargetResult.cs114
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs7
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.v4.0.cs13
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/BuildEngine.Shared.cs56
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/LocalLogger.cs169
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/Main.cs66
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/MonoDevelop.Projects.MSBuild.Shared.projitems4
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/ProjectBuilder.Shared.cs127
-rw-r--r--main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/RemoteBuildEngineMessages.cs34
-rw-r--r--main/tests/MonoDevelop.CSharpBinding.Tests/Features/CodeCompletion/NR6/ProtocolMemberContextHandlerTests.cs127
-rw-r--r--main/tests/MonoDevelop.CSharpBinding.Tests/MonoDevelop.CSharpBinding.Tests.csproj1
-rw-r--r--main/tests/UnitTests/MonoDevelop.Core/MonoExecutionParametersTests.cs (renamed from main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildResult.cs)112
-rw-r--r--main/tests/UnitTests/MonoDevelop.Core/RemoteProcessConnectionTests.cs119
-rw-r--r--main/tests/UnitTests/MonoDevelop.Projects/MSBuildLoggerTests.cs150
-rw-r--r--main/tests/UnitTests/UnitTests.csproj2
115 files changed, 1827 insertions, 2480 deletions
diff --git a/main/Main.sln b/main/Main.sln
index 3283ba9b3d..2a09d158ab 100644
--- a/main/Main.sln
+++ b/main/Main.sln
@@ -328,8 +328,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.ConnectedServic
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Debugging.Win32", "src\addins\MonoDevelop.Debugger.Win32\Mono.Debugging.Win32\Mono.Debugging.Win32.csproj", "{74704C00-5861-4F86-920C-865148A175C5}"
EndProject
-Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "po", "po\po.mdproj", "{7247EE12-28FE-486C-9220-FEE203015D74}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.DotNetCore", "src\addins\MonoDevelop.DotNetCore\MonoDevelop.DotNetCore.csproj", "{6868153E-41EA-43A4-A81A-C1E7256373F7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.DotNetCore.Tests", "src\addins\MonoDevelop.DotNetCore\MonoDevelop.DotNetCore.Tests\MonoDevelop.DotNetCore.Tests.csproj", "{7D3073E9-F52D-4E14-B988-5316DC6FD0BF}"
@@ -340,6 +338,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MonoDevelop.Debugger.VsCode
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Debugger.VsCodeDebugProtocol", "src\addins\MonoDevelop.Debugger.VSCodeDebugProtocol\MonoDevelop.Debugger.VsCodeDebugProtocol\MonoDevelop.Debugger.VsCodeDebugProtocol.csproj", "{10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}"
EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MonoDevelop.Projects.MSBuild.Shared", "src\core\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.shproj", "{DB95FF74-275D-4488-84E9-1060527988BF}"
+EndProject
+Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "po", "po\po.mdproj", "{6EB4E15A-5750-441A-98C0-FFC5888354AA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -2177,17 +2179,7 @@ Global
{74704C00-5861-4F86-920C-865148A175C5}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
{74704C00-5861-4F86-920C-865148A175C5}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
{74704C00-5861-4F86-920C-865148A175C5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {74704C00-5861-4F86-920C-865148A175C5}.Release|x86.ActiveCfg = Release|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.DebugGnome|Any CPU.ActiveCfg = DebugGnome|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.ReleaseWin32|Any CPU.ActiveCfg = ReleaseWin32|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.ReleaseWin32|Any CPU.Build.0 = ReleaseWin32|Any CPU
- {7247EE12-28FE-486C-9220-FEE203015D74}.ReleaseGnome|Any CPU.ActiveCfg = ReleaseGnome|Any CPU
+ {74704C00-5861-4F86-920C-865148A175C5}.Release|x86.ActiveCfg = Release|Any CPUF
{6868153E-41EA-43A4-A81A-C1E7256373F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6868153E-41EA-43A4-A81A-C1E7256373F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6868153E-41EA-43A4-A81A-C1E7256373F7}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
@@ -2247,7 +2239,16 @@ Global
{10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}.Debug|x86.ActiveCfg = Debug|Any CPU
{10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}.Debug|x86.Build.0 = Debug|Any CPU
{10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}.Release|x86.ActiveCfg = Release|Any CPU
- {10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}.Release|x86.Build.0 = Release|Any CPU
+ {10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD}.Release|x86.Build.0 = Release|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.DebugGnome|Any CPU.ActiveCfg = DebugGnome|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.ReleaseWin32|Any CPU.ActiveCfg = ReleaseWin32|Any CPU
+ {6EB4E15A-5750-441A-98C0-FFC5888354AA}.ReleaseGnome|Any CPU.ActiveCfg = ReleaseGnome|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{7525BB88-6142-4A26-93B9-A30C6983390A} = {9D360D43-0C05-49D6-84DB-4E7AB2F38F82}
@@ -2386,7 +2387,7 @@ Global
{DD14AD77-6FBB-4F0D-8083-CEC28A9D0BBD} = {19C4CC37-7050-4944-B11F-60F52121B24C}
{3FDB97B5-916E-4817-8098-41659687A8FF} = {19C4CC37-7050-4944-B11F-60F52121B24C}
{BF71E2BB-9838-4E0C-B0E7-80559E3909BB} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
- {74704C00-5861-4F86-920C-865148A175C5} = {8F47F5EC-2F57-4030-B658-7B1002DA90C2}
+ {74704C00-5861-4F86-920C-865148A175C5} = {8F47F5EC-2F57-4030-B658-7B1002DA90C2}
{6868153E-41EA-43A4-A81A-C1E7256373F7} = {A026D596-3C8D-4521-BB42-2C898FA3BE2D}
{7D3073E9-F52D-4E14-B988-5316DC6FD0BF} = {A026D596-3C8D-4521-BB42-2C898FA3BE2D}
{A026D596-3C8D-4521-BB42-2C898FA3BE2D} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
@@ -2401,6 +2402,7 @@ Global
{25FBDD35-1CA0-4BED-93F6-927FAF33F96B} = {07BADCA3-CE39-42D4-8EFB-B1E5573FF2BD}
{40ACF101-36F0-468A-9A5E-A0D204BA732B} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
{10F5BBD5-8A1D-4563-BCE4-DE681DFD82FD} = {40ACF101-36F0-468A-9A5E-A0D204BA732B}
+ {DB95FF74-275D-4488-84E9-1060527988BF} = {8F48ECA6-CFFF-4EBF-BC92-817199EDE9AF}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
diff --git a/main/external/debugger-libs b/main/external/debugger-libs
-Subproject 2c1ca3795d2752924c65d091f4281b8159140c1
+Subproject fcc4bc528f10b970dbbe75bcddf20226f5db7e8
diff --git a/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj
index f0c25da1e3..3bd7f81a5e 100644
--- a/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj
+++ b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj
@@ -110,6 +110,13 @@
<Name>MonoDevelop.Projects.Formats.MSBuild</Name>
<Private>False</Private>
</ProjectReference>
+ <Reference Include="MonoDevelop.SourceEditor" Condition=" '$(Configuration)' == 'Debug' Or '$(Configuration)' == 'Release' ">
+ <Private>False</Private>
+ <HintPath>..\..\..\build\AddIns\DisplayBindings\SourceEditor\MonoDevelop.SourceEditor.dll</HintPath>
+ </Reference>
+ <Reference Include="FSharpBinding">
+ <HintPath>..\..\..\build\AddIns\BackendBindings\FSharpBinding.dll</HintPath>
+ </Reference>
<Reference Include="System.Collections.Immutable">
<HintPath>..\..\..\build\bin\System.Collections.Immutable.dll</HintPath>
</Reference>
diff --git a/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpBinding.addin.xml b/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpBinding.addin.xml
index c714a7a8f4..bb07acb9a0 100644
--- a/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpBinding.addin.xml
+++ b/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpBinding.addin.xml
@@ -95,7 +95,6 @@
<ProjectTemplate id="MonoDevelop.FSharp.TutorialProject" file="Templates/FSharpTutorialProject.xpt.xml"/>
</ComplexCondition>
- <ProjectTemplate id="FSharpGtkProject" file="Templates/FSharpGtkProject.xpt.xml"/>
<ProjectTemplate id="FSharpNUnitLibraryProject" file="Templates/FSharpNUnitLibraryProject.xpt.xml"/>
<Condition id="MSBuildTargetIsAvailable" target="$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.1\Framework\v4.0\Microsoft.Portable.FSharp.Targets" >
@@ -352,4 +351,14 @@
<CommandItem id = "MonoDevelop.FSharp.FSharpCommands.SendReferences" />
</ComplexCondition>
</Extension>
+
+ <Module>
+ <!-- The GTK# template should only be available if the GTK add-in is enabled -->
+ <Dependencies>
+ <Addin id="GtkCore" version="$(Version)" />
+ </Dependencies>
+ <Extension path = "/MonoDevelop/Ide/ProjectTemplates">
+ <ProjectTemplate id="FSharpGtkProject" file="Templates/FSharpGtkProject.xpt.xml"/>
+ </Extension>
+ </Module>
</ExtensionModel>
diff --git a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
index 60102df42f..a82bf6b2d5 100644
--- a/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
+++ b/main/src/addins/CSharpBinding/CSharpBinding.addin.xml
@@ -270,13 +270,8 @@
</Extension>
<Extension path = "/MonoDevelop/Refactoring/CodeGenerators">
-
<Class class = "MonoDevelop.CodeGeneration.CreateConstructorGenerator" />
<Class class = "MonoDevelop.CodeGeneration.ReadonlyPropertyGenerator" />
- <Class class = "MonoDevelop.CodeGeneration.PropertyGenerator" />
-<!-- <Class class = "MonoDevelop.CodeGeneration.ImplementInterfaceMembersGenerator" /> -->
- <Class class = "MonoDevelop.CodeGeneration.RequiredProtocolMemberGenerator" />
- <Class class = "MonoDevelop.CodeGeneration.OptionalProtocolMemberGenerator" />
<Class class = "MonoDevelop.CodeGeneration.PartialGenerator" />
<Class class = "MonoDevelop.CodeGeneration.OverrideMembersGenerator" />
<Class class = "MonoDevelop.CodeGeneration.ToStringGenerator" />
diff --git a/main/src/addins/CSharpBinding/CSharpBinding.csproj b/main/src/addins/CSharpBinding/CSharpBinding.csproj
index cd93132bb1..398203fdab 100644
--- a/main/src/addins/CSharpBinding/CSharpBinding.csproj
+++ b/main/src/addins/CSharpBinding/CSharpBinding.csproj
@@ -298,7 +298,6 @@
<Compile Include="MonoDevelop.CSharp.UnitTests\UnitTestTextEditorExtension.cs" />
<Compile Include="MonoDevelop.CSharp.CodeGeneration\PartialGenerator.cs" />
<Compile Include="AddinInfo.cs" />
- <Compile Include="MonoDevelop.CSharp.CodeGeneration\ExportCodeGenerator.cs" />
<Compile Include="MonoDevelop.CSharp.Project\CSharpProjectExtension.cs" />
<Compile Include="MonoDevelop.CSharp.Project\PortableCSharpProjectFlavor.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\RoslynSymbolCompletionData.cs" />
@@ -309,9 +308,6 @@
<Compile Include="gtk-gui\MonoDevelop.CSharp.ClassOutline.OutlineSortingPreferencesDialog.cs" />
<Compile Include="MonoDevelop.CSharp.ClassOutline\OutlineSettings.cs" />
<Compile Include="MonoDevelop.CSharp.ClassOutline\OutlineNodeComparer.cs" />
- <Compile Include="MonoDevelop.CSharp.Completion\ProtocolCompletionData.cs">
- <DependentUpon>ProtocolMemberContextHandler.cs</DependentUpon>
- </Compile>
<Compile Include="MonoDevelop.CSharp.Formatting\CSharpTextPasteHandler.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\CreateOverrideCompletionData.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\CreatePartialCompletionData.cs" />
@@ -319,7 +315,7 @@
<Compile Include="MonoDevelop.CSharp.Parser\CSharpParsedDocument.cs" />
<Compile Include="MonoDevelop.CSharp.Resolver\DebuggerExpressionResolver.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\ImportSymbolCompletionData.cs" />
- <Compile Include="MonoDevelop.CSharp.Completion\ProtocolMemberContextHandler.cs" />
+ <Compile Include="MonoDevelop.CSharp.Completion\IExtensionContextHandler.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\AnonymousMethodCompletionData.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\ObjectCreationCompletionData.cs" />
<Compile Include="MonoDevelop.CSharp.Completion\CastCompletionData.cs" />
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs
deleted file mode 100644
index 65b8b02a8a..0000000000
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.CodeGeneration/ExportCodeGenerator.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-//
-// ExportCodeGenerator.cs
-//
-// Author:
-// Mike Krüger <mkrueger@xamarin.com>
-//
-// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using Gtk;
-using System.Collections.Generic;
-using MonoDevelop.Core;
-using System.Linq;
-using MonoDevelop.CodeGeneration;
-using MonoDevelop.CSharp.Completion;
-using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.Shared.Extensions;
-using MonoDevelop.CSharp.Refactoring;
-using ICSharpCode.NRefactory6.CSharp;
-using MonoDevelop.Ide.TypeSystem;
-
-namespace MonoDevelop.CodeGeneration
-{
- abstract class BaseExportCodeGenerator : ICodeGenerator
- {
- public abstract bool IsValidMember (ISymbol member);
-
- #region ICodeGenerator implementation
-
- bool ICodeGenerator.IsValid (CodeGenerationOptions options)
- {
- return new ExportMethods (this, options).IsValid ();
- }
-
- IGenerateAction ICodeGenerator.InitalizeSelection (CodeGenerationOptions options, TreeView treeView)
- {
- var exportMethods = new ExportMethods (this, options);
- exportMethods.Initialize (treeView);
- return exportMethods;
- }
-
- string ICodeGenerator.Icon {
- get {
- return "md-method";
- }
- }
-
- public abstract string Text {
- get;
- }
-
- public abstract string GenerateDescription {
- get;
- }
-
- #endregion
-
-
-// public static Attribute GenerateExportAttribute (RefactoringContext ctx, IMember member)
-// {
-// if (member == null)
-// return null;
-//
-// bool useMonoTouchNamespace = false;
-// var exportAttribute = member.GetAttribute (new FullTypeName (new TopLevelTypeName ("Foundation", "ExportAttribute")));
-// if (exportAttribute == null) {
-// useMonoTouchNamespace = true;
-// exportAttribute = member.GetAttribute (new FullTypeName (new TopLevelTypeName ("MonoTouch.Foundation", "ExportAttribute")));
-// }
-//
-// if (exportAttribute == null || exportAttribute.PositionalArguments.Count == 0)
-// return null;
-//
-// var astType = useMonoTouchNamespace
-// ? CreateMonoTouchExportAttributeAst (ctx)
-// : CreateUnifiedExportAttributeAst (ctx);
-//
-// var attr = new Attribute {
-// Type = astType,
-// };
-//
-// attr.Arguments.Add (new PrimitiveExpression (exportAttribute.PositionalArguments [0].ConstantValue));
-// return attr;
-// }
-//
-// static AstType CreateUnifiedExportAttributeAst (RefactoringContext ctx)
-// {
-// var astType = ctx.CreateShortType ("Foundation", "ExportAttribute");
-// if (astType is SimpleType) {
-// astType = new SimpleType ("Export");
-// } else {
-// astType = new MemberType (new SimpleType ("Foundation"), "Export");
-// }
-// return astType;
-// }
-//
-// static AstType CreateMonoTouchExportAttributeAst (RefactoringContext ctx)
-// {
-// var astType = ctx.CreateShortType ("MonoTouch.Foundation", "ExportAttribute");
-// if (astType is SimpleType) {
-// astType = new SimpleType ("Export");
-// } else {
-// astType = new MemberType (new MemberType (new SimpleType ("MonoTouch"), "Foundation"), "Export");
-// }
-// return astType;
-// }
-//
-// static IMember GetProtocolMember (RefactoringContext ctx, IType protocolType, IMember member)
-// {
-// foreach (var m in protocolType.GetMembers (m => m.SymbolKind == member.SymbolKind && m.Name == member.Name)) {
-// if (!SignatureComparer.Ordinal.Equals (m, member))
-// return null;
-// var prop = m as IProperty;
-// if (prop != null) {
-// if (prop.CanGet && GenerateExportAttribute (ctx, prop.Getter) != null ||
-// prop.CanSet && GenerateExportAttribute (ctx, prop.Setter) != null)
-// return m;
-// } else {
-// if (GenerateExportAttribute (ctx, m) != null)
-// return m;
-// }
-// }
-// return null;
-// }
-//
- static string GetProtocol (ISymbol member)
- {
- var attr = member.GetAttributes ().FirstOrDefault (a => a.AttributeClass.Name == "ExportAttribute" && ProtocolMemberContextHandler.IsFoundationNamespace (a.AttributeClass.ContainingNamespace));
- if (attr == null || attr.ConstructorArguments.Length == 0)
- return null;
- return attr.ConstructorArguments.First ().Value.ToString ();
- }
-
- public static bool IsImplemented (ITypeSymbol type, ISymbol protocolMember)
- {
- foreach (var m in type.GetMembers().Where (m => m.Kind == protocolMember.Kind && m.Name == protocolMember.Name)) {
- var p = m as IPropertySymbol;
- if (p != null) {
- if (p.GetMethod != null && ((IPropertySymbol)protocolMember).GetMethod != null && GetProtocol (p.GetMethod) == GetProtocol (((IPropertySymbol)protocolMember).GetMethod))
- return true;
- if (p.SetMethod != null && ((IPropertySymbol)protocolMember).SetMethod != null && GetProtocol (p.SetMethod) == GetProtocol (((IPropertySymbol)protocolMember).SetMethod))
- return true;
- continue;
- }
- if (GetProtocol (m) == GetProtocol (protocolMember))
- return true;
- }
- return false;
- }
-
- class ExportMethods : AbstractGenerateAction
- {
- readonly BaseExportCodeGenerator cg;
-
- public ExportMethods (BaseExportCodeGenerator cg, CodeGenerationOptions options) : base (options)
- {
- this.cg = cg;
- }
-
-
- protected override IEnumerable<object> GetValidMembers ()
- {
- var type = Options.EnclosingType;
- if (type == null || Options.EnclosingMember != null)
- yield break;
- foreach (var t in type.GetBaseTypes ()) {
- string name;
- if (!ProtocolMemberContextHandler.HasProtocolAttribute (t, out name))
- continue;
- var protocolType = Options.CurrentState.Compilation.GetTypeByMetadataName (t.ContainingNamespace.GetFullName () + "." + name);
- if (protocolType == null)
- break;
- foreach (var member in protocolType.GetMembers().OfType<IMethodSymbol>()) {
- if (member.ExplicitInterfaceImplementations.Length > 0)
- continue;
- if (!cg.IsValidMember (member))
- continue;
- if (IsImplemented (type, member))
- continue;
- if (member.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && ProtocolMemberContextHandler.IsFoundationNamespace (a.AttributeClass.ContainingNamespace)))
- yield return member;
- }
- foreach (var member in protocolType.GetMembers().OfType<IPropertySymbol>()) {
- if (member.ExplicitInterfaceImplementations.Length > 0)
- continue;
- if (!cg.IsValidMember (member))
- continue;
- if (IsImplemented (type, member))
- continue;
- if (member.GetMethod != null && member.GetMethod.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && ProtocolMemberContextHandler.IsFoundationNamespace (a.AttributeClass.ContainingNamespace)) ||
- member.SetMethod != null && member.SetMethod.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && ProtocolMemberContextHandler.IsFoundationNamespace (a.AttributeClass.ContainingNamespace)))
- yield return member;
- }
- }
- }
-
- protected override IEnumerable<string> GenerateCode (List<object> includedMembers)
- {
- foreach (ISymbol member in includedMembers) {
- yield return CSharpCodeGenerator.CreateProtocolMemberImplementation (Options.DocumentContext, Options.Editor, Options.EnclosingType, Options.EnclosingPart.GetLocation (), member, false, null).Code;
- }
- }
- }
- }
-
- class OptionalProtocolMemberGenerator : BaseExportCodeGenerator
- {
- public override string Text {
- get {
- return GettextCatalog.GetString ("Implement protocol members");
- }
- }
-
- public override string GenerateDescription {
- get {
- return GettextCatalog.GetString ("Select protocol members to implement");
- }
- }
-
- public override bool IsValidMember (ISymbol member)
- {
- return !member.IsAbstract;
- }
- }
-
- class RequiredProtocolMemberGenerator : BaseExportCodeGenerator
- {
- public override string Text {
- get {
- return GettextCatalog.GetString ("Implement required protocol members");
- }
- }
-
- public override string GenerateDescription {
- get {
- return GettextCatalog.GetString ("Select protocol members to implement");
- }
- }
-
- public override bool IsValidMember (ISymbol member)
- {
- return member.IsAbstract;
- }
- }
-} \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IBuildEngine.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/IExtensionContextHandler.cs
index d926143452..09988338aa 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IBuildEngine.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/IExtensionContextHandler.cs
@@ -1,21 +1,21 @@
-//
-// IProjectBuilder.cs
-//
+//
+// ProtocolMemberContextHandler.cs
+//
// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-//
-// Copyright (c) 2010 Novell, Inc (http://www.novell.com)
-//
+// Mike Krüger <mkrueger@xamarin.com>
+//
+// Copyright (c) 2015 Xamarin Inc. (http://xamarin.com)
+//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
-//
+//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
-//
+//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -24,19 +24,12 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
-using System;
-using System.Globalization;
-using System.Collections.Generic;
-
-namespace MonoDevelop.Projects.MSBuild
-{
- public interface IBuildEngine: IDisposable
+namespace MonoDevelop.CSharp.Completion
+{
+ interface IExtensionContextHandler
{
- void SetCulture (CultureInfo uiCulture);
- void SetGlobalProperties (IDictionary<string, string> properties);
- IProjectBuilder LoadProject (string projectFile);
- void UnloadProject (IProjectBuilder pb);
- void Ping ();
- void CancelTask (int taskId);
+ void Init (RoslynCodeCompletionFactory factory);
}
-}
+
+
+} \ No newline at end of file
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolCompletionData.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolCompletionData.cs
deleted file mode 100644
index 2fa3acb6b4..0000000000
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolCompletionData.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-//
-// ProtocolCompletionData.cs
-//
-// Author:
-// Mike Krüger <mkrueger@xamarin.com>
-//
-// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System;
-using ICSharpCode.NRefactory.TypeSystem;
-using MonoDevelop.Ide.CodeCompletion;
-using MonoDevelop.Ide.TypeSystem;
-using MonoDevelop.CodeGeneration;
-using MonoDevelop.Ide.Editor.Extension;
-using Microsoft.CodeAnalysis;
-using MonoDevelop.CSharp.Refactoring;
-using System.Linq;
-using MonoDevelop.CSharp.Formatting;
-
-namespace MonoDevelop.CSharp.Completion
-{
- class ProtocolCompletionData : RoslynSymbolCompletionData
- {
- readonly int declarationBegin;
- readonly ITypeSymbol currentType;
-
- public bool GenerateBody { get; set; }
-
- static readonly SymbolDisplayFormat NameFormat;
-
- internal static readonly SymbolDisplayFormat overrideNameFormat;
-
- static ProtocolCompletionData ()
- {
- NameFormat = new SymbolDisplayFormat (
- globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Omitted,
- typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces,
- propertyStyle: SymbolDisplayPropertyStyle.NameOnly,
- genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters | SymbolDisplayGenericsOptions.IncludeVariance,
- memberOptions: SymbolDisplayMemberOptions.IncludeParameters | SymbolDisplayMemberOptions.IncludeExplicitInterface,
- parameterOptions:
- SymbolDisplayParameterOptions.IncludeParamsRefOut |
- SymbolDisplayParameterOptions.IncludeExtensionThis |
- SymbolDisplayParameterOptions.IncludeType |
- SymbolDisplayParameterOptions.IncludeName,
- miscellaneousOptions:
- SymbolDisplayMiscellaneousOptions.EscapeKeywordIdentifiers |
- SymbolDisplayMiscellaneousOptions.UseSpecialTypes
- );
-
- overrideNameFormat = NameFormat.WithParameterOptions (
- SymbolDisplayParameterOptions.IncludeDefaultValue |
- SymbolDisplayParameterOptions.IncludeExtensionThis |
- SymbolDisplayParameterOptions.IncludeType |
- SymbolDisplayParameterOptions.IncludeName |
- SymbolDisplayParameterOptions.IncludeParamsRefOut
- );
- }
-
- string displayText;
-
- bool afterKeyword;
-
- public override string DisplayText {
- get {
- if (displayText == null) {
- if (factory == null) {
- displayText = Symbol.Name;
- } else {
- var model = ext.ParsedDocument.GetAst<SemanticModel> ();
- displayText = RoslynCompletionData.SafeMinimalDisplayString (base.Symbol, model, ext.Editor.CaretOffset, overrideNameFormat);
- }
- if (!afterKeyword)
- displayText = "override " + displayText;
- }
-
- return displayText;
- }
- }
-
- public override string CompletionText {
- get {
- return Symbol.Name;
- }
- }
-
- public override string GetDisplayTextMarkup ()
- {
- if (factory == null)
- return Symbol.Name;
- var model = ext.ParsedDocument.GetAst<SemanticModel> ();
-
- var result = RoslynCompletionData.SafeMinimalDisplayString (base.Symbol, model, declarationBegin, Ambience.LabelFormat) + " {...}";
- var idx = result.IndexOf (Symbol.Name);
- if (idx >= 0) {
- result =
- result.Substring (0, idx) +
- "<b>" + Symbol.Name + "</b>" +
- result.Substring (idx + Symbol.Name.Length);
- }
-
- if (!afterKeyword)
- result = "override " + result;
-
- return ApplyDiplayFlagsFormatting (result);
- }
-
- public ProtocolCompletionData (ICompletionDataKeyHandler keyHandler, RoslynCodeCompletionFactory factory, int declarationBegin, ITypeSymbol currentType, Microsoft.CodeAnalysis.ISymbol member, bool afterKeyword) : base (keyHandler, factory, member, member.ToDisplayString ())
- {
- this.afterKeyword = afterKeyword;
- this.currentType = currentType;
- this.declarationBegin = declarationBegin;
- this.GenerateBody = true;
- }
-
- public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, KeyDescriptor descriptor)
- {
- var editor = ext.Editor;
- bool isExplicit = false;
- // if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) {
- // foreach (var m in type.Members) {
- // if (m.Name == member.Name && !m.ReturnType.Equals (member.ReturnType)) {
- // isExplicit = true;
- // break;
- // }
- // }
- // }
- // var resolvedType = type.Resolve (ext.Project).GetDefinition ();
- // if (ext.Project != null)
- // generator.PolicyParent = ext.Project.Policies;
-
- var result = CSharpCodeGenerator.CreateProtocolMemberImplementation (ext.DocumentContext, ext.Editor, currentType, currentType.Locations.First (), Symbol, isExplicit, factory.SemanticModel);
- string sb = result.Code.TrimStart ();
- int trimStart = result.Code.Length - sb.Length;
- sb = sb.TrimEnd ();
-
- var lastRegion = result.BodyRegions.LastOrDefault ();
- var region = lastRegion == null ? null
- : new CodeGeneratorBodyRegion (lastRegion.StartOffset - trimStart, lastRegion.EndOffset - trimStart);
-
- int targetCaretPosition;
- int selectionEndPosition = -1;
- if (region != null && region.IsValid) {
- targetCaretPosition = declarationBegin + region.StartOffset;
- if (region.Length > 0) {
- if (GenerateBody) {
- selectionEndPosition = declarationBegin + region.EndOffset;
- } else {
- //FIXME: if there are multiple regions, remove all of them
- sb = sb.Substring (0, region.StartOffset) + sb.Substring (region.EndOffset);
- }
- }
- } else {
- targetCaretPosition = declarationBegin + sb.Length;
- }
-
- editor.ReplaceText (declarationBegin, editor.CaretOffset - declarationBegin, sb);
- if (selectionEndPosition > 0) {
- editor.CaretOffset = selectionEndPosition;
- editor.SetSelection (targetCaretPosition, selectionEndPosition);
- } else {
- editor.CaretOffset = targetCaretPosition;
- }
-
- OnTheFlyFormatter.Format (editor, ext.DocumentContext, declarationBegin, declarationBegin + sb.Length);
- }
- }
-}
-
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolMemberContextHandler.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolMemberContextHandler.cs
deleted file mode 100644
index 134a577d02..0000000000
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Completion/ProtocolMemberContextHandler.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-//
-// ProtocolMemberContextHandler.cs
-//
-// Author:
-// Mike Krüger <mkrueger@xamarin.com>
-//
-// Copyright (c) 2015 Xamarin Inc. (http://xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using ICSharpCode.NRefactory6.CSharp;
-using ICSharpCode.NRefactory6.CSharp.Completion;
-using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.CSharp.Extensions;
-using Microsoft.CodeAnalysis.Shared.Extensions;
-using Microsoft.CodeAnalysis.Shared.Utilities;
-using MonoDevelop.Ide.CodeCompletion;
-using MonoDevelop.Ide.TypeSystem;
-
-namespace MonoDevelop.CSharp.Completion
-{
- interface IExtensionContextHandler
- {
- void Init (RoslynCodeCompletionFactory factory);
- }
-
- class ProtocolMemberContextHandler : OverrideContextHandler, IExtensionContextHandler
- {
- RoslynCodeCompletionFactory factory;
-
- void IExtensionContextHandler.Init (RoslynCodeCompletionFactory factory)
- {
- this.factory = factory;
- }
-
- protected override IEnumerable<CompletionData> CreateCompletionData (CompletionEngine engine, SemanticModel semanticModel, int position, ITypeSymbol returnType, Accessibility seenAccessibility, SyntaxToken startToken, SyntaxToken tokenBeforeReturnType, bool afterKeyword, CancellationToken cancellationToken)
- {
- var result = new List<CompletionData> ();
- ISet<ISymbol> overridableMembers;
- if (!TryDetermineOverridableProtocolMembers (semanticModel, tokenBeforeReturnType, seenAccessibility, out overridableMembers, cancellationToken)) {
- return result;
- }
- if (returnType != null) {
- overridableMembers = FilterOverrides (overridableMembers, returnType);
- }
- var curType = semanticModel.GetEnclosingSymbol<INamedTypeSymbol> (startToken.SpanStart, cancellationToken);
- var declarationBegin = afterKeyword ? startToken.SpanStart : position - 1;
- foreach (var m in overridableMembers) {
- var data = new ProtocolCompletionData (this, factory, declarationBegin, curType, m, afterKeyword);
- result.Add (data);
- }
- return result;
- }
-
- static bool TryDetermineOverridableProtocolMembers(SemanticModel semanticModel, SyntaxToken startToken, Accessibility seenAccessibility, out ISet<ISymbol> overridableMembers, CancellationToken cancellationToken)
- {
- var result = new HashSet<ISymbol>();
- var containingType = semanticModel.GetEnclosingSymbol<INamedTypeSymbol>(startToken.SpanStart, cancellationToken);
- if (containingType != null && !containingType.IsScriptClass && !containingType.IsImplicitClass)
- {
- if (containingType.TypeKind == TypeKind.Class || containingType.TypeKind == TypeKind.Struct)
- {
- var baseTypes = containingType.GetBaseTypes().Reverse().Concat(containingType.AllInterfaces);
- foreach (var type in baseTypes)
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- // Prefer overrides in derived classes
- RemoveOverriddenMembers(result, type, cancellationToken);
-
- // Retain overridable methods
- AddProtocolMembers(semanticModel, result, containingType, type, cancellationToken);
- }
- // Don't suggest already overridden members
- RemoveOverriddenMembers(result, containingType, cancellationToken);
- }
- }
-
- // Filter based on accessibility
- if (seenAccessibility != Accessibility.NotApplicable)
- {
- result.RemoveWhere(m => m.DeclaredAccessibility != seenAccessibility);
- }
-
-
- // Filter members that are already overriden - they're already part of 'override completion'
- ISet<ISymbol> realOverridableMembers;
- if (OverrideContextHandler.TryDetermineOverridableMembers (semanticModel, startToken, seenAccessibility, out realOverridableMembers, cancellationToken)) {
- result.RemoveWhere (m => realOverridableMembers.Any (m2 => IsEqualMember (m, m2)));
- }
-
- overridableMembers = result;
- return overridableMembers.Count > 0;
- }
-
- static bool IsEqualMember (ISymbol m, ISymbol m2)
- {
- return SignatureComparer.Instance.HaveSameSignature (m, m2, true);
- }
-
- static void AddProtocolMembers(SemanticModel semanticModel, HashSet<ISymbol> result, INamedTypeSymbol containingType, INamedTypeSymbol type, CancellationToken cancellationToken)
- {
- string name;
- if (!HasProtocolAttribute (type, out name))
- return;
- var protocolType = semanticModel.Compilation.GlobalNamespace.GetAllTypes (cancellationToken).FirstOrDefault (t => string.Equals (t.Name, name, StringComparison.OrdinalIgnoreCase));
- if (protocolType == null)
- return;
-
- foreach (var member in protocolType.GetMembers ().OfType<IMethodSymbol> ()) {
- if (member.ExplicitInterfaceImplementations.Length > 0 || member.IsAbstract || !member.IsVirtual)
- continue;
- if (member.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && IsFoundationNamespace (a.AttributeClass.ContainingNamespace.GetFullName ()))) {
- result.Add (member);
- }
-
- }
- foreach (var member in protocolType.GetMembers ().OfType<IPropertySymbol> ()) {
- if (member.ExplicitInterfaceImplementations.Length > 0 || member.IsAbstract || !member.IsVirtual)
- continue;
- if (member.GetMethod != null && member.GetMethod.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && IsFoundationNamespace (a.AttributeClass.ContainingNamespace.GetFullName ())) ||
- member.SetMethod != null && member.SetMethod.GetAttributes ().Any (a => a.AttributeClass.Name == "ExportAttribute" && IsFoundationNamespace (a.AttributeClass.ContainingNamespace.GetFullName ())))
- result.Add (member);
- }
- }
-
- internal static bool IsFoundationNamespace (string ns )
- {
- return (ns == "MonoTouch.Foundation" || ns == "Foundation");
- }
-
- internal static bool IsFoundationNamespace (INamespaceSymbol ns)
- {
- return IsFoundationNamespace (ns.GetFullName ());
- }
-
- internal static bool HasProtocolAttribute (INamedTypeSymbol type, out string name)
- {
- foreach (var baseType in type.GetAllBaseClassesAndInterfaces (true)) {
- foreach (var attrs in baseType.GetAttributes ()) {
- if (attrs.AttributeClass.Name == "ProtocolAttribute" && IsFoundationNamespace (attrs.AttributeClass.ContainingNamespace.GetFullName ())) {
- foreach (var na in attrs.NamedArguments) {
- if (na.Key != "Name")
- continue;
- name = na.Value.Value as string;
- if (name != null)
- return true;
- }
- }
- }
- }
- name = null;
- return false;
- }
- }
-} \ No newline at end of file
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CodeGenerationPanel.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CodeGenerationPanel.cs
index 15bd4b7a83..1726302049 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CodeGenerationPanel.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CodeGenerationPanel.cs
@@ -136,7 +136,7 @@ namespace MonoDevelop.CSharp.Project
case DEBUG_FULL:
configuration.DebugSymbols = true;
if (!string.Equals (configuration.DebugType, "full", StringComparison.OrdinalIgnoreCase)) {
- configuration.DebugType = "";
+ configuration.DebugType = "full";
}
break;
case DEBUG_PDB_ONLY:
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
index a9778fefe2..76a68c1600 100644
--- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
+++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp/PathedDocumentTextEditorExtension.cs
@@ -771,22 +771,23 @@ namespace MonoDevelop.CSharp
return;
}
+ var regionEntry = await GetRegionEntry (DocumentContext.ParsedDocument, loc).ConfigureAwait (false);
- var result = new List<PathEntry>();
+ Gtk.Application.Invoke (delegate {
+ var result = new List<PathEntry>();
- if (curProject != null) {
- // Current project if there is more than one
- result.Add (new PathEntry (ImageService.GetIcon (curProject.StockIcon, Gtk.IconSize.Menu), GLib.Markup.EscapeText (curProject.Name)) { Tag = curProject });
- }
+ if (curProject != null) {
+ // Current project if there is more than one
+ result.Add (new PathEntry (ImageService.GetIcon (curProject.StockIcon, Gtk.IconSize.Menu), GLib.Markup.EscapeText (curProject.Name)) { Tag = curProject });
+ }
- if (curType == null) {
- if (CurrentPath != null && CurrentPath.Length == 1 && CurrentPath [0]?.Tag is CSharpSyntaxTree)
- return;
- if (CurrentPath != null && CurrentPath.Length == 2 && CurrentPath [1]?.Tag is CSharpSyntaxTree)
- return;
- var prevPath = CurrentPath;
- result.Add (new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit });
- Gtk.Application.Invoke (delegate {
+ if (curType == null) {
+ if (CurrentPath != null && CurrentPath.Length == 1 && CurrentPath [0]?.Tag is CSharpSyntaxTree)
+ return;
+ if (CurrentPath != null && CurrentPath.Length == 2 && CurrentPath [1]?.Tag is CSharpSyntaxTree)
+ return;
+ var prevPath = CurrentPath;
+ result.Add (new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit });
if (cancellationToken.IsCancellationRequested)
return;
@@ -799,12 +800,9 @@ namespace MonoDevelop.CSharp
lastProject = curProject;
OnPathChanged (new DocumentPathChangedEventArgs (prevPath));
- });
- return;
- }
- var regionEntry = await GetRegionEntry (DocumentContext.ParsedDocument, loc).ConfigureAwait (false);
+ return;
+ }
- Gtk.Application.Invoke(delegate {
if (curType != null) {
var type = curType;
var pos = result.Count;
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs
index bf90fb52c7..988df2ea2e 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyReferenceFolderNodeBuilder.cs
@@ -80,10 +80,10 @@ namespace MonoDevelop.AssemblyBrowser
{
return true;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- return -1;
+
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ return -200;
}
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyResourceFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyResourceFolderNodeBuilder.cs
index f699a83fe6..adaa35fea0 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyResourceFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/AssemblyResourceFolderNodeBuilder.cs
@@ -61,13 +61,11 @@ namespace MonoDevelop.AssemblyBrowser
{
return true;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is AssemblyReferenceFolder)
- return 1;
- return -1;
+ return -100;
}
-
+
}
}
diff --git a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
index acf0f19327..6327acd79c 100644
--- a/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.AssemblyBrowser/MonoDevelop.AssemblyBrowser/TreeNodes/BaseTypeFolderNodeBuilder.cs
@@ -106,10 +106,10 @@ namespace MonoDevelop.AssemblyBrowser
{
return true;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- return -1;
+ return -100;
}
}
}
diff --git a/main/src/addins/MonoDevelop.ConnectedServices/Gui.ServicesTab/ServiceDetailsWidget.cs b/main/src/addins/MonoDevelop.ConnectedServices/Gui.ServicesTab/ServiceDetailsWidget.cs
index a813257914..5274183e53 100644
--- a/main/src/addins/MonoDevelop.ConnectedServices/Gui.ServicesTab/ServiceDetailsWidget.cs
+++ b/main/src/addins/MonoDevelop.ConnectedServices/Gui.ServicesTab/ServiceDetailsWidget.cs
@@ -86,7 +86,7 @@ namespace MonoDevelop.ConnectedServices.Gui.ServicesTab
{
// handle when the service has finished being added
if (e.WasAdded) {
- ExpandFirstOrUnconfiguredSection ();
+ InvokeAsync (ExpandFirstOrUnconfiguredSection);
}
}
diff --git a/main/src/addins/MonoDevelop.ConnectedServices/Gui.SolutionPad/ConnectedServicesFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.ConnectedServices/Gui.SolutionPad/ConnectedServicesFolderNodeBuilder.cs
index 54a2cedb85..65bf6107a6 100644
--- a/main/src/addins/MonoDevelop.ConnectedServices/Gui.SolutionPad/ConnectedServicesFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.ConnectedServices/Gui.SolutionPad/ConnectedServicesFolderNodeBuilder.cs
@@ -61,9 +61,9 @@ namespace MonoDevelop.ConnectedServices.Gui.SolutionPad
}
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ public override int GetSortIndex (ITreeNavigator node)
{
- return (otherNode.DataItem is Ide.Gui.Pads.ProjectPad.GettingStartedNode) ? 1 : -1;
+ return -1500;
}
public override void OnNodeAdded (object dataObject)
diff --git a/main/src/addins/MonoDevelop.Debugger.VSCodeDebugProtocol/MonoDevelop.Debugger.VsCodeDebugProtocol/VSCodeDebuggerSession.cs b/main/src/addins/MonoDevelop.Debugger.VSCodeDebugProtocol/MonoDevelop.Debugger.VsCodeDebugProtocol/VSCodeDebuggerSession.cs
index 034640519d..e1ef5546ae 100644
--- a/main/src/addins/MonoDevelop.Debugger.VSCodeDebugProtocol/MonoDevelop.Debugger.VsCodeDebugProtocol/VSCodeDebuggerSession.cs
+++ b/main/src/addins/MonoDevelop.Debugger.VSCodeDebugProtocol/MonoDevelop.Debugger.VsCodeDebugProtocol/VSCodeDebuggerSession.cs
@@ -148,9 +148,14 @@ namespace MonoDevelop.Debugger.VsCodeDebugProtocol
Process debugAgentProcess;
+ protected virtual void OnDebugAdaptorRequestReceived (object sender, RequestReceivedEventArgs e)
+ {
+
+ }
+
void StartDebugAgent ()
{
- var startInfo = new ProcessStartInfo (GetDebugAdapterPath ());
+ var startInfo = new ProcessStartInfo (GetDebugAdapterPath (), GetDebugAdapterArguments ());
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.StandardOutputEncoding = Encoding.UTF8;
@@ -161,6 +166,7 @@ namespace MonoDevelop.Debugger.VsCodeDebugProtocol
debugAgentProcess = Process.Start (startInfo);
debugAgentProcess.Exited += DebugAgentProcess_Exited;
protocolClient = new DebugProtocolHost (debugAgentProcess.StandardInput.BaseStream, debugAgentProcess.StandardOutput.BaseStream);
+ protocolClient.RequestReceived += OnDebugAdaptorRequestReceived;
protocolClient.Run ();
protocolClient.TraceCallback = (obj) => {
Debug.WriteLine (obj);
@@ -175,6 +181,11 @@ namespace MonoDevelop.Debugger.VsCodeDebugProtocol
protected abstract AttachRequest CreateAttachRequest (long processId);
protected abstract string GetDebugAdapterPath ();
+ protected virtual string GetDebugAdapterArguments ()
+ {
+ return "";
+ }
+
protected override void OnRun (DebuggerStartInfo startInfo)
{
Launch (startInfo);
@@ -340,5 +351,12 @@ namespace MonoDevelop.Debugger.VsCodeDebugProtocol
UpdateBreakpoints ();
UpdateExceptions ();
}
+
+ public override void Dispose ()
+ {
+ base.Dispose ();
+ if (protocolClient != null)
+ protocolClient.RequestReceived += OnDebugAdaptorRequestReceived;
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.Debugger.Win32/Mono.Debugging.Win32/CorDebuggerSession.cs b/main/src/addins/MonoDevelop.Debugger.Win32/Mono.Debugging.Win32/CorDebuggerSession.cs
index a06bee9c44..e8f7ec0b68 100644
--- a/main/src/addins/MonoDevelop.Debugger.Win32/Mono.Debugging.Win32/CorDebuggerSession.cs
+++ b/main/src/addins/MonoDevelop.Debugger.Win32/Mono.Debugging.Win32/CorDebuggerSession.cs
@@ -155,10 +155,23 @@ namespace Mono.Debugging.Win32
helperOperationsQueue.Add (action);
}
+ void DeactivateBreakpoints ()
+ {
+ var breakpointsCopy = breakpoints.Keys.ToList ();
+ foreach (var corBreakpoint in breakpointsCopy) {
+ try {
+ corBreakpoint.Activate (false);
+ }
+ catch (Exception e) {
+ DebuggerLoggingService.LogMessage ("Exception in DeactivateBreakpoints(): {0}", e);
+ }
+ }
+ }
+
void TerminateDebugger ()
{
helperOperationsCancellationTokenSource.Cancel();
- Breakpoints.Clear ();
+ DeactivateBreakpoints ();
lock (terminateLock) {
if (terminated)
return;
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.Tests/MonoDevelop.DotNetCore.Tests/DotNetCoreMSBuildProjectTests.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.Tests/MonoDevelop.DotNetCore.Tests/DotNetCoreMSBuildProjectTests.cs
index 90fc93ca8e..39280bfb9d 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.Tests/MonoDevelop.DotNetCore.Tests/DotNetCoreMSBuildProjectTests.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.Tests/MonoDevelop.DotNetCore.Tests/DotNetCoreMSBuildProjectTests.cs
@@ -346,5 +346,24 @@ namespace MonoDevelop.DotNetCore.Tests
Assert.IsTrue (MSBuildProjectHasGlobalProperty ("AssemblyName"));
Assert.IsTrue (MSBuildProjectHasGlobalProperty ("RootNamespace"));
}
+
+ [Test]
+ public void WriteProject_SdkProjectHasToolsVersionSetAfterReading_ToolsVersionRemovedOnWriting ()
+ {
+ CreateMSBuildProject (
+ "<Project Sdk=\"Microsoft.NET.Sdk\">\r\n" +
+ " <PropertyGroup>\r\n" +
+ " <OutputType>Exe</OutputType>\r\n" +
+ " <TargetFramework>netcoreapp1.0</TargetFramework>\r\n" +
+ " </PropertyGroup>\r\n" +
+ "</Project>");
+ ReadProject ();
+ project.Sdk = "Microsoft.NET.Sdk";
+ msbuildProject.ToolsVersion = "4.0";
+
+ WriteProject ();
+
+ Assert.IsNull (msbuildProject.ToolsVersion);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.csproj b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.csproj
index 63ef51e633..542fb8f1c9 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.csproj
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore.csproj
@@ -32,17 +32,6 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
- <Reference Include="System.IO.Compression.FileSystem" />
- <Reference Include="Mono.Posix" />
- <Reference Include="System.IO.Compression" />
- <Reference Include="Newtonsoft.Json">
- <HintPath>..\..\..\packages\Newtonsoft.Json.8.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
- <Private>False</Private>
- </Reference>
- <Reference Include="Microsoft.VisualStudio.Shared.VSCodeDebugProtocol">
- <HintPath>..\..\..\packages\Microsoft.VisualStudio.Shared.VsCodeDebugProtocol.0.2.1214.1\lib\net45\Microsoft.VisualStudio.Shared.VSCodeDebugProtocol.dll</HintPath>
- <Private>False</Private>
- </Reference>
<Reference Include="System.Collections.Immutable">
<HintPath>..\..\..\build\bin\System.Collections.Immutable.dll</HintPath>
<Private>False</Private>
@@ -52,8 +41,6 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\AddinInfo.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCoreProjectExtension.cs" />
- <Compile Include="MonoDevelop.DotnetCore.Debugger\DotNetCoreDebuggerEngine.cs" />
- <Compile Include="MonoDevelop.DotnetCore.Debugger\DotNetCoreDebuggerSession.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCoreExecutionCommand.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCorePath.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCoreExecutionHandler.cs" />
@@ -69,10 +56,10 @@
<Compile Include="MonoDevelop.DotNetCore\MSBuildProjectExtensions.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCoreSdkPaths.cs" />
<Compile Include="MonoDevelop.DotNetCore\DotNetCoreMSBuildProject.cs" />
+ <Compile Include="MonoDevelop.DotNetCore\DotNetCoreCanReferenceProjectExtension.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="MonoDevelop.DotNetCore\" />
- <Folder Include="MonoDevelop.DotnetCore.Debugger\" />
<Folder Include="Templates\" />
<Folder Include="Templates\Projects\" />
<Folder Include="Templates\Projects\Console\" />
@@ -123,10 +110,10 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
+ <InternalsVisibleTo Include="MonoDevelop.Debugger" />
<InternalsVisibleTo Include="MonoDevelop.DotNetCore.Tests" />
</ItemGroup>
<ItemGroup>
- <None Include="packages.config" />
<None Include="Templates\Projects\Console\ConsoleProject.csproj">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreCanReferenceProjectExtension.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreCanReferenceProjectExtension.cs
new file mode 100644
index 0000000000..01c73c5677
--- /dev/null
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreCanReferenceProjectExtension.cs
@@ -0,0 +1,74 @@
+//
+// DotNetCoreCanReferenceProjectExtension.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2017 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.DotNetCore
+{
+ [ExportProjectModelExtension]
+ class DotNetCoreCanReferenceProjectExtension : DotNetProjectExtension
+ {
+ protected override bool OnGetCanReferenceProject (DotNetProject targetProject, out string reason)
+ {
+ if (base.OnGetCanReferenceProject (targetProject, out reason))
+ return true;
+
+ if (IsNetStandardProject (targetProject) &&
+ CanReferenceNetStandardProject (Project, targetProject)) {
+
+ if (Runtime.Preferences.BuildWithMSBuild)
+ return true;
+
+ reason = GettextCatalog.GetString ("MSBuild must be used instead of xbuild. Please enable MSBuild in preferences - Projects - Build and then re-open the solution.");
+ return false;
+ }
+
+ return false;
+ }
+
+ static bool IsNetStandardProject (DotNetProject project)
+ {
+ return project.TargetFramework.Id.Identifier == ".NETStandard";
+ }
+
+ /// <summary>
+ /// Handle any failures to parse the target framework.
+ /// </summary>
+ static bool CanReferenceNetStandardProject (DotNetProject project, DotNetProject targetProject)
+ {
+ try {
+ return DotNetCoreFrameworkCompatibility.CanReferenceNetStandardProject (project, targetProject);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Error checking target framework compatibility.", ex);
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreMSBuildProject.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreMSBuildProject.cs
index f7e60357a1..67d819598e 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreMSBuildProject.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreMSBuildProject.cs
@@ -24,8 +24,10 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
+using System;
using System.Collections.Generic;
using System.Linq;
+using MonoDevelop.Projects;
using MonoDevelop.Projects.MSBuild;
namespace MonoDevelop.DotNetCore
@@ -36,6 +38,7 @@ namespace MonoDevelop.DotNetCore
bool hasRootNamespace;
bool hasAssemblyName;
bool hasDescription;
+ CompileTarget defaultCompileTarget = CompileTarget.Library;
public string ToolsVersion { get; private set; }
public bool IsOutputTypeDefined { get; private set; }
@@ -49,6 +52,10 @@ namespace MonoDevelop.DotNetCore
get { return Sdk != null; }
}
+ public CompileTarget DefaultCompileTarget {
+ get { return defaultCompileTarget; }
+ }
+
public void ReadProject (MSBuildProject project)
{
ToolsVersion = project.ToolsVersion;
@@ -85,6 +92,7 @@ namespace MonoDevelop.DotNetCore
if (HasSdk) {
project.RemoveInternalElements ();
+ project.ToolsVersion = ToolsVersion;
}
}
@@ -115,5 +123,15 @@ namespace MonoDevelop.DotNetCore
return true;
}
+
+ public void ReadDefaultCompileTarget (MSBuildProject project)
+ {
+ string outputType = project.EvaluatedProperties.GetValue ("OutputType");
+ if (!string.IsNullOrEmpty (outputType)) {
+ if (!Enum.TryParse (outputType, out defaultCompileTarget)) {
+ defaultCompileTarget = CompileTarget.Library;
+ }
+ }
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectExtension.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectExtension.cs
index 9b86559124..bf1e90dd7b 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectExtension.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectExtension.cs
@@ -98,7 +98,7 @@ namespace MonoDevelop.DotNetCore
dotNetCoreMSBuildProject.ReadProject (msproject);
if (!dotNetCoreMSBuildProject.IsOutputTypeDefined)
- Project.CompileTarget = CompileTarget.Library;
+ Project.CompileTarget = dotNetCoreMSBuildProject.DefaultCompileTarget;
Project.UseAdvancedGlobSupport = true;
}
@@ -288,7 +288,37 @@ namespace MonoDevelop.DotNetCore
if (dotNetCoreMSBuildProject.AddInternalSdkImports (project, sdkPaths)) {
project.Evaluate ();
+ dotNetCoreMSBuildProject.ReadDefaultCompileTarget (project);
}
}
+
+ /// <summary>
+ /// HACK: Remove any C# files found in the intermediate obj directory. This avoids
+ /// a type system error if a file in the obj directory is modified but the type
+ /// system does not have that file in the workspace. This can happen if the file
+ /// was not filtered out initially and added to the project by the wildcard import
+ /// and then later on after a re-evaluation of the project is filtered out from the
+ /// source files returned by Project.OnGetSourceFiles.
+ /// </summary>
+ protected override async Task<ProjectFile[]> OnGetSourceFiles (ProgressMonitor monitor, ConfigurationSelector configuration)
+ {
+ var sourceFiles = await base.OnGetSourceFiles (monitor, configuration);
+
+ return RemoveFilesFromIntermediateDirectory (sourceFiles);
+ }
+
+ ProjectFile[] RemoveFilesFromIntermediateDirectory (ProjectFile[] files)
+ {
+ var filteredFiles = new List<ProjectFile> ();
+ FilePath intermediateOutputPath = Project.BaseIntermediateOutputPath;
+
+ foreach (var file in files) {
+ if (!file.FilePath.IsChildPathOf (intermediateOutputPath)) {
+ filteredFiles.Add (file);
+ }
+ }
+
+ return filteredFiles.ToArray ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectReader.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectReader.cs
index 36ef924747..53a1046d67 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectReader.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/DotNetCoreProjectReader.cs
@@ -67,10 +67,6 @@ namespace MonoDevelop.DotNetCore
if (string.IsNullOrEmpty (sdk))
return null;
- string toolsVersion = tr.GetAttribute ("ToolsVersion");
- if (toolsVersion != "15.0")
- return null;
-
return sdk;
}
}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/MSBuildProjectExtensions.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/MSBuildProjectExtensions.cs
index 78e1ee23ab..1f9550e1fb 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/MSBuildProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotNetCore/MSBuildProjectExtensions.cs
@@ -126,7 +126,15 @@ namespace MonoDevelop.DotNetCore
return project.GetImport (importedProjectFile) != null;
}
- static string DefaultExcludes = @"$(BaseOutputPath)**;$(BaseIntermediateOutputPath)**;**\*.*proj.user;**\*.*proj;**\*.sln;.*;**\.*\**";
+ /// <summary>
+ /// Use IntermediateOutputPath instead of BaseIntermediateOutputPath since the latter
+ /// seems to have a full path so the exclude fails to match the include since these
+ /// are relative paths. IntermediateOutputPath is a relative path however it is not
+ /// as restrictive as BaseIntermediateOutputPath and will not exclude all files from
+ /// this directory. A separate filtering is done in DotNetCoreProjectExtension's
+ /// OnGetSourceFiles to remove files from the BaseIntermediateOutputPath.
+ /// </summary>
+ static string DefaultExcludes = @"$(BaseOutputPath)**;$(IntermediateOutputPath)**;**\*.*proj.user;**\*.*proj;**\*.sln;.*;**\.*\**";
// HACK: Temporary workaround. Add wildcard items to the project otherwise the
// solution window shows no files.
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerEngine.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerEngine.cs
deleted file mode 100644
index fe3741bd29..0000000000
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerEngine.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-// DotNetCoreDebuggerEngine.cs
-//
-// Author:
-// David Karlaš <david.karlas@xamarin.com>
-//
-// Copyright (c) 2016 Xamarin, Inc (http://www.xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System;
-using System.IO;
-using Mono.Debugging.Client;
-using MonoDevelop.Core;
-using MonoDevelop.Core.Assemblies;
-using MonoDevelop.Core.Execution;
-using MonoDevelop.Debugger;
-using MonoDevelop.DotNetCore;
-using System.Linq;
-
-namespace MonoDevelop.DotnetCore.Debugger
-{
- public class DotNetCoreDebuggerEngine : DebuggerEngineBackend
- {
- public override bool CanDebugCommand (ExecutionCommand cmd)
- {
- return cmd is DotNetCoreExecutionCommand;
- }
-
- public override bool IsDefaultDebugger (ExecutionCommand cmd)
- {
- return true;
- }
-
- public static bool CanDebugRuntime (TargetRuntime runtime)
- {
- return true;
- }
-
- public override DebuggerStartInfo CreateDebuggerStartInfo (ExecutionCommand c)
- {
- var cmd = (DotNetCoreExecutionCommand)c;
- var dsi = new DebuggerStartInfo {
- Command = cmd.OutputPath,
- Arguments = cmd.DotNetArguments,
- WorkingDirectory = cmd.WorkingDirectory,
- UseExternalConsole = cmd.ExternalConsole
- };
-
- foreach (var envVar in cmd.EnvironmentVariables)
- dsi.EnvironmentVariables [envVar.Key] = envVar.Value;
-
- return dsi;
- }
-
- public override DebuggerSession CreateSession ()
- {
- return new DotNetCoreDebuggerSession ();
- }
-
- public override ProcessInfo [] GetAttachableProcesses ()
- {
- return System.Diagnostics.Process.GetProcessesByName ("dotnet").Select (p => {
- try {
- return new ProcessInfo (p.Id, p.ProcessName);
- } catch {
- return null;
- }
- }).Where (p => p != null).ToArray ();
- }
- }
-}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerSession.cs b/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerSession.cs
deleted file mode 100644
index 894eb1cb38..0000000000
--- a/main/src/addins/MonoDevelop.DotNetCore/MonoDevelop.DotnetCore.Debugger/DotNetCoreDebuggerSession.cs
+++ /dev/null
@@ -1,337 +0,0 @@
-//
-// DotNetCoreDebuggerSession.cs
-//
-// Author:
-// David Karlaš <david.karlas@xamarin.com>
-//
-// Copyright (c) 2016 Xamarin, Inc (http://www.xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using System.Net;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.VisualStudio.Shared.VSCodeDebugProtocol.Messages;
-using Mono.Debugging.Client;
-using MonoDevelop.Core;
-using MonoDevelop.Core.ProgressMonitoring;
-using MonoDevelop.Debugger.VsCodeDebugProtocol;
-using MonoDevelop.Ide;
-using MonoDevelop.Ide.Gui;
-using Newtonsoft.Json.Linq;
-using Mono.Unix.Native;
-
-namespace MonoDevelop.DotnetCore.Debugger
-{
- public class DotNetCoreDebuggerSession : VSCodeDebuggerSession
- {
- CancellationTokenSource cancelEngineDownload;
-
- //TODO: version the download
- static string DebugAdapterPath = Path.Combine (UserProfile.Current.CacheDir, "CoreClrAdaptor", "OpenDebugAD7");
- static string DebugAdapterDir = Path.GetDirectoryName (DebugAdapterPath);
- static string AdapterVersion = "1-6-3";
- static string DebugAdapterZipPath = UserProfile.Current.CacheDir.Combine ("coreclr-debug-osx.10.11-x64-" + AdapterVersion + ".zip");
-
- protected override string GetDebugAdapterPath ()
- {
- return DebugAdapterPath;
- }
-
- protected override InitializeRequest CreateInitRequest ()
- {
- var initRequest = new InitializeRequest (
- "coreclr",
- true,
- true,
- InitializeArguments.PathFormatValue.Path,
- true,
- false,//TODO: Add support for VariablePaging
- false//TODO: Add support for RunInTerminal
- );
- return initRequest;
- }
-
- protected override LaunchRequest CreateLaunchRequest (DebuggerStartInfo startInfo)
- {
- string cwd;
- if (string.IsNullOrWhiteSpace (startInfo.WorkingDirectory)) {
- cwd = Path.GetDirectoryName (startInfo.Command);
-
- //HACK: Need to have proper way of setting CWD for asp.net projects
- //Check if wwwroot exists in root of project but not in output... That indicates we really want to move CWD to project root
- if (Directory.Exists (Path.Combine (cwd, ".."/*netcoreapp1.0*/, ".."/*Debug*/, ".."/*bin*/, "wwwroot")) && !Directory.Exists (Path.Combine (cwd, "wwwroot"))) {
- cwd = Path.GetFullPath (Path.Combine (cwd, ".."/*netcoreapp1.0*/, ".."/*Debug*/, ".."/*bin*/));
- } else if (Directory.Exists (Path.Combine (cwd, ".."/*Debug*/, ".."/*bin*/, "wwwroot")) && !Directory.Exists (Path.Combine (cwd, "wwwroot"))) {
- cwd = Path.GetFullPath (Path.Combine (cwd, ".."/*Debug*/, ".."/*bin*/));
- }
- } else {
- cwd = startInfo.WorkingDirectory;
- }
-
- var launchRequest = new LaunchRequest (
- false,
- new Dictionary<string, JToken> () {
- {"name" , JToken.FromObject (".NET Core Launch")},
- {"type" , JToken.FromObject ("coreclr")},
- {"request" , JToken.FromObject ("launch")},
- {"preLaunchTask" , JToken.FromObject ("build")},
- {"program" , JToken.FromObject (startInfo.Command)},
- {"args" , JToken.FromObject (startInfo.Arguments.Split (new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries))},
- {"cwd" , JToken.FromObject (cwd)},
- {"env", JToken.FromObject (startInfo.EnvironmentVariables)},
- {"stopAtEntry" ,JToken.FromObject (false)},
- {"justMyCode", JToken.FromObject (Options.ProjectAssembliesOnly)},
- {"requireExactSource", JToken.FromObject (false)},//Mimic XS behavior
- {"enableStepFiltering", JToken.FromObject (Options.StepOverPropertiesAndOperators)},
- {"externalConsole", JToken.FromObject (startInfo.UseExternalConsole)},
- {"launchBrowser", JToken.FromObject(new Dictionary<string, JToken>(){
- { "enabled", JToken.FromObject( true)},
- { "args", JToken.FromObject( "${auto-detect-url}")},
- {"windows", JToken.FromObject(new Dictionary<string, JToken>(){
- { "command", JToken.FromObject("cmd.exe")},
- { "args", JToken.FromObject( "/C start ${auto-detect-url}")}})},
- {"osx", JToken.FromObject(new Dictionary<string, JToken>(){
- { "command", JToken.FromObject("open")}})},
- {"linux", JToken.FromObject(new Dictionary<string, JToken>() {
- { "command", JToken.FromObject("xdg-open")}})}
- })},
- {"sourceFileMap", JToken.FromObject (new Dictionary<string, JToken> () {
- {"/Views", Path.Combine(cwd , "Views")}
- })}});
- return launchRequest;
- }
-
- protected override AttachRequest CreateAttachRequest (long processId)
- {
- var attachRequest = new AttachRequest (
- new Dictionary<string, JToken> () {
- {"name" , JToken.FromObject (".NET Core Attach")},
- {"type" , JToken.FromObject ("coreclr")},
- {"request" , JToken.FromObject ("launch")},
- {"processId" , JToken.FromObject (processId)},
- {"justMyCode", JToken.FromObject (Options.ProjectAssembliesOnly)},
- {"requireExactSource", JToken.FromObject (false)},//Mimic XS behavior
- {"enableStepFiltering", JToken.FromObject (Options.StepOverPropertiesAndOperators)}
- }
- );
- return attachRequest;
- }
-
- protected async override void OnAttachToProcess (long processId)
- {
- try {
- if (await EnsureDebuggerInstalled ()) {
- Attach (processId);
- }
- } catch (Exception ex) {
- if (!HandleException (ex)) {
- throw;
- }
- }
- }
-
- protected async override void OnRun (DebuggerStartInfo startInfo)
- {
- try {
- if (await EnsureDebuggerInstalled ()) {
- Launch (startInfo);
- }
- } catch (Exception ex) {
- if (!HandleException (ex)) {
- throw;
- }
- }
- }
-
- async Task<bool> EnsureDebuggerInstalled ()
- {
- if (File.Exists (DebugAdapterPath) && File.Exists (DebugAdapterZipPath)) {
- return true;
- }
-
- try {
- cancelEngineDownload = new CancellationTokenSource ();
- var installSuccess = await InstallDotNetCoreDebugger (cancelEngineDownload.Token);
-
- if (installSuccess && !cancelEngineDownload.IsCancellationRequested) {
- return true;
- } else {
- OnTargetEvent (new TargetEventArgs (TargetEventType.TargetExited));
- }
- } catch (OperationCanceledException) {
- } catch (Exception e) {
- LoggingService.LogError ("Error downloading .Net Core debugger adaptor", e);
- } finally {
- cancelEngineDownload = null;
- }
- return false;
- }
-
- protected override void OnExit ()
- {
- cancelEngineDownload?.Cancel ();
- base.OnExit ();
- }
-
- async Task<bool> InstallDotNetCoreDebugger (CancellationToken token)
- {
- using (var progressMonitor = CreateProgressMonitor ()) {
- progressMonitor.CancellationToken.Register (() => {
- cancelEngineDownload?.Cancel ();
- });
- try {
- if (await InstallDebuggerFilesInternal (progressMonitor, token)) {
- return true;
- }
- if (token.IsCancellationRequested) {
- return false;
- }
- } catch (Exception ex) {
- ex = ex.FlattenAggregate ();
- if (ex is OperationCanceledException) {
- return false;
- }
- LoggingService.LogInternalError (ex);
- }
- progressMonitor.ReportError (GettextCatalog.GetString ("Could not install .NET Core debugger adaptor"));
- }
- return false;
- }
-
- async Task<bool> InstallDebuggerFilesInternal (ProgressMonitor progressMonitor, CancellationToken token)
- {
- var dotnetPath = new DotNetCore.DotNetCorePath ().FileName;
-
- //TODO: check whether the file was downloaded already, check hash?
- //TODO: resume partial downloads?
- var url = GetDebuggerZipUrl ();
-
- using (var progressTask = progressMonitor.BeginTask (GettextCatalog.GetString ("Downloading .NET Core debugger..."), 1000)) {
- int reported = 0;
- await DownloadWithProgress (
- url,
- DebugAdapterZipPath,
- (p) => {
- int progress = (int)(1000f * p);
- if (reported < progress) {
- progressMonitor.Step (progress - reported);
- reported = progress;
- }
- },
- token
- );
- }
-
- using (progressMonitor.BeginTask (GettextCatalog.GetString ("Installing .NET Core debugger..."), 1)) {
- //clean up any old debugger files
- if (Directory.Exists (DebugAdapterDir)) {
- Directory.Delete (DebugAdapterDir, true);
- }
-
- Directory.CreateDirectory (DebugAdapterDir);
- using (var archive = ZipFile.Open (DebugAdapterZipPath, ZipArchiveMode.Read)) {
- foreach (var entry in archive.Entries) {
- var name = Path.Combine (DebugAdapterDir, entry.FullName);
- if (name [name.Length - 1] == Path.DirectorySeparatorChar) {
- Directory.CreateDirectory (name);
- } else {
- var dir = Path.GetDirectoryName (name);
- Directory.CreateDirectory (dir);
- entry.ExtractToFile (name, true);
- }
- }
- }
-
- if (File.Exists (DebugAdapterPath)) {
- foreach (var file in Directory.GetFiles (DebugAdapterDir, "*", SearchOption.AllDirectories)) {
- Syscall.chmod (file, FilePermissions.S_IRWXU | FilePermissions.S_IRGRP | FilePermissions.S_IXGRP | FilePermissions.S_IROTH | FilePermissions.S_IXOTH);
- }
- } else {
- progressMonitor.ReportError (GettextCatalog.GetString ("Failed to extract files"));
- return false;
- }
- }
-
- return true;
- }
-
- static async Task DownloadWithProgress (string fromUrl, string toFile, Action<float> reportProgress, CancellationToken token)
- {
- try {
- Directory.CreateDirectory (Path.GetDirectoryName (toFile));
-
- var response = await WebRequestHelper.GetResponseAsync (
- () => WebRequest.CreateHttp (fromUrl),
- null,
- token
- );
-
- using (var fs = File.Open (toFile, FileMode.Create, FileAccess.ReadWrite)) {
- var stream = response.GetResponseStream ();
-
- long total = stream.Length;
- long copied = 0;
- float progressTotal = 0;
- byte [] buffer = new byte [4096];
-
- int read;
- while ((read = await stream.ReadAsync (buffer, 0, buffer.Length, token).ConfigureAwait (false)) != 0) {
- await fs.WriteAsync (buffer, 0, read, token).ConfigureAwait (false);
- copied += read;
- float progressIncrement = copied / (float)total - progressTotal;
- if (progressIncrement > 0.001f) {
- progressTotal += progressIncrement;
- reportProgress (progressTotal);
- }
- }
- }
- } catch (WebException wex) {
- if (wex.Status == WebExceptionStatus.RequestCanceled) {
- token.ThrowIfCancellationRequested ();
- }
- }
- }
-
- ProgressMonitor CreateProgressMonitor ()
- {
- //TODO: make cancellable
- return IdeApp.Workbench.ProgressMonitors.GetStatusProgressMonitor (
- GettextCatalog.GetString ("Installing .NET Core debugger..."),
- Stock.StatusSolutionOperation,
- true,
- true,
- false,
- null,
- true);
- }
-
- string GetDebuggerZipUrl ()
- {
- if (Platform.IsMac)
- return "https://vsdebugger.azureedge.net/coreclr-debug-" + AdapterVersion + "/coreclr-debug-osx.10.11-x64.zip";
- //TODO: other platforms
- throw new NotImplementedException ();
- }
- }
-}
diff --git a/main/src/addins/MonoDevelop.DotNetCore/Properties/MonoDevelop.DotNetCore.addin.xml b/main/src/addins/MonoDevelop.DotNetCore/Properties/MonoDevelop.DotNetCore.addin.xml
index 7bd5061408..4c96dc1dd4 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/Properties/MonoDevelop.DotNetCore.addin.xml
+++ b/main/src/addins/MonoDevelop.DotNetCore/Properties/MonoDevelop.DotNetCore.addin.xml
@@ -3,15 +3,6 @@
<Extension path="/MonoDevelop/Core/ExecutionHandlers">
<ExecutionHandler id="DotNetCore" class="MonoDevelop.DotNetCore.DotNetCoreExecutionHandler" />
</Extension>
-
- <Extension path="/MonoDevelop/Debugging/DebuggerEngines">
- <DebuggerEngine insertbefore="Mono.Debugger.Soft"
- id="NetCoreDebugger"
- name=".Net Core Debugger"
- features="Breakpoints, Pause, Stepping, DebugFile, ConditionalBreakpoints, Tracepoints, Catchpoints, Disassembly, Attaching"
- type="MonoDevelop.DotnetCore.Debugger.DotNetCoreDebuggerEngine" />
- </Extension>
-
<Extension path="/MonoDevelop/Ide/ProjectTemplateCategories">
<Category id="netcore" name=".NET Core" icon="md-platform-other" insertbefore="other">
<Category id="app" name="App">
diff --git a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Console/ConsoleProject.csproj b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Console/ConsoleProject.csproj
index 5787ed73c5..5e1611f89d 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Console/ConsoleProject.csproj
+++ b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Console/ConsoleProject.csproj
@@ -1,11 +1,8 @@
-<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.0</TargetFramework>
</PropertyGroup>
- <ItemGroup>
- <PackageReference Include="Microsoft.NETCore.App" Version="1.0.3" />
- </ItemGroup>
</Project>
diff --git a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/EmptyWeb/EmptyWebProject.csproj b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/EmptyWeb/EmptyWebProject.csproj
index 505db35118..f71ef36b61 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/EmptyWeb/EmptyWebProject.csproj
+++ b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/EmptyWeb/EmptyWebProject.csproj
@@ -1,21 +1,11 @@
-<Project Sdk="Microsoft.NET.Sdk.Web" ToolsVersion="15.0">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
- <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.0</TargetFramework>
- <PreserveCompilationContext>true</PreserveCompilationContext>
- </PropertyGroup>
-
- <PropertyGroup>
- <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.NETCore.App" Version="1.0.3" />
- <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="1.0.0" />
- <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="1.0.0" />
- <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.0.1" />
- <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.0.0" />
+ <PackageReference Include="Microsoft.AspNetCore" Version="1.0.3" />
</ItemGroup>
</Project>
diff --git a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Library/LibraryProject.csproj b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Library/LibraryProject.csproj
index d4b7bb0878..20861435dc 100644
--- a/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Library/LibraryProject.csproj
+++ b/main/src/addins/MonoDevelop.DotNetCore/Templates/Projects/Library/LibraryProject.csproj
@@ -1,10 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
</PropertyGroup>
- <ItemGroup>
- <PackageReference Include="NETStandard.Library" Version="1.6" />
- </ItemGroup>
</Project>
diff --git a/main/src/addins/MonoDevelop.DotNetCore/packages.config b/main/src/addins/MonoDevelop.DotNetCore/packages.config
deleted file mode 100644
index 385d4256f5..0000000000
--- a/main/src/addins/MonoDevelop.DotNetCore/packages.config
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="Microsoft.VisualStudio.Shared.VsCodeDebugProtocol" version="0.2.1214.1" targetFramework="net45" />
- <package id="Newtonsoft.Json" version="8.0.1" targetFramework="net45" />
-</packages> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/StockIconsNodeBuilder.cs b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/StockIconsNodeBuilder.cs
index 181ccd5634..a8088a2ad6 100644
--- a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/StockIconsNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/StockIconsNodeBuilder.cs
@@ -44,12 +44,11 @@ namespace MonoDevelop.GtkCore.NodeBuilders
Console.WriteLine ("Error while loading pixbuf 'image-x-generic.png': " + e);
}
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ public override int GetSortIndex (ITreeNavigator node)
{
- return -1;
+ return -100;
}
-
public override string GetNodeName (ITreeNavigator thisNode, object dataObject)
{
return "StockIcons";
diff --git a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/WindowsFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/WindowsFolderNodeBuilder.cs
index aea532fc77..2e1b0f44ea 100644
--- a/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/WindowsFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.GtkCore/MonoDevelop.GtkCore.NodeBuilders/WindowsFolderNodeBuilder.cs
@@ -84,15 +84,12 @@ namespace MonoDevelop.GtkCore.NodeBuilders
{
return true;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is ProjectReferenceCollection)
- return 1;
- else
- return -1;
+ return -200;
}
-
+
public override void OnNodeAdded (object dataObject)
{
WindowsFolder w = (WindowsFolder) dataObject;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/DependenciesNodeBuilder.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/DependenciesNodeBuilder.cs
index f5bae2f026..a73baa5a09 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/DependenciesNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/DependenciesNodeBuilder.cs
@@ -51,13 +51,9 @@ namespace MonoDevelop.PackageManagement.NodeBuilders
nodeInfo.ClosedIcon = Context.GetIcon (node.ClosedIcon);
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is ProjectReferenceCollection)
- return 1;
- if (otherNode.DataItem is GettingStartedNode)
- return 1;
- return -1;
+ return -600;
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesFolderNodeBuilder.cs
index a91b9bab49..cdbc4dc801 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectPackagesFolderNodeBuilder.cs
@@ -60,15 +60,9 @@ namespace MonoDevelop.PackageManagement.NodeBuilders
nodeInfo.ClosedIcon = Context.GetIcon (node.ClosedIcon);
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- if (otherNode.DataItem is ProjectReferenceCollection)
- return 1;
- if (otherNode.DataItem is GettingStartedNode)
- return 1;
- if (otherNode.DataItem is DependenciesNode)
- return 1;
- return -1;
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ return -500;
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectReferencesFromPackagesFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectReferencesFromPackagesFolderNodeBuilder.cs
index 26b5aea6b8..4a892b92c7 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectReferencesFromPackagesFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.NodeBuilders/ProjectReferencesFromPackagesFolderNodeBuilder.cs
@@ -50,12 +50,9 @@ namespace MonoDevelop.PackageManagement.NodeBuilders
nodeInfo.Icon = Context.GetIcon ("md-reference-package");
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- if (otherNode.NodeName == ".NET Portable Subset") {
- return 1;
- }
- return -1;
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ return -500;
}
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreFrameworkCompatibility.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreFrameworkCompatibility.cs
index c8a604d819..fabc564661 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreFrameworkCompatibility.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreFrameworkCompatibility.cs
@@ -48,5 +48,13 @@ namespace MonoDevelop.PackageManagement
else // Assume compatible.
return true;
}
+
+ public static bool CanReferenceNetStandardProject (DotNetProject project, DotNetProject netStandardProject)
+ {
+ var netStandardFramework = NuGetFramework.Parse (netStandardProject.TargetFramework.Id.ToString ());
+ var projectFramework = NuGetFramework.Parse (project.TargetFramework.Id.ToString ());
+
+ return DefaultCompatibilityProvider.Instance.IsCompatible (projectFramework, netStandardFramework);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
index 8b43070797..7eba9a6cc6 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
@@ -176,7 +176,8 @@ namespace MonoDevelop.PackageManagement
public static bool HasPackageReferences (this DotNetProject project)
{
- return project.Items.OfType<ProjectPackageReference> ().Any ();
+ return project.Items.OfType<ProjectPackageReference> ().Any () ||
+ project.MSBuildProject.HasEvaluatedPackageReferences ();
}
public static ProjectPackageReference GetPackageReference (
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
index 06acd72da9..565fd96603 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectProxy.cs
@@ -153,7 +153,12 @@ namespace MonoDevelop.PackageManagement
public IEnumerable<ProjectPackageReference> GetPackageReferences ()
{
- return DotNetProject.Items.OfType<ProjectPackageReference> ();
+ foreach (var item in DotNetProject.MSBuildProject.GetEvaluatedPackageReferences ()) {
+ yield return item;
+ }
+ foreach (var item in DotNetProject.Items.OfType<ProjectPackageReference> ()) {
+ yield return item;
+ }
}
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildProjectExtensions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildProjectExtensions.cs
index 37545c9cd8..f1c155b48a 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildProjectExtensions.cs
@@ -88,5 +88,26 @@ namespace MonoDevelop.PackageManagement
{
return project.GetImport (importedProjectFile) != null;
}
+
+ public static IEnumerable<ProjectPackageReference> GetEvaluatedPackageReferences (this MSBuildProject project)
+ {
+ return project.GetEvaluatedPackageReferenceItems ()
+ .Select (ProjectPackageReference.Create);
+ }
+
+ static IEnumerable<IMSBuildItemEvaluated> GetEvaluatedPackageReferenceItems (this MSBuildProject project)
+ {
+ if (project.EvaluatedItems != null) {
+ return project.EvaluatedItems
+ .Where (item => item.Name == "PackageReference");
+ }
+
+ return Enumerable.Empty<IMSBuildItemEvaluated> ();
+ }
+
+ public static bool HasEvaluatedPackageReferences (this MSBuildProject project)
+ {
+ return project.GetEvaluatedPackageReferenceItems ().Any ();
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectPackageReference.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectPackageReference.cs
index e2a5c23c1b..5cb98c8379 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectPackageReference.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectPackageReference.cs
@@ -27,6 +27,7 @@
using System;
using System.Linq;
using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
using NuGet.Packaging;
using NuGet.Packaging.Core;
using NuGet.Versioning;
@@ -85,6 +86,20 @@ namespace MonoDevelop.PackageManagement
return packageReference;
}
+ internal static ProjectPackageReference Create (string packageId, string version)
+ {
+ var package = new PackageIdentity (packageId, new NuGetVersion (version));
+ return Create (package);
+ }
+
+ public static ProjectPackageReference Create (IMSBuildItemEvaluated evaluatedItem)
+ {
+ return Create (
+ evaluatedItem.Include,
+ evaluatedItem.Metadata.GetValue ("Version")
+ );
+ }
+
public override string ToString ()
{
return string.Format ("[PackageReference: {0} {1}]", Include, Metadata.GetValue ("Version"));
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
index 6e55609e21..8a6b109660 100644
--- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
+++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/ExtensibleTextEditor.cs
@@ -657,20 +657,40 @@ namespace MonoDevelop.SourceEditor
#endregion
#region Key bindings
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineEnd)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineStart)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteLeftChar)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteRightChar)]
[CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.CharLeft)]
[CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.CharRight)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineUp)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineDown)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DocumentStart)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DocumentEnd)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteLeftChar)]
[CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteLine)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MoveBlockUp)]
- [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MoveBlockDown)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteNextSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteNextWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeletePrevSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeletePrevWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DeleteRightChar)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DocumentEnd)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.DocumentStart)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.ExpandSelectionToLine)]
[CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.GotoMatchingBrace)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineDown)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineEnd)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineStart)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.LineUp)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MoveNextSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MoveNextWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MovePrevSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.MovePrevWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveDown)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveEnd)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveHome)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveLeft)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveNextSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveNextWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMovePrevSubword)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMovePrevWord)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveRight)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveToDocumentEnd)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveToDocumentStart)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SelectionMoveUp)]
+ [CommandUpdateHandler (MonoDevelop.Ide.Commands.TextEditorCommands.SwitchCaretMode)]
protected void OnUpdateEditorCommand (CommandInfo info)
{
// ignore command if the editor has no focus
diff --git a/main/src/addins/MonoDevelop.UnitTesting.NUnit/MonoDevelop.UnitTesting.NUnit/ExternalTestRunner.cs b/main/src/addins/MonoDevelop.UnitTesting.NUnit/MonoDevelop.UnitTesting.NUnit/ExternalTestRunner.cs
index 0b39c59b82..12248158f1 100644
--- a/main/src/addins/MonoDevelop.UnitTesting.NUnit/MonoDevelop.UnitTesting.NUnit/ExternalTestRunner.cs
+++ b/main/src/addins/MonoDevelop.UnitTesting.NUnit/MonoDevelop.UnitTesting.NUnit/ExternalTestRunner.cs
@@ -139,8 +139,7 @@ namespace MonoDevelop.UnitTesting.NUnit.External
public void Dispose ()
{
- connection.Disconnect (true);
- connection.Dispose ();
+ connection.Disconnect ().Ignore ();
}
}
diff --git a/main/src/addins/MonoDevelop.UnitTesting.NUnit/NUnitRunner/ExternalTestRunner.cs b/main/src/addins/MonoDevelop.UnitTesting.NUnit/NUnitRunner/ExternalTestRunner.cs
index 05705f8e80..a375247036 100644
--- a/main/src/addins/MonoDevelop.UnitTesting.NUnit/NUnitRunner/ExternalTestRunner.cs
+++ b/main/src/addins/MonoDevelop.UnitTesting.NUnit/NUnitRunner/ExternalTestRunner.cs
@@ -70,7 +70,7 @@ namespace MonoDevelop.UnitTesting.NUnit.External
public RemoteTestResult Run (string[] nameFilter, string path, string suiteName, string[] supportAssemblies, string testRunnerType, string testRunnerAssembly, string crashLogFile)
{
- NUnitTestRunner runner = GetRunner (path);
+ NUnitTestRunner runner = GetRunner (path, false);
EventListenerWrapper listenerWrapper = new EventListenerWrapper (server);
UnhandledExceptionEventHandler exceptionHandler = (object sender, UnhandledExceptionEventArgs e) => {
@@ -90,19 +90,33 @@ namespace MonoDevelop.UnitTesting.NUnit.External
[MessageHandler]
public GetTestInfoResponse GetTestInfo (GetTestInfoRequest req)
{
- NUnitTestRunner runner = GetRunner (req.Path);
+ NUnitTestRunner runner = GetRunner (req.Path, true);
var r = runner.GetTestInfo (req.Path, req.SupportAssemblies);
return new GetTestInfoResponse { Result = r };
}
- NUnitTestRunner GetRunner (string assemblyPath)
+ NUnitTestRunner GetRunner (string assemblyPath, bool forQuery)
{
string basePath = Path.GetDirectoryName (GetType ().Assembly.Location);
TestPackage package = new TestPackage (assemblyPath);
package.Settings ["ShadowCopyFiles"] = false;
- package.BasePath = Path.GetDirectoryName(assemblyPath);
-
+
+ // This is a workaround for what could be a Mono bug (hard to tell).
+ // For the test runner to be able to load the app.config file,
+ // the BasePath of the domain needs to be set to the location
+ // of the test assembly (see bug #41541 - App Config is not read in Unit Tests).
+ // However, when doing that, the test runner crashes in some cases
+ // (for example when loading the MD unit tests). It crashes because
+ // Mono gets confused and tries to load assemblies from two different
+ // locations. As a workaround, we set the test assebmly directory
+ // as base path only when running, which seems to work.
+
+ if (forQuery)
+ package.BasePath = basePath;
+ else
+ package.BasePath = Path.GetDirectoryName (assemblyPath);
+
AppDomain domain = Services.DomainManager.CreateDomain (package);
string asm = Path.Combine (basePath, "NUnitRunner.exe");
runner = (NUnitTestRunner)domain.CreateInstanceFromAndUnwrap (asm, "MonoDevelop.UnitTesting.NUnit.External.NUnitTestRunner");
diff --git a/main/src/addins/MonoDevelop.UnitTesting/Services/UnitTestResultsStore.cs b/main/src/addins/MonoDevelop.UnitTesting/Services/UnitTestResultsStore.cs
index 5cadb15f39..4a0940a90e 100644
--- a/main/src/addins/MonoDevelop.UnitTesting/Services/UnitTestResultsStore.cs
+++ b/main/src/addins/MonoDevelop.UnitTesting/Services/UnitTestResultsStore.cs
@@ -28,6 +28,7 @@
using System;
+using MonoDevelop.Core;
namespace MonoDevelop.UnitTesting
{
@@ -35,41 +36,66 @@ namespace MonoDevelop.UnitTesting
{
UnitTest test;
IResultsStore store;
-
+
internal UnitTestResultsStore (UnitTest test, IResultsStore store)
{
this.test = test;
this.store = store;
}
-
+
public UnitTestResult GetLastResult (DateTime date)
{
- if (store == null) return null;
- return store.GetLastResult (test.ActiveConfiguration, test, date);
+ try {
+ if (store != null)
+ return store.GetLastResult (test.ActiveConfiguration, test, date);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Test store query failed. Test history data may be corrupt.", ex);
+ }
+ return null;
}
-
+
public UnitTestResult GetNextResult (DateTime date)
{
- if (store == null) return null;
- return store.GetNextResult (test.ActiveConfiguration, test, date);
+ try {
+ if (store != null)
+ return store.GetNextResult (test.ActiveConfiguration, test, date);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Test store query failed. Test history data may be corrupt.", ex);
+ }
+ return null;
}
-
+
public UnitTestResult GetPreviousResult (DateTime date)
{
- if (store == null) return null;
- return store.GetPreviousResult (test.ActiveConfiguration, test, date);
+ try {
+ if (store != null)
+ return store.GetPreviousResult (test.ActiveConfiguration, test, date);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Test store query failed. Test history data may be corrupt.", ex);
+ }
+ return null;
}
-
- public UnitTestResult[] GetResults (DateTime startDate, DateTime endDate)
+
+ public UnitTestResult [] GetResults (DateTime startDate, DateTime endDate)
{
- if (store == null) return new UnitTestResult [0];
- return store.GetResults (test.ActiveConfiguration, test, startDate, endDate);
+ try {
+ if (store != null)
+ return store.GetResults (test.ActiveConfiguration, test, startDate, endDate);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Test store query failed. Test history data may be corrupt.", ex);
+ }
+ return new UnitTestResult [0];
}
-
- public UnitTestResult[] GetResultsToDate (DateTime endDate, int count)
+
+ public UnitTestResult [] GetResultsToDate (DateTime endDate, int count)
{
- if (store == null) return new UnitTestResult [0];
- return store.GetResultsToDate (test.ActiveConfiguration, test, endDate, count);
+ try {
+ if (store != null)
+ return store.GetResultsToDate (test.ActiveConfiguration, test, endDate, count);
+ } catch (Exception ex) {
+ LoggingService.LogError ("Test store query failed. Test history data may be corrupt.", ex);
+ }
+ return new UnitTestResult [0];
}
}
}
diff --git a/main/src/addins/MonoDevelop.WebReferences/MonoDevelop.WebReferences.NodeBuilders/WebReferenceFolderNodeBuilder.cs b/main/src/addins/MonoDevelop.WebReferences/MonoDevelop.WebReferences.NodeBuilders/WebReferenceFolderNodeBuilder.cs
index 87869b8874..f579b4faf0 100644
--- a/main/src/addins/MonoDevelop.WebReferences/MonoDevelop.WebReferences.NodeBuilders/WebReferenceFolderNodeBuilder.cs
+++ b/main/src/addins/MonoDevelop.WebReferences/MonoDevelop.WebReferences.NodeBuilders/WebReferenceFolderNodeBuilder.cs
@@ -70,11 +70,9 @@ namespace MonoDevelop.WebReferences.NodeBuilders
treeBuilder.AddChildren (WebReferencesService.GetWebReferenceItemsWS (folder.Project));
}
- /// <summary>Compare two object with one another and returns a number based on their sort order.</summary>
- /// <returns>An integer containing the sort order for the objects.</returns>
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ public override int GetSortIndex (ITreeNavigator node)
{
- return (otherNode.DataItem is ProjectReferenceCollection) ? 1 : -1;
+ return -200;
}
}
}
diff --git a/main/src/addins/VBNetBinding/MonoDevelop.VBNet/VBNetTextEditorExtension.cs b/main/src/addins/VBNetBinding/MonoDevelop.VBNet/VBNetTextEditorExtension.cs
index 48d6b02989..192a4f2288 100644
--- a/main/src/addins/VBNetBinding/MonoDevelop.VBNet/VBNetTextEditorExtension.cs
+++ b/main/src/addins/VBNetBinding/MonoDevelop.VBNet/VBNetTextEditorExtension.cs
@@ -42,7 +42,7 @@ namespace MonoDevelop.VBNet
{
class VBNetTextEditorExtension : TextEditorExtension
{
- MonoDevelopWorkspace workspace = new MonoDevelopWorkspace ();
+ MonoDevelopWorkspace workspace = new MonoDevelopWorkspace (null);
Microsoft.CodeAnalysis.SyntaxTree parseTree;
internal static MetadataReference [] DefaultMetadataReferences;
diff --git a/main/src/addins/VBNetBinding/VBNetBinding.addin.xml b/main/src/addins/VBNetBinding/VBNetBinding.addin.xml
index 147ecfb6a2..5deea28913 100644
--- a/main/src/addins/VBNetBinding/VBNetBinding.addin.xml
+++ b/main/src/addins/VBNetBinding/VBNetBinding.addin.xml
@@ -25,7 +25,6 @@
<Extension path = "/MonoDevelop/Ide/ProjectTemplates">
<ProjectTemplate id = "MonoDevelop.VBNet.EmptyProject" resource = "EmptyVBProject.xpt.xml"/>
<ProjectTemplate id = "MonoDevelop.VBNet.ConsoleProject" resource = "VBConsoleApplicationProject.xpt.xml"/>
- <ProjectTemplate id = "MonoDevelop.VBNet.GtkSharp2Project" resource = "VBGtkSharp2Project.xpt.xml"/>
</Extension>
<Extension path = "/MonoDevelop/ProjectModel/Gui/ItemOptionPanels/Build/General">
@@ -77,5 +76,13 @@
<Extension path = "/MonoDevelop/ProjectModel/DomParser">
<Parser class = "MonoDevelop.VBNetBinding.DomParser" fileExtensions=".vb" />
</Extension>-->
-
+ <Module>
+ <!-- The GTK# template should only be available if the GTK add-in is enabled -->
+ <Dependencies>
+ <Addin id="GtkCore" version="$(Version)" />
+ </Dependencies>
+ <Extension path = "/MonoDevelop/Ide/ProjectTemplates">
+ <ProjectTemplate id = "MonoDevelop.VBNet.GtkSharp2Project" resource = "VBGtkSharp2Project.xpt.xml"/>
+ </Extension>
+ </Module>
</ExtensionModel>
diff --git a/main/src/core/MonoDevelop.Core/CoreExtensions.cs b/main/src/core/MonoDevelop.Core/CoreExtensions.cs
index 5c26e6d07a..1f83f07d6b 100644
--- a/main/src/core/MonoDevelop.Core/CoreExtensions.cs
+++ b/main/src/core/MonoDevelop.Core/CoreExtensions.cs
@@ -26,6 +26,8 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
+using System.Threading.Tasks;
+using MonoDevelop.Core;
namespace System
{
@@ -111,6 +113,19 @@ namespace System
return new Dictionary<Key, Value> ();
}
}
+
+ /// <summary>
+ /// Use this method to explicitly indicate that you don't care
+ /// about the result of an async call
+ /// </summary>
+ /// <param name="task">The task to forget</param>
+ public static void Ignore (this Task task)
+ {
+ task.ContinueWith (t => {
+ if (t.IsFaulted)
+ LoggingService.LogError ("Async operation failed", t.Exception);
+ });
+ }
}
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessConnection.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessConnection.cs
index 0c7288be1f..7ce7b5f8e4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessConnection.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessConnection.cs
@@ -4,15 +4,9 @@ using System;
using System.Threading;
using System.Net.Sockets;
using System.Net;
-using System.Diagnostics;
using System.IO;
using System.Collections.Generic;
-
-using System.Linq;
using System.Threading.Tasks;
-using System.Text;
-using MonoDevelop.Core.Assemblies;
-using System.Reflection;
namespace MonoDevelop.Core.Execution
{
@@ -20,7 +14,6 @@ namespace MonoDevelop.Core.Execution
{
bool initializationDone;
TaskCompletionSource<bool> processConnectedEvent = new TaskCompletionSource<bool> ();
- ManualResetEvent processDisconnectedEvent = new ManualResetEvent (false);
ProcessAsyncOperation process;
ConnectionStatus status;
bool disposed;
@@ -133,7 +126,7 @@ namespace MonoDevelop.Core.Execution
public void Dispose ()
{
- Disconnect (false);
+ Disconnect ().Ignore ();
}
public void AddListener (MessageListener listener)
@@ -155,34 +148,60 @@ namespace MonoDevelop.Core.Execution
}
}
+ [Obsolete ("Use Disconnect()")]
public void Disconnect (bool waitUntilDone)
{
+ if (waitUntilDone)
+ Disconnect ().Wait (TimeSpan.FromSeconds (7));
+ else
+ Disconnect ().Ignore ();
+ }
+
+ public async Task Disconnect ()
+ {
+ StopPinger ();
+
+ if (process == null)
+ return;
+
+ try {
+ // Send a stop message to try a graceful stop. Don't wait more than 2s for a response
+ var timeout = Task.Delay (2000);
+ if (await Task.WhenAny (SendMessage (new BinaryMessage ("Stop", "Process")), timeout) != timeout) {
+ // Wait for at most two seconds for the process to end
+ timeout = Task.Delay (4000);
+ if (await Task.WhenAny (process.Task, timeout) != timeout)
+ return; // All done!
+ }
+ } catch {
+ }
+
mainCancelSource.Cancel ();
mainCancelSource = new CancellationTokenSource ();
+ // The process did not gracefully stop. Kill the process.
+
try {
StopRemoteProcess ();
} catch {
// Ignore
}
- if (waitUntilDone)
- processDisconnectedEvent.WaitOne (TimeSpan.FromSeconds (7));
+ await process.Task;
}
- public Task Connect ()
+ public async Task Connect ()
{
initializationDone = false;
AbortPendingMessages ();
if (listener != null && !disposed) {
// Disconnect the current session and reconnect
- Disconnect (true);
+ await Disconnect ();
}
- return StartConnecting ();
+ await StartConnecting ();
}
Task StartConnecting ()
{
- processDisconnectedEvent.Reset ();
disposed = false;
SetStatus (ConnectionStatus.Connecting, "Connecting");
return DoConnect (mainCancelSource.Token);
@@ -225,8 +244,7 @@ namespace MonoDevelop.Core.Execution
var timeout = Task.Delay (ProcessInitializationTimeout, token).ContinueWith (t => {
if (t.IsCanceled)
return;
- if (!processConnectedEvent.Task.IsCompleted)
- processConnectedEvent.SetException (new Exception ("Could not start process"));
+ processConnectedEvent.TrySetException (new Exception ("Could not start process"));
});
await Task.WhenAny (timeout, processConnectedEvent.Task).ConfigureAwait (false);
@@ -257,7 +275,6 @@ namespace MonoDevelop.Core.Execution
token.ThrowIfCancellationRequested ();
StopRemoteProcess ();
SetStatus (ConnectionStatus.ConnectionFailed, ex.Message, ex);
- processDisconnectedEvent.Set ();
}
Task StartRemoteProcess ()
@@ -275,7 +292,6 @@ namespace MonoDevelop.Core.Execution
{
if (!stopping)
AbortConnection (isAsync: true);
- processDisconnectedEvent.Set ();
}
public async Task<RT> SendMessage<RT> (BinaryMessage<RT> message) where RT:BinaryMessage
@@ -395,7 +411,7 @@ namespace MonoDevelop.Core.Execution
void AbortConnection (string message = null, bool isAsync = false)
{
if (message == null)
- message = "Disconnected from layout renderer";
+ message = "Disconnected from remote process";
AbortPendingMessages ();
disposed = true;
processConnectedEvent.TrySetResult (true);
@@ -415,17 +431,22 @@ namespace MonoDevelop.Core.Execution
}
}
+ void StopPinger ()
+ {
+ if (pinger != null) {
+ pinger.Dispose ();
+ pinger = null;
+ }
+ }
+
void StopRemoteProcess (bool isAsync = false)
{
if (process != null)
stopping = true;
AbortConnection (isAsync: isAsync);
+ StopPinger ();
- if (pinger != null) {
- pinger.Dispose ();
- pinger = null;
- }
if (listener != null) {
listener.Stop ();
listener = null;
@@ -473,7 +494,7 @@ namespace MonoDevelop.Core.Execution
try {
int nr = await connectionStream.ReadAsync (buffer, 0, 1, mainCancelSource.Token).ConfigureAwait (false);
if (nr == 0) {
- StopRemoteProcess (isAsync: true);
+ // Connection closed. Remote process should die by itself.
return;
}
type = buffer [0];
@@ -483,7 +504,7 @@ namespace MonoDevelop.Core.Execution
return;
LoggingService.LogError ("ReadMessage failed", ex);
StopRemoteProcess (isAsync: true);
- PostSetStatus (ConnectionStatus.ConnectionFailed, "Connection to layout renderer failed.");
+ PostSetStatus (ConnectionStatus.ConnectionFailed, "Connection to remote process failed.");
return;
}
@@ -499,7 +520,7 @@ namespace MonoDevelop.Core.Execution
lock (pendingMessageTasks) {
pendingMessageTasks.Remove (ta);
}
- });
+ }).Ignore ();
pendingMessageTasks.Add (t);
}
}
@@ -577,7 +598,7 @@ namespace MonoDevelop.Core.Execution
LogMessage (MessageType.Message, msg);
if (msg.Name == "Connect") {
- processConnectedEvent.SetResult (true);
+ processConnectedEvent.TrySetResult (true);
return;
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessServer.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessServer.cs
index 5a4425ef76..0cbc8a6d82 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessServer.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Execution/RemoteProcessServer.cs
@@ -39,6 +39,7 @@ namespace MonoDevelop.Core.Execution
Stream outStream;
Stream inStream;
string messages = "";
+ bool shuttingDown;
Dictionary<string, MessageListenerHandler> listeners = new Dictionary<string, MessageListenerHandler> ();
Dictionary<string, Type> messageTypes = new Dictionary<string, Type> ();
@@ -104,6 +105,17 @@ namespace MonoDevelop.Core.Execution
return messages;
}
+ public void Shutdown ()
+ {
+ try {
+ shuttingDown = true;
+ inStream.Close ();
+ socket.Close ();
+ } catch {
+ // Ignore
+ }
+ }
+
void Start ()
{
var t = new Thread (Run);
@@ -148,7 +160,7 @@ namespace MonoDevelop.Core.Execution
{
List<BinaryMessage> messages = new List<BinaryMessage> ();
- while (true) {
+ while (!shuttingDown) {
BinaryMessage msg;
int type;
try {
@@ -173,6 +185,14 @@ namespace MonoDevelop.Core.Execution
}
break;
}
+ if (msg.Name == "Ping" && msg.Target == "Process") {
+ try {
+ WriteMessage (0, msg.CreateResponse ());
+ } catch {
+ // Ignore
+ }
+ continue;
+ }
messages.Add (msg);
if (type == MESSAGE_QUEUE_END) {
ProcessMessages (messages);
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
index a850d30fe4..cb01d3352c 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.csproj
@@ -688,6 +688,20 @@
<Compile Include="MonoDevelop.Core\StructEqualityComparer.cs" />
<Compile Include="MonoDevelop.Projects\SimpleExpressionEvaluator.cs" />
<Compile Include="MonoDevelop.Projects\PackageDependency.cs" />
+ <Compile Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.MSBuild.Shared\RemoteBuildEngineMessages.cs">
+ <Link>MonoDevelop.Projects.MSBuild\RemoteBuildEngineMessages.cs</Link>
+ </Compile>
+ <Compile Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.MSBuild.Shared\MSBuildEvaluatedItem.cs">
+ <Link>MonoDevelop.Projects.MSBuild\MSBuildEvaluatedItem.cs</Link>
+ </Compile>
+ <Compile Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.MSBuild.Shared\MSBuildResult.cs">
+ <Link>MonoDevelop.Projects.MSBuild\MSBuildResult.cs</Link>
+ </Compile>
+ <Compile Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.MSBuild.Shared\MSBuildTargetResult.cs">
+ <Link>MonoDevelop.Projects.MSBuild\MSBuildTargetResult.cs</Link>
+ </Compile>
+ <Compile Include="MonoDevelop.Projects.MSBuild\MSBuildEvent.cs" />
+ <Compile Include="MonoDevelop.Projects\MSBuildLogger.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Makefile.am" />
@@ -734,11 +748,6 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
- <ProjectReference Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.Formats.MSBuild.csproj">
- <Project>{A437F1A3-78DF-4F00-8053-D32A8B1EB679}</Project>
- <Name>MonoDevelop.Projects.Formats.MSBuild</Name>
- <Private>False</Private>
- </ProjectReference>
<ProjectReference Include="..\..\..\external\cecil\Mono.Cecil.csproj">
<Project>{D68133BD-1E63-496E-9EDE-4FBDBF77B486}</Project>
<Name>Mono.Cecil</Name>
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/IconId.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/IconId.cs
index 16194d7df3..4a1a847820 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core/IconId.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core/IconId.cs
@@ -34,8 +34,6 @@ namespace MonoDevelop.Core
readonly string id;
public static readonly IconId Null = new IconId (null);
-
- public static IconNameRequestHandler IconNameRequestHandler;
public IconId (string id)
{
@@ -48,10 +46,6 @@ namespace MonoDevelop.Core
public string Name {
get {
- // If the icon is converted to string, fire the icon request event, to ensure that
- // the icon it represents is loaded.
- if (IconNameRequestHandler != null)
- IconNameRequestHandler (id);
return id;
}
}
@@ -112,7 +106,5 @@ namespace MonoDevelop.Core
return this.id == other.id;
}
}
-
- public delegate void IconNameRequestHandler (string id);
}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildEvaluatedItem.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvent.cs
index 6e2d31916f..ac21ab58a7 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildEvaluatedItem.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvent.cs
@@ -1,10 +1,10 @@
-//
-// MSBuildEvaluatedItem.cs
+//
+// MSBuildEvent.cs
//
// Author:
-// Michael Hutchinson <m.j.hutchinson@gmail.com>
+// Lluis Sanchez Gual <lluis@xamarin.com>
//
-// Copyright (c) 2014 Xamarin Inc.
+// Copyright (c) 2017 Xamarin, Inc (http://www.xamarin.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@@ -23,25 +23,25 @@
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
-
using System;
-using System.Collections.Generic;
-
namespace MonoDevelop.Projects.MSBuild
{
-
- [Serializable]
- public class MSBuildEvaluatedItem
+ [Flags]
+ public enum MSBuildEvent
{
- public MSBuildEvaluatedItem (string name, string itemSpec)
- {
- Name = name;
- ItemSpec = itemSpec;
- Metadata = new Dictionary<string, string> ();
- }
-
- public Dictionary<string,string> Metadata { get; private set; }
- public string ItemSpec { get; private set; }
- public string Name { get; private set; }
+ None = 0,
+ BuildStarted = 1 << 0,
+ BuildFinished = 1 << 1,
+ ProjectStarted = 1 << 2,
+ ProjectFinished = 1 << 3,
+ TargetStarted = 1 << 4,
+ TargetFinished = 1 << 5,
+ TaskStarted = 1 << 6,
+ TaskFinished = 1 << 7,
+ ErrorRaised = 1 << 8,
+ WarningRaised = 1 << 9,
+ MessageRaised = 1 << 10,
+ CustomEventRaised = 1 << 11,
+ All = 0xffff
}
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
index 42cc448440..316392552e 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
@@ -43,6 +43,7 @@ using Cecil = Mono.Cecil;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
+using MonoDevelop.Core.Execution;
namespace MonoDevelop.Projects.MSBuild
{
@@ -169,7 +170,7 @@ namespace MonoDevelop.Projects.MSBuild
using (await buildersLock.EnterAsync ()) {
var gpp = (IMSBuildGlobalPropertyProvider)sender;
foreach (var builder in builders.GetAllBuilders ())
- builder.SetGlobalProperties (gpp.GetGlobalProperties ());
+ await builder.SetGlobalProperties (new Dictionary<string,string> (gpp.GetGlobalProperties ()));
}
}
@@ -909,8 +910,6 @@ namespace MonoDevelop.Projects.MSBuild
return true;
}
- static bool runLocal = false;
-
static string GetNewestInstalledToolsVersion (TargetRuntime runtime, bool requiresMicrosoftBuild, out string binDir)
{
string [] supportedToolsVersions;
@@ -965,75 +964,41 @@ namespace MonoDevelop.Projects.MSBuild
if (builder != null) {
builder.ReferenceCount++;
- return new RemoteProjectBuilder (file, builder);
+ var pb = new RemoteProjectBuilder (file, builder);
+ await pb.Load ();
+ return pb;
}
return await Task.Run (async () => {
//always start the remote process explicitly, even if it's using the current runtime and fx
//else it won't pick up the assembly redirects from the builder exe
var exe = GetExeLocation (runtime, toolsVersion, requiresMicrosoftBuild);
-
- MonoDevelop.Core.Execution.RemotingService.RegisterRemotingChannel ();
- var pinfo = new ProcessStartInfo (exe) {
- WorkingDirectory = binDir,
- UseShellExecute = false,
- CreateNoWindow = true,
- RedirectStandardError = true,
- RedirectStandardInput = true,
- };
- runtime.GetToolsExecutionEnvironment ().MergeTo (pinfo);
-
- Process p = null;
+ RemoteProcessConnection connection = null;
try {
- IBuildEngine engine;
- if (!runLocal) {
- p = runtime.ExecuteAssembly (pinfo);
-
- // The builder app will write the build engine reference
- // after reading the process id from the standard input
- var processStartedSignal = new TaskCompletionSource<bool> ();
- string responseKey = "[MonoDevelop]";
- string sref = null;
- p.ErrorDataReceived += (sender, e) => {
- if (e.Data == null) {
- if (string.IsNullOrEmpty (sref))
- LoggingService.LogError ("The MSBuild builder exited before initializing");
- return;
- }
-
- if (e.Data.StartsWith (responseKey, StringComparison.Ordinal)) {
- sref = e.Data.Substring (responseKey.Length);
- processStartedSignal.SetResult (true);
- } else
- Console.WriteLine (e.Data);
- };
- p.BeginErrorReadLine ();
-
- p.StandardInput.WriteLine (binDir);
-
- p.StandardInput.WriteLine (Process.GetCurrentProcess ().Id.ToString ());
- if (await Task.WhenAny (processStartedSignal.Task, Task.Delay (5000)) != processStartedSignal.Task)
- throw new Exception ("MSBuild process could not be started");
-
- byte [] data = Convert.FromBase64String (sref);
- MemoryStream ms = new MemoryStream (data);
- BinaryFormatter bf = new BinaryFormatter ();
- engine = (IBuildEngine)bf.Deserialize (ms);
- } else {
- var asm = System.Reflection.Assembly.LoadFrom (exe);
- var t = asm.GetType ("MonoDevelop.Projects.MSBuild.BuildEngine");
- engine = (IBuildEngine)Activator.CreateInstance (t);
+
+ connection = new RemoteProcessConnection (exe, runtime.GetExecutionHandler ());
+ await connection.Connect ();
+
+ var props = GetCoreGlobalProperties (solutionFile);
+ foreach (var gpp in globalPropertyProviders) {
+ foreach (var e in gpp.GetGlobalProperties ())
+ props [e.Key] = e.Value;
}
- engine.SetCulture (GettextCatalog.UICulture);
- engine.SetGlobalProperties (GetCoreGlobalProperties (solutionFile));
- foreach (var gpp in globalPropertyProviders)
- engine.SetGlobalProperties (gpp.GetGlobalProperties ());
- builder = new RemoteBuildEngine (p, engine);
+
+ await connection.SendMessage (new InitializeRequest {
+ IdeProcessId = Process.GetCurrentProcess ().Id,
+ BinDir = binDir,
+ CultureName = GettextCatalog.UICulture.Name,
+ GlobalProperties = props
+ });
+
+ builder = new RemoteBuildEngine (connection);
+
} catch {
- if (p != null) {
+ if (connection != null) {
try {
- p.Kill ();
+ connection.Dispose ();
} catch {
}
}
@@ -1048,12 +1013,14 @@ namespace MonoDevelop.Projects.MSBuild
};
if (lockBuilder)
builder.Lock ();
- return new RemoteProjectBuilder (file, builder);
+ var pb = new RemoteProjectBuilder (file, builder);
+ await pb.Load ();
+ return pb;
});
}
}
- static IDictionary<string,string> GetCoreGlobalProperties (string slnFile)
+ static Dictionary<string,string> GetCoreGlobalProperties (string slnFile)
{
var dictionary = new Dictionary<string,string> ();
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/RemoteProjectBuilder.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/RemoteProjectBuilder.cs
index 6694a77f1d..dce9df56a6 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/RemoteProjectBuilder.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/RemoteProjectBuilder.cs
@@ -34,27 +34,28 @@ using MonoDevelop.Core;
using System.IO;
using System.Linq;
using MonoDevelop.Projects.MSBuild;
+using MonoDevelop.Core.Execution;
namespace MonoDevelop.Projects.MSBuild
{
- class RemoteBuildEngine: IBuildEngine
+ class RemoteBuildEngine
{
- IBuildEngine engine;
- Process proc;
+ RemoteProcessConnection connection;
bool alive = true;
static int count;
int busy;
+ static int loggerIdCounter;
+ Dictionary<int, LoggerInfo> loggers = new Dictionary<int, LoggerInfo> ();
+
public int ReferenceCount { get; set; }
public DateTime ReleaseTime { get; set; }
- public SemaphoreSlim Semaphore { get; } = new SemaphoreSlim (1, 1);
-
- public RemoteBuildEngine (Process proc, IBuildEngine engine)
- {
- this.proc = proc;
- this.engine = engine;
+ public RemoteBuildEngine (RemoteProcessConnection connection)
+ {
+ this.connection = connection;
Interlocked.Increment (ref count);
+ connection.AddListener (this);
}
public event EventHandler Disconnected;
@@ -65,68 +66,59 @@ namespace MonoDevelop.Projects.MSBuild
}
}
- public IProjectBuilder LoadProject (string projectFile)
+ public async Task<ProjectBuilder> LoadProject (string projectFile)
{
try {
- return engine.LoadProject (projectFile);
+ var pid = (await connection.SendMessage (new LoadProjectRequest { ProjectFile = projectFile})).ProjectId;
+ return new ProjectBuilder (connection, pid);
} catch {
- CheckDisconnected ();
+ await CheckDisconnected ();
throw;
}
}
- public void UnloadProject (IProjectBuilder pb)
+ public async Task UnloadProject (ProjectBuilder builder)
{
try {
- engine.UnloadProject (pb);
+ await connection.SendMessage (new UnloadProjectRequest { ProjectId = ((ProjectBuilder)builder).ProjectId});
} catch (Exception ex) {
LoggingService.LogError ("Project unloading failed", ex);
- if (!CheckDisconnected ())
+ if (!await CheckDisconnected ())
throw;
}
}
- public void CancelTask (int taskId)
- {
- try {
- engine.CancelTask (taskId);
- } catch {
- CheckDisconnected ();
- throw;
- }
- }
-
- public void SetCulture (CultureInfo uiCulture)
+ public async Task CancelTask (int taskId)
{
try {
- engine.SetCulture (uiCulture);
+ await connection.SendMessage (new CancelTaskRequest { TaskId = taskId });
} catch {
- CheckDisconnected ();
+ await CheckDisconnected ();
throw;
}
}
- public void SetGlobalProperties (IDictionary<string, string> properties)
+ public async Task SetGlobalProperties (Dictionary<string, string> properties)
{
try {
- engine.SetGlobalProperties (properties);
+ await connection.SendMessage (new SetGlobalPropertiesRequest { Properties = properties });
} catch {
- CheckDisconnected ();
+ await CheckDisconnected ();
throw;
}
}
- void IBuildEngine.Ping ()
+ public async Task Ping ()
{
- engine.Ping ();
+ await connection.SendMessage (new PingRequest ());
}
- bool CheckAlive ()
+ async Task<bool> CheckAlive ()
{
if (!alive)
return false;
try {
- engine.Ping ();
+ await Ping ();
return true;
} catch {
alive = false;
@@ -134,9 +126,9 @@ namespace MonoDevelop.Projects.MSBuild
}
}
- internal bool CheckDisconnected ()
+ internal async Task<bool> CheckDisconnected ()
{
- if (!CheckAlive ()) {
+ if (!await CheckAlive ()) {
if (Disconnected != null)
Disconnected (this, EventArgs.Empty);
return true;
@@ -149,19 +141,50 @@ namespace MonoDevelop.Projects.MSBuild
Interlocked.Decrement (ref count);
try {
alive = false;
- if (proc != null) {
- try {
- proc.Kill ();
- } catch {
- }
- }
- else
- engine.Dispose ();
+ connection.Disconnect ().Ignore ();
} catch {
// Ignore
}
}
+ [MessageHandler]
+ void OnLogMessage (LogMessage msg)
+ {
+ LoggerInfo logger = null;
+ lock (loggers) {
+ if (!loggers.TryGetValue (msg.LoggerId, out logger))
+ return;
+ }
+ if (msg.LogText != null)
+ logger.Writer.Write (msg.LogText);
+ if (msg.Events != null && logger.Logger != null) {
+ foreach (var e in msg.Events)
+ logger.Logger.NotifyEvent (e);
+ }
+ }
+
+ class LoggerInfo
+ {
+ public TextWriter Writer;
+ public MSBuildLogger Logger;
+ }
+
+ public int RegisterLogger (TextWriter writer, MSBuildLogger logger)
+ {
+ lock (loggers) {
+ var i = loggerIdCounter++;
+ loggers [i] = new LoggerInfo { Writer = writer, Logger = logger };
+ return i;
+ }
+ }
+
+ public void UnregisterLogger (int id)
+ {
+ lock (loggers) {
+ loggers.Remove (id);
+ }
+ }
+
public bool Lock ()
{
return Interlocked.Increment (ref busy) == 1;
@@ -178,11 +201,61 @@ namespace MonoDevelop.Projects.MSBuild
}
}
}
-
- public class RemoteProjectBuilder: IDisposable
+
+ class ProjectBuilder
+ {
+ public int ProjectId;
+ RemoteProcessConnection connection;
+
+ public ProjectBuilder (RemoteProcessConnection connection, int projectId)
+ {
+ this.connection = connection;
+ this.ProjectId = projectId;
+ }
+
+ public void Dispose ()
+ {
+ connection.SendMessage (new DisposeProjectRequest { ProjectId = ProjectId });
+ }
+
+ public Task Refresh ()
+ {
+ return connection.SendMessage (new RefreshProjectRequest { ProjectId = ProjectId });
+ }
+
+ public Task RefreshWithContent (string projectContent)
+ {
+ return connection.SendMessage (new RefreshWithContentRequest { ProjectId = ProjectId, Content = projectContent });
+ }
+
+ public async Task<MSBuildResult> Run (ProjectConfigurationInfo [] configurations, int loggerId, MSBuildEvent enabledLogEvents, MSBuildVerbosity verbosity, string [] runTargets, string [] evaluateItems, string [] evaluateProperties, Dictionary<string, string> globalProperties, int taskId)
+ {
+ var msg = new RunProjectRequest {
+ ProjectId = ProjectId,
+ Configurations = configurations,
+ LogWriterId = loggerId,
+ EnabledLogEvents = enabledLogEvents,
+ Verbosity = verbosity,
+ RunTargets = runTargets,
+ EvaluateItems = evaluateItems,
+ EvaluateProperties = evaluateProperties,
+ GlobalProperties = globalProperties,
+ TaskId = taskId
+ };
+
+ var res = await connection.SendMessage (msg);
+
+ // Make sure we get all log messages
+ await connection.ProcessPendingMessages ();
+
+ return res.Result;
+ }
+ }
+
+ class RemoteProjectBuilder: IDisposable
{
RemoteBuildEngine engine;
- IProjectBuilder builder;
+ ProjectBuilder builder;
Dictionary<string,AssemblyReference[]> referenceCache;
AsyncCriticalSection referenceCacheLock = new AsyncCriticalSection ();
Dictionary<string, PackageDependency[]> packageDependenciesCache;
@@ -194,16 +267,20 @@ namespace MonoDevelop.Projects.MSBuild
{
this.file = file;
this.engine = engine;
- builder = engine.LoadProject (file);
referenceCache = new Dictionary<string, AssemblyReference[]> ();
packageDependenciesCache = new Dictionary<string, PackageDependency[]> ();
}
+ internal async Task Load ()
+ {
+ builder = await engine.LoadProject (file).ConfigureAwait (false);
+ }
+
public event EventHandler Disconnected;
- void CheckDisconnected ()
+ async Task CheckDisconnected ()
{
- if (engine != null && engine.CheckDisconnected ()) {
+ if (engine != null && await engine.CheckDisconnected ().ConfigureAwait (false)) {
if (Disconnected != null)
Disconnected (this, EventArgs.Empty);
}
@@ -211,10 +288,10 @@ namespace MonoDevelop.Projects.MSBuild
IDisposable RegisterCancellation (CancellationToken cancellationToken, int taskId)
{
- return cancellationToken.Register (() => {
+ return cancellationToken.Register (async () => {
try {
BeginOperation ();
- engine.CancelTask (taskId);
+ await engine.CancelTask (taskId);
} catch (Exception ex) {
// Ignore
LoggingService.LogError ("CancelTask failed", ex);
@@ -224,9 +301,10 @@ namespace MonoDevelop.Projects.MSBuild
});
}
- public Task<MSBuildResult> Run (
+ public async Task<MSBuildResult> Run (
ProjectConfigurationInfo[] configurations,
- ILogWriter logWriter,
+ TextWriter logWriter,
+ MSBuildLogger logger,
MSBuildVerbosity verbosity,
string[] runTargets,
string[] evaluateItems,
@@ -238,33 +316,29 @@ namespace MonoDevelop.Projects.MSBuild
// Get an id for the task, and get ready to cancel it if the cancellation token is signalled
var taskId = Interlocked.Increment (ref lastTaskId);
var cr = RegisterCancellation (cancellationToken, taskId);
+ var loggerId = engine.RegisterLogger (logWriter, logger);
- var t = Task.Run (() => {
- try {
- BeginOperation ();
- var res = builder.Run (configurations, logWriter, verbosity, runTargets, evaluateItems, evaluateProperties, globalProperties, taskId);
- if (res == null && cancellationToken.IsCancellationRequested) {
- MSBuildTargetResult err = new MSBuildTargetResult (file, false, "", "", file, 1, 1, 1, 1, "Build cancelled", "");
- return new MSBuildResult (new [] { err });
- }
- if (res == null)
- throw new Exception ("Unknown failure");
- return res;
- } catch (Exception ex) {
- CheckDisconnected ();
- LoggingService.LogError ("RunTarget failed", ex);
- MSBuildTargetResult err = new MSBuildTargetResult (file, false, "", "", file, 1, 1, 1, 1, "Unknown MSBuild failure. Please try building the project again", "");
- MSBuildResult res = new MSBuildResult (new [] { err });
- return res;
- } finally {
- EndOperation ();
+ try {
+ BeginOperation ();
+ var res = await builder.Run (configurations, loggerId, logger.EnabledEvents, verbosity, runTargets, evaluateItems, evaluateProperties, globalProperties, taskId).ConfigureAwait (false);
+ if (res == null && cancellationToken.IsCancellationRequested) {
+ MSBuildTargetResult err = new MSBuildTargetResult (file, false, "", "", file, 1, 1, 1, 1, "Build cancelled", "");
+ return new MSBuildResult (new [] { err });
}
- });
-
- // Dispose the cancel registration
- t.ContinueWith (r => cr.Dispose ());
-
- return t;
+ if (res == null)
+ throw new Exception ("Unknown failure");
+ return res;
+ } catch (Exception ex) {
+ await CheckDisconnected ();
+ LoggingService.LogError ("RunTarget failed", ex);
+ MSBuildTargetResult err = new MSBuildTargetResult (file, false, "", "", file, 1, 1, 1, 1, "Unknown MSBuild failure. Please try building the project again", "");
+ MSBuildResult res = new MSBuildResult (new [] { err });
+ return res;
+ } finally {
+ engine.UnregisterLogger (loggerId);
+ EndOperation ();
+ cr.Dispose ();
+ }
}
public async Task<AssemblyReference[]> ResolveAssemblyReferences (ProjectConfigurationInfo[] configurations, CancellationToken cancellationToken)
@@ -272,61 +346,40 @@ namespace MonoDevelop.Projects.MSBuild
AssemblyReference[] refs = null;
var id = configurations [0].Configuration + "|" + configurations [0].Platform;
- using (await referenceCacheLock.EnterAsync ()) {
+ using (await referenceCacheLock.EnterAsync ().ConfigureAwait (false)) {
// Check the cache before starting the task
if (referenceCache.TryGetValue (id, out refs))
return refs;
- }
- // Get an id for the task, it will be used later on to cancel the task if necessary
- var taskId = Interlocked.Increment (ref lastTaskId);
- IDisposable cr = null;
-
- refs = await Task.Run (async () => {
- using (await referenceCacheLock.EnterAsync ()) {
- // Check again the cache, maybe the value was set while the task was starting
- if (referenceCache.TryGetValue (id, out refs))
- return refs;
-
- // Get ready to cancel the task if the cancellation token is signalled
- cr = RegisterCancellation (cancellationToken, taskId);
-
- MSBuildResult result;
- bool locked = false;
- try {
- BeginOperation ();
- locked = await engine.Semaphore.WaitAsync (Timeout.Infinite, cancellationToken).ConfigureAwait (false);
- // FIXME: This lock should not be necessary, but remoting seems to have problems when doing many concurrent calls.
- result = builder.Run (
- configurations, null, MSBuildVerbosity.Normal,
- new [] { "ResolveAssemblyReferences" }, new [] { "ReferencePath" }, null, null, taskId
- );
- } catch (Exception ex) {
- CheckDisconnected ();
- LoggingService.LogError ("ResolveAssemblyReferences failed", ex);
- return new AssemblyReference [0];
- } finally {
- if (locked)
- engine.Semaphore.Release ();
- EndOperation ();
- }
-
- List<MSBuildEvaluatedItem> items;
- if (result.Items.TryGetValue ("ReferencePath", out items) && items != null) {
- string aliases;
- refs = items.Select (i => new AssemblyReference (i.ItemSpec, i.Metadata.TryGetValue ("Aliases", out aliases) ? aliases : "")).ToArray ();
- } else
- refs = new AssemblyReference [0];
-
- referenceCache [id] = refs;
+ // Get an id for the task, it will be used later on to cancel the task if necessary
+ var taskId = Interlocked.Increment (ref lastTaskId);
+ IDisposable cr = RegisterCancellation (cancellationToken, taskId);
+
+ MSBuildResult result;
+ try {
+ BeginOperation ();
+ result = await builder.Run (
+ configurations, -1, MSBuildEvent.None, MSBuildVerbosity.Quiet,
+ new [] { "ResolveAssemblyReferences" }, new [] { "ReferencePath" }, null, null, taskId
+ );
+ } catch (Exception ex) {
+ await CheckDisconnected ();
+ LoggingService.LogError ("ResolveAssemblyReferences failed", ex);
+ return new AssemblyReference [0];
+ } finally {
+ cr.Dispose ();
+ EndOperation ();
}
- return refs;
- });
- // Dispose the cancel registration
- if (cr != null)
- cr.Dispose ();
-
+ MSBuildEvaluatedItem[] items;
+ if (result.Items.TryGetValue ("ReferencePath", out items) && items != null) {
+ string aliases;
+ refs = items.Select (i => new AssemblyReference (i.ItemSpec, i.Metadata.TryGetValue ("Aliases", out aliases) ? aliases : "")).ToArray ();
+ } else
+ refs = new AssemblyReference [0];
+
+ referenceCache [id] = refs;
+ }
return refs;
}
@@ -335,64 +388,44 @@ namespace MonoDevelop.Projects.MSBuild
PackageDependency[] packageDependencies = null;
var id = configurations [0].Configuration + "|" + configurations [0].Platform;
- using (await packageDependenciesCacheLock.EnterAsync ()) {
+ using (await packageDependenciesCacheLock.EnterAsync ().ConfigureAwait (false)) {
// Check the cache before starting the task
if (packageDependenciesCache.TryGetValue (id, out packageDependencies))
return packageDependencies;
- }
- // Get an id for the task, it willf be used later on to cancel the task if necessary
- var taskId = Interlocked.Increment (ref lastTaskId);
- IDisposable cr = null;
-
- packageDependencies = await Task.Run (async () => {
- using (await packageDependenciesCacheLock.EnterAsync ()) {
- // Check again the cache, maybe the value was set while the task was starting
- if (packageDependenciesCache.TryGetValue (id, out packageDependencies))
- return packageDependencies;
-
- // Get ready to cancel the task if the cancellation token is signalled
- cr = RegisterCancellation (cancellationToken, taskId);
-
- MSBuildResult result;
- bool locked = false;
- try {
- BeginOperation ();
- locked = await engine.Semaphore.WaitAsync (Timeout.Infinite, cancellationToken).ConfigureAwait (false);
- // FIXME: This lock should not be necessary, but remoting seems to have problems when doing many concurrent calls.
- result = builder.Run (
- configurations, null, MSBuildVerbosity.Normal,
- new [] { "ResolvePackageDependenciesDesignTime" }, new [] { "_DependenciesDesignTime" }, null, null, taskId
- );
- } catch (Exception ex) {
- CheckDisconnected ();
- LoggingService.LogError ("ResolvePackageDependencies failed", ex);
- return new PackageDependency [0];
- } finally {
- if (locked)
- engine.Semaphore.Release ();
- EndOperation ();
- }
-
- List<MSBuildEvaluatedItem> items;
- if (result == null)
- return new PackageDependency[0];
- else if (result.Items.TryGetValue ("_DependenciesDesignTime", out items) && items != null) {
- packageDependencies = items
- .Select (i => PackageDependency.Create (i))
- .Where (dependency => dependency != null)
- .ToArray ();
- } else
- packageDependencies = new PackageDependency [0];
-
- packageDependenciesCache [id] = packageDependencies;
+ // Get an id for the task, it will be used later on to cancel the task if necessary
+ var taskId = Interlocked.Increment (ref lastTaskId);
+ IDisposable cr = RegisterCancellation (cancellationToken, taskId);
+
+ MSBuildResult result;
+ try {
+ BeginOperation ();
+ result = await builder.Run (
+ configurations, -1, MSBuildEvent.None, MSBuildVerbosity.Quiet,
+ new [] { "ResolvePackageDependenciesDesignTime" }, new [] { "_DependenciesDesignTime" }, null, null, taskId
+ );
+ } catch (Exception ex) {
+ await CheckDisconnected ();
+ LoggingService.LogError ("ResolvePackageDependencies failed", ex);
+ return new PackageDependency [0];
+ } finally {
+ cr.Dispose ();
+ EndOperation ();
}
- return packageDependencies;
- });
- // Dispose the cancel registration
- if (cr != null)
- cr.Dispose ();
+ MSBuildEvaluatedItem[] items;
+ if (result == null)
+ return new PackageDependency[0];
+ else if (result.Items.TryGetValue ("_DependenciesDesignTime", out items) && items != null) {
+ packageDependencies = items
+ .Select (i => PackageDependency.Create (i))
+ .Where (dependency => dependency != null)
+ .ToArray ();
+ } else
+ packageDependencies = new PackageDependency [0];
+
+ packageDependenciesCache [id] = packageDependencies;
+ }
return packageDependencies;
}
@@ -400,49 +433,48 @@ namespace MonoDevelop.Projects.MSBuild
public async Task Refresh ()
{
- using (await referenceCacheLock.EnterAsync ())
+ using (await referenceCacheLock.EnterAsync ().ConfigureAwait (false))
referenceCache.Clear ();
- using (await packageDependenciesCacheLock.EnterAsync ())
+ using (await packageDependenciesCacheLock.EnterAsync ().ConfigureAwait (false))
packageDependenciesCache.Clear ();
- await Task.Run (() => {
- try {
- BeginOperation ();
- builder.Refresh ();
- } catch (Exception ex) {
- LoggingService.LogError ("MSBuild refresh failed", ex);
- CheckDisconnected ();
- } finally {
- EndOperation ();
- }
- });
+ try {
+ BeginOperation ();
+ await builder.Refresh ();
+ } catch (Exception ex) {
+ LoggingService.LogError ("MSBuild refresh failed", ex);
+ await CheckDisconnected ();
+ } finally {
+ EndOperation ();
+ }
}
public async Task RefreshWithContent (string projectContent)
{
- using (await referenceCacheLock.EnterAsync ())
+ using (await referenceCacheLock.EnterAsync ().ConfigureAwait (false))
referenceCache.Clear ();
- await Task.Run (() => {
- try {
- BeginOperation ();
- builder.RefreshWithContent (projectContent);
- } catch (Exception ex) {
- LoggingService.LogError ("MSBuild refresh failed", ex);
- CheckDisconnected ();
- } finally {
- EndOperation ();
- }
- });
+ using (await packageDependenciesCacheLock.EnterAsync ().ConfigureAwait (false))
+ packageDependenciesCache.Clear ();
+
+ try {
+ BeginOperation ();
+ await builder.RefreshWithContent (projectContent);
+ } catch (Exception ex) {
+ LoggingService.LogError ("MSBuild refresh failed", ex);
+ await CheckDisconnected ();
+ } finally {
+ EndOperation ();
+ }
}
- public void Dispose ()
+ public async void Dispose ()
{
if (!MSBuildProjectService.ShutDown && engine != null) {
try {
if (builder != null)
- engine.UnloadProject (builder);
+ await engine.UnloadProject (builder).ConfigureAwait (false);
MSBuildProjectService.ReleaseProjectBuilder (engine);
} catch {
// Ignore
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ChainedExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ChainedExtension.cs
index fdd3d70305..4d0a6f46fc 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ChainedExtension.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ChainedExtension.cs
@@ -68,11 +68,13 @@ namespace MonoDevelop.Projects
if (tm.DeclaringType != type)
return next;
}
- }
-
+ }
+
// Serializable fields and properties
- if (next.GetType ().GetMembers (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Any (m => m.IsDefined (typeof(MonoDevelop.Core.Serialization.ItemPropertyAttribute))))
- return next;
+ foreach (var m in next.GetType ().GetMembers (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) {
+ if (m.IsDefined (typeof (MonoDevelop.Core.Serialization.ItemPropertyAttribute)))
+ return next;
+ }
return FindNextImplementation (type, next.nextInChain);
}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MSBuildLogger.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MSBuildLogger.cs
new file mode 100644
index 0000000000..e68eb41a65
--- /dev/null
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MSBuildLogger.cs
@@ -0,0 +1,87 @@
+//
+// MSBuildLogger.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@xamarin.com>
+//
+// Copyright (c) 2017 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using MonoDevelop.Projects.MSBuild;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace MonoDevelop.Projects
+{
+ public class MSBuildLogger
+ {
+ public MSBuildLogger ()
+ {
+ }
+
+ internal void NotifyEvent (LogEvent e)
+ {
+ OnEventRaised (new MSBuildLoggerEventArgs { Event = e.Event, Message = e.Message });
+ }
+
+ internal void NotifyEvent (MSBuildLoggerEventArgs args)
+ {
+ OnEventRaised (args);
+ }
+
+ public MSBuildEvent EnabledEvents { get; set; }
+
+ protected virtual void OnEventRaised (MSBuildLoggerEventArgs args)
+ {
+ EventRaised?.Invoke (this, args);
+ }
+
+ public event EventHandler<MSBuildLoggerEventArgs> EventRaised;
+ }
+
+ public class MSBuildLoggerEventArgs: EventArgs
+ {
+ public Project Project { get; set; }
+ public MSBuildEvent Event { get; set; }
+ public string Message { get; set; }
+ }
+
+ class ProxyLogger: MSBuildLogger
+ {
+ IEnumerable<MSBuildLogger> loggers;
+ Project project;
+
+ public ProxyLogger (Project project, IEnumerable<MSBuildLogger> loggers)
+ {
+ this.project = project;
+ this.loggers = loggers;
+ foreach (var lo in loggers)
+ EnabledEvents |= lo.EnabledEvents;
+ }
+
+ protected override void OnEventRaised (MSBuildLoggerEventArgs args)
+ {
+ args.Project = project;
+ foreach (var lo in loggers)
+ if ((lo.EnabledEvents & args.Event) != 0)
+ lo.NotifyEvent (args);
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MonoExecutionParameters.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MonoExecutionParameters.cs
index ed1f838aa1..5d2ca2cf0b 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MonoExecutionParameters.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/MonoExecutionParameters.cs
@@ -202,6 +202,8 @@ namespace MonoDevelop.Projects
else if ((val is string) && !string.IsNullOrEmpty ((string)val))
ops.AppendFormat (argAttr.Name, val).Append (' ');
}
+ if (ops.Length > 0)
+ ops.Remove (ops.Length - 1, 1);
foreach (var kvp in envVarAttributes) {
var prop = kvp.Key;
@@ -213,7 +215,7 @@ namespace MonoDevelop.Projects
else if ((val is string) && !string.IsNullOrEmpty ((string)val))
envVars [envVar.Name] = val.ToString ();
}
- options = ops.ToString ().Trim ();
+ options = ops.ToString ();
}
object GetValue (object val)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
index aced3fc93b..3d523c2893 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
@@ -1141,7 +1141,6 @@ namespace MonoDevelop.Projects
async Task<TargetEvaluationResult> RunMSBuildTarget (ProgressMonitor monitor, string target, ConfigurationSelector configuration, TargetEvaluationContext context)
{
if (CheckUseMSBuildEngine (configuration)) {
- LogWriter logWriter = new LogWriter (monitor.Log);
var configs = GetConfigurations (configuration);
string [] evaluateItems = context != null ? context.ItemsToEvaluate.ToArray () : new string [0];
@@ -1185,7 +1184,7 @@ namespace MonoDevelop.Projects
targets = new string [] { target };
try {
- result = await builder.Run (configs, logWriter, MSBuildProjectService.DefaultMSBuildVerbosity, targets, evaluateItems, evaluateProperties, globalProperties, monitor.CancellationToken);
+ result = await builder.Run (configs, monitor.Log, new ProxyLogger (this, context.Loggers), context.LogVerbosity, targets, evaluateItems, evaluateProperties, globalProperties, monitor.CancellationToken);
} finally {
builder.Unlock ();
builder.ReleaseReference ();
@@ -1199,8 +1198,6 @@ namespace MonoDevelop.Projects
if (t2 != null)
t2.End ();
}
-
- System.Runtime.Remoting.RemotingServices.Disconnect (logWriter);
});
var br = new BuildResult ();
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/TargetEvaluationContext.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/TargetEvaluationContext.cs
index d147a56554..674ad3ecd0 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/TargetEvaluationContext.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/TargetEvaluationContext.cs
@@ -25,15 +25,19 @@
// THE SOFTWARE.
using System;
using System.Collections.Generic;
+using MonoDevelop.Projects.MSBuild;
namespace MonoDevelop.Projects
{
public class TargetEvaluationContext: ProjectOperationContext
{
+ List<MSBuildLogger> loggers = new List<MSBuildLogger> ();
+
public TargetEvaluationContext ()
{
PropertiesToEvaluate = new HashSet<string> ();
ItemsToEvaluate = new HashSet<string> ();
+ LogVerbosity = MSBuildProjectService.DefaultMSBuildVerbosity;
}
public TargetEvaluationContext (OperationContext other): this ()
@@ -46,13 +50,21 @@ namespace MonoDevelop.Projects
public HashSet<string> ItemsToEvaluate { get; private set; }
+ public MSBuildVerbosity LogVerbosity { get; set; }
+
+ public ICollection<MSBuildLogger> Loggers {
+ get { return loggers; }
+ }
+
public override void CopyFrom (OperationContext other)
{
base.CopyFrom (other);
var o = other as TargetEvaluationContext;
if (o != null) {
PropertiesToEvaluate = new HashSet<string> (o.PropertiesToEvaluate);
- o.ItemsToEvaluate = new HashSet<string> (o.ItemsToEvaluate);
+ ItemsToEvaluate = new HashSet<string> (o.ItemsToEvaluate);
+ loggers = new List<MSBuildLogger> (o.Loggers);
+ LogVerbosity = o.LogVerbosity;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs
index 38cc5dc358..1d820edcde 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs
@@ -1763,11 +1763,11 @@ namespace MonoDevelop.Components.Commands
ICommandArrayUpdateHandler customArrayHandlerChain = null;
ICommandTargetHandler customTargetHandlerChain = null;
ICommandArrayTargetHandler customArrayTargetHandlerChain = null;
- List<CommandHandlerInfo> methodHandlers = new List<CommandHandlerInfo> ();
+ int handlersStart = handlers.Count;
foreach (object attr in method.GetCustomAttributes (true)) {
if (attr is CommandHandlerAttribute)
- methodHandlers.Add (new CommandHandlerInfo (method, (CommandHandlerAttribute) attr));
+ handlers.Add(new CommandHandlerInfo (method, (CommandHandlerAttribute)attr));
else if (attr is CommandUpdateHandlerAttribute)
AddUpdater (updaters, method, (CommandUpdateHandlerAttribute) attr);
else {
@@ -1785,21 +1785,20 @@ namespace MonoDevelop.Components.Commands
customArrayTargetHandlerChain = ChainHandler (customArrayTargetHandlerChain, attr);
}
- if (methodHandlers.Count > 0) {
- if (customHandlerChain != null || customArrayHandlerChain != null) {
- // There are custom handlers. Create update handlers for all commands
- // that the method handles so the custom update handlers can be chained
- foreach (CommandHandlerInfo ci in methodHandlers) {
- CommandUpdaterInfo c = AddUpdateHandler (updaters, ci.CommandId);
+ if (handlers.Count > handlersStart) {
+ if (customHandlerChain != null || customArrayHandlerChain != null) {
+ // There are custom handlers. Create update handlers for all commands
+ // that the method handles so the custom update handlers can be chained
+ for (int i = handlersStart; i < handlers.Count; ++i) {
+ CommandUpdaterInfo c = AddUpdateHandler (updaters, handlers[i].CommandId);
c.AddCustomHandlers (customHandlerChain, customArrayHandlerChain);
}
}
if (customTargetHandlerChain != null || customArrayTargetHandlerChain != null) {
- foreach (CommandHandlerInfo ci in methodHandlers)
- ci.AddCustomHandlers (customTargetHandlerChain, customArrayTargetHandlerChain);
+ for (int i = handlersStart; i < handlers.Count; ++i)
+ handlers[i].AddCustomHandlers (customTargetHandlerChain, customArrayTargetHandlerChain);
}
}
- handlers.AddRange (methodHandlers);
}
curType = curType.BaseType;
}
@@ -1827,8 +1826,9 @@ namespace MonoDevelop.Components.Commands
void AddUpdater (List<CommandUpdaterInfo> methodUpdaters, MethodInfo method, CommandUpdateHandlerAttribute attr)
{
+ var attrCommandId = CommandManager.ToCommandId (attr.CommandId);
foreach (CommandUpdaterInfo ci in methodUpdaters) {
- if (ci.CommandId.Equals (CommandManager.ToCommandId (attr.CommandId))) {
+ if (ci.CommandId.Equals (attrCommandId)) {
ci.Init (method, attr);
return;
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbarController.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbarController.cs
index 1eb449cc4a..130a1c32a1 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbarController.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/MainToolbarController.cs
@@ -144,6 +144,7 @@ namespace MonoDevelop.Components.MainToolbar
ignoreConfigurationChangedCount++;
try {
if (!IdeApp.Workspace.IsOpen) {
+ configurationMergers.Clear ();
ToolbarView.ConfigurationModel = Enumerable.Empty<IConfigurationModel> ();
ToolbarView.RuntimeModel = Enumerable.Empty<IRuntimeModel> ();
ToolbarView.RunConfigurationModel = Enumerable.Empty<IRunConfigurationModel> ();
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchPopupWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchPopupWindow.cs
index 9c484f2ba7..71f90eaac9 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchPopupWindow.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.MainToolbar/SearchPopupWindow.cs
@@ -326,6 +326,8 @@ namespace MonoDevelop.Components.MainToolbar
failedResults.ForEach (failedResult => newResults.Remove (failedResult));
Application.Invoke (delegate {
+ if (token.IsCancellationRequested)
+ return;
ShowResults (newResults, topResult);
isInSearch = false;
AnimatedResize ();
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.GettingStarted/GettingStartedNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.GettingStarted/GettingStartedNodeBuilder.cs
index 3d4b402df0..8cce132ef7 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.GettingStarted/GettingStartedNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.GettingStarted/GettingStartedNodeBuilder.cs
@@ -25,6 +25,12 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
return "GettingStarted";
}
+ public override object GetParentObject (object dataObject)
+ {
+ var node = dataObject as GettingStartedNode;
+ return node?.Project ?? base.GetParentObject (dataObject);
+ }
+
public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo)
{
nodeInfo.Label = GettextCatalog.GetString ("Getting Started");
@@ -36,9 +42,9 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
return false;
}
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ public override int GetSortIndex (ITreeNavigator node)
{
- return -1;
+ return -2000;
}
public override void OnNodeAdded (object dataObject)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
index 7888a7ad41..f9921fdf37 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs
@@ -215,8 +215,7 @@ namespace MonoDevelop.Ide.Gui.Components
store.SetSortColumnId (/* GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID */ -1, Gtk.SortType.Ascending);
tree.HeadersVisible = false;
- tree.SearchColumn = 0;
- tree.EnableSearch = true;
+ tree.EnableSearch = false;
complete_column = new Gtk.TreeViewColumn ();
complete_column.Title = "column";
@@ -1585,15 +1584,23 @@ namespace MonoDevelop.Ide.Gui.Components
NodeBuilder[] chain1 = (NodeBuilder[]) store.GetValue (a, BuilderChainColumn);
if (chain1 == null) return -1;
+ NodeBuilder [] chain2 = (NodeBuilder [])store.GetValue (b, BuilderChainColumn);
+ if (chain2 == null) return 1;
+
compareNode1.MoveToIter (a);
compareNode2.MoveToIter (b);
+ var i1 = GetSortIndex (chain1, compareNode1);
+ var i2 = GetSortIndex (chain2, compareNode2);
+
+ if (i1 < i2)
+ return -1;
+ else if (i1 > i2)
+ return 1;
+
int sort = CompareObjects (chain1, compareNode1, compareNode2);
if (sort != TypeNodeBuilder.DefaultSort) return sort;
- NodeBuilder[] chain2 = (NodeBuilder[]) store.GetValue (b, BuilderChainColumn);
- if (chain2 == null) return 1;
-
if (chain1 != chain2) {
sort = CompareObjects (chain2, compareNode2, compareNode1);
if (sort != TypeNodeBuilder.DefaultSort) return sort * -1;
@@ -1622,6 +1629,17 @@ namespace MonoDevelop.Ide.Gui.Components
return result;
}
+ int GetSortIndex (NodeBuilder [] chain, ITreeNavigator node)
+ {
+ int result = 0;
+ for (int n = 0; n < chain.Length; n++) {
+ int sort = chain [n].GetSortIndex (node);
+ if (sort != NodeBuilder.DefaultSort)
+ result = sort;
+ }
+ return result;
+ }
+
internal bool GetFirstNode (object dataObject, out Gtk.TreeIter iter)
{
object it;
@@ -2074,6 +2092,12 @@ namespace MonoDevelop.Ide.Gui.Components
}
}
+ [CommandHandler (SearchCommands.Find)]
+ void HandleSearchCommand ()
+ {
+ IdeApp.CommandService.DispatchCommand (MonoDevelop.Components.MainToolbar.Commands.NavigateTo);
+ }
+
void Expand (Gtk.TreeIter it)
{
tree.ExpandRow (store.GetPath (it), false);
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeBuilder.cs
index 3f61621ea2..b7a842d75c 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Components/NodeBuilder.cs
@@ -135,6 +135,21 @@ namespace MonoDevelop.Ide.Gui.Components
return DefaultSort;
}
+ /// <summary>
+ /// Gets the sort index for this node
+ /// </summary>
+ /// <returns>The sort index.</returns>
+ /// <param name="node">A tree node.</param>
+ /// <remarks>
+ /// The sort index is used to determine the relative ordering of nodes. Nodes with a higher sort index are
+ /// placed after nodes with lower index. When the index of two nodes is the same, the CompareObjects
+ /// method is used to determine the ordering. The default value is 0.
+ /// </remarks>
+ public virtual int GetSortIndex (ITreeNavigator node)
+ {
+ return DefaultSort;
+ }
+
// Helper methods
internal static bool HasAttribute (ITreeNavigator treeNavigator, NodeAttributes attr, NodeBuilder[] chain, object dataObject)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/ClassNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/ClassNodeBuilder.cs
index fba7a52efa..086f4a09a8 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/ClassNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/ClassNodeBuilder.cs
@@ -127,14 +127,6 @@ namespace MonoDevelop.Ide.Gui.Pads.ClassPad
// info from the db, so we always return true here. After all 99% of classes will have members
return true;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- if (thisNode.DataItem is ClassData)
- return DefaultSort;
- else
- return 1;
- }
}
public class ClassNodeCommandHandler : NodeCommandHandler
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/CombineNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/CombineNodeBuilder.cs
index f2f7c8d72a..a53acf34d4 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/CombineNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ClassPad/CombineNodeBuilder.cs
@@ -82,15 +82,12 @@ namespace MonoDevelop.Ide.Gui.Pads.ClassPad
{
return ((SolutionFolder) dataObject).Items.Count > 0;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is SolutionFolder)
- return DefaultSort;
- else
- return -1;
+ return -100;
}
-
+
public override void OnNodeAdded (object dataObject)
{
SolutionFolder combine = (SolutionFolder) dataObject;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/PortableFrameworkSubsetNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/PortableFrameworkSubsetNodeBuilder.cs
index 5f8ab86709..60c43377da 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/PortableFrameworkSubsetNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/PortableFrameworkSubsetNodeBuilder.cs
@@ -83,6 +83,11 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
treeBuilder.AddChildren (project.TargetRuntime.AssemblyContext.GetAssemblies (project.TargetFramework)
.Where (asm => asm.Package.IsFrameworkPackage && asm.Name != "mscorlib")
.Select (asm => new ImplicitFrameworkAssemblyReference (asm)));
+ }
+
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ return -1000;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
index 5918f1803a..d8f55c4c31 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFileNodeBuilder.cs
@@ -109,9 +109,6 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
{
- if (otherNode.DataItem is ProjectFolder)
- return 1;
-
if (!(thisNode.DataItem is ProjectFile))
return DefaultSort;
if (!(otherNode.DataItem is ProjectFile))
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs
index d5409a51c8..aff577c773 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs
@@ -112,6 +112,12 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
tb.UpdateChildren ();
}
}
+
+ public override int GetSortIndex (ITreeNavigator node)
+ {
+ // Before items, but after references and other collections
+ return -100;
+ }
public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo)
{
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectReferenceFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectReferenceFolderNodeBuilder.cs
index 43bbe3e59c..0f2ba3af5f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectReferenceFolderNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectReferenceFolderNodeBuilder.cs
@@ -95,12 +95,10 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
var p = (DotNetProject) builder.GetParentDataItem (typeof(DotNetProject), true);
return p != null && p.IsPortableLibrary;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is GettingStartedNode)
- return 1;
- return -1;
+ return -1000;
}
void OnRemoveReference (object sender, ProjectReferenceEventArgs e)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs
index f96a0dadb9..c4499e5157 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs
@@ -69,14 +69,6 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
else
return file.Parent;
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- if (otherNode.DataItem is SolutionFolderFileNode)
- return DefaultSort;
- else
- return -1;
- }
}
class SolutionFolderFileNodeCommandHandler: NodeCommandHandler
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs
index 9401cb7182..8daa364fc9 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs
@@ -83,16 +83,13 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
{
SolutionFolder sf = (SolutionFolder) dataObject;
return sf.IsRoot || sf.ParentFolder.IsRoot ? (object) sf.ParentSolution : (object) sf.ParentFolder;
- }
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
+ }
+
+ public override int GetSortIndex (ITreeNavigator node)
{
- if (otherNode.DataItem is SolutionFolder)
- return DefaultSort;
- else
- return -1;
+ return -1000;
}
-
+
public override void OnNodeAdded (object dataObject)
{
SolutionFolder folder = (SolutionFolder) dataObject;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs
index 54834f3f25..fe17301dc1 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs
@@ -80,14 +80,6 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
nodeInfo.Label = "<span foreground='dimgrey'>" + nodeInfo.Label + "</span>";
}
}
-
- public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
- {
- if (otherNode.DataItem is ProjectFolder)
- return 1;
- else
- return DefaultSort;
- }
}
class SystemFileNodeCommandHandler: NodeCommandHandler
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs
index c74ce15c27..9c12156013 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs
@@ -352,9 +352,17 @@ namespace MonoDevelop.Ide.Gui
get { return Window.ViewContent.IsViewOnly; }
}
+ Task currentOperationTask = Task.FromResult (true);
+
+ Task RunAsyncOperation (Func<Task> action)
+ {
+ Runtime.AssertMainThread ();
+ return currentOperationTask = currentOperationTask.ContinueWith (t => action(), Runtime.MainTaskScheduler).Unwrap ();
+ }
+
public Task Reload ()
{
- return ReloadTask ();
+ return RunAsyncOperation (ReloadTask);
}
async Task ReloadTask ()
@@ -373,7 +381,7 @@ namespace MonoDevelop.Ide.Gui
public Task Save ()
{
- return SaveTask ();
+ return RunAsyncOperation (SaveTask);
}
async Task SaveTask ()
@@ -446,7 +454,7 @@ namespace MonoDevelop.Ide.Gui
public Task SaveAs (string filename)
{
- return SaveAsTask (filename);
+ return RunAsyncOperation (() => SaveAsTask (filename));
}
async Task SaveAsTask (string filename)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
index b6e7e13925..18eede54f0 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs
@@ -338,20 +338,17 @@ namespace MonoDevelop.Ide.Gui
// Text editor commands
- [CommandUpdateHandler (TextEditorCommands.LineEnd)]
- [CommandUpdateHandler (TextEditorCommands.LineStart)]
- [CommandUpdateHandler (TextEditorCommands.DeleteLeftChar)]
- [CommandUpdateHandler (TextEditorCommands.DeleteRightChar)]
[CommandUpdateHandler (TextEditorCommands.CharLeft)]
[CommandUpdateHandler (TextEditorCommands.CharRight)]
- [CommandUpdateHandler (TextEditorCommands.LineUp)]
- [CommandUpdateHandler (TextEditorCommands.LineDown)]
- [CommandUpdateHandler (TextEditorCommands.DocumentStart)]
- [CommandUpdateHandler (TextEditorCommands.DocumentEnd)]
+ [CommandUpdateHandler (TextEditorCommands.DeleteLeftChar)]
[CommandUpdateHandler (TextEditorCommands.DeleteLine)]
- [CommandUpdateHandler (TextEditorCommands.MoveBlockUp)]
- [CommandUpdateHandler (TextEditorCommands.MoveBlockDown)]
- [CommandUpdateHandler (TextEditorCommands.GotoMatchingBrace)]
+ [CommandUpdateHandler (TextEditorCommands.DeleteRightChar)]
+ [CommandUpdateHandler (TextEditorCommands.DocumentEnd)]
+ [CommandUpdateHandler (TextEditorCommands.DocumentStart)]
+ [CommandUpdateHandler (TextEditorCommands.LineDown)]
+ [CommandUpdateHandler (TextEditorCommands.LineEnd)]
+ [CommandUpdateHandler (TextEditorCommands.LineStart)]
+ [CommandUpdateHandler (TextEditorCommands.LineUp)]
protected void OnUpdateLineEnd (CommandInfo info)
{
// If the current document is not an editor, just ignore the text
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
index 0d357a2141..93f595f5a0 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
@@ -59,14 +59,15 @@ namespace MonoDevelop.Ide.TypeSystem
internal readonly WorkspaceId Id;
CancellationTokenSource src = new CancellationTokenSource ();
- MonoDevelop.Projects.Solution currentMonoDevelopSolution;
+ bool disposed;
+ readonly MonoDevelop.Projects.Solution monoDevelopSolution;
object addLock = new object();
bool added;
bool internalChanges;
public MonoDevelop.Projects.Solution MonoDevelopSolution {
get {
- return currentMonoDevelopSolution;
+ return monoDevelopSolution;
}
}
@@ -118,7 +119,7 @@ namespace MonoDevelop.Ide.TypeSystem
}
services = MefHostServices.Create (assemblies);
}
-
+
/// <summary>
/// This bypasses the type system service. Use with care.
/// </summary>
@@ -128,10 +129,11 @@ namespace MonoDevelop.Ide.TypeSystem
OnSolutionAdded (sInfo);
}
- internal MonoDevelopWorkspace () : base (services, "MonoDevelop")
+ internal MonoDevelopWorkspace (MonoDevelop.Projects.Solution solution) : base (services, "MonoDevelop")
{
+ this.monoDevelopSolution = solution;
this.Id = WorkspaceId.Next ();
- if (IdeApp.Workspace != null) {
+ if (IdeApp.Workspace != null && solution != null) {
IdeApp.Workspace.ActiveConfigurationChanged += HandleActiveConfigurationChanged;
}
}
@@ -139,15 +141,15 @@ namespace MonoDevelop.Ide.TypeSystem
protected override void Dispose (bool finalize)
{
base.Dispose (finalize);
+ if (disposed)
+ return;
+ disposed = true;
CancelLoad ();
if (IdeApp.Workspace != null) {
IdeApp.Workspace.ActiveConfigurationChanged -= HandleActiveConfigurationChanged;
- }
- if (currentMonoDevelopSolution != null) {
- foreach (var prj in currentMonoDevelopSolution.GetAllProjects ()) {
- UnloadMonoProject (prj);
- }
- currentMonoDevelopSolution = null;
+ }
+ foreach (var prj in monoDevelopSolution.GetAllProjects ()) {
+ UnloadMonoProject (prj);
}
}
@@ -203,14 +205,12 @@ namespace MonoDevelop.Ide.TypeSystem
async void HandleActiveConfigurationChanged (object sender, EventArgs e)
{
- if (currentMonoDevelopSolution == null)
- return;
ShowStatusIcon ();
CancelLoad ();
var token = src.Token;
try {
- var si = await CreateSolutionInfo (currentMonoDevelopSolution, token).ConfigureAwait (false);
+ var si = await CreateSolutionInfo (monoDevelopSolution, token).ConfigureAwait (false);
if (si != null)
OnSolutionReloaded (si);
} catch (OperationCanceledException) {
@@ -265,10 +265,9 @@ namespace MonoDevelop.Ide.TypeSystem
});
}
- internal Task<SolutionInfo> TryLoadSolution (MonoDevelop.Projects.Solution solution, CancellationToken cancellationToken = default(CancellationToken))
+ internal Task<SolutionInfo> TryLoadSolution (CancellationToken cancellationToken = default(CancellationToken))
{
- this.currentMonoDevelopSolution = solution;
- return CreateSolutionInfo (solution, cancellationToken);
+ return CreateSolutionInfo (monoDevelopSolution, CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, src.Token).Token);
}
internal void UnloadSolution ()
@@ -448,6 +447,8 @@ namespace MonoDevelop.Ide.TypeSystem
if (fileName.IsNullOrEmpty)
fileName = new FilePath (p.Name + ".dll");
+ if (token.IsCancellationRequested)
+ return null;
var sourceFiles = await p.GetSourceFilesAsync (config != null ? config.Selector : null).ConfigureAwait (false);
var documents = CreateDocuments (projectData, p, token, sourceFiles);
if (documents == null)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
index c7e212620d..c3c8de5785 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService.cs
@@ -83,7 +83,7 @@ namespace MonoDevelop.Ide.TypeSystem
initialLoad = false;
try {
- emptyWorkspace = new MonoDevelopWorkspace ();
+ emptyWorkspace = new MonoDevelopWorkspace (null);
} catch (Exception e) {
LoggingService.LogFatalError ("Can't create roslyn workspace", e);
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService_WorkspaceHandling.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService_WorkspaceHandling.cs
index f8219ba660..382f7e329a 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService_WorkspaceHandling.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/TypeSystemService_WorkspaceHandling.cs
@@ -150,11 +150,12 @@ namespace MonoDevelop.Ide.TypeSystem
}
}
- internal static Task<List<MonoDevelopWorkspace>> Load (WorkspaceItem item, ProgressMonitor progressMonitor, CancellationToken cancellationToken = default(CancellationToken))
+ internal static async Task<List<MonoDevelopWorkspace>> Load (WorkspaceItem item, ProgressMonitor progressMonitor, CancellationToken cancellationToken = default(CancellationToken))
{
using (Counters.ParserService.WorkspaceItemLoaded.BeginTiming ()) {
var wsList = new List<MonoDevelopWorkspace> ();
- return InternalLoad (wsList, item, progressMonitor, cancellationToken).ContinueWith (t => { t.Wait (); return wsList; });
+ //If we want BeginTiming to work correctly we need to `await`
+ return await InternalLoad (wsList, item, progressMonitor, cancellationToken).ContinueWith (t => { t.Wait (); return wsList; });
}
}
@@ -171,18 +172,18 @@ namespace MonoDevelop.Ide.TypeSystem
} else {
var solution = item as MonoDevelop.Projects.Solution;
if (solution != null) {
- var workspace = new MonoDevelopWorkspace ();
- list.Add (workspace);
- workspace.ShowStatusIcon ();
- await workspace.TryLoadSolution (solution, cancellationToken);
+ var workspace = new MonoDevelopWorkspace (solution);
lock (workspaceLock)
workspaces = workspaces.Add (workspace);
+ list.Add (workspace);
+ workspace.ShowStatusIcon ();
+ await workspace.TryLoadSolution (cancellationToken);
solution.SolutionItemAdded += OnSolutionItemAdded;
solution.SolutionItemRemoved += OnSolutionItemRemoved;
- workspace.HideStatusIcon ();
- TaskCompletionSource <MonoDevelopWorkspace> request;
+ TaskCompletionSource<MonoDevelopWorkspace> request;
if (workspaceRequests.TryGetValue (solution, out request))
request.TrySetResult (workspace);
+ workspace.HideStatusIcon ();
}
}
});
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs
index 01226e434d..461543d522 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.WelcomePage/WelcomePageService.cs
@@ -35,6 +35,9 @@ namespace MonoDevelop.Ide.WelcomePage
static bool visible;
static WelcomePageFrame welcomePage;
+ public static event EventHandler WelcomePageShown;
+ public static event EventHandler WelcomePageHidden;
+
public static void Initialize ()
{
IdeApp.Workspace.FirstWorkspaceItemOpened += delegate {
@@ -64,6 +67,7 @@ namespace MonoDevelop.Ide.WelcomePage
var provider = AddinManager.GetExtensionObjects<IWelcomePageProvider> ().FirstOrDefault ();
welcomePage = new WelcomePageFrame (provider != null ? provider.CreateWidget () : new DefaultWelcomePage ());
}
+ WelcomePageShown?.Invoke (welcomePage, EventArgs.Empty);
welcomePage.UpdateProjectBar ();
((DefaultWorkbench)IdeApp.Workbench.RootWindow).BottomBar.Visible = false;
((DefaultWorkbench)IdeApp.Workbench.RootWindow).DockFrame.AddOverlayWidget (welcomePage, animate);
@@ -78,6 +82,7 @@ namespace MonoDevelop.Ide.WelcomePage
((DefaultWorkbench)IdeApp.Workbench.RootWindow).BottomBar.Show ();
((DefaultWorkbench)IdeApp.Workbench.RootWindow).DockFrame.RemoveOverlayWidget (animate);
}
+ WelcomePageHidden?.Invoke (welcomePage, EventArgs.Empty);
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
index c750a74fea..d600c828ef 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
@@ -186,11 +186,6 @@
<Name>MonoDevelop.Core</Name>
<Private>False</Private>
</ProjectReference>
- <ProjectReference Include="..\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.Formats.MSBuild.csproj">
- <Project>{A437F1A3-78DF-4F00-8053-D32A8B1EB679}</Project>
- <Name>MonoDevelop.Projects.Formats.MSBuild</Name>
- <Private>False</Private>
- </ProjectReference>
<ProjectReference Include="..\..\..\external\nrefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
index c8ad15845d..3b369b289d 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide/ImageService.cs
@@ -69,9 +69,6 @@ namespace MonoDevelop.Ide
static ImageService ()
{
iconFactory.AddDefault ();
- IconId.IconNameRequestHandler = delegate (string stockId) {
- EnsureStockIconIsLoaded (stockId);
- };
AddinManager.AddExtensionNodeHandler (IconsExtensionPath, delegate (object sender, ExtensionNodeEventArgs args) {
StockIconCodon iconCodon = (StockIconCodon)args.ExtensionNode;
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.csproj
index 67fb17f949..44f9613665 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.csproj
@@ -43,18 +43,12 @@
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ConsoleLogger.cs" />
<Compile Include="AssemblyInfo.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v12.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v12.0.csproj
index ed72fe0105..6abdcc8dd6 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v12.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v12.0.csproj
@@ -51,21 +51,14 @@
</Reference>
</ItemGroup>
<ItemGroup>
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="AssemblyInfo.v12.0.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.v4.0.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.0.csproj
index d6d245a050..f3c01d0c7b 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.0.csproj
@@ -50,21 +50,13 @@
</None>
</ItemGroup>
<ItemGroup>
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.v4.0.cs" />
<Compile Include="AssemblyInfo.v14.0.cs" />
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MonoDevelopTargets)" />
</Project>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj
index ab6d93f5c7..9a16cfcd99 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj
@@ -71,20 +71,12 @@
</None>
</ItemGroup>
<ItemGroup>
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.v4.0.cs" />
<Compile Include="AssemblyInfo.v14.1.cs" />
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v4.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v4.0.csproj
index 92777c6681..211581bc23 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v4.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.dotnet.v4.0.csproj
@@ -44,21 +44,14 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="AssemblyInfo.v4.0.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.v4.0.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v12.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v12.0.csproj
index bb42015505..bf7ffacab8 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v12.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v12.0.csproj
@@ -43,22 +43,15 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ConsoleLogger.cs" />
<Compile Include="AssemblyInfo.v12.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v14.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v14.0.csproj
index a6a3930ebe..596b8c30ec 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v14.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v14.0.csproj
@@ -43,22 +43,15 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ConsoleLogger.cs" />
<Compile Include="AssemblyInfo.v14.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v4.0.csproj b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v4.0.csproj
index d27c976b40..6bf0a3476a 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v4.0.csproj
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild.v4.0.csproj
@@ -43,22 +43,15 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
- <Compile Include="Main.cs" />
<Compile Include="AssemblyInfo.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\LocalLogger.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ILogWriter.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IProjectBuilder.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\IBuildEngine.cs" />
<Compile Include="MonoDevelop.Projects.Formats.MSBuild\ConsoleLogger.cs" />
<Compile Include="AssemblyInfo.v4.0.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildTargetResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildResult.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\MSBuildEvaluatedItem.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\ProjectBuilder.Shared.cs" />
- <Compile Include="MonoDevelop.Projects.Formats.MSBuild\BuildEngine.Shared.cs" />
</ItemGroup>
+ <Import Project="MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems" Label="Shared" Condition="Exists('MonoDevelop.Projects.MSBuild.Shared\MonoDevelop.Projects.MSBuild.Shared.projitems')" />
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Folder Include="MonoDevelop.Projects.Formats.MSBuild\" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.Shared.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.Shared.cs
deleted file mode 100644
index d24a6b864e..0000000000
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.Shared.cs
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-// ProjectBuilder.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-//
-// Copyright (c) 2010 Novell, Inc (http://www.novell.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Threading;
-using System.Runtime.Remoting;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-
-//this is the builder for the deprecated build engine API
-#pragma warning disable 618
-
-namespace MonoDevelop.Projects.MSBuild
-{
- partial class BuildEngine: MarshalByRefObject, IBuildEngine
- {
- static readonly AutoResetEvent workDoneEvent = new AutoResetEvent (false);
- static ThreadStart workDelegate;
- static readonly object workLock = new object ();
- static Thread workThread;
- static Exception workError;
-
- static List<int> cancelledTasks = new List<int> ();
- static int currentTaskId;
- static int fatalErrorRetries = 4;
-
- readonly ManualResetEvent doneEvent = new ManualResetEvent (false);
-
- public void Dispose ()
- {
- doneEvent.Set ();
- }
-
- internal WaitHandle WaitHandle {
- get { return doneEvent; }
- }
-
- public void Ping ()
- {
- if (fatalErrorRetries <= 0)
- throw new Exception ("Too many fatal exceptions");
- }
-
- public override object InitializeLifetimeService ()
- {
- return null;
- }
-
- public void CancelTask (int taskId)
- {
- lock (cancelledTasks) {
- if (currentTaskId == taskId)
- AbortCurrentTask ();
- else
- cancelledTasks.Add (taskId);
- }
- }
-
- static bool IsTaskCancelled (int taskId)
- {
- lock (cancelledTasks) {
- return cancelledTasks.Contains (taskId);
- }
- }
-
- static bool SetCurrentTask (int taskId)
- {
- lock (cancelledTasks) {
- if (cancelledTasks.Contains (taskId))
- return false;
- currentTaskId = taskId;
- return true;
- }
- }
-
- static void ResetCurrentTask ()
- {
- lock (cancelledTasks) {
- currentTaskId = -1;
- }
- }
-
- static void AbortCurrentTask ()
- {
- workThread.Abort ();
- workThread = null;
- workDoneEvent.Set ();
- }
-
- internal static void RunSTA (ThreadStart ts)
- {
- RunSTA (-1, ts);
- }
-
- internal static void RunSTA (int taskId, ThreadStart ts)
- {
- lock (workLock) {
- if (IsTaskCancelled (taskId))
- return;
- lock (threadLock) {
- // Last chance to check for canceled task before the thread is started
- if (IsTaskCancelled (taskId))
- return;
-
- workDelegate = ts;
- workError = null;
- if (workThread == null) {
- workThread = new Thread (STARunner);
- workThread.SetApartmentState (ApartmentState.STA);
- workThread.IsBackground = true;
- workThread.CurrentUICulture = uiCulture;
- workThread.Start ();
- }
- else
- // Awaken the existing thread
- Monitor.Pulse (threadLock);
- }
- if (!SetCurrentTask (taskId)) {
- // The task was aborted after all. Since the thread is already running we need to abort it
- AbortCurrentTask ();
- return;
- }
-
- workDoneEvent.WaitOne ();
-
- ResetCurrentTask ();
- }
- if (workError != null) {
- if (workError is OutOfMemoryException)
- fatalErrorRetries = 0;
- else
- fatalErrorRetries--;
- throw new Exception ("MSBuild operation failed", workError);
- }
- }
-
- static readonly object threadLock = new object ();
-
- static void STARunner ()
- {
- lock (threadLock) {
- do {
- try {
- workDelegate ();
- }
- catch (Exception ex) {
- workError = ex;
- }
- workDoneEvent.Set ();
- }
- while (Monitor.Wait (threadLock, 60000));
-
- workThread = null;
- }
- }
- }
-} \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
index 676ff9d933..63be2feb9e 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.cs
@@ -35,7 +35,7 @@ using System.Globalization;
namespace MonoDevelop.Projects.MSBuild
{
- public partial class BuildEngine: MarshalByRefObject, IBuildEngine
+ partial class BuildEngine
{
static CultureInfo uiCulture;
readonly Dictionary<string,string> unsavedProjects = new Dictionary<string, string> ();
@@ -45,7 +45,6 @@ namespace MonoDevelop.Projects.MSBuild
public void SetCulture (CultureInfo uiCulture)
{
BuildEngine.uiCulture = uiCulture;
-
}
public void SetGlobalProperties (IDictionary<string, string> properties)
@@ -55,12 +54,12 @@ namespace MonoDevelop.Projects.MSBuild
gp.SetProperty (p.Key, p.Value);
}
- public IProjectBuilder LoadProject (string file)
+ public ProjectBuilder LoadProject (string file)
{
return new ProjectBuilder (this, file);
}
- public void UnloadProject (IProjectBuilder pb)
+ public void UnloadProject (ProjectBuilder pb)
{
((ProjectBuilder)pb).Dispose ();
RemotingServices.Disconnect ((MarshalByRefObject) pb);
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.v4.0.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.v4.0.cs
index 84b0e3552f..c65576afbf 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.v4.0.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/BuildEngine.v4.0.cs
@@ -36,7 +36,7 @@ using System.Globalization;
namespace MonoDevelop.Projects.MSBuild
{
- public partial class BuildEngine: MarshalByRefObject, IBuildEngine
+ partial class BuildEngine
{
static CultureInfo uiCulture;
readonly Dictionary<string, string> unsavedProjects = new Dictionary<string, string> ();
@@ -53,15 +53,14 @@ namespace MonoDevelop.Projects.MSBuild
engine.SetGlobalProperty (p.Key, p.Value);
}
- public IProjectBuilder LoadProject (string file)
+ public ProjectBuilder LoadProject (string file)
{
return new ProjectBuilder (this, engine, file);
}
- public void UnloadProject (IProjectBuilder pb)
+ public void UnloadProject (ProjectBuilder pb)
{
- ((ProjectBuilder)pb).Dispose ();
- RemotingServices.Disconnect ((MarshalByRefObject) pb);
+ pb.Dispose ();
}
internal void SetUnsavedProjectContent (string file, string content)
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ILogWriter.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ILogWriter.cs
deleted file mode 100644
index 744b177d75..0000000000
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ILogWriter.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// ILogWriter.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-//
-// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.IO;
-using System.Runtime.Remoting.Messaging;
-
-namespace MonoDevelop.Projects.MSBuild
-{
- public interface ILogWriter
- {
- void Write (string text);
- }
-
- public class LogWriter: MarshalByRefObject, ILogWriter
- {
- TextWriter writer;
-
- public LogWriter (TextWriter writer)
- {
- this.writer = writer;
- }
-
- public void Write (string text)
- {
- writer.Write (text);
- }
-
- public override object InitializeLifetimeService ()
- {
- return null;
- }
- }
-
- public enum MSBuildVerbosity
- {
- Quiet,
- Minimal,
- Normal,
- Detailed,
- Diagnostic
- }
-}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs
deleted file mode 100644
index 886a5937a9..0000000000
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/IProjectBuilder.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// IProjectBuilder.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-// Michael Hutchinson <m.j.hutchinson@gmail.com>
-//
-// Copyright (c) 2009-2011 Novell, Inc (http://www.novell.com)
-// Copyright (c) 2011-2015 Xamarin Inc. (http://www.xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-namespace MonoDevelop.Projects.MSBuild
-{
- public interface IProjectBuilder : IDisposable
- {
- void Refresh ();
- void RefreshWithContent (string projectContent);
- MSBuildResult Run (
- ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity,
- string[] runTargets, string[] evaluateItems, string[] evaluateProperties, Dictionary<string,string> globalProperties, int taskId
- );
- }
-
- [Serializable]
- public class ProjectConfigurationInfo
- {
- public string ProjectFile;
- public string ProjectGuid;
- public string Configuration;
- public string Platform;
- public bool Enabled;
- }
-}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/LocalLogger.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/LocalLogger.cs
index 6dcc8dd153..4bd1a11a70 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/LocalLogger.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/LocalLogger.cs
@@ -32,7 +32,7 @@ using Microsoft.Build.Framework;
namespace MonoDevelop.Projects.MSBuild
{
- public class LocalLogger: Logger
+ class LocalLogger: Logger
{
IEventSource eventSource;
readonly List<MSBuildTargetResult> results = new List<MSBuildTargetResult> ();
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildTargetResult.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildTargetResult.cs
deleted file mode 100644
index ba37f3ef32..0000000000
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildTargetResult.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// MSBuildTargetResult.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-//
-// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Text;
-
-namespace MonoDevelop.Projects.MSBuild
-{
- [Serializable]
- public class MSBuildTargetResult
- {
- public MSBuildTargetResult (
- string projectFile, bool isWarning, string subcategory, string code, string file,
- int lineNumber, int columnNumber, int endLineNumber, int endColumnNumber,
- string message, string helpKeyword)
- {
- ProjectFile = projectFile;
- IsWarning = isWarning;
- Subcategory = subcategory;
- Code = code;
- File = file;
- LineNumber = lineNumber;
- ColumnNumber = columnNumber;
- EndLineNumber = endLineNumber;
- EndColumnNumber = endColumnNumber;
- Message = message;
- HelpKeyword = helpKeyword;
- }
-
- public string ProjectFile { get; set; }
- public bool IsWarning { get; set; }
- public string Subcategory { get; set; }
- public string Code { get; set; }
- public string File { get; set; }
- public int LineNumber { get; set; }
- public int ColumnNumber { get; set; }
- public int EndLineNumber { get; set; }
- public int EndColumnNumber { get; set; }
- public string Message { get; set; }
- public string HelpKeyword { get; set; }
-
- public override string ToString ()
- {
- var sb = new StringBuilder ();
- if (!string.IsNullOrEmpty (File)) {
- sb.Append (File);
- if (LineNumber > 0) {
- //(line)
- sb.Append ("(");
- sb.Append (LineNumber);
- if (ColumnNumber > 0) {
- //(line,col)
- sb.Append (",");
- sb.Append (ColumnNumber);
- if (EndColumnNumber > 0) {
- if (EndLineNumber > 0) {
- //(line,col,line,col)
- sb.Append (",");
- sb.Append (EndLineNumber);
- sb.Append (",");
- sb.Append (EndColumnNumber);
- } else {
- //(line,col-col)
- sb.Append ("-");
- sb.Append (EndColumnNumber);
- }
- }
- } else if (EndLineNumber > 0) {
- //(line-line)
- sb.Append ("-");
- sb.Append (EndLineNumber);
- }
- sb.Append (")");
- }
- sb.Append (": ");
- }
- if (!string.IsNullOrEmpty (Subcategory)) {
- sb.Append (Subcategory);
- sb.Append (" ");
- }
- sb.Append (IsWarning ? "warning" : "error");
- if (!string.IsNullOrEmpty (Code)) {
- sb.Append (" ");
- sb.Append (Code);
- }
- sb.Append (": ");
- sb.Append (Message);
- return sb.ToString ();
- }
- }
-}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
index 9b6edf0b43..0e2e23a75a 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.cs
@@ -42,7 +42,7 @@ using System.Linq;
namespace MonoDevelop.Projects.MSBuild
{
- public partial class ProjectBuilder: MarshalByRefObject, IProjectBuilder
+ partial class ProjectBuilder: MarshalByRefObject
{
readonly string file;
readonly MDConsoleLogger consoleLogger;
@@ -62,7 +62,7 @@ namespace MonoDevelop.Projects.MSBuild
FieldInfo evaluatedMetadataField = typeof(BuildItem).GetField ("evaluatedMetadata", BindingFlags.NonPublic | BindingFlags.Instance);
public MSBuildResult Run (
- ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity,
+ ProjectConfigurationInfo[] configurations, IEngineLogWriter logWriter, MSBuildVerbosity verbosity,
string[] runTargets, string[] evaluateItems, string[] evaluateProperties, Dictionary<string,string> globalProperties, int taskId)
{
MSBuildResult result = null;
@@ -78,6 +78,7 @@ namespace MonoDevelop.Projects.MSBuild
if (logWriter != null) {
buildEngine.Engine.RegisterLogger (consoleLogger);
consoleLogger.Verbosity = GetVerbosity (verbosity);
+ buildEngine.Engine.RegisterLogger (new TargetLogger (logWriter.RequiredEvents, LogEvent));
}
if (runTargets != null && runTargets.Length > 0) {
@@ -116,7 +117,7 @@ namespace MonoDevelop.Projects.MSBuild
}
list.Add (evItem);
}
- result.Items[name] = list;
+ result.Items[name] = list.ToArray ();
}
}
} catch (InvalidProjectFileException ex) {
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.v4.0.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.v4.0.cs
index 7cd143bda0..90401a3000 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.v4.0.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/ProjectBuilder.v4.0.cs
@@ -39,7 +39,7 @@ using System.Xml;
namespace MonoDevelop.Projects.MSBuild
{
- public partial class ProjectBuilder: MarshalByRefObject, IProjectBuilder
+ partial class ProjectBuilder
{
readonly ProjectCollection engine;
readonly string file;
@@ -54,7 +54,7 @@ namespace MonoDevelop.Projects.MSBuild
}
public MSBuildResult Run (
- ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity,
+ ProjectConfigurationInfo[] configurations, IEngineLogWriter logWriter, MSBuildVerbosity verbosity,
string[] runTargets, string[] evaluateItems, string[] evaluateProperties, Dictionary<string,string> globalProperties, int taskId)
{
if (runTargets == null || runTargets.Length == 0)
@@ -70,7 +70,8 @@ namespace MonoDevelop.Projects.MSBuild
var logger = new LocalLogger (file);
if (logWriter != null) {
var consoleLogger = new ConsoleLogger (GetVerbosity (verbosity), LogWrite, null, null);
- loggers = new ILogger[] { logger, consoleLogger };
+ var eventLogger = new TargetLogger (logWriter.RequiredEvents, LogEvent);
+ loggers = new ILogger[] { logger, consoleLogger, eventLogger };
} else {
loggers = new ILogger[] { logger };
}
@@ -104,7 +105,7 @@ namespace MonoDevelop.Projects.MSBuild
}
list.Add (evItem);
}
- result.Items[name] = list;
+ result.Items[name] = list.ToArray ();
}
}
} catch (Microsoft.Build.Exceptions.InvalidProjectFileException ex) {
@@ -148,7 +149,9 @@ namespace MonoDevelop.Projects.MSBuild
Environment.CurrentDirectory = Path.GetDirectoryName (file);
var projectRootElement = ProjectRootElement.Create (new XmlTextReader (new StringReader (content)));
projectRootElement.FullPath = file;
- string toolsVersion = projectRootElement.ToolsVersion ?? engine.DefaultToolsVersion;
+ string toolsVersion = projectRootElement.ToolsVersion;
+ if (string.IsNullOrEmpty (toolsVersion))
+ toolsVersion = engine.DefaultToolsVersion;
p = new Project (projectRootElement, engine.GlobalProperties, toolsVersion, engine);
}
}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/BuildEngine.Shared.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/BuildEngine.Shared.cs
index 5a55c5cbb2..199a89c067 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/BuildEngine.Shared.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/BuildEngine.Shared.cs
@@ -35,6 +35,8 @@ using System.IO;
using MonoDevelop.Core.Execution;
using System.Net.Configuration;
using System.Diagnostics;
+using System.Reflection;
+using System.Linq;
#pragma warning disable 618
namespace MonoDevelop.Projects.MSBuild
@@ -49,37 +51,40 @@ namespace MonoDevelop.Projects.MSBuild
static List<int> cancelledTasks = new List<int> ();
static int currentTaskId;
+ static int fatalErrorRetries = 4;
static int projectIdCounter;
+ static string msbuildBinDir;
Dictionary<int, ProjectBuilder> projects = new Dictionary<int, ProjectBuilder> ();
- readonly ManualResetEvent doneEvent = new ManualResetEvent (false);
-
static RemoteProcessServer server;
- internal WaitHandle WaitHandle {
- get { return doneEvent; }
- }
-
- public class LogWriter: ILogWriter
+ public class LogWriter: IEngineLogWriter
{
int id;
- public LogWriter (int loggerId)
+ public LogWriter (int loggerId, MSBuildEvent eventFilter)
{
this.id = loggerId;
+ RequiredEvents = eventFilter;
}
- public void Write (string text)
+ public void Write (string text, LogEvent [] events)
{
- server.SendMessage (new LogMessage { LoggerId = id, Text = text });
+ server.SendMessage (new LogMessage { LoggerId = id, LogText = text, Events = events });
}
+
+ public MSBuildEvent RequiredEvents { get; private set; }
}
- public class NullLogWriter: ILogWriter
+ public class NullLogWriter: IEngineLogWriter
{
- public void Write (string text)
+ public void Write (string text, LogEvent [] events)
{
}
+
+ public MSBuildEvent RequiredEvents {
+ get { return default (MSBuildEvent); }
+ }
}
void WatchProcess (int procId)
@@ -99,7 +104,7 @@ namespace MonoDevelop.Projects.MSBuild
break;
}
}
- doneEvent.Set ();
+ server.Shutdown ();
});
t.IsBackground = true;
t.Start ();
@@ -113,6 +118,7 @@ namespace MonoDevelop.Projects.MSBuild
[MessageHandler]
public BinaryMessage Initialize (InitializeRequest msg)
{
+ msbuildBinDir = msg.BinDir;
WatchProcess (msg.IdeProcessId);
SetCulture (CultureInfo.GetCultureInfo (msg.CultureName));
SetGlobalProperties (msg.GlobalProperties);
@@ -144,15 +150,10 @@ namespace MonoDevelop.Projects.MSBuild
}
[MessageHandler]
- public BinaryMessage Dispose (DisposeRequest msg)
- {
- doneEvent.Set ();
- return msg.CreateResponse ();
- }
-
- [MessageHandler]
public BinaryMessage Ping (PingRequest msg)
{
+ if (fatalErrorRetries <= 0)
+ throw new Exception ("Too many fatal exceptions");
return msg.CreateResponse ();
}
@@ -207,7 +208,7 @@ namespace MonoDevelop.Projects.MSBuild
{
var pb = GetProject (msg.ProjectId);
if (pb != null) {
- var logger = msg.LogWriterId != -1 ? (ILogWriter) new LogWriter (msg.LogWriterId) : (ILogWriter) new NullLogWriter ();
+ var logger = msg.LogWriterId != -1 ? (IEngineLogWriter) new LogWriter (msg.LogWriterId, msg.EnabledLogEvents) : (IEngineLogWriter) new NullLogWriter ();
var res = pb.Run (msg.Configurations, logger, msg.Verbosity, msg.RunTargets, msg.EvaluateItems, msg.EvaluateProperties, msg.GlobalProperties, msg.TaskId);
return new RunProjectResponse { Result = res };
}
@@ -293,8 +294,13 @@ namespace MonoDevelop.Projects.MSBuild
ResetCurrentTask ();
}
- if (workError != null)
+ if (workError != null) {
+ if (workError is OutOfMemoryException)
+ fatalErrorRetries = 0;
+ else
+ fatalErrorRetries--;
throw new Exception ("MSBuild operation failed", workError);
+ }
}
static readonly object threadLock = new object ();
@@ -317,4 +323,10 @@ namespace MonoDevelop.Projects.MSBuild
}
}
}
+
+ interface IEngineLogWriter
+ {
+ void Write (string text, LogEvent[] events);
+ MSBuildEvent RequiredEvents { get; }
+ }
} \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/LocalLogger.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/LocalLogger.cs
new file mode 100644
index 0000000000..4ebd738b76
--- /dev/null
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/LocalLogger.cs
@@ -0,0 +1,169 @@
+//
+// LocalLogger.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@novell.com>
+//
+// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using Microsoft.Build.Utilities;
+using Microsoft.Build.Framework;
+
+namespace MonoDevelop.Projects.MSBuild
+{
+ class TargetLogger: Logger
+ {
+ IEventSource eventSource;
+ readonly MSBuildEvent eventFilter;
+ readonly Action<LogEvent> logger;
+
+ public TargetLogger (MSBuildEvent eventFilter, Action<LogEvent> logger)
+ {
+ this.eventFilter = eventFilter;
+ this.logger = logger;
+ }
+
+ public override void Initialize (IEventSource eventSource)
+ {
+ this.eventSource = eventSource;
+
+ if ((eventFilter & MSBuildEvent.BuildStarted) != 0)
+ eventSource.BuildStarted += EventSource_BuildStarted;
+
+ if ((eventFilter & MSBuildEvent.BuildFinished) != 0)
+ eventSource.BuildFinished += EventSource_BuildFinished;
+
+ if ((eventFilter & MSBuildEvent.CustomEventRaised) != 0)
+ eventSource.CustomEventRaised += EventSource_CustomEventRaised;
+
+ if ((eventFilter & MSBuildEvent.ErrorRaised) != 0)
+ eventSource.ErrorRaised += EventSource_ErrorRaised;
+
+ if ((eventFilter & MSBuildEvent.MessageRaised) != 0)
+ eventSource.MessageRaised += EventSource_MessageRaised;
+
+ if ((eventFilter & MSBuildEvent.ProjectStarted) != 0)
+ eventSource.ProjectStarted += EventSource_ProjectStarted;
+
+ if ((eventFilter & MSBuildEvent.ProjectFinished) != 0)
+ eventSource.ProjectFinished += EventSource_ProjectFinished;
+
+ if ((eventFilter & MSBuildEvent.TargetStarted) != 0)
+ eventSource.TargetStarted += EventSource_TargetStarted;
+
+ if ((eventFilter & MSBuildEvent.TargetFinished) != 0)
+ eventSource.TargetFinished += EventSource_TargetFinished;
+
+ if ((eventFilter & MSBuildEvent.TaskStarted) != 0)
+ eventSource.TaskStarted += EventSource_TaskStarted;
+
+ if ((eventFilter & MSBuildEvent.TargetFinished) != 0)
+ eventSource.TaskFinished += EventSource_TaskFinished;
+
+ if ((eventFilter & MSBuildEvent.WarningRaised) != 0)
+ eventSource.WarningRaised += EventSource_WarningRaised;
+ }
+
+ void EventSource_BuildStarted (object sender, BuildStartedEventArgs e)
+ {
+ Log (MSBuildEvent.BuildStarted, e.Message);
+ }
+
+ void EventSource_BuildFinished (object sender, BuildFinishedEventArgs e)
+ {
+ Log (MSBuildEvent.BuildFinished, e.Message);
+ }
+
+ void EventSource_CustomEventRaised (object sender, CustomBuildEventArgs e)
+ {
+ Log (MSBuildEvent.CustomEventRaised, e.Message);
+ }
+
+ void EventSource_ErrorRaised (object sender, BuildErrorEventArgs e)
+ {
+ Log (MSBuildEvent.ErrorRaised, e.Message);
+ }
+
+ void EventSource_MessageRaised (object sender, BuildMessageEventArgs e)
+ {
+ Log (MSBuildEvent.MessageRaised, e.Message);
+ }
+
+ void EventSource_ProjectStarted (object sender, ProjectStartedEventArgs e)
+ {
+ Log (MSBuildEvent.ProjectStarted, e.Message);
+ }
+
+ void EventSource_ProjectFinished (object sender, ProjectFinishedEventArgs e)
+ {
+ Log (MSBuildEvent.ProjectFinished, e.Message);
+ }
+
+ void EventSource_TargetStarted (object sender, TargetStartedEventArgs e)
+ {
+ Log (MSBuildEvent.TargetStarted, e.Message);
+ }
+
+ void EventSource_TargetFinished (object sender, TargetFinishedEventArgs e)
+ {
+ Log (MSBuildEvent.TargetFinished, e.Message);
+ }
+
+ void EventSource_TaskStarted (object sender, TaskStartedEventArgs e)
+ {
+ Log (MSBuildEvent.TaskStarted, e.Message);
+ }
+
+ void EventSource_TaskFinished (object sender, TaskFinishedEventArgs e)
+ {
+ Log (MSBuildEvent.TaskFinished, e.Message);
+ }
+
+ void EventSource_WarningRaised (object sender, BuildWarningEventArgs e)
+ {
+ Log (MSBuildEvent.WarningRaised, e.Message);
+ }
+
+ void Log (MSBuildEvent ev, string message)
+ {
+ logger (new LogEvent { Event = ev, Message = message });
+ }
+
+ public override void Shutdown ()
+ {
+ eventSource.BuildStarted -= EventSource_BuildStarted;
+ eventSource.BuildFinished -= EventSource_BuildFinished;
+ eventSource.CustomEventRaised -= EventSource_CustomEventRaised;
+ eventSource.ErrorRaised -= EventSource_ErrorRaised;
+ eventSource.MessageRaised -= EventSource_MessageRaised;
+ eventSource.ProjectStarted -= EventSource_ProjectStarted;
+ eventSource.ProjectFinished -= EventSource_ProjectFinished;
+ eventSource.TargetStarted -= EventSource_TargetStarted;
+ eventSource.TargetFinished -= EventSource_TargetFinished;
+ eventSource.TaskStarted -= EventSource_TaskStarted;
+ eventSource.TaskFinished -= EventSource_TaskFinished;
+ eventSource.WarningRaised -= EventSource_WarningRaised;
+ }
+ }
+}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/Main.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/Main.cs
index cfc5126fd2..0fdff77118 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/Main.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/Main.cs
@@ -33,6 +33,9 @@ using System.Runtime.Remoting.Channels.Tcp;
using System.Threading;
using System.Diagnostics;
using MonoDevelop.Core.Execution;
+using System.Reflection;
+using System.Linq;
+using System.Runtime.CompilerServices;
namespace MonoDevelop.Projects.MSBuild
{
@@ -42,9 +45,66 @@ namespace MonoDevelop.Projects.MSBuild
public static void Main (string[] args)
{
RemoteProcessServer server = new RemoteProcessServer ();
- var builderEngine = new BuildEngine (server);
- server.Connect (args, builderEngine);
- builderEngine.WaitHandle.WaitOne ();
+ server.Connect (args, new AssemblyResolver (server));
+ }
+
+ /// <summary>
+ /// Since BuildEngine class directly access MSBuild types it tries to load Microsoft.Build.dll assembly when
+ /// constructor is called so before Initialize is called which specifies msbuildBinDir and installs MSBuildAssemblyResolver.
+ /// To solve this problem we use AssemblyResolver class which we install as listener to RemoteProcessServer(implicitly in Connect call).
+ /// and after installing MSBuildAssemblyResolver we create BuildEngine and add it as Listener and remove AssemblyResolver
+ /// as if it was never there.
+ /// </summary>
+ class AssemblyResolver
+ {
+ string msbuildBinDir;
+ RemoteProcessServer server;
+
+ public AssemblyResolver (RemoteProcessServer server)
+ {
+ this.server = server;
+ }
+
+ Assembly MSBuildAssemblyResolver (object sender, ResolveEventArgs args)
+ {
+ var msbuildAssemblies = new string [] {
+ "Microsoft.Build",
+ "Microsoft.Build.Engine",
+ "Microsoft.Build.Framework",
+ "Microsoft.Build.Tasks.Core",
+ "Microsoft.Build.Utilities.Core" };
+
+ var asmName = new AssemblyName (args.Name);
+ if (!msbuildAssemblies.Any (n => string.Compare (n, asmName.Name, StringComparison.OrdinalIgnoreCase) == 0))
+ return null;
+
+ string fullPath = Path.Combine (msbuildBinDir, asmName.Name + ".dll");
+ if (File.Exists (fullPath)) {
+ // If the file exists under the msbuild bin dir, then we need
+ // to load it only from there. If that fails, then let that exception
+ // escape
+ return Assembly.LoadFrom (fullPath);
+ } else
+ return null;
+ }
+
+ [MessageHandler]
+ public BinaryMessage Initialize (InitializeRequest msg)
+ {
+ msbuildBinDir = msg.BinDir;
+ AppDomain.CurrentDomain.AssemblyResolve += MSBuildAssemblyResolver;
+ return CreateBuildEngineAndRespondToInitialize(msg);
+ }
+
+ //Keep in seperate method so MSBuildAssemblyResolver is installed before BuildEngine is loaded
+ [MethodImpl (MethodImplOptions.NoInlining)]
+ BinaryMessage CreateBuildEngineAndRespondToInitialize (InitializeRequest msg)
+ {
+ var buildEngine = new BuildEngine (server);
+ server.AddListener (buildEngine);
+ server.RemoveListener (this);
+ return buildEngine.Initialize (msg);
+ }
}
}
}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/MonoDevelop.Projects.MSBuild.Shared.projitems b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/MonoDevelop.Projects.MSBuild.Shared.projitems
index bd0e54a174..429d1a1980 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/MonoDevelop.Projects.MSBuild.Shared.projitems
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/MonoDevelop.Projects.MSBuild.Shared.projitems
@@ -23,5 +23,9 @@
<Compile Include="$(MSBuildThisFileDirectory)MSBuildResult.cs" />
<Compile Include="$(MSBuildThisFileDirectory)MSBuildTargetResult.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Main.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)LocalLogger.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)..\..\MonoDevelop.Core\MonoDevelop.Projects.MSBuild\MSBuildEvent.cs">
+ <Link>MSBuildEvent.cs</Link>
+ </Compile>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/ProjectBuilder.Shared.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/ProjectBuilder.Shared.cs
index 3a5a54fe9e..0f28b62a83 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/ProjectBuilder.Shared.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/ProjectBuilder.Shared.cs
@@ -1,45 +1,48 @@
-//
-// ProjectBuilder.Shared.cs
-//
-// Author:
-// Lluis Sanchez Gual <lluis@novell.com>
-// Michael Hutchinson <m.j.hutchinson@gmail.com>
-//
-// Copyright (c) 2009-2011 Novell, Inc (http://www.novell.com)
-// Copyright (c) 2011-2015 Xamarin Inc. (http://www.xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
+//
+// ProjectBuilder.Shared.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@novell.com>
+// Michael Hutchinson <m.j.hutchinson@gmail.com>
+//
+// Copyright (c) 2009-2011 Novell, Inc (http://www.novell.com)
+// Copyright (c) 2011-2015 Xamarin Inc. (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
using Microsoft.Build.Framework;
using System.Xml;
using System.IO;
using System;
using System.Text;
using System.Threading;
-using MonoDevelop.Core.Execution;
-
+using System.Collections.Generic;
+using System.Linq;
+
namespace MonoDevelop.Projects.MSBuild
{
partial class ProjectBuilder
{
- ILogWriter currentLogWriter;
+ IEngineLogWriter currentLogWriter;
StringBuilder log = new StringBuilder ();
+ List<LogEvent> logMessages = new List<LogEvent> ();
+
bool flushingLog;
Timer flushTimer;
object flushLogLock = new object ();
@@ -64,35 +67,51 @@ namespace MonoDevelop.Projects.MSBuild
/// <summary>
/// Prepares the logging infrastructure
/// </summary>
- void InitLogger (ILogWriter logWriter)
- {
+ void InitLogger (IEngineLogWriter logWriter)
+ {
currentLogWriter = logWriter;
if (currentLogWriter != null) {
log.Clear ();
+ logMessages.Clear ();
flushingLog = false;
flushTimer = new Timer (o => FlushLog ());
}
- }
-
+ }
+
/// <summary>
/// Flushes the log that has not yet been sent and disposes the logging infrastructure
/// </summary>
void DisposeLogger ()
{
- if (currentLogWriter != null) {
- flushTimer.Dispose ();
- flushTimer = null;
- FlushLog ();
- currentLogWriter = null;
+ lock (flushLogLock)
+ lock (log) {
+ if (currentLogWriter != null) {
+ try {
+ flushTimer.Dispose ();
+ FlushLog ();
+ } catch {
+ // Ignoree
+ } finally {
+ // This needs to be done inside the finally, to make sure it is called even in
+ // the case the thread is being aborted.
+ flushTimer = null;
+ currentLogWriter = null;
+ }
+ }
}
}
void LogWriteLine (string txt)
{
- if (currentLogWriter != null) {
- lock (log) {
+ LogWrite (txt + Environment.NewLine);
+ }
+
+ void LogWrite (string txt)
+ {
+ lock (log) {
+ if (currentLogWriter != null) {
// Append the line to the log, and schedule the flush of the log, unless it has already been done
- log.AppendLine (txt);
+ log.Append (txt);
if (!flushingLog) {
// Flush the log after 100ms
flushingLog = true;
@@ -100,6 +119,21 @@ namespace MonoDevelop.Projects.MSBuild
}
}
}
+ }
+
+ void LogEvent (LogEvent msg)
+ {
+ lock (log) {
+ if (currentLogWriter != null) {
+ // Append the line to the log, and schedule the flush of the log, unless it has already been done
+ logMessages.Add (msg);
+ if (!flushingLog) {
+ // Flush the log after 100ms
+ flushingLog = true;
+ flushTimer.Change (LogFlushTimeout, Timeout.Infinite);
+ }
+ }
+ }
}
void FlushLog ()
@@ -110,15 +144,18 @@ namespace MonoDevelop.Projects.MSBuild
lock (flushLogLock) {
string txt;
+ List<LogEvent> messages;
lock (log) {
// Don't flush the log inside the lock since that would prevent LogWriteLine from writing
// more log while the current log is being flushed (that would slow down the whole build)
txt = log.ToString ();
log.Clear ();
+ messages = new List<LogEvent> (logMessages);
+ logMessages.Clear ();
flushingLog = false;
}
- if (txt.Length > 0 && currentLogWriter != null)
- currentLogWriter.Write (txt);
+ if (currentLogWriter != null && (txt.Length > 0 || messages.Count > 0))
+ currentLogWriter.Write (txt.Length > 0 ? txt : null, messages.Count > 0 ? messages.ToArray () : null);
}
}
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/RemoteBuildEngineMessages.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/RemoteBuildEngineMessages.cs
index 23f22f4b16..e52d8806bd 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/RemoteBuildEngineMessages.cs
+++ b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.MSBuild.Shared/RemoteBuildEngineMessages.cs
@@ -39,6 +39,9 @@ namespace MonoDevelop.Projects.MSBuild
public string CultureName { get; set; }
[MessageDataProperty]
+ public string BinDir { get; set; }
+
+ [MessageDataProperty]
public Dictionary<string, string> GlobalProperties { get; set; }
}
@@ -129,6 +132,9 @@ namespace MonoDevelop.Projects.MSBuild
public int LogWriterId { get; set; }
[MessageDataProperty]
+ public MSBuildEvent EnabledLogEvents { get; set; }
+
+ [MessageDataProperty]
public MSBuildVerbosity Verbosity { get; set; }
[MessageDataProperty]
@@ -161,7 +167,20 @@ namespace MonoDevelop.Projects.MSBuild
public int LoggerId { get; set; }
[MessageDataProperty]
- public string Text { get; set; }
+ public string LogText { get; set; }
+
+ [MessageDataProperty]
+ public LogEvent[] Events { get; set; }
+ }
+
+ [MessageDataType]
+ class LogEvent
+ {
+ [MessageDataProperty]
+ public MSBuildEvent Event { get; set; }
+
+ [MessageDataProperty]
+ public string Message { get; set; }
}
public enum MSBuildVerbosity
@@ -191,5 +210,18 @@ namespace MonoDevelop.Projects.MSBuild
[MessageDataProperty]
public bool Enabled { get; set; }
}
+
+ [MessageDataType]
+ class LoggerInfo
+ {
+ [MessageDataProperty]
+ public string Id { get; set; }
+
+ [MessageDataProperty]
+ public bool ConsoleLog { get; set; }
+
+ [MessageDataProperty]
+ public MSBuildEvent EventsFilter { get; set; }
+ }
}
diff --git a/main/tests/MonoDevelop.CSharpBinding.Tests/Features/CodeCompletion/NR6/ProtocolMemberContextHandlerTests.cs b/main/tests/MonoDevelop.CSharpBinding.Tests/Features/CodeCompletion/NR6/ProtocolMemberContextHandlerTests.cs
deleted file mode 100644
index 36a8241eac..0000000000
--- a/main/tests/MonoDevelop.CSharpBinding.Tests/Features/CodeCompletion/NR6/ProtocolMemberContextHandlerTests.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-// ProtocolMemberContextHandlerTests.cs
-//
-// Author:
-// Mike Krüger <mkrueger@xamarin.com>
-//
-// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using NUnit.Framework;
-using ICSharpCode.NRefactory6.CSharp.Completion;
-using ICSharpCode.NRefactory6.CSharp.CodeCompletion.Roslyn;
-using MonoDevelop.CSharp.Completion;
-using System.Runtime.Remoting.Messaging;
-
-namespace ICSharpCode.NRefactory6.CSharp.CodeCompletion.NR6
-{
-
- [TestFixture]
- class ProtocolMemberContextHandlerTests : CompletionTestBase
- {
- static readonly string Header = @"
-using System;
-using Foundation;
-
-namespace Foundation
-{
- public class ExportAttribute : Attribute
- {
- public ExportAttribute(string id) { }
- }
-
- public class ProtocolAttribute : Attribute
- {
- public string Name { get; set; }
- public ProtocolAttribute() { }
- }
-}";
-
- internal override CompletionContextHandler CreateContextHandler ()
- {
- return new ProtocolMemberContextHandler ();
- }
-
- [Test]
- public void TestSimple ()
- {
- VerifyItemsExist (Header + @"
-
-class MyProtocol
-{
- [Export("":FooBar"")]
- public virtual void FooBar()
- {
-
- }
-}
-
-
-[Protocol(Name = ""MyProtocol"")]
-class ProtocolClass
-{
-
-}
-
-
-class FooBar : ProtocolClass
-{
- override $$
-}
-
-", "FooBar");
- }
-
- /// <summary>
- /// Bug 39428 - [iOS] Override of protocol method shows 2 completions
- /// </summary>
- [Test]
- public void TestBug39428 ()
- {
- VerifyItemIsAbsent (Header + @"
-
-class MyProtocol
-{
- [Export("":FooBar"")]
- public virtual void FooBar()
- {
-
- }
-}
-
-
-[Protocol(Name = ""MyProtocol"")]
-class ProtocolClass
-{
- public virtual void FooBar()
- {
- }
-}
-
-class FooBar : ProtocolClass
-{
- override $$
-}
-
-", "FooBar");
- }
- }
-} \ No newline at end of file
diff --git a/main/tests/MonoDevelop.CSharpBinding.Tests/MonoDevelop.CSharpBinding.Tests.csproj b/main/tests/MonoDevelop.CSharpBinding.Tests/MonoDevelop.CSharpBinding.Tests.csproj
index b8beb220b6..c6d0e3fd56 100644
--- a/main/tests/MonoDevelop.CSharpBinding.Tests/MonoDevelop.CSharpBinding.Tests.csproj
+++ b/main/tests/MonoDevelop.CSharpBinding.Tests/MonoDevelop.CSharpBinding.Tests.csproj
@@ -120,7 +120,6 @@
<Compile Include="Features\IndentationTests\StringTests.cs" />
<Compile Include="Features\IndentationTests\TextPasteIndentEngineTests.cs" />
<Compile Include="Features\CodeCompletion\NR6\RegexContextHandlerTests.cs" />
- <Compile Include="Features\CodeCompletion\NR6\ProtocolMemberContextHandlerTests.cs" />
<Compile Include="Features\TestBase.cs" />
<Compile Include="Features\Util.cs" />
</ItemGroup>
diff --git a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildResult.cs b/main/tests/UnitTests/MonoDevelop.Core/MonoExecutionParametersTests.cs
index 843961a150..dca16289f1 100644
--- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildResult.cs
+++ b/main/tests/UnitTests/MonoDevelop.Core/MonoExecutionParametersTests.cs
@@ -1,59 +1,53 @@
-//
-// MSBuildResult.cs
-//
-// Author:
-// Michael Hutchinson <m.j.hutchinson@gmail.com>
-//
-// Copyright (c) 2014 Xamarin Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-namespace MonoDevelop.Projects.MSBuild
-{
- [Serializable]
- public class MSBuildResult
- {
- readonly MSBuildTargetResult[] errors;
- readonly Dictionary<string,string> properties;
- readonly Dictionary<string,List<MSBuildEvaluatedItem>> items;
-
- public MSBuildResult (MSBuildTargetResult[] errors)
- {
- this.errors = errors;
- this.properties = new Dictionary<string,string> ();
- this.items = new Dictionary<string,List<MSBuildEvaluatedItem>> ();
- }
-
- public MSBuildTargetResult[] Errors {
- get { return errors; }
- }
-
- public Dictionary<string,List<MSBuildEvaluatedItem>> Items {
- get { return items; }
- }
-
- public Dictionary<string, string> Properties {
- get { return properties; }
- }
- }
-
-}
+//
+// MonoExecutionParameters.cs
+//
+// Author:
+// Marius Ungureanu <marius.ungureanu@xamarin.com>
+//
+// Copyright (c) 2017 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using MonoDevelop.Projects;
+using NUnit.Framework;
+
+namespace MonoDevelop.Core
+{
+ [TestFixture]
+ public class MonoExecutionParametersTests
+ {
+ [Test, TestCaseSource ("ExecutionParameters")]
+ public void CheckWeTrimString (MonoExecutionParameters par)
+ {
+ string ops;
+ par.GenerateOptions (new Dictionary<string, string> (), out ops);
+
+ Assert.AreEqual (ops.Trim (), ops);
+ }
+
+ static MonoExecutionParameters [] ExecutionParameters = new[] {
+ new MonoExecutionParameters (),
+ new MonoExecutionParameters { MonoVerboseLevel = 3 },
+ new MonoExecutionParameters { MonoVerboseLevel = 3, MonoDebugMode = true, },
+ new MonoExecutionParameters { MonoDebugMode = true, MonoDebugCasts = true, },
+ new MonoExecutionParameters { MonoDebugMode = true, MonoDebugCasts = true, MonoVerifyAll = true, MonoConfigFile = "test.config" },
+ };
+ }
+}
diff --git a/main/tests/UnitTests/MonoDevelop.Core/RemoteProcessConnectionTests.cs b/main/tests/UnitTests/MonoDevelop.Core/RemoteProcessConnectionTests.cs
index e20459d9d4..1627e0f263 100644
--- a/main/tests/UnitTests/MonoDevelop.Core/RemoteProcessConnectionTests.cs
+++ b/main/tests/UnitTests/MonoDevelop.Core/RemoteProcessConnectionTests.cs
@@ -28,6 +28,7 @@ using NUnit.Framework;
using MonoDevelop.Core.Execution;
using System.Security.Cryptography.X509Certificates;
using System.IO;
+using System.Collections.Generic;
namespace MonoDevelop.Core
{
@@ -99,6 +100,124 @@ namespace MonoDevelop.Core
Assert.AreEqual (new [] { new DateTime (2016, 2, 17), new DateTime (2016, 2, 18) }, m.GetArgument ("DateTime"));
Assert.AreEqual (new [] { TimeSpan.FromSeconds (44), TimeSpan.FromSeconds (45) }, m.GetArgument ("TimeSpan"));
}
+
+ [Test]
+ public void BinaryMessageMapSerialization ()
+ {
+ Dictionary<string, object> data1 = new Dictionary<string, object> ();
+ data1 ["one"] = 1;
+ data1 ["two"] = true;
+
+ Dictionary<string, string> data2 = new Dictionary<string, string> ();
+ data2 ["one"] = "uno";
+ data2 ["two"] = "dos";
+
+ Dictionary<int, double[]> data3 = new Dictionary<int, double[]> ();
+ data3 [1] = new double[] { 11, 111 };
+ data3 [2] = new double[] { 22, 222 };
+
+ var m = new BinaryMessage ("Test");
+ m.AddArgument ("map1", data1);
+ m.AddArgument ("map2", data2);
+ m.AddArgument ("map3", data3);
+
+ MemoryStream ms = new MemoryStream ();
+ m.Write (ms);
+ ms.Position = 0;
+
+ m = BinaryMessage.Read (ms);
+ Assert.AreEqual (3, m.Args.Count);
+ Assert.AreEqual (data1, m.GetArgument ("map1"));
+ Assert.AreEqual (data2, m.GetArgument ("map2"));
+ Assert.AreEqual (data3, m.GetArgument ("map3"));
+ }
+
+ [Test]
+ public void BinaryMessageCustomMapSerialization ()
+ {
+ var data = new Dictionary<string, CustomData[]> ();
+ data ["one"] = new CustomData [] { new CustomData { Data = "1" }, new CustomData { Data = "2" } };
+ data ["two"] = new CustomData [] { new CustomData { Data = "3" }, new CustomData { Data = "4" } };
+
+ var m = new BinaryMessage ("Test");
+ m.AddArgument ("map", data);
+
+ MemoryStream ms = new MemoryStream ();
+ m.Write (ms);
+ ms.Position = 0;
+
+ m = BinaryMessage.Read (ms);
+ Assert.AreEqual (1, m.Args.Count);
+
+ var dict = m.GetArgument<Dictionary<string, CustomData[]>> ("map");
+
+ Assert.AreEqual (2, dict.Count);
+ Assert.IsTrue (dict.ContainsKey ("one"));
+ Assert.IsTrue (dict.ContainsKey ("two"));
+
+ var ar = dict ["one"];
+ Assert.AreEqual (2, ar.Length);
+ Assert.AreEqual ("1", ar[0].Data);
+ Assert.AreEqual ("2", ar[1].Data);
+
+ ar = dict ["two"];
+ Assert.AreEqual (2, ar.Length);
+ Assert.AreEqual ("3", ar[0].Data);
+ Assert.AreEqual ("4", ar[1].Data);
+ }
+
+ [Test]
+ public void EmptyMessage ()
+ {
+ var m = new BinaryMessage ("MonoDevelop.Projects.MSBuild.PingRequest");
+ Assert.AreEqual (0, m.Args.Count);
+ Assert.AreEqual ("MonoDevelop.Projects.MSBuild.PingRequest", m.Name);
+ Assert.AreEqual ("", m.Target);
+
+ MemoryStream ms = new MemoryStream ();
+ m.Write (ms);
+ ms.Position = 0;
+
+ m = BinaryMessage.Read (ms);
+ Assert.AreEqual (0, m.Args.Count);
+ Assert.AreEqual ("MonoDevelop.Projects.MSBuild.PingRequest", m.Name);
+ Assert.AreEqual ("", m.Target);
+ }
+
+ [Test]
+ public void EmptyCustomMessage ()
+ {
+ var m = new PingRequest ();
+ m.ReadCustomData ();
+
+ Assert.AreEqual (0, m.Args.Count);
+ Assert.AreEqual ("MonoDevelop.Core.PingRequest", m.Name);
+ Assert.AreEqual (null, m.Target);
+
+ MemoryStream ms = new MemoryStream ();
+ m.Write (ms);
+ ms.Position = 0;
+
+ var rm = BinaryMessage.Read (ms);
+ m = new PingRequest ();
+ m.CopyFrom (rm);
+
+ Assert.AreEqual (0, m.Args.Count);
+ Assert.AreEqual ("MonoDevelop.Core.PingRequest", m.Name);
+ Assert.AreEqual ("", m.Target);
+ }
+ }
+
+ [MessageDataTypeAttribute]
+ class PingRequest: BinaryMessage
+ {
+ }
+
+ [MessageDataTypeAttribute]
+ class CustomData
+ {
+ [MessageDataProperty]
+ public string Data;
}
}
diff --git a/main/tests/UnitTests/MonoDevelop.Projects/MSBuildLoggerTests.cs b/main/tests/UnitTests/MonoDevelop.Projects/MSBuildLoggerTests.cs
new file mode 100644
index 0000000000..17f48bf622
--- /dev/null
+++ b/main/tests/UnitTests/MonoDevelop.Projects/MSBuildLoggerTests.cs
@@ -0,0 +1,150 @@
+//
+// MSBuildLoggerTests.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@xamarin.com>
+//
+// Copyright (c) 2017 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Threading.Tasks;
+using MonoDevelop.Projects.MSBuild;
+using NUnit.Framework;
+using UnitTests;
+using MonoDevelop.Core;
+using System.Text;
+
+namespace MonoDevelop.Projects
+{
+ [TestFixture]
+ public class MSBuildLoggerTests: TestBase
+ {
+ [Test]
+ public async Task BasicEvents ()
+ {
+ string solFile = Util.GetSampleProject ("console-project", "ConsoleProject.sln");
+ Solution item = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile);
+
+ var myLogger = new MSBuildLogger ();
+ TargetEvaluationContext ctx = new TargetEvaluationContext ();
+ ctx.Loggers.Add (myLogger);
+ myLogger.EnabledEvents = MSBuildEvent.BuildStarted | MSBuildEvent.BuildFinished | MSBuildEvent.TargetStarted;
+
+ int started = 0, finished = 0, targetStarted = 0;
+
+ myLogger.EventRaised += (sender, e) => {
+ switch (e.Event) {
+ case MSBuildEvent.BuildStarted: started++; break;
+ case MSBuildEvent.BuildFinished: finished++; break;
+ case MSBuildEvent.TargetStarted: targetStarted++; break;
+ default: throw new InvalidOperationException ("Unexpected event: " + e.Event);
+ }
+ };
+ await item.Build (Util.GetMonitor (), "Debug", ctx);
+ Assert.AreEqual (1, started);
+ Assert.AreEqual (1, finished);
+ Assert.IsTrue (targetStarted > 0);
+ }
+
+ [Test]
+ public async Task NoEvents ()
+ {
+ string solFile = Util.GetSampleProject ("console-project", "ConsoleProject.sln");
+ Solution item = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile);
+
+ var myLogger = new MSBuildLogger ();
+ TargetEvaluationContext ctx = new TargetEvaluationContext ();
+ ctx.Loggers.Add (myLogger);
+ myLogger.EnabledEvents = MSBuildEvent.None;
+
+ int events = 0;
+
+ myLogger.EventRaised += (sender, e) => events++;
+ await item.Build (Util.GetMonitor (), "Debug", ctx);
+ Assert.AreEqual (0, events);
+ }
+
+ [Test]
+ public async Task AllEvents ()
+ {
+ string solFile = Util.GetSampleProject ("console-project", "ConsoleProject.sln");
+ Solution item = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile);
+
+ var myLogger = new MSBuildLogger ();
+ TargetEvaluationContext ctx = new TargetEvaluationContext ();
+ ctx.Loggers.Add (myLogger);
+ myLogger.EnabledEvents = MSBuildEvent.All;
+
+ int buildStarted = 0, buildFinished = 0, targetStarted = 0, targetFinished = 0, projectStarted = 0,
+ projectFinished = 0, taskStarted = 0, taskFinished = 0;
+
+ myLogger.EventRaised += (sender, e) => {
+ switch (e.Event) {
+ case MSBuildEvent.BuildStarted: buildStarted++; break;
+ case MSBuildEvent.BuildFinished: buildFinished++; break;
+ case MSBuildEvent.TargetStarted: targetStarted++; break;
+ case MSBuildEvent.TargetFinished: targetFinished++; break;
+ case MSBuildEvent.ProjectStarted: projectStarted++; break;
+ case MSBuildEvent.ProjectFinished: projectFinished++; break;
+ case MSBuildEvent.TaskStarted: taskStarted++; break;
+ case MSBuildEvent.TaskFinished: taskFinished++; break;
+ }
+ };
+ var mon = new StringMonitor ();
+ await item.Build (mon, "Debug", ctx);
+
+ Assert.AreEqual (1, buildStarted);
+ Assert.AreEqual (1, buildFinished);
+ Assert.AreEqual (1, projectStarted);
+ Assert.AreEqual (1, projectFinished);
+ Assert.AreEqual (taskStarted, taskFinished);
+ Assert.AreEqual (targetStarted, targetFinished);
+ Assert.AreNotEqual (string.Empty, mon.GetLogText ());
+ }
+
+ [Test]
+ public async Task NoLog ()
+ {
+ string solFile = Util.GetSampleProject ("console-project", "ConsoleProject.sln");
+ Solution item = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solFile);
+
+ TargetEvaluationContext ctx = new TargetEvaluationContext ();
+ ctx.LogVerbosity = MSBuildVerbosity.Quiet;
+ var mon = new StringMonitor ();
+ await item.Build (mon, "Debug", ctx);
+ Assert.AreEqual (string.Empty, mon.GetLogText ());
+ }
+ }
+
+ class StringMonitor: ProgressMonitor
+ {
+ StringBuilder sb = new StringBuilder ();
+
+ protected override void OnWriteLog (string message)
+ {
+ sb.Append (message);
+ }
+
+ public string GetLogText ()
+ {
+ return sb.ToString ();
+ }
+ }
+}
diff --git a/main/tests/UnitTests/UnitTests.csproj b/main/tests/UnitTests/UnitTests.csproj
index ed9e2a3268..078638bf69 100644
--- a/main/tests/UnitTests/UnitTests.csproj
+++ b/main/tests/UnitTests/UnitTests.csproj
@@ -304,6 +304,8 @@
<Compile Include="MonoDevelop.Projects\MSBuildGlobTests.cs" />
<Compile Include="MonoDevelop.Projects\ProjectCapabilityTests.cs" />
<Compile Include="MonoDevelop.Projects\ProjectReevaluationTests.cs" />
+ <Compile Include="MonoDevelop.Projects\MSBuildLoggerTests.cs" />
+ <Compile Include="MonoDevelop.Core\MonoExecutionParametersTests.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Makefile.am" />