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. 13
      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

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

@ -99,15 +99,18 @@ namespace CSharpBinding @@ -99,15 +99,18 @@ namespace CSharpBinding
string documentText = editor.Text;
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);
if(result.Expression != null) {
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"))) {
EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult);
eventHandlerProvider.InsertSpace = true;
editor.ShowCompletionWindow(eventHandlerProvider, ch);
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);
eventHandlerProvider.InsertSpace = true;
editor.ShowCompletionWindow(eventHandlerProvider, ch);
}
}
}
}

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

@ -117,9 +117,9 @@ namespace ICSharpCode.Core @@ -117,9 +117,9 @@ namespace ICSharpCode.Core
try {
try {
if (File.Exists(itemFileName)) {
assembly = Assembly.ReflectionOnlyLoadFrom(itemFileName);
assembly = LoadReflectionOnlyAssemblyFrom(itemFileName);
if (assembly != null) {
contents[itemFileName] = new ReflectionProjectContent(assembly);
contents[itemFileName] = new ReflectionProjectContent(assembly, itemFileName);
contents[assembly.FullName] = contents[itemFileName];
#if DEBUG
how = "ReflectionOnly";
@ -198,15 +198,15 @@ namespace ICSharpCode.Core @@ -198,15 +198,15 @@ namespace ICSharpCode.Core
string path = Path.Combine(lookupDirectory, name.Name);
if (File.Exists(path + ".dll")) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .dll file");
return Assembly.ReflectionOnlyLoadFrom(path + ".dll");
return LoadReflectionOnlyAssemblyFrom(path + ".dll");
}
if (File.Exists(path + ".exe")) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom .exe file");
return Assembly.ReflectionOnlyLoadFrom(path + ".exe");
return LoadReflectionOnlyAssemblyFrom(path + ".exe");
}
if (File.Exists(path)) {
LoggingService.Debug("AssemblyResolve ReflectionOnlyLoadFrom file");
return Assembly.ReflectionOnlyLoadFrom(path);
return LoadReflectionOnlyAssemblyFrom(path);
}
try {
LoggingService.Debug("AssemblyResolve trying ReflectionOnlyLoad");
@ -221,6 +221,26 @@ namespace ICSharpCode.Core @@ -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)
{
string[] info = name.Split(',');

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

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

Loading…
Cancel
Save