Browse Source

Use SD.Dom for entity context menu.

Note: this does not work yet because the DOM implementation is incomplete.
newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
e24b3330ce
  1. 2
      src/AddIns/Analysis/UnitTesting/UnitTesting.addin
  2. 2
      src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin
  3. 15
      src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs
  4. 5
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  5. 33
      src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs
  6. 110
      src/Main/Base/Project/Util/SharpDevelopExtensions.cs
  7. 2
      src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs

2
src/AddIns/Analysis/UnitTesting/UnitTesting.addin

@ -41,7 +41,7 @@
defaultPosition="Right, Hidden" /> defaultPosition="Right, Hidden" />
</Path> </Path>
<Path name="/SharpDevelop/ViewContent/TextEditor/EntityContextMenu"> <Path name="/SharpDevelop/EntityContextMenu">
<Condition name="Testable"> <Condition name="Testable">
<MenuItem id="UnitTestMenu" type="Menu" label="${res:ICSharpCode.NUnitPad.NUnitPadContent.PadName}" icon="PadIcons.NUnitTest" insertbefore="MenuBuilder"> <MenuItem id="UnitTestMenu" type="Menu" label="${res:ICSharpCode.NUnitPad.NUnitPadContent.PadName}" icon="PadIcons.NUnitTest" insertbefore="MenuBuilder">
<Include id="CommonTestCommands" path="/SharpDevelop/Pads/UnitTestsPad/CommonTestCommands"/> <Include id="CommonTestCommands" path="/SharpDevelop/Pads/UnitTestsPad/CommonTestCommands"/>

2
src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyAddIn.addin

@ -17,7 +17,7 @@
</Path> </Path>
<!-- Text editor context menu: Launch ILSpy command --> <!-- Text editor context menu: Launch ILSpy command -->
<Path name="/SharpDevelop/ViewContent/TextEditor/EntityContextMenu"> <Path name="/SharpDevelop/EntityContextMenu">
<MenuItem id="ILSpy" icon="ILSpy" type="Item" label="${res:ILSpyAddIn.OpenILSpyCommand}" class="ICSharpCode.ILSpyAddIn.OpenInILSpyCommand"/> <MenuItem id="ILSpy" icon="ILSpy" type="Item" label="${res:ILSpyAddIn.OpenILSpyCommand}" class="ICSharpCode.ILSpyAddIn.OpenInILSpyCommand"/>
</Path> </Path>
</AddIn> </AddIn>

15
src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs

@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks
} }
} }
public const string ContextMenuPath = "/SharpDevelop/ViewContent/TextEditor/EntityContextMenu"; public const string ContextMenuPath = "/SharpDevelop/EntityContextMenu";
public virtual IImage Image { public virtual IImage Image {
get { return ClassBrowserIconService.GetIcon(entity); } get { return ClassBrowserIconService.GetIcon(entity); }
@ -54,10 +54,15 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks
public virtual void MouseDown(MouseButtonEventArgs e) public virtual void MouseDown(MouseButtonEventArgs e)
{ {
if (e.ChangedButton == MouseButton.Left) { if (e.ChangedButton == MouseButton.Left) {
var f = SD.AnalyticsMonitor.TrackFeature("ICSharpCode.SharpDevelop.Editor.Bookmarks.EntityBookmark.ShowContextMenu"); var entityModel = entity.GetModel();
var ctx = MenuService.ShowContextMenu(e.Source as UIElement, entity, ContextMenuPath); if (entityModel == null) {
ctx.Closed += delegate { f.EndTracking(); }; SD.Log.Warn("Could not find model for entity");
e.Handled = true; } else {
var f = SD.AnalyticsMonitor.TrackFeature("ICSharpCode.SharpDevelop.Editor.Bookmarks.EntityBookmark.ShowContextMenu");
var ctx = MenuService.ShowContextMenu(e.Source as UIElement, entityModel, ContextMenuPath);
ctx.Closed += delegate { f.EndTracking(); };
e.Handled = true;
}
} }
} }

5
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -1952,12 +1952,13 @@
<!-- TEXT EDITOR --> <!-- TEXT EDITOR -->
<Path name = "/SharpDevelop/ViewContent/TextEditor/EntityContextMenu"> <Path name = "/SharpDevelop/EntityContextMenu">
<MenuItem id = "FindReferences" <MenuItem id = "FindReferences"
label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}" label = "${res:SharpDevelop.Refactoring.FindReferencesCommand}"
class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferencesCommand"/> class = "ICSharpCode.SharpDevelop.Editor.Commands.FindReferencesCommand"/>
</Path> </Path>
<!--
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"> <Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common">
<MenuItem id = "Rename" <MenuItem id = "Rename"
label = "${res:SharpDevelop.Refactoring.RenameCommand}" label = "${res:SharpDevelop.Refactoring.RenameCommand}"
@ -1981,7 +1982,7 @@
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Parameter"> <Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Parameter">
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/> <Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path> </Path>-->
<Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu"> <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu">
<Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/> <Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/>

33
src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs

@ -6,6 +6,7 @@ using ICSharpCode.Core;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Semantics; using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
@ -15,9 +16,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
/// A menu command that operates on a <see cref="ResolveResult"/>. /// A menu command that operates on a <see cref="ResolveResult"/>.
/// ///
/// Supports the following types as <see cref="Owner"/>: /// Supports the following types as <see cref="Owner"/>:
/// - IUnresolvedTypeDefinition (as used by EntityBookmark) /// - ResolveResult
/// - IUnresolvedMember (as used by EntityBookmark) /// - IEntityModel
/// - ResolveResult (so that using the wrong GetEntity overload doesn't cause hard-to-debug problems)
/// ///
/// If the owner isn't one of the types above, the command operates on the caret position in the current editor. /// If the owner isn't one of the types above, the command operates on the caret position in the current editor.
/// </summary> /// </summary>
@ -46,8 +46,8 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
{ {
if (owner is ResolveResult) { if (owner is ResolveResult) {
return (ResolveResult)owner; return (ResolveResult)owner;
} else if (owner is IUnresolvedTypeDefinition || owner is IUnresolvedMember) { } else if (owner is IEntityModel) {
return GetResolveResultFromUnresolvedEntity((IUnresolvedEntity)owner); return GetResolveResultFromEntityModel((IEntityModel)owner);
} else if (currentEditor != null) { } else if (currentEditor != null) {
return SD.ParserService.Resolve(currentEditor, currentEditor.Caret.Location); return SD.ParserService.Resolve(currentEditor, currentEditor.Caret.Location);
} else { } else {
@ -55,23 +55,14 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
} }
} }
static ResolveResult GetResolveResultFromUnresolvedEntity(IUnresolvedEntity entity) static ResolveResult GetResolveResultFromEntityModel(IEntityModel entityModel)
{ {
if (entity.UnresolvedFile == null) IEntity entity = entityModel.Resolve();
return ErrorResolveResult.UnknownError; if (entity is IMember)
ICompilation compilation = SD.ParserService.GetCompilationForFile(FileName.Create(entity.UnresolvedFile.FileName)); return new MemberResolveResult(null, (IMember)entity);
var context = new SimpleTypeResolveContext(compilation.MainAssembly); if (entity is ITypeDefinition)
if (entity is IUnresolvedMember) { return new TypeResolveResult((ITypeDefinition)entity);
var member = ((IUnresolvedMember)entity).Resolve(context); return ErrorResolveResult.UnknownError;
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 static IEntity GetEntity(ResolveResult symbol) protected static IEntity GetEntity(ResolveResult symbol)

110
src/Main/Base/Project/Util/SharpDevelopExtensions.cs

@ -13,13 +13,13 @@ using System.Windows.Controls;
using System.Windows.Media; using System.Windows.Media;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.Utils; using ICSharpCode.NRefactory.Utils;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -368,8 +368,114 @@ namespace ICSharpCode.SharpDevelop
else else
return AmbienceService.GetCurrentAmbience(); return AmbienceService.GetCurrentAmbience();
} }
/// <summary>
/// Retrieves the model instance for the given entity.
/// May return null if there is no model for the specified entity.
/// </summary>
public static IEntityModel GetModel(this IEntity entity)
{
if (entity == null)
throw new ArgumentNullException("entity");
if (entity is ITypeDefinition)
return GetModel((ITypeDefinition)entity);
else if (entity is IMember)
return GetModel((IMember)entity);
else
return null;
}
/// <summary>
/// Retrieves the model instance for the given type definition.
/// May return null if there is no model for the specified type definition.
/// </summary>
public static ITypeDefinitionModel GetModel(this ITypeDefinition typeDefinition)
{
if (typeDefinition == null)
throw new ArgumentNullException("typeDefinition");
IProject project = typeDefinition.ParentAssembly.GetProject();
if (project != null)
return project.TypeDefinitionModels[typeDefinition.FullTypeName];
else
return null;
}
/// <summary>
/// Retrieves the model instance for the given member.
/// May return null if there is no model for the specified member.
/// </summary>
public static IMemberModel GetModel(this IMember member)
{
if (member == null)
throw new ArgumentNullException("member");
if (member.DeclaringTypeDefinition == null)
return null;
var snapshot = member.Compilation.SolutionSnapshot as ISolutionSnapshotWithProjectMapping;
if (snapshot == null)
return null;
ITypeDefinitionModel typeModel = GetModel(member.DeclaringTypeDefinition);
if (typeModel == null)
return null;
foreach (var memberModel in typeModel.Members) {
if (memberModel.Name == member.Name) {
if (memberModel.Resolve(snapshot) == member.MemberDefinition) {
return memberModel;
}
}
}
return null;
}
/// <summary>
/// Retrieves the model instance the given unresolved entity.
/// </summary>
/// <param name="entity">The unresolved entity</param>
/// <param name="project">The project in which the entity is defined.
/// If this parameter is null, the project will be determined based on the file name.</param>
/// <returns>The entity model if it could be found; or null otherwise.</returns>
public static IEntityModel GetModel(this IUnresolvedEntity entity, IProject project = null)
{
if (project == null) {
if (entity.Region.FileName == null || ProjectService.OpenSolution == null)
return null;
project = ProjectService.OpenSolution.FindProjectContainingFile(entity.Region.FileName);
if (project == null)
return null;
}
IUnresolvedTypeDefinition unresolvedTypeDefinition = entity as IUnresolvedTypeDefinition ?? entity.DeclaringTypeDefinition;
if (unresolvedTypeDefinition == null)
return null;
ITypeDefinitionModel typeModel = project.TypeDefinitionModels[unresolvedTypeDefinition.FullTypeName];
if (entity is IUnresolvedTypeDefinition || typeModel == null)
return typeModel;
ITypeDefinition typeDefinition = typeModel.Resolve();
IUnresolvedMember unresolvedMember = entity as IUnresolvedMember;
if (typeDefinition == null || unresolvedMember == null)
return null;
IMember member = unresolvedMember.Resolve(new SimpleTypeResolveContext(typeDefinition));
if (member == null)
return null;
var snapshot = member.Compilation.SolutionSnapshot as ISolutionSnapshotWithProjectMapping;
foreach (var memberModel in typeModel.Members) {
if (memberModel.Name == unresolvedMember.Name) {
if (memberModel.Resolve(snapshot) == member.MemberDefinition) {
return memberModel;
}
}
}
return null;
}
#endregion #endregion
#region DPI independence #region DPI independence
public static Rect TransformToDevice(this Rect rect, Visual visual) public static Rect TransformToDevice(this Rect rect, Visual visual)
{ {

2
src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs

@ -43,7 +43,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public ITypeDefinitionModel this[FullTypeName fullTypeName] { public ITypeDefinitionModel this[FullTypeName fullTypeName] {
get { get {
ITypeDefinitionModel model = this[fullTypeName.TopLevelTypeName]; ITypeDefinitionModel model = this[fullTypeName.TopLevelTypeName];
for (int i = 0; i < fullTypeName.NestingLevel; i++) { for (int i = 0; i < fullTypeName.NestingLevel && model != null; i++) {
string name = fullTypeName.GetNestedTypeName(i); string name = fullTypeName.GetNestedTypeName(i);
int atpc = fullTypeName.GetNestedTypeAdditionalTypeParameterCount(i); int atpc = fullTypeName.GetNestedTypeAdditionalTypeParameterCount(i);
model = model.GetNestedType(name, atpc); model = model.GetNestedType(name, atpc);

Loading…
Cancel
Save