Browse Source

Implemented "Add using" editor context action.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6199 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
6a3116d7ff
  1. 32
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/AddUsing.cs
  2. 3
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/Extensions.cs
  3. 38
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorASTProvider.cs

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

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Refactoring;
@ -19,11 +20,32 @@ namespace SharpRefactoring.ContextActions @@ -19,11 +20,32 @@ namespace SharpRefactoring.ContextActions
{
public IEnumerable<IContextAction> GetAvailableActions(EditorASTProvider editorAST)
{
yield break;
var currentLineAST = editorAST.CurrentLineAST;
if (currentLineAST == null)
yield break;
var symbol = editorAST.SymbolUnderCaret;
foreach (var contextAction in GetAddUsingContextActions(symbol, editorAST.Editor)) {
yield return contextAction;
}
}
IEnumerable<IContextAction> GetAddUsingContextActions(ResolveResult symbol, ITextEditor editor)
{
IEnumerable<RefactoringService.AddUsingAction> addUsingActions = null;
if (symbol is UnknownIdentifierResolveResult) {
addUsingActions = RefactoringService.GetAddUsingActions((UnknownIdentifierResolveResult)symbol, editor);
} else if (symbol is UnknownConstructorCallResolveResult) {
addUsingActions = RefactoringService.GetAddUsingActions((UnknownConstructorCallResolveResult)symbol, editor);
}
if (addUsingActions == null)
yield break;
foreach (var addUsingAction in addUsingActions) {
var addUsingActionCopy = addUsingAction;
yield return new DelegateAction {
Title = "using " + addUsingActionCopy.NewNamespace,
ExecuteAction = addUsingActionCopy.Execute
};
}
}
}
public class AddUsingAction
{
}
}

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

@ -7,10 +7,10 @@ @@ -7,10 +7,10 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
@ -34,6 +34,7 @@ namespace SharpRefactoring.ContextActions @@ -34,6 +34,7 @@ namespace SharpRefactoring.ContextActions
yield break;
var editor = editorAST.Editor;
foreach (var declaration in currentLineAST.FindTypeDeclarations()) {
var rr = ParserService.Resolve(new ExpressionResult(declaration.Name), editor.Caret.Line, editor.Caret.Column, editor.FileName, editor.Document.Text);
if (rr != null && rr.ResolvedType != null) {
var foundClass = rr.ResolvedType.GetUnderlyingClass();

38
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorASTProvider.cs

@ -33,6 +33,41 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -33,6 +33,41 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.resolver = GetResolver(editor);
}
// TODO make all reference types cached ResolveResult? - implement own Nullable<T>
ResolveResult symbolUnderCaret;
public ResolveResult SymbolUnderCaret
{
get
{
if (symbolUnderCaret != null)
return symbolUnderCaret;
// workaround so that Resolve works when the caret is placed also at the end of the word
symbolUnderCaret = ParserService.Resolve(Editor.Caret.Line, Editor.Caret.Column - 1, Editor.Document, Editor.FileName);
if (symbolUnderCaret == null)
symbolUnderCaret = ParserService.Resolve(Editor.Caret.Line, Editor.Caret.Column, Editor.Document, Editor.FileName);
return symbolUnderCaret;
}
}
string currentLineText;
public string CurrentLineText
{
get
{
if (currentLineText != null)
return currentLineText;
try
{
var currentLine = Editor.Document.GetLine(Editor.Caret.Line);
return (currentLineText = currentLine.Text);
}
catch
{
return string.Empty;
}
}
}
INode currentLineAST;
public INode CurrentLineAST
{
@ -43,8 +78,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -43,8 +78,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
if (snippetParser == null)
return null;
try {
var currentLine = Editor.Document.GetLine(Editor.Caret.Line);
return (currentLineAST = snippetParser.Parse(currentLine.Text));
return (currentLineAST = snippetParser.Parse(this.CurrentLineText));
}
catch {
return null;

Loading…
Cancel
Save