Browse Source

Merge branch 'master' of github.com:icsharpcode/SharpDevelop

pull/520/merge
Peter Forstmeier 11 years ago
parent
commit
d3237baa53
  1. 137
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs
  2. 12
      src/AddIns/Debugger/Debugger.Core/Process.cs
  3. 1
      src/AddIns/DisplayBindings/IconEditor/PickFormatDialog.Designer.cs
  4. 12
      src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.Designer.cs
  5. 7
      src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.cs
  6. 4
      src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs

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

@ -24,6 +24,7 @@ using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ICSharpCode.NRefactory.Analysis;
using CSharpBinding.Parser; using CSharpBinding.Parser;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Highlighting;
@ -56,22 +57,44 @@ namespace CSharpBinding
FindReferences fr = new FindReferences(); FindReferences fr = new FindReferences();
IList<IFindReferenceSearchScope> searchScopes; IList<IFindReferenceSearchScope> searchScopes;
IList<string>[] interestingFileNames; IList<string>[] interestingFileNames;
Dictionary<string, IList<IFindReferenceSearchScope>> searchScopesPerFile;
int workAmount; int workAmount;
double workAmountInverse; double workAmountInverse;
public CSharpSymbolSearch(IProject project, ISymbol entity) public CSharpSymbolSearch(IProject project, ISymbol entity)
{ {
this.project = project; this.project = project;
searchScopes = fr.GetSearchScopes(entity);
compilation = SD.ParserService.GetCompilation(project); compilation = SD.ParserService.GetCompilation(project);
var relatedSymbols = GetRelatedSymbols(entity);
if ((relatedSymbols != null) && relatedSymbols.Any()) {
searchScopes = relatedSymbols.SelectMany(e => fr.GetSearchScopes(e)).ToList();
} else {
searchScopes = fr.GetSearchScopes(entity);
}
searchScopesPerFile = new Dictionary<string, IList<IFindReferenceSearchScope>>();
interestingFileNames = new IList<string>[searchScopes.Count]; interestingFileNames = new IList<string>[searchScopes.Count];
for (int i = 0; i < searchScopes.Count; i++) { for (int i = 0; i < searchScopes.Count; i++) {
interestingFileNames[i] = fr.GetInterestingFiles(searchScopes[i], compilation).Select(f => f.FileName).ToList(); var thisSearchScope = searchScopes[i];
workAmount += interestingFileNames[i].Count; var interestingFiles = fr.GetInterestingFiles(thisSearchScope, compilation).Select(f => f.FileName).ToList();
foreach (var file in interestingFiles) {
if (!searchScopesPerFile.ContainsKey(file))
searchScopesPerFile[file] = new List<IFindReferenceSearchScope>();
searchScopesPerFile[file].Add(thisSearchScope);
}
interestingFileNames[i] = interestingFiles.ToList();
workAmount += interestingFiles.Count;
} }
workAmountInverse = 1.0 / workAmount; workAmountInverse = 1.0 / workAmount;
} }
IEnumerable<ISymbol> GetRelatedSymbols(ISymbol entity)
{
TypeGraph typeGraph = new TypeGraph(new [] { compilation.MainAssembly });
var symbolCollector = new SymbolCollector();
return symbolCollector.GetRelatedSymbols(typeGraph, entity);
}
public double WorkAmount { public double WorkAmount {
get { return workAmount; } get { return workAmount; }
} }
@ -83,38 +106,36 @@ namespace CSharpBinding
var cancellationToken = args.ProgressMonitor.CancellationToken; var cancellationToken = args.ProgressMonitor.CancellationToken;
return Task.Run( return Task.Run(
() => { () => {
for (int i = 0; i < searchScopes.Count; i++) { object progressLock = new object();
IFindReferenceSearchScope searchScope = searchScopes[i]; Parallel.ForEach(
object progressLock = new object(); searchScopesPerFile.Keys,
Parallel.ForEach( new ParallelOptions {
interestingFileNames[i], MaxDegreeOfParallelism = Environment.ProcessorCount,
new ParallelOptions { CancellationToken = cancellationToken
MaxDegreeOfParallelism = Environment.ProcessorCount, },
CancellationToken = cancellationToken delegate (string fileName) {
}, try {
delegate (string fileName) { FindReferencesInFile(args, searchScopesPerFile[fileName], FileName.Create(fileName), callback, cancellationToken);
try { } catch (OperationCanceledException) {
FindReferencesInFile(args, searchScope, FileName.Create(fileName), callback, cancellationToken); throw;
} catch (OperationCanceledException) { } catch (Exception ex) {
throw; throw new ApplicationException("Error searching in file '" + fileName + "'", ex);
} catch (Exception ex) { }
throw new ApplicationException("Error searching in file '" + fileName + "'", ex); lock (progressLock)
} args.ProgressMonitor.Progress += workAmountInverse;
lock (progressLock) });
args.ProgressMonitor.Progress += workAmountInverse;
});
}
}, cancellationToken }, cancellationToken
); );
} }
void FindReferencesInFile(SymbolSearchArgs args, IFindReferenceSearchScope searchScope, FileName fileName, Action<SearchedFile> callback, CancellationToken cancellationToken) void FindReferencesInFile(SymbolSearchArgs args, IList<IFindReferenceSearchScope> searchScopeList, FileName fileName, Action<SearchedFile> callback, CancellationToken cancellationToken)
{ {
ITextSource textSource = args.ParseableFileContentFinder.Create(fileName); ITextSource textSource = args.ParseableFileContentFinder.Create(fileName);
if (textSource == null) if (textSource == null)
return; return;
if (searchScope.SearchTerm != null) { if (searchScopeList != null) {
if (textSource.IndexOf(searchScope.SearchTerm, 0, textSource.TextLength, StringComparison.Ordinal) < 0) if (!searchScopeList.Any(
scope => (scope.SearchTerm == null) || (textSource.IndexOf(scope.SearchTerm, 0, textSource.TextLength, StringComparison.Ordinal) >= 0)))
return; return;
} }
@ -134,7 +155,7 @@ namespace CSharpBinding
} }
fr.FindReferencesInFile( fr.FindReferencesInFile(
searchScope, unresolvedFile, parseInfo.SyntaxTree, compilation, searchScopeList, unresolvedFile, parseInfo.SyntaxTree, compilation,
delegate (AstNode node, ResolveResult result) { delegate (AstNode node, ResolveResult result) {
if (document == null) { if (document == null) {
document = new ReadOnlyDocument(textSource, fileName); document = new ReadOnlyDocument(textSource, fileName);
@ -154,8 +175,18 @@ namespace CSharpBinding
if (highlighter != null) { if (highlighter != null) {
highlighter.Dispose(); highlighter.Dispose();
} }
if (results.Count > 0) if (results.Count > 0) {
callback(new SearchedFile(fileName, results)); // Remove overlapping results
List<SearchResultMatch> fixedResults = new List<SearchResultMatch>();
int lastEndOffset = 0;
foreach (var result in results.OrderBy(m => m.StartOffset)) {
if (result.StartOffset >= lastEndOffset) {
fixedResults.Add(result);
lastEndOffset = result.EndOffset;
}
}
callback(new SearchedFile(fileName, fixedResults));
}
} }
public Task RenameAsync(SymbolRenameArgs args, Action<PatchedFile> callback, Action<Error> errorCallback) public Task RenameAsync(SymbolRenameArgs args, Action<PatchedFile> callback, Action<Error> errorCallback)
@ -166,32 +197,30 @@ namespace CSharpBinding
return Task.Run( return Task.Run(
() => { () => {
bool isNameValid = Mono.CSharp.Tokenizer.IsValidIdentifier(args.NewName); bool isNameValid = Mono.CSharp.Tokenizer.IsValidIdentifier(args.NewName);
for (int i = 0; i < searchScopes.Count; i++) { object progressLock = new object();
IFindReferenceSearchScope searchScope = searchScopes[i]; Parallel.ForEach(
object progressLock = new object(); searchScopesPerFile.Keys,
Parallel.ForEach( new ParallelOptions {
interestingFileNames[i], MaxDegreeOfParallelism = Environment.ProcessorCount,
new ParallelOptions { CancellationToken = cancellationToken
MaxDegreeOfParallelism = Environment.ProcessorCount, },
CancellationToken = cancellationToken delegate (string fileName) {
}, RenameReferencesInFile(args, searchScopesPerFile[fileName], FileName.Create(fileName), callback, errorCallback, isNameValid, cancellationToken);
delegate (string fileName) { lock (progressLock)
RenameReferencesInFile(args, searchScope, FileName.Create(fileName), callback, errorCallback, isNameValid, cancellationToken); args.ProgressMonitor.Progress += workAmountInverse;
lock (progressLock) });
args.ProgressMonitor.Progress += workAmountInverse;
});
}
}, cancellationToken }, cancellationToken
); );
} }
void RenameReferencesInFile(SymbolRenameArgs args, IFindReferenceSearchScope searchScope, FileName fileName, Action<PatchedFile> callback, Action<Error> errorCallback, bool isNameValid, CancellationToken cancellationToken) void RenameReferencesInFile(SymbolRenameArgs args, IList<IFindReferenceSearchScope> searchScopeList, FileName fileName, Action<PatchedFile> callback, Action<Error> errorCallback, bool isNameValid, CancellationToken cancellationToken)
{ {
ITextSource textSource = args.ParseableFileContentFinder.Create(fileName); ITextSource textSource = args.ParseableFileContentFinder.Create(fileName);
if (textSource == null) if (textSource == null)
return; return;
if (searchScope.SearchTerm != null) { if (searchScopeList != null) {
if (textSource.IndexOf(searchScope.SearchTerm, 0, textSource.TextLength, StringComparison.Ordinal) < 0) if (!searchScopeList.Any(
scope => (scope.SearchTerm == null) || (textSource.IndexOf(scope.SearchTerm, 0, textSource.TextLength, StringComparison.Ordinal) >= 0)))
return; return;
} }
@ -213,7 +242,7 @@ namespace CSharpBinding
CSharpAstResolver resolver = new CSharpAstResolver(compilation, parseInfo.SyntaxTree, unresolvedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, parseInfo.SyntaxTree, unresolvedFile);
fr.RenameReferencesInFile( fr.RenameReferencesInFile(
new[] { searchScope }, args.NewName, resolver, searchScopeList, args.NewName, resolver,
delegate (RenameCallbackArguments callbackArgs) { delegate (RenameCallbackArguments callbackArgs) {
var node = callbackArgs.NodeToReplace; var node = callbackArgs.NodeToReplace;
string newCode = callbackArgs.NewNode.ToString(); string newCode = callbackArgs.NewNode.ToString();
@ -249,10 +278,16 @@ namespace CSharpBinding
} }
IDocument changedDocument = new TextDocument(document); IDocument changedDocument = new TextDocument(document);
var oldVersion = changedDocument.Version; var oldVersion = changedDocument.Version;
List<SearchResultMatch> fixedResults = new List<SearchResultMatch>();
int lastStartOffset = changedDocument.TextLength + 1;
foreach (var result in results.OrderByDescending(m => m.StartOffset)) { foreach (var result in results.OrderByDescending(m => m.StartOffset)) {
changedDocument.Replace(result.StartOffset, result.Length, result.NewCode); if (result.EndOffset <= lastStartOffset) {
changedDocument.Replace(result.StartOffset, result.Length, result.NewCode);
fixedResults.Add(result);
lastStartOffset = result.StartOffset;
}
} }
callback(new PatchedFile(fileName, results, oldVersion, changedDocument.Version)); callback(new PatchedFile(fileName, fixedResults, oldVersion, changedDocument.Version));
} }
} }
} }

12
src/AddIns/Debugger/Debugger.Core/Process.cs

@ -527,8 +527,16 @@ namespace Debugger
System.Threading.Thread.Sleep(0); System.Threading.Thread.Sleep(0);
// Stop&terminate - both must be called // Stop&terminate - both must be called
corProcess.Stop(uint.MaxValue); try {
corProcess.Terminate(0); corProcess.Stop(uint.MaxValue);
corProcess.Terminate(0);
} catch (COMException ex) {
if (ex.ErrorCode == unchecked((int)0x80131301)) {
// COMException (0x80131301): Process was terminated.
} else {
throw;
}
}
this.TerminateCommandIssued = true; this.TerminateCommandIssued = true;
// Do not mark the process as exited // Do not mark the process as exited

1
src/AddIns/DisplayBindings/IconEditor/PickFormatDialog.Designer.cs generated

@ -133,7 +133,6 @@ namespace ICSharpCode.IconEditor
"Monochrome", "Monochrome",
"4 bit", "4 bit",
"8 bit", "8 bit",
"16 bit",
"24 bit", "24 bit",
"32 bit"}); "32 bit"});
this.colorDepthComboBox.Location = new System.Drawing.Point(93, 73); this.colorDepthComboBox.Location = new System.Drawing.Point(93, 73);

12
src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.Designer.cs generated

@ -38,7 +38,7 @@ namespace ICSharpCode.FiletypeRegisterer
} }
base.Dispose(disposing); base.Dispose(disposing);
} }
/// <summary> /// <summary>
/// This method is required for Windows Forms designer support. /// This method is required for Windows Forms designer support.
/// Do not change the method contents inside the source code editor. The Forms designer might /// Do not change the method contents inside the source code editor. The Forms designer might
@ -53,24 +53,25 @@ namespace ICSharpCode.FiletypeRegisterer
// captionLabel // captionLabel
// //
this.captionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) this.captionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.captionLabel.Location = new System.Drawing.Point(3, 0); this.captionLabel.Location = new System.Drawing.Point(3, 0);
this.captionLabel.Name = "captionLabel"; this.captionLabel.Name = "captionLabel";
this.captionLabel.Size = new System.Drawing.Size(328, 23); this.captionLabel.Size = new System.Drawing.Size(328, 23);
this.captionLabel.TabIndex = 0; this.captionLabel.TabIndex = 0;
this.captionLabel.Text = "${res:ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.RegisterFiletypesPanel.Ca" + this.captionLabel.Text = "${res:ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.RegisterFiletypesPanel.Ca" +
"ptionLabel}"; "ptionLabel}";
// //
// fileTypesListBox // fileTypesListBox
// //
this.fileTypesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.fileTypesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.fileTypesListBox.IntegralHeight = false; this.fileTypesListBox.IntegralHeight = false;
this.fileTypesListBox.Location = new System.Drawing.Point(3, 26); this.fileTypesListBox.Location = new System.Drawing.Point(3, 26);
this.fileTypesListBox.Name = "fileTypesListBox"; this.fileTypesListBox.Name = "fileTypesListBox";
this.fileTypesListBox.Size = new System.Drawing.Size(328, 299); this.fileTypesListBox.Size = new System.Drawing.Size(328, 299);
this.fileTypesListBox.TabIndex = 1; this.fileTypesListBox.TabIndex = 1;
this.fileTypesListBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.fileTypesListBox_MouseClick);
// //
// RegisterFiletypesPanel // RegisterFiletypesPanel
// //
@ -79,6 +80,7 @@ namespace ICSharpCode.FiletypeRegisterer
this.Name = "RegisterFiletypesPanel"; this.Name = "RegisterFiletypesPanel";
this.Size = new System.Drawing.Size(334, 328); this.Size = new System.Drawing.Size(334, 328);
this.ResumeLayout(false); this.ResumeLayout(false);
} }
private System.Windows.Forms.CheckedListBox fileTypesListBox; private System.Windows.Forms.CheckedListBox fileTypesListBox;
private System.Windows.Forms.Label captionLabel; private System.Windows.Forms.Label captionLabel;

7
src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.cs

@ -80,5 +80,12 @@ namespace ICSharpCode.FiletypeRegisterer
} }
return true; return true;
} }
void fileTypesListBox_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (fileTypesListBox.IndexFromPoint(e.X, e.Y) == ListBox.NoMatches) {
fileTypesListBox.SelectedIndex = -1;
}
}
} }
} }

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

@ -53,6 +53,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
public override void Run(ResolveResult symbol) public override void Run(ResolveResult symbol)
{ {
var entity = GetSymbol(symbol); var entity = GetSymbol(symbol);
if ((entity is IMember) && ((entity.SymbolKind == SymbolKind.Constructor) || (entity.SymbolKind == SymbolKind.Destructor))) {
// Don't rename constructors/destructors, rename their declaring type instead
entity = ((IMember) entity).DeclaringType.GetDefinition();
}
if (entity != null) { if (entity != null) {
var project = GetProjectFromSymbol(entity); var project = GetProjectFromSymbol(entity);
if (project != null) { if (project != null) {

Loading…
Cancel
Save