Browse Source

Context actions - Fix: "Add check for null" is offered only for parameter definitions of non-abstract methods.

pull/15/head
mkonicek 15 years ago
parent
commit
1e8e0353c0
  1. 32
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs
  2. 3
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs
  3. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs

32
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs

@ -14,30 +14,40 @@ namespace SharpRefactoring.ContextActions
{ {
public override bool IsAvailable(EditorContext context) public override bool IsAvailable(EditorContext context)
{ {
var paramAtCaret = GetParameterAtCaret(context.CurrentSymbol); var paramAtCaret = GetParameterAtCaret(context);
if (paramAtCaret == null) if (paramAtCaret == null)
return false; return false;
return IsAvailable(paramAtCaret.ResolvedType); return IsAvailable(paramAtCaret.ResolvedType);
} }
public LocalResolveResult GetParameterAtCaret(ResolveResult symbol) public LocalResolveResult GetParameterAtCaret(EditorContext context)
{ {
LocalResolveResult param = symbol as LocalResolveResult; LocalResolveResult paramAtCaret = context.CurrentSymbol as LocalResolveResult;
if (param == null || param.CallingClass == null || param.ResolvedType == null) if (paramAtCaret == null || paramAtCaret.CallingClass == null || paramAtCaret.ResolvedType == null)
return null; return null;
if (param.CallingClass.ProjectContent.Language != LanguageProperties.CSharp) // only for C#
if (paramAtCaret.CallingClass.ProjectContent.Language != LanguageProperties.CSharp)
return null; return null;
if (!param.IsParameter) if (!paramAtCaret.IsParameter)
return null; return null;
// FIXME must be parameter definition, and method with body (not interface or abstract) // must be definition
return param; if (!paramAtCaret.VariableDefinitionRegion.IsInside(context.CurrentExpression.Region.BeginLine, context.CurrentExpression.Region.BeginColumn))
return null;
// must be not abstract/interface method
if (paramAtCaret.CallingMember == null || paramAtCaret.CallingMember.IsAbstract ||
paramAtCaret.CallingMember.DeclaringType.ClassType == ClassType.Interface)
return null;
return paramAtCaret;
} }
public override void Execute(EditorContext context) public override void Execute(EditorContext context)
{ {
var paramAtCaret = GetParameterAtCaret(context.CurrentSymbol); var paramAtCaret = GetParameterAtCaret(context);
Extensions.AddCodeToMethodStart(paramAtCaret.CallingMember, context.Editor, GetCodeToInsert(paramAtCaret.VariableName)); if (paramAtCaret != null)
{
Extensions.AddCodeToMethodStart(paramAtCaret.CallingMember, context.Editor, GetCodeToInsert(paramAtCaret.VariableName));
}
} }
public abstract bool IsAvailable(IReturnType parameterType); public abstract bool IsAvailable(IReturnType parameterType);

3
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs

@ -19,7 +19,8 @@ namespace SharpRefactoring.ContextActions
public override bool IsAvailable(IReturnType parameterType) public override bool IsAvailable(IReturnType parameterType)
{ {
var parameterTypeClass = parameterType.GetUnderlyingClass(); var parameterTypeClass = parameterType.GetUnderlyingClass();
return (parameterTypeClass == null || parameterTypeClass.ClassType != ClassType.Enum && parameterTypeClass.ClassType != ClassType.Struct); return (parameterTypeClass == null ||
(parameterTypeClass.ClassType != ClassType.Enum && parameterTypeClass.ClassType != ClassType.Struct));
} }
public override string GetCodeToInsert(string parameterName) public override string GetCodeToInsert(string parameterName)

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs

@ -49,6 +49,10 @@ namespace ICSharpCode.SharpDevelop.Dom
get; get;
} }
/// <summary>
/// Returns true if this entity has the 'abstract' modifier set.
/// (Returns false for interface members).
/// </summary>
bool IsAbstract { bool IsAbstract {
get; get;
} }

Loading…
Cancel
Save