From 2828c9e9041ffe28472be96d452afe4ecfa763f2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 8 Sep 2012 01:04:34 +0200 Subject: [PATCH] Change "SymbolUnderCaretMenuCommand" into "ResolveResultMenuCommand". --- .../Src/AvalonEditViewContent.cs | 2 +- .../AvalonEdit.AddIn/Src/CodeEditorView.cs | 3 +- .../Src/ContextActions/FindBaseClasses.cs | 4 +- .../FindDerivedClassesOrOverrides.cs | 4 +- .../Src/XmlDoc/XmlDocTooltipProvider.cs | 34 +++++++------ .../ILSpyAddIn/ILSpyAddIn.addin | 18 +------ .../LaunchILSpy/OpenInILSpyCommand.cs | 49 +++---------------- .../ViewContent/DecompiledViewContent.cs | 6 +-- .../Project/ICSharpCode.SharpDevelop.addin | 2 +- .../Editor/Commands/FindReferencesCommand.cs | 5 +- .../Src/Editor/Commands/GoToDefinition.cs | 4 +- .../Commands/SymbolUnderCaretMenuCommand.cs | 48 ++++++++++++++---- .../Project/Src/Project/CompilableProject.cs | 11 ++--- .../AmbienceService/AmbienceService.cs | 2 +- .../ParserService/ParseProjectContent.cs | 26 +++++++++- 15 files changed, 111 insertions(+), 107 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs index e2282915e6..972c283513 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs @@ -214,7 +214,7 @@ namespace ICSharpCode.AvalonEdit.AddIn else col += 1; } - WorkbenchSingleton.StatusBar.SetCaretPosition(col, this.Line, chOffset); + SD.StatusBar.SetCaretPosition(col, this.Line, chOffset); } public override bool IsReadOnly { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index 636732b12d..7aa44f32c5 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -455,8 +455,9 @@ namespace ICSharpCode.AvalonEdit.AddIn if (position == null) return; SD.AnalyticsMonitor.TrackFeature(typeof(GoToDefinition).FullName, "Ctrl+Click"); + var resolveResult = SD.ParserService.Resolve(Adapter, position.Value.Location); var goToDefinitionCommand = new GoToDefinition(); - goToDefinitionCommand.Run(this.Adapter, this.Document.GetOffset(position.Value.Location)); + goToDefinitionCommand.Run(resolveResult); e.Handled = true; } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs index 72191dc3bc..fef5423343 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs @@ -15,9 +15,9 @@ using ICSharpCode.SharpDevelop.Editor.Commands; namespace ICSharpCode.AvalonEdit.AddIn.ContextActions { - public class FindBaseClasses : SymbolUnderCaretMenuCommand + public class FindBaseClasses : ResolveResultMenuCommand { - protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + public override void Run(ResolveResult symbol) { IEntity entityUnderCaret = GetEntity(symbol); if (entityUnderCaret is ITypeDefinition) { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs index f18a67e6f6..172216cf4b 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindDerivedClassesOrOverrides.cs @@ -16,9 +16,9 @@ using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.AvalonEdit.AddIn.ContextActions { - public class FindDerivedClassesOrOverrides : SymbolUnderCaretMenuCommand + public class FindDerivedClassesOrOverrides : ResolveResultMenuCommand { - protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + public override void Run(ResolveResult symbol) { IEntity entityUnderCaret = GetEntity(symbol); if (entityUnderCaret is ITypeDefinition && !entityUnderCaret.IsSealed) { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/XmlDoc/XmlDocTooltipProvider.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/XmlDoc/XmlDocTooltipProvider.cs index e1c0bb1484..28e9732bf9 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/XmlDoc/XmlDocTooltipProvider.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/XmlDoc/XmlDocTooltipProvider.cs @@ -41,6 +41,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.XmlDoc public FlowDocumentTooltip(FlowDocument document) { + TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display); viewer = new FlowDocumentScrollViewer(); viewer.Document = document; Border border = new Border { @@ -55,8 +56,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.XmlDoc document.FontSize = CodeEditorOptions.Instance.FontSize; } - public event RoutedEventHandler Closed { add {} remove {} } - public bool CloseOnHoverEnd { get { return true; } } @@ -65,42 +64,45 @@ namespace ICSharpCode.AvalonEdit.AddIn.XmlDoc object CreateTooltip(IType type) { var ambience = AmbienceService.GetCurrentAmbience(); - ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; - string header = ambience.ConvertType(type); + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowDeclaringType; + string header; + if (type is ITypeDefinition) + header = ambience.ConvertEntity((ITypeDefinition)type); + else + header = ambience.ConvertType(type); + + ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList; + DocumentationUIBuilder b = new DocumentationUIBuilder(ambience); + b.AddCodeBlock(header, keepLargeMargin: true); + ITypeDefinition entity = type.GetDefinition(); if (entity != null) { var documentation = XmlDocumentationElement.Get(entity); if (documentation != null) { - ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList; - DocumentationUIBuilder b = new DocumentationUIBuilder(ambience); - b.AddCodeBlock(header, keepLargeMargin: true); foreach (var child in documentation.Children) { b.AddDocumentationElement(child); } - return new FlowDocumentTooltip(b.FlowDocument); } } - return header; + return new FlowDocumentTooltip(b.FlowDocument); } object CreateTooltip(IEntity entity) { var ambience = AmbienceService.GetCurrentAmbience(); - ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowDeclaringType; string header = ambience.ConvertEntity(entity); var documentation = XmlDocumentationElement.Get(entity); + ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList; + DocumentationUIBuilder b = new DocumentationUIBuilder(ambience); + b.AddCodeBlock(header, keepLargeMargin: true); if (documentation != null) { - ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList; - DocumentationUIBuilder b = new DocumentationUIBuilder(ambience); - b.AddCodeBlock(header, keepLargeMargin: true); foreach (var child in documentation.Children) { b.AddDocumentationElement(child); } - return new FlowDocumentTooltip(b.FlowDocument); - } else { - return header; } + return new FlowDocumentTooltip(b.FlowDocument); } } } diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin index 2577b4636b..ea1ec88349 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin @@ -17,21 +17,7 @@ - diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/LaunchILSpy/OpenInILSpyCommand.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/LaunchILSpy/OpenInILSpyCommand.cs index 4650759f90..70734ae298 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/LaunchILSpy/OpenInILSpyCommand.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/LaunchILSpy/OpenInILSpyCommand.cs @@ -3,7 +3,9 @@ using System; using ICSharpCode.Core; +using ICSharpCode.NRefactory.Semantics; using ICSharpCode.SharpDevelop.Bookmarks; +using ICSharpCode.SharpDevelop.Editor.Commands; namespace ICSharpCode.ILSpyAddIn { @@ -11,53 +13,14 @@ namespace ICSharpCode.ILSpyAddIn /// Implements a menu command to position .NET ILSpy on a class /// or class member. /// - public sealed class OpenInILSpyCommand : AbstractMenuCommand + public sealed class OpenInILSpyCommand : ResolveResultMenuCommand { - public override void Run() + public override void Run(ResolveResult symbol) { - throw new NotImplementedException(); - #warning implement OpenInILSpyCommand - /*IClass c; - IMember m; - - MemberNode mn = this.Owner as MemberNode; - if (mn != null) { - m = mn.Member; - c = m.DeclaringType; - } else { - ClassNode cn = this.Owner as ClassNode; - if (cn != null) { - c = cn.Class; - m = null; - } else { - ClassMemberBookmark cmbm = this.Owner as ClassMemberBookmark; - if (cmbm != null) { - m = cmbm.Member; - c = m.DeclaringType; - } else { - ClassBookmark cbm = this.Owner as ClassBookmark; - if (cbm != null) { - c = cbm.Class; - m = null; - } else { - MessageService.ShowWarning("ILSpy AddIn: Could not determine the class for the selected element. Owner: " + ((this.Owner == null) ? "" : this.Owner.ToString())); - return; - } - } - } - } - - if (c == null) { - MessageService.ShowWarning("ILSpy AddIn: Could not determine the class for the selected element (known owner). Owner: " + this.Owner.ToString()); - return; - } - - AbstractEntity entity = m as AbstractEntity; - if (entity == null) - entity = c as AbstractEntity; + var entity = GetEntity(symbol); if (entity != null) { ILSpyController.OpenInILSpy(entity); - }*/ + } } } } diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs index f0c587b605..eb9efb465f 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs @@ -30,7 +30,7 @@ namespace ICSharpCode.ILSpyAddIn { readonly FileName assemblyFile; readonly string fullTypeName; - readonly string uri; + readonly FileName virtualFileName; /// /// Entity to jump to once decompilation has finished. @@ -47,7 +47,7 @@ namespace ICSharpCode.ILSpyAddIn #region Constructor public DecompiledViewContent(FileName assemblyFile, string fullTypeName, string entityTag) { - this.uri = string.Format("ilspy://{0}|{1}", assemblyFile, fullTypeName); + this.virtualFileName = FileName.Create("ilspy://" + assemblyFile + ">" + fullTypeName); this.codeView = new CodeView(); this.assemblyFile = assemblyFile; @@ -273,7 +273,7 @@ namespace ICSharpCode.ILSpyAddIn void BookmarkManager_Added(object sender, BookmarkEventArgs e) { var mark = e.Bookmark; - if (mark != null && mark is BreakpointBookmark && mark.FileName == uri) { + if (mark != null && mark is BreakpointBookmark && mark.FileName == virtualFileName) { codeView.IconBarManager.Bookmarks.Add(mark); mark.Document = this.codeView.Document; } diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index 2d777e9a4e..d9e5a12b87 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -1930,7 +1930,7 @@ + class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferencesCommand"/> diff --git a/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs index 03406f33f1..a995f8a7df 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/FindReferencesCommand.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.Core; using ICSharpCode.NRefactory.Semantics; using ICSharpCode.SharpDevelop.Refactoring; @@ -10,9 +11,9 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands /// /// Runs the find references command. /// - public class FindReferencesCommand : SymbolUnderCaretMenuCommand + public class FindReferencesCommand : ResolveResultMenuCommand { - protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + public override void Run(ResolveResult symbol) { var entity = GetEntity(symbol); if (entity != null) { diff --git a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs index c99df07617..2b9ed91c0f 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/GoToDefinition.cs @@ -12,9 +12,9 @@ using Mono.Cecil; namespace ICSharpCode.SharpDevelop.Editor.Commands { - public class GoToDefinition : SymbolUnderCaretMenuCommand + public class GoToDefinition : ResolveResultMenuCommand { - protected override void RunImpl(ITextEditor editor, int offset, ResolveResult symbol) + public override void Run(ResolveResult symbol) { if (symbol == null) return; diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs index 6faaf12a77..abe947c44c 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs @@ -12,26 +12,54 @@ using ICSharpCode.SharpDevelop.Parser; namespace ICSharpCode.SharpDevelop.Editor.Commands { /// - /// A menu command that uses the symbol under the editor's caret. + /// A menu command that operates on a . + /// + /// Supports the following types as : + /// - IUnresolvedTypeDefinition (as used by EntityBookmark) + /// - IUnresolvedMember (as used by EntityBookmark) + /// + /// If the owner isn't one of the types above, the command operates on the caret position in the current editor. /// - public abstract class SymbolUnderCaretMenuCommand : AbstractMenuCommand + public abstract class ResolveResultMenuCommand : AbstractMenuCommand { + public abstract void Run(ResolveResult symbol); + public override void Run() { ITextEditor editor = SD.GetActiveViewContentService(); - if (editor != null) { - Run(editor, editor.Caret.Offset); - } + ResolveResult resolveResult = GetResolveResult(editor, Owner); + Run(resolveResult); } - public void Run(ITextEditor editor, int caretOffset) + public static ResolveResult GetResolveResult(ITextEditor editor, object owner) { - var location = editor.Document.GetLocation(caretOffset); - var resolveResult = SD.ParserService.Resolve(editor, location); - RunImpl(editor, editor.Caret.Offset, resolveResult); + if (owner is IUnresolvedTypeDefinition || owner is IUnresolvedMember) { + return GetResolveResultFromUnresolvedEntity((IUnresolvedEntity)owner); + } else if (editor != null) { + return SD.ParserService.Resolve(editor, editor.Caret.Location); + } else { + return ErrorResolveResult.UnknownError; + } } - protected abstract void RunImpl(ITextEditor editor, int caretOffset, ResolveResult symbol); + static ResolveResult GetResolveResultFromUnresolvedEntity(IUnresolvedEntity entity) + { + if (entity.UnresolvedFile == null) + return ErrorResolveResult.UnknownError; + ICompilation compilation = SD.ParserService.GetCompilationForFile(FileName.Create(entity.UnresolvedFile.FileName)); + var context = new SimpleTypeResolveContext(compilation.MainAssembly); + if (entity is IUnresolvedMember) { + var member = ((IUnresolvedMember)entity).Resolve(context); + if (member != null) { + return new MemberResolveResult(null, member); + } else { + return ErrorResolveResult.UnknownError; + } + } else { // IUnresolvedTypeDefinition + var type = ((IUnresolvedTypeDefinition)entity).Resolve(context); + return new TypeResolveResult(type); + } + } protected IEntity GetEntity(ResolveResult symbol) { diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 4e98666fef..01c00327f4 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -224,12 +224,9 @@ namespace ICSharpCode.SharpDevelop.Project if (e.PropertyName == "TargetFrameworkVersion") CreateItemsListFromMSBuild(); if (!isLoading) { - if (reparseReferencesSensitiveProperties.Contains(e.PropertyName)) { - Reparse(true, false); - } - if (reparseCodeSensitiveProperties.Contains(e.PropertyName)) { - Reparse(false, true); - } + bool reparseReferences = reparseReferencesSensitiveProperties.Contains(e.PropertyName); + bool reparseCode = reparseCodeSensitiveProperties.Contains(e.PropertyName); + Reparse(reparseReferences, reparseCode); } } @@ -238,6 +235,8 @@ namespace ICSharpCode.SharpDevelop.Project lock (SyncRoot) { if (parseProjectContentContainer == null) return; // parsing hasn't started yet; no need to re-parse + parseProjectContentContainer.SetAssemblyName(this.AssemblyName); + parseProjectContentContainer.SetLocation(this.OutputAssemblyFullPath); if (references) { parseProjectContentContainer.ReparseReferences(); } diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs b/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs index ee3cda1827..1e7e918a30 100644 --- a/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs +++ b/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.SharpDevelop /// This method is thread-safe. /// /// Returns a new ambience object (ambience objects are never reused to ensure their thread-safety). - /// Never returns null, in case of errors the is used. + /// Never returns null, in case of errors the is used. public static IAmbience GetCurrentAmbience() { if (UseProjectAmbienceIfPossible) { diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index 5ca21bbf9e..80ef660aeb 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.SharpDevelop.Parser if (project == null) throw new ArgumentNullException("project"); this.project = project; - this.projectContent = initialProjectContent.SetAssemblyName(project.AssemblyName); + this.projectContent = initialProjectContent.SetAssemblyName(project.AssemblyName).SetLocation(project.OutputAssemblyFullPath); this.cacheFileName = GetCacheFileName(FileName.Create(project.FileName)); @@ -240,6 +240,30 @@ namespace ICSharpCode.SharpDevelop.Parser } } + public void SetAssemblyName(string newAssemblyName) + { + lock (lockObj) { + if (!disposed) { + if (projectContent.FullAssemblyName == newAssemblyName) + return; + projectContent = projectContent.SetAssemblyName(newAssemblyName); + SD.ParserService.InvalidateCurrentSolutionSnapshot(); + } + } + } + + public void SetLocation(string newLocation) + { + lock (lockObj) { + if (!disposed) { + if (projectContent.Location == newLocation) + return; + projectContent = projectContent.SetLocation(newLocation); + SD.ParserService.InvalidateCurrentSolutionSnapshot(); + } + } + } + public void SetCompilerSettings(object compilerSettings) { lock (lockObj) {