diff options
author | Mikayla Hutchinson <m.j.hutchinson@gmail.com> | 2017-01-26 19:35:44 +0300 |
---|---|---|
committer | Mikayla Hutchinson <m.j.hutchinson@gmail.com> | 2017-01-26 20:33:09 +0300 |
commit | 9baeaf6cdcddfc61bd8641c5b85b118a5734fb39 (patch) | |
tree | 51c5f3511df74d1962923ffd448fa342926ca9a6 /main/src | |
parent | bfe719850a431ab688e674bcaa4379c04f8f9e3f (diff) | |
parent | 239def51e3a1addbad9cffc818e978a8fc6d8afb (diff) |
Merge remote-tracking branch 'xamarin/vNext' into roslyn-ivt
Diffstat (limited to 'main/src')
106 files changed, 1469 insertions, 2336 deletions
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/MSBuildResult.cs b/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildResult.cs deleted file mode 100644 index 843961a150..0000000000 --- a/main/src/core/MonoDevelop.Projects.Formats.MSBuild/MonoDevelop.Projects.Formats.MSBuild/MSBuildResult.cs +++ /dev/null @@ -1,59 +0,0 @@ -// -// 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; } - } - } - -} 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; } + } } |