From 58d070bbf7630dac168a40c2d5b4dd2d59a39121 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 27 Feb 2007 16:43:15 +0000 Subject: [PATCH] Fixed SD2-1307: Code completion for NHibernate git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.1@2408 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../ICSharpCode.SharpDevelop.Dom.csproj | 1 + .../Project/Src/CecilReader.cs | 6 +-- .../Src/ProjectContent/DomAssemblyName.cs | 39 +++++++++++++++++++ .../ProjectContent/ProjectContentRegistry.cs | 6 +++ .../ReflectionProjectContent.cs | 34 ++++++++++------ .../Src/ReflectionLayer/DomPersistence.cs | 8 ++-- 6 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DomAssemblyName.cs diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj index c729757248..c3bf9f6e44 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj @@ -88,6 +88,7 @@ + diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs index a299d4e047..e3b908de64 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CecilReader.cs @@ -24,9 +24,9 @@ namespace ICSharpCode.SharpDevelop.Dom throw new ArgumentNullException("registry"); LoggingService.Info("Cecil: Load from " + fileName); AssemblyDefinition asm = AssemblyFactory.GetAssembly(fileName); - List referencedAssemblies = new List(); + List referencedAssemblies = new List(); foreach (AssemblyNameReference anr in asm.MainModule.AssemblyReferences) { - referencedAssemblies.Add(new AssemblyName(anr.FullName)); + referencedAssemblies.Add(new DomAssemblyName(anr.FullName)); } return new CecilProjectContent(asm.Name.FullName, fileName, referencedAssemblies.ToArray(), asm.MainModule.Types, registry); } @@ -121,7 +121,7 @@ namespace ICSharpCode.SharpDevelop.Dom private sealed class CecilProjectContent : ReflectionProjectContent { - public CecilProjectContent(string fullName, string fileName, AssemblyName[] referencedAssemblies, + public CecilProjectContent(string fullName, string fileName, DomAssemblyName[] referencedAssemblies, TypeDefinitionCollection types, ProjectContentRegistry registry) : base(fullName, fileName, referencedAssemblies, registry) { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DomAssemblyName.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DomAssemblyName.cs new file mode 100644 index 0000000000..d1ddb78dea --- /dev/null +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DomAssemblyName.cs @@ -0,0 +1,39 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.SharpDevelop.Dom +{ + /// + /// Similar to System.Reflection.AssemblyName, but does not raise an exception + /// on invalid assembly names. (See SD2-1307) + /// + public sealed class DomAssemblyName + { + readonly string fullAssemblyName; + + public DomAssemblyName(string fullAssemblyName) + { + this.fullAssemblyName = fullAssemblyName; + } + + public string FullName { + get { return fullAssemblyName; } + } + + internal static DomAssemblyName[] Convert(System.Reflection.AssemblyName[] names) + { + if (names == null) return null; + DomAssemblyName[] n = new DomAssemblyName[names.Length]; + for (int i = 0; i < names.Length; i++) { + n[i] = new DomAssemblyName(names[i].FullName); + } + return n; + } + } +} diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs index 0daa866b06..2e0ac70981 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs @@ -192,11 +192,17 @@ namespace ICSharpCode.SharpDevelop.Dom } } + [Obsolete("Use DomAssemblyName instead of AssemblyName")] public IProjectContent GetExistingProjectContent(AssemblyName assembly) { return GetExistingProjectContent(assembly.FullName, assembly.FullName); } + public IProjectContent GetExistingProjectContent(DomAssemblyName assembly) + { + return GetExistingProjectContent(assembly.FullName, assembly.FullName); + } + public virtual IProjectContent GetExistingProjectContent(string itemInclude, string itemFileName) { if (itemFileName == itemInclude) { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs index 87d9b39fb9..661691f47d 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ReflectionProjectContent.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.SharpDevelop.Dom public class ReflectionProjectContent : DefaultProjectContent { string assemblyFullName; - AssemblyName[] referencedAssemblies; + DomAssemblyName[] referencedAssemblyNames; ICompilationUnit assemblyCompilationUnit; string assemblyLocation; ProjectContentRegistry registry; @@ -35,16 +35,20 @@ namespace ICSharpCode.SharpDevelop.Dom } } + [Obsolete("This property always returns an empty array! Use ReferencedAssemblyNames instead!")] public AssemblyName[] ReferencedAssemblies { - get { - return referencedAssemblies; - } + get { return new AssemblyName[0]; } + } + + /// + /// Gets the list of assembly names referenced by this project content. + /// + public IList ReferencedAssemblyNames { + get { return Array.AsReadOnly(referencedAssemblyNames); } } public ICompilationUnit AssemblyCompilationUnit { - get { - return assemblyCompilationUnit; - } + get { return assemblyCompilationUnit; } } DateTime assemblyFileLastWriteTime; @@ -73,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Dom } public ReflectionProjectContent(Assembly assembly, string assemblyLocation, ProjectContentRegistry registry) - : this(assembly.FullName, assemblyLocation, assembly.GetReferencedAssemblies(), registry) + : this(assembly.FullName, assemblyLocation, DomAssemblyName.Convert(assembly.GetReferencedAssemblies()), registry) { foreach (Type type in assembly.GetExportedTypes()) { string name = type.FullName; @@ -84,7 +88,13 @@ namespace ICSharpCode.SharpDevelop.Dom InitializeSpecialClasses(); } + [Obsolete("Use DomAssemblyName instead of AssemblyName!")] public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, AssemblyName[] referencedAssemblies, ProjectContentRegistry registry) + : this(assemblyFullName, assemblyLocation, DomAssemblyName.Convert(referencedAssemblies), registry) + { + } + + public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, DomAssemblyName[] referencedAssemblies, ProjectContentRegistry registry) { if (assemblyFullName == null) throw new ArgumentNullException("assemblyFullName"); @@ -95,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.Dom this.registry = registry; this.assemblyFullName = assemblyFullName; - this.referencedAssemblies = referencedAssemblies; + this.referencedAssemblyNames = referencedAssemblies; this.assemblyLocation = assemblyLocation; this.assemblyCompilationUnit = new DefaultCompilationUnit(this); @@ -146,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.Dom } bool initialized = false; - List missingNames; + List missingNames; public void InitializeReferences() { @@ -169,7 +179,7 @@ namespace ICSharpCode.SharpDevelop.Dom } } else { initialized = true; - foreach (AssemblyName name in referencedAssemblies) { + foreach (DomAssemblyName name in referencedAssemblyNames) { IProjectContent content = registry.GetExistingProjectContent(name); if (content != null) { changed = true; @@ -178,7 +188,7 @@ namespace ICSharpCode.SharpDevelop.Dom } } else { if (missingNames == null) - missingNames = new List(); + missingNames = new List(); missingNames.Add(name); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs index 87e3d0b471..f5c1aa44c6 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ReflectionLayer/DomPersistence.cs @@ -249,8 +249,8 @@ namespace ICSharpCode.SharpDevelop.Dom time = File.GetLastWriteTimeUtc(pc.AssemblyLocation).ToFileTime(); } catch {} writer.Write(time); - writer.Write(pc.ReferencedAssemblies.Length); - foreach (AssemblyName name in pc.ReferencedAssemblies) { + writer.Write(pc.ReferencedAssemblyNames.Count); + foreach (DomAssemblyName name in pc.ReferencedAssemblyNames) { writer.Write(name.FullName); } WriteClasses(); @@ -281,9 +281,9 @@ namespace ICSharpCode.SharpDevelop.Dom LoggingService.Warn("Read dom: assembly changed since cache was created"); return null; } - AssemblyName[] referencedAssemblies = new AssemblyName[reader.ReadInt32()]; + DomAssemblyName[] referencedAssemblies = new DomAssemblyName[reader.ReadInt32()]; for (int i = 0; i < referencedAssemblies.Length; i++) { - referencedAssemblies[i] = new AssemblyName(reader.ReadString()); + referencedAssemblies[i] = new DomAssemblyName(reader.ReadString()); } this.pc = new ReflectionProjectContent(assemblyName, assemblyLocation, referencedAssemblies, registry); if (ReadClasses()) {