Browse Source

Refactored EditorContext to allow sharing of data between Context actions.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6387 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
e0be701baa
  1. 2
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.csproj
  2. 34
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentCache.cs
  3. 18
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentNotNull.cs
  4. 18
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentNull.cs
  5. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  6. 4
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextAction.cs
  7. 47
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs
  8. 18
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/IContextActionCache.cs

2
src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.csproj

@ -71,7 +71,7 @@ @@ -71,7 +71,7 @@
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\ClassRefactoringSubmenuBuilder.cs" />
<Compile Include="Src\ContextActions\AddUsing.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentAction.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentCache.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentNull.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentNotNull.cs" />
<Compile Include="Src\ContextActions\DelegateAction.cs" />

34
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentAction.cs → src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentCache.cs

@ -14,15 +14,29 @@ using ICSharpCode.SharpDevelop.Refactoring; @@ -14,15 +14,29 @@ using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of CheckAssignmentAction.
/// Caches common data for CheckAssignmentNull and CheckAssignmentNotNull.
/// </summary>
public abstract class CheckAssignmentAction : ContextAction
public class CheckAssignmentCache : IContextActionCache
{
protected string VariableName { get; private set; }
public void Initialize(EditorContext context)
{
this.VariableName = GetVariableName(context);
this.CodeGenerator = GetCodeGenerator(context);
this.ElementRegion = GetStatementRegion(context);
}
public bool IsActionAvailable
{
get {
return !string.IsNullOrEmpty(this.VariableName) && (this.CodeGenerator != null);
}
}
protected CodeGenerator CodeGenerator { get; private set; }
public string VariableName { get; private set; }
protected DomRegion ElementRegion { get; private set; }
public CodeGenerator CodeGenerator { get; private set; }
public DomRegion ElementRegion { get; private set; }
protected string GetVariableName(EditorContext context)
{
@ -74,7 +88,7 @@ namespace SharpRefactoring.ContextActions @@ -74,7 +88,7 @@ namespace SharpRefactoring.ContextActions
if (declaration.Variables.Count != 1)
return null;
VariableDeclaration varDecl = declaration.Variables[0];
if (!varDecl.Initializer.IsNull &&
if (!varDecl.Initializer.IsNull &&
// don't offer action for "var a = new Foo()"
!(varDecl.Initializer is ObjectCreateExpression))
return varDecl.Name;
@ -95,13 +109,5 @@ namespace SharpRefactoring.ContextActions @@ -95,13 +109,5 @@ namespace SharpRefactoring.ContextActions
return symbol.ResolvedType;
return null;
}
public override bool IsEnabled(EditorContext context)
{
this.VariableName = GetVariableName(context);
this.CodeGenerator = GetCodeGenerator(context);
this.ElementRegion = GetStatementRegion(context);
return !string.IsNullOrEmpty(this.VariableName) && (this.CodeGenerator != null);
}
}
}

18
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentNotNull.cs

@ -14,7 +14,7 @@ namespace SharpRefactoring.ContextActions @@ -14,7 +14,7 @@ namespace SharpRefactoring.ContextActions
/// <summary>
/// Description of CheckAssignmentNotNull.
/// </summary>
public class CheckAssignmentNotNull : CheckAssignmentAction
public class CheckAssignmentNotNull : ContextAction
{
public override string Title {
get { return "Check for not null"; }
@ -22,14 +22,22 @@ namespace SharpRefactoring.ContextActions @@ -22,14 +22,22 @@ namespace SharpRefactoring.ContextActions
string caretMarker = "<<>>";
public override bool IsAvailable(EditorContext context)
{
var cache = context.GetCached<CheckAssignmentCache>();
return cache.IsActionAvailable;
}
public override void Execute(EditorContext context)
{
var ifStatement = GenerateAstToInsert(this.VariableName);
var cache = context.GetCached<CheckAssignmentCache>();
var ifStatement = GenerateAstToInsert(cache.VariableName);
var editor = context.Editor;
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, editor.Document.GetLineStartOffset(this.ElementRegion.GetStart()));
string code = this.CodeGenerator.GenerateCode(ifStatement, indent);
int insertOffset = editor.Document.GetLineEndOffset(this.ElementRegion.GetEnd());
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, editor.Document.GetLineStartOffset(cache.ElementRegion.GetStart()));
string code = cache.CodeGenerator.GenerateCode(ifStatement, indent);
int insertOffset = editor.Document.GetLineEndOffset(cache.ElementRegion.GetEnd());
using (var undoGroup = editor.Document.OpenUndoGroup()) {
editor.Document.Insert(insertOffset, code);
var caretPos = editor.Document.Text.IndexOf(caretMarker, insertOffset);

18
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CheckAssignmentNull.cs

@ -15,20 +15,28 @@ namespace SharpRefactoring.ContextActions @@ -15,20 +15,28 @@ namespace SharpRefactoring.ContextActions
/// <summary>
/// Offers inserting "if (a == null) return;" after "var a = *expr*"
/// </summary>
public class CheckAssignmentNull : CheckAssignmentAction
public class CheckAssignmentNull : ContextAction
{
public override string Title {
get { return "Check for null"; }
}
public override bool IsAvailable(EditorContext context)
{
var cache = context.GetCached<CheckAssignmentCache>();
return cache.IsActionAvailable;
}
public override void Execute(EditorContext context)
{
var ifStatement = GenerateAstToInsert(this.VariableName);
var cache = context.GetCached<CheckAssignmentCache>();
var ifStatement = GenerateAstToInsert(cache.VariableName);
var editor = context.Editor;
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, editor.Document.GetLineStartOffset(this.ElementRegion.GetStart()));
string code = this.CodeGenerator.GenerateCode(ifStatement, indent);
int insertOffset = editor.Document.GetLineEndOffset(this.ElementRegion.GetEnd());
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, editor.Document.GetLineStartOffset(cache.ElementRegion.GetStart()));
string code = cache.CodeGenerator.GenerateCode(ifStatement, indent);
int insertOffset = editor.Document.GetLineEndOffset(cache.ElementRegion.GetEnd());
editor.Document.Insert(insertOffset, code);
editor.Caret.Offset = insertOffset + code.Length - 1;
}

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -332,6 +332,7 @@ @@ -332,6 +332,7 @@
<Compile Include="Src\Services\ProjectService\CompileModifiedProjectsOnly.cs" />
<Compile Include="Src\Services\ProjectService\SolutionConfigurationEventHandler.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\ContextAction.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\ContextActionCache.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\ContextActionsBulbControl.xaml.cs">
<DependentUpon>ContextActionsBulbControl.xaml</DependentUpon>
<SubType>Code</SubType>
@ -353,6 +354,7 @@ @@ -353,6 +354,7 @@
<Compile Include="Src\Services\RefactoringService\ContextActions\ContextActionsViewModel.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\ContextActionViewModel.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActionsHelper.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\IContextActionCache.cs" />
<Compile Include="Src\Services\RefactoringService\ContextActions\IContextActionsProvider.cs" />
<Compile Include="Src\Services\RefactoringService\ExtractInterfaceOptions.cs" />
<Compile Include="Src\Services\RefactoringService\GoToClassAction.cs" />

4
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextAction.cs

@ -16,14 +16,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -16,14 +16,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{
public abstract string Title { get; }
public abstract bool IsEnabled(EditorContext context);
public abstract bool IsAvailable(EditorContext context);
public abstract void Execute(EditorContext context);
public IEnumerable<IContextAction> GetAvailableActions(EditorContext context)
{
this.context = context;
if (this.IsEnabled(context))
if (this.IsAvailable(context))
yield return this;
}

47
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs

@ -5,8 +5,10 @@ @@ -5,8 +5,10 @@
// <version>$Revision: $</version>
// </file>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.Visitors;
@ -74,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -74,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.CurrentMemberAST = GetCurrentMemberAST(editor);
this.CurrentElement = FindInnermostNodeAtLocation(this.CurrentMemberAST, new Location(CaretColumn, CaretLine));
this.CurrentElement = FindInnermostNode(this.CurrentMemberAST, new Location(CaretColumn, CaretLine));
// DebugLog();
}
@ -119,29 +121,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -119,29 +121,19 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null;
}
// public TNode GetInnerElement<TNode>() where TNode : class, INode
// {
// var findChildVisitor = new FindOutermostNodeVisitor<TNode>();
// this.CurrentElement.AcceptVisitor(findChildVisitor, null);
// return findChildVisitor.FoundNode;
// }
Dictionary<Type, object> cachedValues = new Dictionary<Type, object>();
INode FindInnermostNodeAtLocation(INode memberDecl, Location position)
public T GetCached<T>() where T : IContextActionCache, new()
{
if (memberDecl == null)
return null;
if (memberDecl is MethodDeclaration) {
return FindInnermostNode(((MethodDeclaration)memberDecl).Body, position);
} else if (memberDecl is PropertyDeclaration) {
var propertyDecl = (PropertyDeclaration)memberDecl;
if (propertyDecl.HasGetRegion && position >= propertyDecl.GetRegion.StartLocation && position <= propertyDecl.GetRegion.EndLocation) {
return FindInnermostNode(propertyDecl.GetRegion.Block, position);
}
if (propertyDecl.HasSetRegion && position >= propertyDecl.SetRegion.StartLocation && position <= propertyDecl.SetRegion.EndLocation) {
return FindInnermostNode(propertyDecl.SetRegion.Block, position);
}
Type t = typeof(T);
if (cachedValues.ContainsKey(t)) {
return (T)cachedValues[t];
} else {
T cached = new T();
cached.Initialize(this);
cachedValues[t] = cached;
return cached;
}
return null;
}
public static INode FindInnermostNode(INode node, Location position)
@ -187,19 +179,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -187,19 +179,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
base.BeginVisit(node);
}
}
// class FindOutermostNodeVisitor<TNode> : NodeTrackingAstVisitor where TNode : class, INode
// {
// public TNode FoundNode { get; private set; }
//
// protected override void BeginVisit(INode node)
// {
// if (node is TNode && FoundNode == null) {
// FoundNode = (TNode)node;
// }
// base.BeginVisit(node);
// }
// }
ResolveResult ResolveExpression(ExpressionResult expression, ITextEditor editor, int caretLine, int caretColumn)
{

18
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/IContextActionCache.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Martin Konicek" email="martin.konicek@gmail.com"/>
// <version>$Revision: $</version>
// </file>
using System;
namespace ICSharpCode.SharpDevelop.Refactoring
{
/// <summary>
/// Data shared by multiple Context actions. Stored in EditorContext.GetCached().
/// </summary>
public interface IContextActionCache
{
void Initialize(EditorContext context);
}
}
Loading…
Cancel
Save