diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs index f4014249c1..c335ad3174 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheck.cs @@ -14,30 +14,40 @@ namespace SharpRefactoring.ContextActions { public override bool IsAvailable(EditorContext context) { - var paramAtCaret = GetParameterAtCaret(context.CurrentSymbol); + var paramAtCaret = GetParameterAtCaret(context); if (paramAtCaret == null) return false; return IsAvailable(paramAtCaret.ResolvedType); } - public LocalResolveResult GetParameterAtCaret(ResolveResult symbol) + public LocalResolveResult GetParameterAtCaret(EditorContext context) { - LocalResolveResult param = symbol as LocalResolveResult; - if (param == null || param.CallingClass == null || param.ResolvedType == null) + LocalResolveResult paramAtCaret = context.CurrentSymbol as LocalResolveResult; + if (paramAtCaret == null || paramAtCaret.CallingClass == null || paramAtCaret.ResolvedType == null) return null; - if (param.CallingClass.ProjectContent.Language != LanguageProperties.CSharp) + // only for C# + if (paramAtCaret.CallingClass.ProjectContent.Language != LanguageProperties.CSharp) return null; - if (!param.IsParameter) + if (!paramAtCaret.IsParameter) return null; - // FIXME must be parameter definition, and method with body (not interface or abstract) - return param; + // must be definition + 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) { - var paramAtCaret = GetParameterAtCaret(context.CurrentSymbol); - Extensions.AddCodeToMethodStart(paramAtCaret.CallingMember, context.Editor, GetCodeToInsert(paramAtCaret.VariableName)); + var paramAtCaret = GetParameterAtCaret(context); + if (paramAtCaret != null) + { + Extensions.AddCodeToMethodStart(paramAtCaret.CallingMember, context.Editor, GetCodeToInsert(paramAtCaret.VariableName)); + } } public abstract bool IsAvailable(IReturnType parameterType); diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs index dfbe51706f..df72a5ec6e 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/ParamCheckForNull.cs @@ -19,7 +19,8 @@ namespace SharpRefactoring.ContextActions public override bool IsAvailable(IReturnType parameterType) { 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) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs index b2fa729907..5fdb21f499 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IEntity.cs @@ -49,6 +49,10 @@ namespace ICSharpCode.SharpDevelop.Dom get; } + /// + /// Returns true if this entity has the 'abstract' modifier set. + /// (Returns false for interface members). + /// bool IsAbstract { get; }