Browse Source

Add CurrentParseInformation to EditorContext. This allows retrieving the ProjectContent without requiring CallingClass!=null (fixes http://community.sharpdevelop.net/forums/t/11756.aspx)

Also removed some try-catch-ignore constructs.
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
dd9e0233ee
  1. 36
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/AddUsing.cs
  2. 34
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs

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

@ -21,50 +21,41 @@ namespace SharpRefactoring.ContextActions
public class AddUsingProvider : ContextActionsProvider public class AddUsingProvider : ContextActionsProvider
{ {
public override IEnumerable<IContextAction> GetAvailableActions(EditorContext context) public override IEnumerable<IContextAction> GetAvailableActions(EditorContext context)
{
foreach (var contextAction in GetAddUsingContextActions(context.CurrentSymbol, context.Editor, context.CurrentExpression.Context)) {
yield return contextAction;
}
}
IEnumerable<IContextAction> GetAddUsingContextActions(ResolveResult symbol, ITextEditor editor, ExpressionContext exprContext)
{ {
// class // class
foreach (var addUsingAction in RefactoringService.GetAddUsingActions(symbol,editor)) { foreach (var addUsingAction in RefactoringService.GetAddUsingActions(context.CurrentSymbol, context.Editor)) {
yield return addUsingAction; yield return addUsingAction;
} }
// extension method // extension method
if (exprContext != ExpressionContext.Attribute) { if (context.CurrentExpression.Context != ExpressionContext.Attribute) {
foreach (var addUsingAction in GetAddUsingExtensionMethodActions(symbol, editor)) { foreach (var addUsingAction in GetAddUsingExtensionMethodActions(context)) {
yield return addUsingAction; yield return addUsingAction;
} }
} }
// attribute // attribute
if (exprContext == ExpressionContext.Attribute) { if (context.CurrentExpression.Context == ExpressionContext.Attribute) {
foreach (var addUsingAction in GetAddUsingAttributeActions(symbol, editor)) { foreach (var addUsingAction in GetAddUsingAttributeActions(context)) {
yield return addUsingAction; yield return addUsingAction;
} }
} }
} }
#region Extension method #region Extension method
IEnumerable<IContextAction> GetAddUsingExtensionMethodActions(ResolveResult symbol, ITextEditor editor) IEnumerable<IContextAction> GetAddUsingExtensionMethodActions(EditorContext context)
{ {
if (!(symbol is UnknownMethodResolveResult)) UnknownMethodResolveResult rr = context.CurrentSymbol as UnknownMethodResolveResult;
if (rr == null)
yield break; yield break;
UnknownMethodResolveResult rr = symbol as UnknownMethodResolveResult;
List<IClass> results = new List<IClass>(); List<IClass> results = new List<IClass>();
IProjectContent pc = rr.CallingClass.ProjectContent; IProjectContent pc = context.ProjectContent;
SearchAllExtensionMethodsWithName(results, pc, rr.CallName); SearchAllExtensionMethodsWithName(results, pc, rr.CallName);
foreach (IProjectContent content in pc.ReferencedContents) foreach (IProjectContent content in pc.ReferencedContents)
SearchAllExtensionMethodsWithName(results, content, rr.CallName); SearchAllExtensionMethodsWithName(results, content, rr.CallName);
if (!results.Any())
yield break;
foreach (IClass c in results) { foreach (IClass c in results) {
yield return new RefactoringService.AddUsingAction(rr.CallingClass.CompilationUnit, editor, c.Namespace); yield return new RefactoringService.AddUsingAction(context.CurrentParseInformation.CompilationUnit, context.Editor, c.Namespace);
} }
} }
@ -79,14 +70,15 @@ namespace SharpRefactoring.ContextActions
#endregion #endregion
#region Attribute #region Attribute
IEnumerable<IContextAction> GetAddUsingAttributeActions(ResolveResult symbol, ITextEditor editor) IEnumerable<IContextAction> GetAddUsingAttributeActions(EditorContext context)
{ {
ResolveResult symbol = context.CurrentSymbol;
if (!(symbol is UnknownIdentifierResolveResult || symbol is UnknownMethodResolveResult)) if (!(symbol is UnknownIdentifierResolveResult || symbol is UnknownMethodResolveResult))
yield break; yield break;
List<IClass> results = new List<IClass>(); List<IClass> results = new List<IClass>();
ParseInformation info = ParserService.GetParseInformation(editor.FileName); ParseInformation info = context.CurrentParseInformation;
if (info == null || info.CompilationUnit == null || info.CompilationUnit.ProjectContent == null) if (info == null || info.CompilationUnit == null || info.CompilationUnit.ProjectContent == null)
yield break; yield break;
ICompilationUnit unit = info.CompilationUnit; ICompilationUnit unit = info.CompilationUnit;
@ -103,7 +95,7 @@ namespace SharpRefactoring.ContextActions
} }
foreach (IClass c in results) { foreach (IClass c in results) {
yield return new RefactoringService.AddUsingAction(unit, editor, c.Namespace); yield return new RefactoringService.AddUsingAction(unit, context.Editor, c.Namespace);
} }
} }

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

@ -38,6 +38,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary> /// </summary>
public ResolveResult CurrentSymbol { get; private set; } public ResolveResult CurrentSymbol { get; private set; }
/// <summary>
/// Language independent.
/// </summary>
public ParseInformation CurrentParseInformation { get; private set; }
public IProjectContent ProjectContent {
get {
if (CurrentParseInformation != null)
return CurrentParseInformation.CompilationUnit.ProjectContent;
else
return null;
}
}
public IDocumentLine CurrentLine { get; private set; } public IDocumentLine CurrentLine { get; private set; }
/// <summary> /// <summary>
/// Only available for C# and VB. /// Only available for C# and VB.
@ -70,6 +84,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
this.CurrentExpression = GetExpressionAtCaret(editor); this.CurrentExpression = GetExpressionAtCaret(editor);
this.CurrentSymbol = ResolveExpression(CurrentExpression, editor, CaretLine, CaretColumn); this.CurrentSymbol = ResolveExpression(CurrentExpression, editor, CaretLine, CaretColumn);
this.CurrentParseInformation = ParserService.GetExistingParseInformation(editor.FileName);
this.CurrentLine = editor.Document.GetLine(CaretLine); this.CurrentLine = editor.Document.GetLine(CaretLine);
this.CurrentLineAST = GetCurrentLineAst(this.CurrentLine, editor); this.CurrentLineAST = GetCurrentLineAst(this.CurrentLine, editor);
@ -202,12 +217,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
var snippetParser = GetSnippetParser(editor); var snippetParser = GetSnippetParser(editor);
if (snippetParser == null) if (snippetParser == null)
return null; return null;
try { //try {
return snippetParser.Parse(currentLine.Text); return snippetParser.Parse(currentLine.Text);
} //}
catch { //catch {
return null; // return null;
} //}
} }
SnippetParser GetSnippetParser(ITextEditor editor) SnippetParser GetSnippetParser(ITextEditor editor)
@ -233,13 +248,12 @@ namespace ICSharpCode.SharpDevelop.Refactoring
INode GetCurrentMemberAST(ITextEditor editor) INode GetCurrentMemberAST(ITextEditor editor)
{ {
try { //try {
var resolver = GetInitializedNRefactoryResolver(editor, this.CaretLine, this.CaretColumn); var resolver = GetInitializedNRefactoryResolver(editor, this.CaretLine, this.CaretColumn);
return resolver.ParseCurrentMember(editor.Document.Text); return resolver.ParseCurrentMember(editor.Document.Text);
} //} catch {
catch { // return null;
return null; //}
}
} }
NRefactoryResolver GetInitializedNRefactoryResolver(ITextEditor editor, int caretLine, int caretColumn) NRefactoryResolver GetInitializedNRefactoryResolver(ITextEditor editor, int caretLine, int caretColumn)

Loading…
Cancel
Save