Browse Source

Force all project contents in a registry to use the same version of .NET assemblies based on the target framework of the project - a .NET 2.0 project referencing .NET 1.1 projects will see .NET 2.0 completion for objects returned by the .NET 1.1 assembly.

Fixed bug that caused assemblies referenced by CF projects to always reference .NET 2.0 projects, causing code-completion to fail when the .NET 2.0 registry was not initialized

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2138 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
491ae3cacf
  1. 16
      src/Main/Base/Project/Src/Services/ParserService/Net1xProjectContentRegistry.cs
  2. 20
      src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs
  3. 38
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

16
src/Main/Base/Project/Src/Services/ParserService/Net1xProjectContentRegistry.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop
protected override IProjectContent LoadProjectContent(string itemInclude, string itemFileName) protected override IProjectContent LoadProjectContent(string itemInclude, string itemFileName)
{ {
if (File.Exists(itemFileName)) { if (File.Exists(itemFileName)) {
return ParserService.DefaultProjectContentRegistry.GetProjectContentForReference(itemInclude, itemFileName); return base.LoadProjectContent(itemInclude, itemFileName);
} }
string netPath = Path.Combine(FileUtility.NETFrameworkInstallRoot, DotnetVersion); string netPath = Path.Combine(FileUtility.NETFrameworkInstallRoot, DotnetVersion);
if (File.Exists(Path.Combine(netPath, "mscorlib.dll"))) { if (File.Exists(Path.Combine(netPath, "mscorlib.dll"))) {
@ -38,10 +38,18 @@ namespace ICSharpCode.SharpDevelop
shortName = shortName.Substring(0, pos); shortName = shortName.Substring(0, pos);
if (File.Exists(Path.Combine(netPath, shortName + ".dll"))) { if (File.Exists(Path.Combine(netPath, shortName + ".dll"))) {
return CecilReader.LoadAssembly(Path.Combine(netPath, shortName + ".dll"), this); ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName + ".dll"), this);
if (rpc != null) {
redirectedAssemblyNames.Add(shortName, rpc.AssemblyFullName);
}
return rpc;
} else if (File.Exists(Path.Combine(netPath, shortName))) { } else if (File.Exists(Path.Combine(netPath, shortName))) {
// perhaps shortName includes file extension // perhaps shortName includes file extension
return CecilReader.LoadAssembly(Path.Combine(netPath, shortName), this); ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName), this);
if (rpc != null) {
redirectedAssemblyNames.Add(Path.GetFileNameWithoutExtension(shortName), rpc.AssemblyFullName);
}
return rpc;
} }
} else { } else {
string message = "Warning: Target .NET Framework version " + DotnetVersion + " is not installed." + Environment.NewLine; string message = "Warning: Target .NET Framework version " + DotnetVersion + " is not installed." + Environment.NewLine;
@ -49,7 +57,7 @@ namespace ICSharpCode.SharpDevelop
TaskService.BuildMessageViewCategory.AppendText(message); TaskService.BuildMessageViewCategory.AppendText(message);
} }
} }
return ParserService.DefaultProjectContentRegistry.GetProjectContentForReference(itemInclude, itemFileName); return base.LoadProjectContent(itemInclude, itemFileName);
} }
} }

20
src/Main/Base/Project/Src/Services/ParserService/NetCFProjectContentRegistry.cs

@ -32,10 +32,14 @@ namespace ICSharpCode.SharpDevelop
return null; return null;
} }
protected override IProjectContent LoadProjectContent(string itemInclude, string itemFileName) protected override IProjectContent LoadProjectContent(string itemInclude, string itemFileName)
{ {
if (File.Exists(itemFileName)) { if (File.Exists(itemFileName)) {
return ParserService.DefaultProjectContentRegistry.GetProjectContentForReference(itemInclude, itemFileName); // we cannot reuse project contents from the default registry because they would
// reference the wrong mscorlib version, causing code-completion problems
// when a CF application references a CF library
return base.LoadProjectContent(itemInclude, itemFileName);
} }
string netPath = GetInstallFolder(); string netPath = GetInstallFolder();
if (!string.IsNullOrEmpty(netPath) && File.Exists(Path.Combine(netPath, "mscorlib.dll"))) { if (!string.IsNullOrEmpty(netPath) && File.Exists(Path.Combine(netPath, "mscorlib.dll"))) {
@ -45,10 +49,18 @@ namespace ICSharpCode.SharpDevelop
shortName = shortName.Substring(0, pos); shortName = shortName.Substring(0, pos);
if (File.Exists(Path.Combine(netPath, shortName + ".dll"))) { if (File.Exists(Path.Combine(netPath, shortName + ".dll"))) {
return CecilReader.LoadAssembly(Path.Combine(netPath, shortName + ".dll"), this); ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName + ".dll"), this);
if (rpc != null) {
redirectedAssemblyNames.Add(shortName, rpc.AssemblyFullName);
}
return rpc;
} else if (File.Exists(Path.Combine(netPath, shortName))) { } else if (File.Exists(Path.Combine(netPath, shortName))) {
// perhaps shortName includes file extension // perhaps shortName includes file extension
return CecilReader.LoadAssembly(Path.Combine(netPath, shortName), this); ReflectionProjectContent rpc = CecilReader.LoadAssembly(Path.Combine(netPath, shortName), this);
if (rpc != null) {
redirectedAssemblyNames.Add(Path.GetFileNameWithoutExtension(shortName), rpc.AssemblyFullName);
}
return rpc;
} }
} else { } else {
string message = "Warning: .NET Compact Framework SDK is not installed." + Environment.NewLine; string message = "Warning: .NET Compact Framework SDK is not installed." + Environment.NewLine;
@ -56,7 +68,7 @@ namespace ICSharpCode.SharpDevelop
TaskService.BuildMessageViewCategory.AppendText(message); TaskService.BuildMessageViewCategory.AppendText(message);
} }
} }
return ParserService.DefaultProjectContentRegistry.GetProjectContentForReference(itemInclude, itemFileName); return base.LoadProjectContent(itemInclude, itemFileName);
} }
} }
} }

38
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

@ -24,6 +24,11 @@ namespace ICSharpCode.SharpDevelop.Dom
internal DomPersistence persistence; internal DomPersistence persistence;
internal Dictionary<string, IProjectContent> contents = new Dictionary<string, IProjectContent>(StringComparer.InvariantCultureIgnoreCase); internal Dictionary<string, IProjectContent> contents = new Dictionary<string, IProjectContent>(StringComparer.InvariantCultureIgnoreCase);
/// <summary>
/// Redirects short names to long names. Used to redirect .NET libraries to the chosen .NET version
/// </summary>
protected Dictionary<string, string> redirectedAssemblyNames = new Dictionary<string, string>();
/// <summary> /// <summary>
/// Disposes all project contents stored in this registry. /// Disposes all project contents stored in this registry.
/// </summary> /// </summary>
@ -167,6 +172,9 @@ namespace ICSharpCode.SharpDevelop.Dom
contents["mscorlib"] = mscorlibContent; contents["mscorlib"] = mscorlibContent;
contents[mscorlibContent.AssemblyFullName] = mscorlibContent; contents[mscorlibContent.AssemblyFullName] = mscorlibContent;
contents[mscorlibContent.AssemblyLocation] = mscorlibContent; contents[mscorlibContent.AssemblyLocation] = mscorlibContent;
lock (redirectedAssemblyNames) {
redirectedAssemblyNames.Add("mscorlib", mscorlibContent.AssemblyFullName);
}
return mscorlibContent; return mscorlibContent;
} }
} }
@ -186,6 +194,20 @@ namespace ICSharpCode.SharpDevelop.Dom
public virtual IProjectContent GetExistingProjectContent(string itemInclude, string itemFileName) public virtual IProjectContent GetExistingProjectContent(string itemInclude, string itemFileName)
{ {
if (itemFileName == itemInclude) {
string shortName = itemInclude;
int pos = shortName.IndexOf(',');
if (pos > 0)
shortName = shortName.Substring(0, pos);
// redirect all references to .NET default assemblies to the .NET version this registry uses
lock (redirectedAssemblyNames) {
if (redirectedAssemblyNames.ContainsKey(shortName)) {
itemFileName = redirectedAssemblyNames[shortName];
itemInclude = shortName;
}
}
}
lock (contents) { lock (contents) {
if (contents.ContainsKey(itemFileName)) { if (contents.ContainsKey(itemFileName)) {
return contents[itemFileName]; return contents[itemFileName];
@ -200,11 +222,9 @@ namespace ICSharpCode.SharpDevelop.Dom
public virtual IProjectContent GetProjectContentForReference(string itemInclude, string itemFileName) public virtual IProjectContent GetProjectContentForReference(string itemInclude, string itemFileName)
{ {
lock (contents) { lock (contents) {
if (contents.ContainsKey(itemFileName)) { IProjectContent pc = GetExistingProjectContent(itemInclude, itemFileName);
return contents[itemFileName]; if (pc != null) {
} return pc;
if (contents.ContainsKey(itemInclude)) {
return contents[itemInclude];
} }
LoggingService.Debug("Loading PC for " + itemInclude); LoggingService.Debug("Loading PC for " + itemInclude);
@ -219,7 +239,6 @@ namespace ICSharpCode.SharpDevelop.Dom
int time = Environment.TickCount; int time = Environment.TickCount;
#endif #endif
IProjectContent pc = null;
try { try {
pc = LoadProjectContent(itemInclude, itemFileName); pc = LoadProjectContent(itemInclude, itemFileName);
} catch (Exception ex) { } catch (Exception ex) {
@ -262,6 +281,13 @@ namespace ICSharpCode.SharpDevelop.Dom
persistence.SaveProjectContent(pc); persistence.SaveProjectContent(pc);
} }
} }
if (pc != null) {
// add default .NET assemblies to redirected assemblies (both when loaded from persistence
// and when loaded using Reflection)
lock (redirectedAssemblyNames) {
redirectedAssemblyNames.Add(shortName, pc.AssemblyFullName);
}
}
} else { } else {
// find real file name for cecil: // find real file name for cecil:
if (File.Exists(itemFileName)) { if (File.Exists(itemFileName)) {

Loading…
Cancel
Save