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 @@ @@ -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 @@ -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 @@ -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 @@ -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>();
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()

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

@ -7,6 +7,7 @@ @@ -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 @@ -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)))
{

Loading…
Cancel
Save