Browse Source

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
shortcuts
Daniel Grunwald 17 years ago
parent
commit
a79df36253
  1. 37
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs
  2. 7
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs

37
src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs

@ -8,6 +8,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -127,6 +128,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
ResolveResult results = ParserService.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, document.TextContent); ResolveResult results = ParserService.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, document.TextContent);
if (results == null)
return;
LanguageProperties language = ParserService.CurrentProjectContent.Language; LanguageProperties language = ParserService.CurrentProjectContent.Language;
TypeResolveResult trr = results as TypeResolveResult; TypeResolveResult trr = results as TypeResolveResult;
if (trr == null && language.AllowObjectConstructionOutsideContext) { if (trr == null && language.AllowObjectConstructionOutsideContext) {
@ -138,22 +141,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
constructorInsight = true; constructorInsight = true;
} }
if (constructorInsight) { if (constructorInsight) {
if (trr == null) { if (trr != null || expressionResult.Context == ExpressionContext.BaseConstructorCall) {
if ((expressionResult.Expression == "this") && (expressionResult.Context == ExpressionContext.BaseConstructorCall)) { if (results.ResolvedType != null) {
methods.AddRange(GetConstructorMethods(results.ResolvedType.GetMethods())); methods.AddRange(GetConstructorMethods(results.ResolvedType.GetMethods()));
} IClass resolvedClass = (trr != null) ? trr.ResolvedClass : results.ResolvedType.GetUnderlyingClass();
if (methods.Count == 0 && resolvedClass != null && !resolvedClass.IsStatic) {
if ((expressionResult.Expression == "base") && (expressionResult.Context == ExpressionContext.BaseConstructorCall)) { // add default constructor
if (results.CallingClass.BaseType.DotNetName == "System.Object") methods.Add(Constructor.CreateDefault(resolvedClass));
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));
} }
} }
} else { } else {
@ -189,15 +184,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
} }
List<IMethodOrProperty> GetConstructorMethods(List<IMethod> methods) IEnumerable<IMethodOrProperty> GetConstructorMethods(List<IMethod> methods)
{ {
List<IMethodOrProperty> constructorMethods = new List<IMethodOrProperty>(); return from method in methods
foreach (IMethod method in methods) { where method.IsConstructor && !method.IsStatic
if (method.IsConstructor && !method.IsStatic) { select (IMethodOrProperty)method;
constructorMethods.Add(method);
}
}
return constructorMethods;
} }
public bool CaretOffsetChanged() public bool CaretOffsetChanged()

7
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/VBNetToCSharpConvertVisitor.cs

@ -7,6 +7,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Ast; using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.AstBuilder; using ICSharpCode.NRefactory.AstBuilder;
@ -383,7 +384,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
bool ReplaceWithInvocation(Expression expression, ResolveResult rr) 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) && !(expression.Parent is AddressOfExpression)
&& !(NRefactoryResolver.IsInvoked(expression))) && !(NRefactoryResolver.IsInvoked(expression)))
{ {

Loading…
Cancel
Save