Browse Source

use ISymbol instead of IEntity in some cases; start implementation of RenameSymbol

pull/45/merge
Siegfried Pammer 13 years ago
parent
commit
931c5ef93c
  1. 7
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs
  2. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
  3. 2
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBehavior.cs
  4. 9
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs
  5. 36
      src/Main/Base/Project/Editor/Search/SearchResultMatch.cs
  6. 15
      src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs
  7. 2
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  8. 2
      src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs
  9. 2
      src/Main/Base/Project/Src/Project/IProject.cs
  10. 60
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs

7
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs

@ -41,7 +41,7 @@ namespace CSharpBinding @@ -41,7 +41,7 @@ namespace CSharpBinding
int workAmount;
double workAmountInverse;
public CSharpSymbolSearch(IProject project, IEntity entity)
public CSharpSymbolSearch(IProject project, ISymbol entity)
{
this.project = project;
searchScopes = fr.GetSearchScopes(entity);
@ -133,5 +133,10 @@ namespace CSharpBinding @@ -133,5 +133,10 @@ namespace CSharpBinding
if (results.Count > 0)
callback(new SearchedFile(fileName, results));
}
public Task RenameAsync(SymbolRenameArgs args, Action<PatchedFile> callback, Action<Error> errorCallback)
{
throw new NotImplementedException();
}
}
}

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs

@ -201,7 +201,7 @@ namespace CSharpBinding @@ -201,7 +201,7 @@ namespace CSharpBinding
return versions;
}
public override ISymbolSearch PrepareSymbolSearch(IEntity entity)
public override ISymbolSearch PrepareSymbolSearch(ISymbol entity)
{
return CompositeSymbolSearch.Create(new CSharpSymbolSearch(Project, entity), base.PrepareSymbolSearch(entity));
}

2
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBehavior.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.XamlBinding @@ -25,7 +25,7 @@ namespace ICSharpCode.XamlBinding
return base.GetDefaultItemType(fileName);
}
public override ISymbolSearch PrepareSymbolSearch(IEntity entity)
public override ISymbolSearch PrepareSymbolSearch(ISymbol entity)
{
return CompositeSymbolSearch.Create(new XamlSymbolSearch(Project, entity), base.PrepareSymbolSearch(entity));
}

9
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs

@ -33,10 +33,10 @@ namespace ICSharpCode.XamlBinding @@ -33,10 +33,10 @@ namespace ICSharpCode.XamlBinding
int workAmount;
double workAmountInverse;
public XamlSymbolSearch(IProject project, IEntity entity)
public XamlSymbolSearch(IProject project, ISymbol entity)
{
compilation = SD.ParserService.GetCompilation(project);
this.entity = compilation.Import(entity);
this.entity = compilation.Import((IEntity)entity);
interestingFileNames = new List<FileName>();
if (this.entity == null)
return;
@ -110,5 +110,10 @@ namespace ICSharpCode.XamlBinding @@ -110,5 +110,10 @@ namespace ICSharpCode.XamlBinding
if (results.Count > 0)
callback(new SearchedFile(fileName, results));
}
public Task RenameAsync(SymbolRenameArgs args, Action<PatchedFile> callback, Action<Error> errorCallback)
{
throw new NotImplementedException();
}
}
}

36
src/Main/Base/Project/Editor/Search/SearchResultMatch.cs

@ -135,14 +135,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Search @@ -135,14 +135,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Search
{
return match.ReplaceWith(pattern);
}
}
public class SearchedFile
@ -161,4 +153,32 @@ namespace ICSharpCode.SharpDevelop.Editor.Search @@ -161,4 +153,32 @@ namespace ICSharpCode.SharpDevelop.Editor.Search
this.Matches = matches;
}
}
public class PatchedFile : SearchedFile
{
ITextSourceVersion result;
public PatchedFile(FileName fileName, IReadOnlyList<SearchResultMatch> matches, ITextSourceVersion result)
: base(fileName, matches)
{
if (result == null)
throw new ArgumentNullException("result");
this.result = result;
}
public void Apply(IDocument document)
{
ITextSourceVersion oldVersion = document.Version;
if (oldVersion == null)
throw new InvalidOperationException("Document is unversioned, cannot apply changes!");
if (!result.BelongsToSameDocumentAs(oldVersion))
throw new InvalidOperationException("Patch does not belong to this document!");
using (document.OpenUndoGroup()) {
var changes = oldVersion.GetChangesTo(result);
foreach (var change in changes)
document.Replace(change.Offset, change.RemovalLength, change.InsertedText);
}
}
}
}

15
src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs

@ -25,4 +25,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -25,4 +25,19 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
}
}
/// <summary>
/// Runs the rename refactoring.
/// </summary>
public class RenameSymbolCommand : ResolveResultMenuCommand
{
public override void Run(ResolveResult symbol)
{
var entity = GetEntity(symbol);
if (entity != null) {
//FindReferenceService.RenameSymbol(entity,
}
}
}
}

2
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -657,7 +657,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -657,7 +657,7 @@ namespace ICSharpCode.SharpDevelop.Project
return new DefaultAmbience();
}
public virtual Refactoring.ISymbolSearch PrepareSymbolSearch(IEntity entity)
public virtual Refactoring.ISymbolSearch PrepareSymbolSearch(ISymbol entity)
{
return GetOrCreateBehavior().PrepareSymbolSearch(entity);
}

2
src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs

@ -139,7 +139,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -139,7 +139,7 @@ namespace ICSharpCode.SharpDevelop.Project
next.SavePreferences(preferences);
}
public virtual Refactoring.ISymbolSearch PrepareSymbolSearch(IEntity entity)
public virtual Refactoring.ISymbolSearch PrepareSymbolSearch(ISymbol entity)
{
if (this.next != null)
return this.next.PrepareSymbolSearch(entity);

2
src/Main/Base/Project/Src/Project/IProject.cs

@ -312,7 +312,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -312,7 +312,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <returns>
/// An object that can be used to perform the search; or null if this project does not support symbol searches.
/// </returns>
Refactoring.ISymbolSearch PrepareSymbolSearch(IEntity entity);
Refactoring.ISymbolSearch PrepareSymbolSearch(ISymbol entity);
/// <summary>
/// Occurs whenever parse information for this project was updated. This event is raised on the main thread.

60
src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs

@ -7,7 +7,9 @@ using System.Linq; @@ -7,7 +7,9 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Analysis;
using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop.Editor.Search;
@ -24,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -24,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
public static class FindReferenceService
{
#region FindReferences
static IEnumerable<IProject> GetProjectsThatCouldReferenceEntity(IEntity entity)
static IEnumerable<IProject> GetProjectsThatCouldReferenceEntity(ISymbol entity)
{
ISolution solution = ProjectService.OpenSolution;
if (solution == null)
@ -37,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -37,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
}
static List<ISymbolSearch> PrepareSymbolSearch(IEntity entity, CancellationToken cancellationToken, out double totalWorkAmount)
static List<ISymbolSearch> PrepareSymbolSearch(ISymbol entity, CancellationToken cancellationToken, out double totalWorkAmount)
{
totalWorkAmount = 0;
List<ISymbolSearch> symbolSearches = new List<ISymbolSearch>();
@ -183,6 +185,46 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -183,6 +185,46 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
}
#endregion
public static IReadOnlyList<Error> RenameSymbol(ISymbol symbol, IProgressMonitor progressMonitor)
{
if (symbol == null)
throw new ArgumentNullException("symbol");
if (progressMonitor == null)
throw new ArgumentNullException("progressMonitor");
SD.MainThread.VerifyAccess();
if (SD.ParserService.LoadSolutionProjectsThread.IsRunning) {
progressMonitor.ShowingDialog = true;
MessageService.ShowMessage("${res:SharpDevelop.Refactoring.LoadSolutionProjectsThreadRunning}");
progressMonitor.ShowingDialog = false;
return EmptyList<Error>.Instance;
}
double totalWorkAmount;
List<ISymbolSearch> symbolSearches = PrepareSymbolSearch(symbol, progressMonitor.CancellationToken, out totalWorkAmount);
double workDone = 0;
ParseableFileContentFinder parseableFileContentFinder = new ParseableFileContentFinder();
var errors = new List<Error>();
foreach (ISymbolSearch s in symbolSearches) {
progressMonitor.CancellationToken.ThrowIfCancellationRequested();
using (var childProgressMonitor = progressMonitor.CreateSubTask(s.WorkAmount / totalWorkAmount)) {
s.RenameAsync(new SymbolRenameArgs(childProgressMonitor, parseableFileContentFinder),
ApplyChanges, error => errors.Add(error)).FireAndForget();
}
workDone += s.WorkAmount;
progressMonitor.Progress = workDone / totalWorkAmount;
}
return errors;
}
static void ApplyChanges(PatchedFile file)
{
var view = SD.FileService.OpenFile(file.FileName, false);
IDocument document = view.GetService(typeof(IDocument)) as IDocument;
if (document == null)
throw new InvalidOperationException("Document not found!");
file.Apply(document);
}
}
public class SymbolSearchArgs
@ -206,11 +248,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -206,11 +248,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
}
public class SymbolRenameArgs : SymbolSearchArgs
{
public SymbolRenameArgs(IProgressMonitor progressMonitor, ParseableFileContentFinder parseableFileContentFinder)
: base(progressMonitor, parseableFileContentFinder)
{
}
}
public interface ISymbolSearch
{
double WorkAmount { get; }
Task FindReferencesAsync(SymbolSearchArgs searchArguments, Action<SearchedFile> callback);
Task RenameAsync(SymbolRenameArgs renameArguments, Action<PatchedFile> callback, Action<Error> errorCallback);
}
public sealed class CompositeSymbolSearch : ISymbolSearch
@ -239,5 +290,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -239,5 +290,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring
{
return Task.WhenAll(symbolSearches.Select(s => s.FindReferencesAsync(searchArguments, callback)));
}
public Task RenameAsync(SymbolRenameArgs renameArguments, Action<PatchedFile> callback, Action<Error> errorCallback)
{
return Task.WhenAll(symbolSearches.Select(s => s.RenameAsync(renameArguments, callback, errorCallback)));
}
}
}

Loading…
Cancel
Save