From 305c991180288d152121ca0f9c9db61b07c27b81 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 24 May 2012 23:29:34 +0200 Subject: [PATCH] Use "ResolveReferences" instead of "ResolveAssemblyReferences" for Portable Library projects. This makes the default references (System.Linq.dll etc.) available in code completion (previously we were only showing types from mscorlib) --- .../Project/ICSharpCode.SharpDevelop.csproj | 1 + .../Project/Src/Project/MSBuildInternals.cs | 16 ++++++- .../Base/Project/Src/Util/ExtensionMethods.cs | 6 +++ src/Main/Base/Project/Src/Util/KeyComparer.cs | 45 +++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/Main/Base/Project/Src/Util/KeyComparer.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 6e972e1cb6..c5e8eaf0bc 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -811,6 +811,7 @@ + diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index 27446a7aa1..0a97799714 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -7,9 +7,11 @@ using System.Linq; using System.Text.RegularExpressions; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Util; using Microsoft.Build.Construction; using Microsoft.Build.Execution; using Microsoft.Build.Framework; +using Microsoft.Build.Logging; using MSBuild = Microsoft.Build; using ProjectCollection = Microsoft.Build.Evaluation.ProjectCollection; @@ -169,6 +171,7 @@ namespace ICSharpCode.SharpDevelop.Project { ProjectInstance project = baseProject.CreateProjectInstance(); project.SetProperty("BuildingProject", "false"); + project.SetProperty("DesignTimeBuild", "true"); List references = ( from item in project.Items @@ -201,9 +204,16 @@ namespace ICSharpCode.SharpDevelop.Project } } - string[] targets = { "ResolveAssemblyReferences" }; - BuildRequestData requestData = new BuildRequestData(project, targets, new HostServices()); + List targets = new List(); + if (baseProject.HasProjectType(ProjectTypeGuids.PortableLibrary)) { + targets.Add("ResolveReferences"); + targets.Add("DesignTimeResolveAssemblyReferences"); + } else { + targets.Add("ResolveAssemblyReferences"); + } + BuildRequestData requestData = new BuildRequestData(project, targets.ToArray(), new HostServices()); List loggers = new List(); + //loggers.Add(new ConsoleLogger(LoggerVerbosity.Diagnostic)); if (logErrorsToOutputPad) loggers.Add(new SimpleErrorLogger()); lock (SolutionProjectCollectionLock) { @@ -231,6 +241,8 @@ namespace ICSharpCode.SharpDevelop.Project CopyLocal = bool.Parse(msbuildItem.GetMetadataValue("CopyLocal")), ReferenceItems = referenceItems }; + // HACK: mscorlib is reported twice for portable library projects (even if we don't specify it as additionalReference) + query = query.DistinctBy(asm => asm.FullPath); List resolvedAssemblies = new List(); List handledReferenceItems = new List(); foreach (var assembly in query) { diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 690537f4c1..e759706bab 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -22,6 +22,7 @@ using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Util; using WinForms = System.Windows.Forms; namespace ICSharpCode.SharpDevelop @@ -160,6 +161,11 @@ namespace ICSharpCode.SharpDevelop return result; } + public static IEnumerable DistinctBy(this IEnumerable input, Func keySelector) + { + return input.Distinct(KeyComparer.Create(keySelector)); + } + /// /// Sets the Content property of the specified ControlControl to the specified content. /// If the content is a Windows-Forms control, it is wrapped in a WindowsFormsHost. diff --git a/src/Main/Base/Project/Src/Util/KeyComparer.cs b/src/Main/Base/Project/Src/Util/KeyComparer.cs new file mode 100644 index 0000000000..4a8cce5b46 --- /dev/null +++ b/src/Main/Base/Project/Src/Util/KeyComparer.cs @@ -0,0 +1,45 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; + +namespace ICSharpCode.SharpDevelop.Util +{ + public static class KeyComparer + { + public static KeyComparer Create(Func keySelector) + { + return new KeyComparer(keySelector, Comparer.Default, EqualityComparer.Default); + } + } + + public class KeyComparer : IComparer, IEqualityComparer + { + readonly Func keySelector; + readonly IComparer keyComparer; + readonly IEqualityComparer keyEqualityComparer; + + public KeyComparer(Func keySelector, IComparer keyComparer, IEqualityComparer keyEqualityComparer) + { + this.keySelector = keySelector; + this.keyComparer = keyComparer; + this.keyEqualityComparer = keyEqualityComparer; + } + + public int Compare(TElement x, TElement y) + { + return keyComparer.Compare(keySelector(x), keySelector(y)); + } + + public bool Equals(TElement x, TElement y) + { + return keyEqualityComparer.Equals(keySelector(x), keySelector(y)); + } + + public int GetHashCode(TElement obj) + { + return keyEqualityComparer.GetHashCode(keySelector(obj)); + } + } +}