Browse Source

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)
pull/24/head
Daniel Grunwald 13 years ago
parent
commit
305c991180
  1. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 16
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs
  3. 6
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs
  4. 45
      src/Main/Base/Project/Src/Util/KeyComparer.cs

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -811,6 +811,7 @@ @@ -811,6 +811,7 @@
<Compile Include="Src\Services\ProjectService\ProjectLoader.cs" />
<Compile Include="Src\Util\DotnetDetection.cs" />
<Compile Include="Src\Util\FakeXmlViewContent.cs" />
<Compile Include="Src\Util\KeyComparer.cs" />
<Compile Include="Src\Util\ReactiveExtensions.cs" />
<Compile Include="Src\Util\TreeNode.cs" />
<Compile Include="Src\Util\NativeMethods.cs" />

16
src/Main/Base/Project/Src/Project/MSBuildInternals.cs

@ -7,9 +7,11 @@ using System.Linq; @@ -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 @@ -169,6 +171,7 @@ namespace ICSharpCode.SharpDevelop.Project
{
ProjectInstance project = baseProject.CreateProjectInstance();
project.SetProperty("BuildingProject", "false");
project.SetProperty("DesignTimeBuild", "true");
List<ProjectItemInstance> references = (
from item in project.Items
@ -201,9 +204,16 @@ namespace ICSharpCode.SharpDevelop.Project @@ -201,9 +204,16 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
string[] targets = { "ResolveAssemblyReferences" };
BuildRequestData requestData = new BuildRequestData(project, targets, new HostServices());
List<string> targets = new List<string>();
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<ILogger> loggers = new List<ILogger>();
//loggers.Add(new ConsoleLogger(LoggerVerbosity.Diagnostic));
if (logErrorsToOutputPad)
loggers.Add(new SimpleErrorLogger());
lock (SolutionProjectCollectionLock) {
@ -231,6 +241,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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<ReferenceProjectItem> resolvedAssemblies = new List<ReferenceProjectItem>();
List<ReferenceProjectItem> handledReferenceItems = new List<ReferenceProjectItem>();
foreach (var assembly in query) {

6
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -22,6 +22,7 @@ using ICSharpCode.NRefactory; @@ -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 @@ -160,6 +161,11 @@ namespace ICSharpCode.SharpDevelop
return result;
}
public static IEnumerable<T> DistinctBy<T, K>(this IEnumerable<T> input, Func<T, K> keySelector)
{
return input.Distinct(KeyComparer.Create(keySelector));
}
/// <summary>
/// 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.

45
src/Main/Base/Project/Src/Util/KeyComparer.cs

@ -0,0 +1,45 @@ @@ -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<TElement, TKey> Create<TElement, TKey>(Func<TElement, TKey> keySelector)
{
return new KeyComparer<TElement, TKey>(keySelector, Comparer<TKey>.Default, EqualityComparer<TKey>.Default);
}
}
public class KeyComparer<TElement, TKey> : IComparer<TElement>, IEqualityComparer<TElement>
{
readonly Func<TElement, TKey> keySelector;
readonly IComparer<TKey> keyComparer;
readonly IEqualityComparer<TKey> keyEqualityComparer;
public KeyComparer(Func<TElement, TKey> keySelector, IComparer<TKey> keyComparer, IEqualityComparer<TKey> 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));
}
}
}
Loading…
Cancel
Save