Browse Source

Moved "Move class to matching file name" and "Rename file to match class name" from context menu to context actions.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6391 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
58aa53cd4f
  1. 2
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.addin
  2. 3
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.csproj
  3. 46
      src/AddIns/Misc/SharpRefactoring/Project/Src/ClassRefactoringSubmenuBuilder.cs
  4. 81
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CacheClassAtCaret.cs
  5. 42
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/MoveClassToFile.cs
  6. 47
      src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/RenameFileToMatchClassName.cs
  7. 11
      src/AddIns/Misc/SharpRefactoring/Project/Src/Extensions.cs
  8. 5
      src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs
  9. 11
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextAction.cs

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

@ -38,6 +38,8 @@ @@ -38,6 +38,8 @@
<Path name="/SharpDevelop/ViewContent/AvalonEdit/ContextActions">
<Class class="SharpRefactoring.ContextActions.AddUsingProvider" />
<Class class="SharpRefactoring.ContextActions.RenameFileToMatchClassName" />
<Class class="SharpRefactoring.ContextActions.MoveClassToFile" />
<Class class="SharpRefactoring.ContextActions.ImplementInterfaceProvider" />
<Class class="SharpRefactoring.ContextActions.ImplementAbstractClassProvider" />
<Class class="SharpRefactoring.ContextActions.GenerateMemberProvider" />

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

@ -71,6 +71,7 @@ @@ -71,6 +71,7 @@
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\ClassRefactoringSubmenuBuilder.cs" />
<Compile Include="Src\ContextActions\AddUsing.cs" />
<Compile Include="Src\ContextActions\CacheClassAtCaret.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentCache.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentNull.cs" />
<Compile Include="Src\ContextActions\CheckAssignmentNotNull.cs" />
@ -80,9 +81,11 @@ @@ -80,9 +81,11 @@
<Compile Include="Src\ContextActions\GenerateMember.cs" />
<Compile Include="Src\ContextActions\ImplementAbstractClass.cs" />
<Compile Include="Src\ContextActions\ImplementInterface.cs" />
<Compile Include="Src\ContextActions\MoveClassToFile.cs" />
<Compile Include="Src\ContextActions\ParamCheck.cs" />
<Compile Include="Src\ContextActions\ParamCheckForNull.cs" />
<Compile Include="Src\ContextActions\ParamRangeCheck.cs" />
<Compile Include="Src\ContextActions\RenameFileToMatchClassName.cs" />
<Compile Include="Src\CSharpMethodExtractor.cs" />
<Compile Include="Src\Extensions.cs" />
<Compile Include="Src\ExtractMethodCommand.cs" />

46
src/AddIns/Misc/SharpRefactoring/Project/Src/ClassRefactoringSubmenuBuilder.cs

@ -53,8 +53,6 @@ namespace SharpRefactoring @@ -53,8 +53,6 @@ namespace SharpRefactoring
LanguageProperties language = c.ProjectContent.Language;
if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
AddCorrectClassFileNameCommands(c, resultItems);
AddRenameCommand(c, resultItems);
if (language.RefactoringProvider.SupportsExtractInterface) {
@ -80,50 +78,6 @@ namespace SharpRefactoring @@ -80,50 +78,6 @@ namespace SharpRefactoring
resultItems.Add(cmd);
}
void AddCorrectClassFileNameCommands(IClass c, List<ToolStripItem> resultItems)
{
if (c.DeclaringType == null &&
!c.BodyRegion.IsEmpty &&
!c.Name.Equals(Path.GetFileNameWithoutExtension(c.CompilationUnit.FileName),
StringComparison.OrdinalIgnoreCase))
{
// File name does not match class name
string correctFileName = Path.Combine(Path.GetDirectoryName(c.CompilationUnit.FileName),
c.Name + Path.GetExtension(c.CompilationUnit.FileName));
if (FileUtility.IsValidPath(correctFileName)
&& Path.IsPathRooted(correctFileName)
&& !File.Exists(correctFileName))
{
if (c.CompilationUnit.Classes.Count == 1) {
// Rename file to ##
var cmd = new MenuCommand(
StringParser.Parse("${res:SharpDevelop.Refactoring.RenameFileTo}",
new string[,] {{ "FileName", Path.GetFileName(correctFileName) }}),
delegate {
IProject p = (IProject)c.ProjectContent.Project;
RefactoringHelpers.RenameFile(p, c.CompilationUnit.FileName, correctFileName);
if (p != null) {
p.Save();
}
});
resultItems.Add(cmd);
} else {
var refactoringProvider = c.ProjectContent.Language.RefactoringProvider;
if (refactoringProvider.SupportsCreateNewFileLikeExisting && refactoringProvider.SupportsGetFullCodeRangeForType) {
// Move class to file ##
var cmd = new MenuCommand(
StringParser.Parse("${res:SharpDevelop.Refactoring.MoveClassToFile}",
new string[,] {{ "FileName", Path.GetFileName(correctFileName) }}),
delegate {
FindReferencesAndRenameHelper.MoveClassToFile(c, correctFileName);
});
resultItems.Add(cmd);
}
}
}
}
}
#region Implementation
void Rename(object sender, EventArgs e)
{

81
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/CacheClassAtCaret.cs

@ -0,0 +1,81 @@ @@ -0,0 +1,81 @@
// <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;
using System.IO;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor.Commands;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of CacheClassAtCaret.
/// </summary>
public class CacheClassAtCaret : IContextActionCache
{
public IClass Class { get; private set; }
public bool IsClassFileNameCorrect { get; private set; }
public string CorrectClassFileName { get; private set; }
public bool IsCorrectClassFileNameAvailable { get; private set; }
public bool IsClassReadOnly { get; private set; }
public bool IsCaretAtClassDeclaration { get; private set; }
public bool IsFixClassFileNameAvailable
{
get {
return !IsClassReadOnly && IsCaretAtClassDeclaration && !IsClassFileNameCorrect && IsCorrectClassFileNameAvailable;
}
}
public void Initialize(EditorContext context)
{
this.Class = GetClass(context.CurrentSymbol);
if (this.Class == null)
return;
var c = this.Class;
// TODO cache
var classDecls = context.GetClassDeclarationsOnCurrentLine().ToList();
this.IsCaretAtClassDeclaration = classDecls.Count == 1 && (classDecls[0].FullyQualifiedName == c.FullyQualifiedName);
this.IsClassFileNameCorrect = (c.IsInnerClass() || (!c.IsUserCode()) ||
c.Name.Equals(Path.GetFileNameWithoutExtension(c.CompilationUnit.FileName), StringComparison.OrdinalIgnoreCase));
if (string.IsNullOrEmpty(c.CompilationUnit.FileName)) {
// Cannot get path
this.CorrectClassFileName = null;
this.IsCorrectClassFileNameAvailable = false;
return;
}
this.CorrectClassFileName = Path.Combine(Path.GetDirectoryName(c.CompilationUnit.FileName),
c.Name + Path.GetExtension(c.CompilationUnit.FileName));
this.IsCorrectClassFileNameAvailable = (FileUtility.IsValidPath(CorrectClassFileName)
&& Path.IsPathRooted(CorrectClassFileName)
&& !File.Exists(CorrectClassFileName));
this.IsClassReadOnly = FindReferencesAndRenameHelper.IsReadOnly(this.Class);
}
IClass GetClass(ResolveResult currentSymbol)
{
if (currentSymbol == null || currentSymbol.ResolvedType == null)
return null;
IClass c = currentSymbol.ResolvedType.GetUnderlyingClass();
c = c.ProjectContent.GetClass(c.FullyQualifiedName, c.TypeParameters.Count, c.ProjectContent.Language, GetClassOptions.LookForInnerClass);
return ClassBookmarkSubmenuBuilder.GetCurrentPart(c);
}
}
}

42
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/MoveClassToFile.cs

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
// <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;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of MoveClassToFile.
/// </summary>
public class MoveClassToFile : ContextAction
{
public CacheClassAtCaret ClassAtCaret
{
get { return this.Context.GetCached<CacheClassAtCaret>(); }
}
public override string Title {
get {
var fileName = Path.GetFileName(ClassAtCaret.CorrectClassFileName);
return StringParser.Parse("${res:SharpDevelop.Refactoring.MoveClassToFile}", new StringTagPair("FileName", fileName));
}
}
public override bool IsAvailable(EditorContext context)
{
if (ClassAtCaret.Class == null) return false;
return (ClassAtCaret.IsFixClassFileNameAvailable && ClassAtCaret.Class.CompilationUnit.Classes.Count != 1);
}
public override void Execute(EditorContext context)
{
FindReferencesAndRenameHelper.MoveClassToFile(ClassAtCaret.Class, ClassAtCaret.CorrectClassFileName);
}
}
}

47
src/AddIns/Misc/SharpRefactoring/Project/Src/ContextActions/RenameFileToMatchClassName.cs

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
// <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;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Refactoring;
namespace SharpRefactoring.ContextActions
{
/// <summary>
/// Description of RenameFileToMatchClassFileName.
/// </summary>
public class RenameFileToMatchClassName : ContextAction
{
public CacheClassAtCaret ClassAtCaret
{
get { return this.Context.GetCached<CacheClassAtCaret>(); }
}
public override string Title {
get {
var fileName = Path.GetFileName(ClassAtCaret.CorrectClassFileName);
return StringParser.Parse("${res:SharpDevelop.Refactoring.RenameFileTo}", new StringTagPair("FileName", fileName));
}
}
public override bool IsAvailable(EditorContext context)
{
if (ClassAtCaret.Class == null) return false;
return (ClassAtCaret.IsFixClassFileNameAvailable && ClassAtCaret.Class.CompilationUnit.Classes.Count == 1);
}
public override void Execute(EditorContext context)
{
IProject project = (IProject)ClassAtCaret.Class.ProjectContent.Project;
RefactoringHelpers.RenameFile(project, ClassAtCaret.Class.CompilationUnit.FileName, ClassAtCaret.CorrectClassFileName);
if (project != null) {
project.Save();
}
}
}
}

11
src/AddIns/Misc/SharpRefactoring/Project/Src/Extensions.cs

@ -57,7 +57,16 @@ namespace SharpRefactoring @@ -57,7 +57,16 @@ namespace SharpRefactoring
public static bool IsUserCode(this IClass c)
{
return (c != null && !c.BodyRegion.IsEmpty);
if (c == null)
throw new ArgumentNullException("c");
return !c.BodyRegion.IsEmpty;
}
public static bool IsInnerClass(this IClass c)
{
if (c == null)
throw new ArgumentNullException("c");
return c.DeclaringType != null;
}
}
}

5
src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs

@ -135,11 +135,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -135,11 +135,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
ParserService.ParseCurrentViewContent();
c = c.ProjectContent.GetClass(c.FullyQualifiedName, c.TypeParameters.Count, c.ProjectContent.Language, GetClassOptions.LookForInnerClass);
c = GetCurrentPart(c);
return c;
return GetCurrentPart(c);
}
static IClass GetCurrentPart(IClass possibleCompound)
public static IClass GetCurrentPart(IClass possibleCompound)
{
IViewContent viewContent = WorkbenchSingleton.Workbench.ActiveViewContent;
if (viewContent != null)

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

@ -22,19 +22,16 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -22,19 +22,16 @@ namespace ICSharpCode.SharpDevelop.Refactoring
public IEnumerable<IContextAction> GetAvailableActions(EditorContext context)
{
this.context = context;
this.Context = context;
if (this.IsAvailable(context))
yield return this;
}
EditorContext context;
public EditorContext Context { get; private set; }
public void Execute()
{
Execute(this.context);
}
public virtual string Id {
get { return this.GetType().FullName; }
Execute(this.Context);
}
}
}

Loading…
Cancel
Save