Browse Source

ClassBrowser: Fixed some more problems in reference handling.

pull/315/head
Andreas Weizel 12 years ago
parent
commit
6c66aff7bc
  1. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 55
      src/Main/Base/Project/Parser/CombinedAssemblySearcher.cs
  3. 18
      src/Main/Base/Project/Parser/ProjectAssemblyReferenceSearcher.cs
  4. 7
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

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

@ -166,6 +166,7 @@ @@ -166,6 +166,7 @@
<DependentUpon>ToolTipService.cs</DependentUpon>
</Compile>
<Compile Include="Editor\ToolTipService.cs" />
<Compile Include="Parser\CombinedAssemblySearcher.cs" />
<Compile Include="Parser\DefaultAssemblySearcher.cs" />
<Compile Include="Parser\DomAssemblyName.cs" />
<Compile Include="Parser\IAssemblyParserService.cs" />

55
src/Main/Base/Project/Parser/CombinedAssemblySearcher.cs

@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
// 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;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Parser
{
/// <summary>
/// Combines other assembly searchers in a chain.
/// </summary>
public class CombinedAssemblySearcher : IAssemblySearcher
{
readonly List<IAssemblySearcher> searcherList;
public CombinedAssemblySearcher(params IAssemblySearcher[] searchers)
{
searcherList = new List<IAssemblySearcher>();
if ((searchers != null) && (searchers.Length > 0)) {
searcherList.AddRange(searchers);
}
}
public void AddSearcher(IAssemblySearcher searcher)
{
if (searcher == null)
throw new ArgumentNullException("searcher");
searcherList.Add(searcher);
}
public void RemoveSearcher(IAssemblySearcher searcher)
{
if (searcher == null)
throw new ArgumentNullException("searcher");
searcherList.Remove(searcher);
}
public FileName FindAssembly(DomAssemblyName fullName)
{
FileName foundFileName = null;
// Run through all searchers until we find something
foreach (var searcher in searcherList) {
if (searcher != null) {
foundFileName = searcher.FindAssembly(fullName);
if (foundFileName != null)
break;
}
}
return foundFileName;
}
}
}

18
src/Main/Base/Project/Parser/ProjectAssemblyReferenceSearcher.cs

@ -25,9 +25,6 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -25,9 +25,6 @@ namespace ICSharpCode.SharpDevelop.Parser
{
// Try to find assembly among solution projects
IProjectService projectService = SD.GetRequiredService<IProjectService>();
if (projectService.CurrentSolution != null) {
var projectOfAssembly = projectService.CurrentSolution.Projects.FirstOrDefault(p => p.AssemblyModel.FullAssemblyName == fullName.FullName);
}
ProjectItem projectItem =
project.Items.FirstOrDefault(
@ -36,18 +33,11 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -36,18 +33,11 @@ namespace ICSharpCode.SharpDevelop.Parser
// Special handling for COM references: Their assembly names are prefixed with "Interop."
return fullName.ShortName == "Interop." + item.Include;
}
if ((item.ItemType == ItemType.ProjectReference) && item is ProjectReferenceProjectItem) {
// Special handling for project references: Find assembly name among solution projects
if (projectService.CurrentSolution != null) {
return projectService.CurrentSolution.Projects.Any(p => p.Name == ((ProjectReferenceProjectItem) item).ProjectName);
}
return false;
}
if (item.ItemType == ItemType.Reference) {
return (item.Include == fullName.ShortName);
if ((item.ItemType == ItemType.ProjectReference) && (item is ProjectReferenceProjectItem)) {
// Special handling for project references: Compare with project name instead of file name
return (((ProjectReferenceProjectItem) item).ProjectName == fullName.ShortName);
}
return false;
return (item.ItemType == ItemType.Reference) && (item.Include == fullName.ShortName);
});
if (projectItem != null) {

7
src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

@ -93,13 +93,12 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -93,13 +93,12 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (assemblyReference != null) {
// Model is an assembly reference
IAssemblyParserService assemblyParserService = SD.GetRequiredService<IAssemblyParserService>();
IAssemblySearcher searcher = null;
IEntityModelContext entityModelContext = assemblyReference.ParentAssemblyModel.Context;
CombinedAssemblySearcher searcher = new CombinedAssemblySearcher();
if ((entityModelContext != null) && (entityModelContext.Project != null)) {
searcher = new ProjectAssemblyReferenceSearcher(entityModelContext.Project);
} else {
searcher = new DefaultAssemblySearcher(assemblyReference.ParentAssemblyModel.Location);
searcher.AddSearcher(new ProjectAssemblyReferenceSearcher(entityModelContext.Project));
}
searcher.AddSearcher(new DefaultAssemblySearcher(assemblyReference.ParentAssemblyModel.Location));
var resolvedFile = searcher.FindAssembly(assemblyReference.AssemblyName);
if (resolvedFile != null) {
assemblyModel = assemblyParserService.GetAssemblyModelSafe(resolvedFile);

Loading…
Cancel
Save