From a79df36253ca7987e5f15b7c0be10110d5d15bbc Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 19 Dec 2008 14:36:20 +0000 Subject: [PATCH] Fixed NullReferenceException in MethodInsightDataProvider. Code converter: when an identifier cannot be resolved, don't assume it's a method. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3692 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../MethodInsightDataProvider.cs | 37 +++++++------------ .../VBNetToCSharpConvertVisitor.cs | 7 +++- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs index 9c076bac7c..08c629978b 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs @@ -8,6 +8,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; @@ -127,6 +128,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor } ResolveResult results = ParserService.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, document.TextContent); + if (results == null) + return; LanguageProperties language = ParserService.CurrentProjectContent.Language; TypeResolveResult trr = results as TypeResolveResult; if (trr == null && language.AllowObjectConstructionOutsideContext) { @@ -138,22 +141,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor constructorInsight = true; } if (constructorInsight) { - if (trr == null) { - if ((expressionResult.Expression == "this") && (expressionResult.Context == ExpressionContext.BaseConstructorCall)) { + if (trr != null || expressionResult.Context == ExpressionContext.BaseConstructorCall) { + if (results.ResolvedType != null) { methods.AddRange(GetConstructorMethods(results.ResolvedType.GetMethods())); - } - - if ((expressionResult.Expression == "base") && (expressionResult.Context == ExpressionContext.BaseConstructorCall)) { - if (results.CallingClass.BaseType.DotNetName == "System.Object") - return; - methods.AddRange(GetConstructorMethods(results.CallingClass.BaseType.GetMethods())); - } - } else { - methods.AddRange(GetConstructorMethods(trr.ResolvedType.GetMethods())); - - if (methods.Count == 0 && trr.ResolvedClass != null && !trr.ResolvedClass.IsAbstract && !trr.ResolvedClass.IsStatic) { - // add default constructor - methods.Add(Constructor.CreateDefault(trr.ResolvedClass)); + IClass resolvedClass = (trr != null) ? trr.ResolvedClass : results.ResolvedType.GetUnderlyingClass(); + if (methods.Count == 0 && resolvedClass != null && !resolvedClass.IsStatic) { + // add default constructor + methods.Add(Constructor.CreateDefault(resolvedClass)); + } } } } else { @@ -189,15 +184,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor } } - List GetConstructorMethods(List methods) + IEnumerable GetConstructorMethods(List methods) { - List constructorMethods = new List(); - foreach (IMethod method in methods) { - if (method.IsConstructor && !method.IsStatic) { - constructorMethods.Add(method); - } - } - return constructorMethods; + return from method in methods + where method.IsConstructor && !method.IsStatic + select (IMethodOrProperty)method; } public bool CaretOffsetChanged() diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs index a1a23c1942..7add62c397 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Linq; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.AstBuilder; @@ -383,7 +384,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver bool ReplaceWithInvocation(Expression expression, ResolveResult rr) { - if (rr is MethodGroupResolveResult + // replace with invocation if rr is a method + // and were not taking the address and it's not already being invoked + MethodGroupResolveResult mgrr = rr as MethodGroupResolveResult; + if (mgrr != null + && mgrr.Methods.Any(g=>g.Count>0) && !(expression.Parent is AddressOfExpression) && !(NRefactoryResolver.IsInvoked(expression))) {