Browse Source

Use referenced assemblies in type resolve context.

newNRvisualizers
Daniel Grunwald 15 years ago
parent
commit
8e0e63dc9e
  1. 6
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs
  2. 28
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  3. 14
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  4. 12
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs
  5. 1
      src/Main/Base/Project/Src/Services/ParserService/AssemblyParserService.cs
  6. 26
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

6
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs

@ -375,7 +375,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -375,7 +375,8 @@ namespace ICSharpCode.SharpDevelop.Gui
}
});
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray());
string mscorlibPath;
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray(), out mscorlibPath);
WorkbenchSingleton.SafeThreadAsyncCall(
delegate {
@ -419,7 +420,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -419,7 +420,8 @@ namespace ICSharpCode.SharpDevelop.Gui
}
});
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray());
string mscorlibPath;
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray(), out mscorlibPath);
foreach (ReferenceProjectItem rpi in referenceItems) {
if (string.IsNullOrEmpty(rpi.Redist)) continue;
if (!redistNameToRequiredFramework.ContainsKey(rpi.Redist)) {

28
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -654,22 +654,32 @@ namespace ICSharpCode.SharpDevelop.Project @@ -654,22 +654,32 @@ namespace ICSharpCode.SharpDevelop.Project
#region Type System
volatile ParseProjectContent parseProjectContent;
public override IProjectContent ProjectContent {
get {
if (parseProjectContent == null) {
lock (SyncRoot) {
if (parseProjectContent == null) {
parseProjectContent = new ParseProjectContent(this);
}
protected virtual ParseProjectContent CreateParseProjectContent()
{
return new ParseProjectContent(this);
}
ParseProjectContent GetParseProjectContent()
{
if (parseProjectContent == null) {
lock (SyncRoot) {
if (parseProjectContent == null) {
parseProjectContent = CreateParseProjectContent();
}
}
return parseProjectContent;
}
return parseProjectContent;
}
public override IProjectContent ProjectContent {
get {
return GetParseProjectContent();
}
}
public override ITypeResolveContext TypeResolveContext {
get {
return new CompositeTypeResolveContext(new ITypeResolveContext[] { this.ProjectContent, MinimalResolveContext.Instance });
return GetParseProjectContent().TypeResolveContext;
}
}
#endregion

14
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -137,9 +137,21 @@ namespace ICSharpCode.SharpDevelop.Project @@ -137,9 +137,21 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
volatile string mscorlibPath;
/// <summary>
/// Gets the path to mscorlib.
/// This property is set only after ResolveAssemblyReferences() is called.
/// </summary>
public string MscorlibPath {
get { return mscorlibPath; }
}
public override void ResolveAssemblyReferences()
{
MSBuildInternals.ResolveAssemblyReferences(this, null);
string mscorlib;
MSBuildInternals.ResolveAssemblyReferences(this, null, out mscorlib);
this.mscorlibPath = mscorlib;
}
#region CreateProjectItem

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

@ -162,7 +162,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -162,7 +162,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <param name="baseProject">The base project.</param>
/// <param name="referenceReplacements">A different set of references to use instead of those in the project.
/// Used by the GacReferencePanel.</param>
internal static void ResolveAssemblyReferences(MSBuildBasedProject baseProject, ReferenceProjectItem[] referenceReplacements)
internal static void ResolveAssemblyReferences(MSBuildBasedProject baseProject, ReferenceProjectItem[] referenceReplacements, out string mscorlibPath)
{
ProjectInstance project = baseProject.CreateProjectInstance();
project.SetProperty("BuildingProject", "false");
@ -215,18 +215,22 @@ namespace ICSharpCode.SharpDevelop.Project @@ -215,18 +215,22 @@ namespace ICSharpCode.SharpDevelop.Project
referenceDict[item.Include] = item;
}
mscorlibPath = null;
foreach (ProjectItemInstance item in project.GetItems("_ResolveAssemblyReferenceResolvedFiles")) {
DomAssemblyName assemblyName = new DomAssemblyName(item.GetMetadataValue("FusionName"));
string fullPath = FileUtility.GetAbsolutePath(baseProject.Directory, item.GetMetadataValue("Identity"));
string originalInclude = item.GetMetadataValue("OriginalItemSpec");
ReferenceProjectItem reference;
if (referenceDict.TryGetValue(originalInclude, out reference)) {
reference.AssemblyName = new DomAssemblyName(item.GetMetadataValue("FusionName"));
//string fullPath = item.GetEvaluatedMetadata("FullPath"); is incorrect for relative paths
string fullPath = FileUtility.GetAbsolutePath(baseProject.Directory, item.GetMetadataValue("Identity"));
reference.FileName = fullPath;
reference.Redist = item.GetMetadataValue("Redist");
LoggingService.Debug("Got information about " + originalInclude + "; fullpath=" + fullPath);
reference.DefaultCopyLocalValue = bool.Parse(item.GetMetadataValue("CopyLocal"));
} else if (string.Equals(assemblyName.ShortName, "mscorlib", StringComparison.OrdinalIgnoreCase)) {
LoggingService.Debug("Got information for mscorlib: " + fullPath);
mscorlibPath = fullPath;
} else {
LoggingService.Warn("Unknown item " + originalInclude);
}

1
src/Main/Base/Project/Src/Services/ParserService/AssemblyParserService.cs

@ -133,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -133,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Parser
#region Load Assembly + XML documentation
static IProjectContent LoadAssembly(string fileName, CancellationToken cancellationToken)
{
LoggingService.Debug("Loading " + fileName);
var param = new ReaderParameters();
param.AssemblyResolver = new DummyAssemblyResolver();
AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(fileName, param);

26
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -9,6 +9,7 @@ using System.Threading; @@ -9,6 +9,7 @@ using System.Threading;
using System.Threading.Tasks;
using ICSharpCode.Core;
using ICSharpCode.Editor;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
@ -17,16 +18,18 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -17,16 +18,18 @@ namespace ICSharpCode.SharpDevelop.Parser
{
public class ParseProjectContent : SimpleProjectContent, IDisposable
{
readonly IProject project;
readonly MSBuildBasedProject project;
readonly object lockObj = new object();
volatile ITypeResolveContext typeResolveContext;
bool initializing;
bool disposed;
public ParseProjectContent(IProject project)
public ParseProjectContent(MSBuildBasedProject project)
{
if (project == null)
throw new ArgumentNullException("project");
this.project = project;
this.typeResolveContext = MinimalResolveContext.Instance;
this.initializing = true;
LoadSolutionProjects.AddJob(Initialize, "Loading " + project.Name + "...", GetInitializationWorkAmount());
@ -42,6 +45,10 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -42,6 +45,10 @@ namespace ICSharpCode.SharpDevelop.Parser
initializing = false;
}
public ITypeResolveContext TypeResolveContext {
get { return typeResolveContext; }
}
public override string AssemblyName {
get { return project.AssemblyName; }
}
@ -75,6 +82,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -75,6 +82,7 @@ namespace ICSharpCode.SharpDevelop.Parser
resolveReferencesTask.Wait();
}
initializing = false;
}
void ParseFiles(ICollection<ProjectItem> projectItems, IProgressMonitor progressMonitor)
@ -114,6 +122,20 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -114,6 +122,20 @@ namespace ICSharpCode.SharpDevelop.Parser
return System.Threading.Tasks.Task.Factory.StartNew(
delegate {
project.ResolveAssemblyReferences();
List<ITypeResolveContext> contexts = new List<ITypeResolveContext>();
string mscorlib = project.MscorlibPath;
if (mscorlib != null && File.Exists(mscorlib)) {
var pc = AssemblyParserService.GetAssembly(FileName.Create(mscorlib), progressMonitor.CancellationToken);
contexts.Add(pc);
}
contexts.Add(this);
foreach (ReferenceProjectItem reference in projectItems.OfType<ReferenceProjectItem>()) {
if (File.Exists(reference.FileName)) {
var pc = AssemblyParserService.GetAssembly(FileName.Create(reference.FileName), progressMonitor.CancellationToken);
contexts.Add(pc);
}
}
this.typeResolveContext = new CompositeTypeResolveContext(contexts);
}, progressMonitor.CancellationToken);
}

Loading…
Cancel
Save