Browse Source

Fixed SD2-434: Reference locking issue

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@429 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
86dfaa1bf3
  1. 7
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 30
      src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs
  3. 7
      src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs

7
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -99,12 +99,14 @@ namespace CSharpBinding
string documentText = editor.Text; string documentText = editor.Text;
int position = editor.ActiveTextAreaControl.Caret.Offset - 2; int position = editor.ActiveTextAreaControl.Caret.Offset - 2;
if (position > 0 && (documentText[position + 1] == '+' || documentText[position + 1] == '-')) { if (position > 0 && (documentText[position + 1] == '+')) {
ExpressionResult result = ef.FindFullExpression(documentText, position); ExpressionResult result = ef.FindFullExpression(documentText, position);
if(result.Expression != null) { if(result.Expression != null) {
ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line, editor.ActiveTextAreaControl.Caret.Column, editor.FileName, documentText); ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line, editor.ActiveTextAreaControl.Caret.Column, editor.FileName, documentText);
if (resolveResult.ResolvedType.GetUnderlyingClass().IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) { if (resolveResult != null && resolveResult.ResolvedType != null) {
IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass();
if (underlyingClass.IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) {
EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult);
eventHandlerProvider.InsertSpace = true; eventHandlerProvider.InsertSpace = true;
editor.ShowCompletionWindow(eventHandlerProvider, ch); editor.ShowCompletionWindow(eventHandlerProvider, ch);
@ -112,6 +114,7 @@ namespace CSharpBinding
} }
} }
} }
}
return base.HandleKeyPress(editor, ch); return base.HandleKeyPress(editor, ch);
} }

30
src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs

@ -117,9 +117,9 @@ namespace ICSharpCode.Core
try { try {
try { try {
if (File.Exists(itemFileName)) { if (File.Exists(itemFileName)) {
assembly = Assembly.ReflectionOnlyLoadFrom(itemFileName); assembly = LoadReflectionOnlyAssemblyFrom(itemFileName);
if (assembly != null) { if (assembly != null) {
contents[itemFileName] = new ReflectionProjectContent(assembly); contents[itemFileName] = new ReflectionProjectContent(assembly, itemFileName);
contents[assembly.FullName] = contents[itemFileName]; contents[assembly.FullName] = contents[itemFileName];
#if DEBUG #if DEBUG
how = "ReflectionOnly"; how = "ReflectionOnly";
@ -198,15 +198,15 @@ namespace ICSharpCode.Core
string path = Path.Combine(lookupDirectory, name.Name); string path = Path.Combine(lookupDirectory, name.Name);
if (File.Exists(path + ".dll")) { if (File.Exists(path + ".dll")) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .dll file"); LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .dll file");
return Assembly.ReflectionOnlyLoadFrom(path + ".dll"); return LoadReflectionOnlyAssemblyFrom(path + ".dll");
} }
if (File.Exists(path + ".exe")) { if (File.Exists(path + ".exe")) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .exe file"); LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .exe file");
return Assembly.ReflectionOnlyLoadFrom(path + ".exe"); return LoadReflectionOnlyAssemblyFrom(path + ".exe");
} }
if (File.Exists(path)) { if (File.Exists(path)) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom file"); LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom file");
return Assembly.ReflectionOnlyLoadFrom(path); return LoadReflectionOnlyAssemblyFrom(path);
} }
try { try {
LoggingService.Debug("AssemblyResolve trying ReflectionOnlyLoad"); LoggingService.Debug("AssemblyResolve trying ReflectionOnlyLoad");
@ -221,6 +221,26 @@ namespace ICSharpCode.Core
} }
} }
static Assembly LoadReflectionOnlyAssemblyFrom(string fileName)
{
byte[] data;
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
if (fs.Length > 10 * 1024 * 1024) {
// more than 10 MB? Do not hold bytes in memory
return Assembly.ReflectionOnlyLoadFrom(fileName);
}
data = new byte[fs.Length];
for (int i = 0; i < data.Length;) {
int c = fs.Read(data, i, data.Length - i);
i += c;
if (c <= 0) {
throw new IOException("Read returned " + c);
}
}
}
return Assembly.ReflectionOnlyLoad(data);
}
public static AssemblyName FindBestMatchingAssemblyName(string name) public static AssemblyName FindBestMatchingAssemblyName(string name)
{ {
string[] info = name.Split(','); string[] info = name.Split(',');

7
src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs

@ -23,6 +23,11 @@ namespace ICSharpCode.Core
Assembly assembly; Assembly assembly;
public ReflectionProjectContent(Assembly assembly) public ReflectionProjectContent(Assembly assembly)
: this(assembly, assembly.Location)
{
}
public ReflectionProjectContent(Assembly assembly, string assemblyLocation)
{ {
this.assembly = assembly; this.assembly = assembly;
@ -44,7 +49,7 @@ namespace ICSharpCode.Core
AddClassToNamespaceListInternal(new ReflectionClass.VoidClass(assemblyCompilationUnit)); AddClassToNamespaceListInternal(new ReflectionClass.VoidClass(assemblyCompilationUnit));
} }
string fileName = LookupLocalizedXmlDoc(assembly.Location); string fileName = LookupLocalizedXmlDoc(assemblyLocation);
// Not found -> look in runtime directory. // Not found -> look in runtime directory.
if (fileName == null) { if (fileName == null) {
string runtimeDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); string runtimeDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();

Loading…
Cancel
Save