From 36090788409596c9c9119dfe936b982ca4bce6a4 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 16 Jun 2013 16:15:41 +0200 Subject: [PATCH] [WIP] EnvDTE --- .../Src/Refactoring/CSharpCodeGenerator.cs | 10 + .../Src/Refactoring/RefactoringExtensions.cs | 13 +- .../Project/PackageManagement.csproj | 6 - .../Project/Src/DocumentNamespaceCreator.cs | 27 --- .../Project/Src/EnvDTE/CodeElement.cs | 29 ++- .../Project/Src/EnvDTE/CodeFunction.cs | 198 +++++++++--------- .../Project/Src/EnvDTE/CodeFunction2.cs | 80 +++---- .../Project/Src/EnvDTE/CodeGetterFunction.cs | 16 -- .../Src/EnvDTE/CodeGetterOrSetterFunction.cs | 29 --- .../Project/Src/EnvDTE/CodeImport.cs | 73 +++---- .../Project/Src/EnvDTE/CodeNamespace.cs | 24 ++- .../Project/Src/EnvDTE/CodeSetterFunction.cs | 16 -- .../Project/Src/EnvDTE/CodeType.cs | 20 +- .../Project/Src/EnvDTE/CodeVariable.cs | 10 - .../Project/Src/EnvDTE/FileCodeModel2.cs | 134 ++++++++---- .../Src/EnvDTE/FileCodeModelCodeNamespace.cs | 78 +++---- .../Project/Src/IDocumentNamespaceCreator.cs | 13 -- .../Project/Src/VirtualMethodUpdater.cs | 67 ------ .../Src/vsCMOverrideKind.vb | 1 + .../ICSharpCode.Reports.Addin.csproj | 5 +- .../ICSharpCode.Reports.Core.csproj | 5 +- .../Refactoring/TypeSystemAstBuilder.cs | 16 +- .../Base/Project/Dom/ITypeDefinitionModel.cs | 3 + .../Base/Project/Refactoring/CodeGenerator.cs | 6 + .../Commands/SymbolUnderCaretMenuCommand.cs | 8 +- src/Main/Base/Project/Util/SimpleCommand.cs | 6 +- .../SharpDevelop/Dom/TypeDefinitionModel.cs | 5 + 27 files changed, 403 insertions(+), 495 deletions(-) delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/DocumentNamespaceCreator.cs delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/IDocumentNamespaceCreator.cs delete mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/VirtualMethodUpdater.cs diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs index 32717a2666..ef594eb342 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs @@ -134,5 +134,15 @@ namespace CSharpBinding.Refactoring // TODO script.ChangeModifiers(...) throw new NotImplementedException(); } + + public override void AddImport(FileName fileName, string namespaceName) + { + var context = RefactoringExtensions.CreateRefactoringContext(new DomRegion(fileName, 0, 0)); + var astBuilder = context.CreateTypeSystemAstBuilder(); + using (var script = context.StartScript()) { + AstType ns = astBuilder.ConvertNamespace(namespaceName); + UsingHelper.InsertUsing(context, script, ns); + } + } } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs index a9b152c8be..a97b2db104 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs @@ -11,6 +11,7 @@ using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Project; namespace CSharpBinding.Refactoring { @@ -82,17 +83,21 @@ namespace CSharpBinding.Refactoring } else { region = entity.Region; } + return CreateRefactoringContext(region, entity.ParentAssembly.GetProject()); + } + + public static SDRefactoringContext CreateRefactoringContext(DomRegion region, IProject project = null) + { var view = SD.FileService.OpenFile(new FileName(region.FileName), false); if (view == null) - return null; + throw new NotSupportedException("Could not open " + region.FileName); var editor = view.GetService(); if (editor == null) - return null; - var project = entity.ParentAssembly.GetProject(); + throw new NotSupportedException("Could not find editor for " + region.FileName); var fileName = FileName.Create(region.FileName); var parseInfo = SD.ParserService.Parse(fileName, editor.Document, project) as CSharpFullParseInformation; if (parseInfo == null) - return null; + throw new NotSupportedException("Could not C# parse info for " + region.FileName); ICompilation compilation; if (project != null) compilation = SD.ParserService.GetCompilation(project); diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 2186e43a7a..fe7f0472dd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -87,7 +87,6 @@ - @@ -99,8 +98,6 @@ - - @@ -110,7 +107,6 @@ - @@ -145,7 +141,6 @@ - @@ -221,7 +216,6 @@ - diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/DocumentNamespaceCreator.cs b/src/AddIns/Misc/PackageManagement/Project/Src/DocumentNamespaceCreator.cs deleted file mode 100644 index 9edaf043a1..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/DocumentNamespaceCreator.cs +++ /dev/null @@ -1,27 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop; -//using ICSharpCode.SharpDevelop.Dom; -//using ICSharpCode.SharpDevelop.Editor; -//using ICSharpCode.SharpDevelop.Gui; -//using ICSharpCode.SharpDevelop.Refactoring; -// -//namespace ICSharpCode.PackageManagement -//{ -// public class DocumentNamespaceCreator : IDocumentNamespaceCreator -// { -// public void AddNamespace(ICompilationUnit compilationUnit, string newNamespace) -// { -// if (WorkbenchSingleton.InvokeRequired) { -// WorkbenchSingleton.SafeThreadCall(() => AddNamespace(compilationUnit, newNamespace)); -// } else { -// IViewContent view = FileService.OpenFile(compilationUnit.FileName); -// var textEditor = view as ITextEditorProvider; -// IDocument document = textEditor.TextEditor.Document; -// NamespaceRefactoringService.AddUsingDeclaration(compilationUnit, document, newNamespace, false); -// } -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs index 8ce016d763..db802abec0 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs @@ -35,8 +35,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE { switch (m.SymbolKind) { case SymbolKind.Field: -// return new CodeVariable(m); - throw new NotImplementedException(); + return new CodeVariable(context, (IFieldModel)m); case SymbolKind.Property: case SymbolKind.Indexer: // return new CodeProperty2(m); @@ -47,8 +46,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE case SymbolKind.Operator: case SymbolKind.Constructor: case SymbolKind.Destructor: -// return new CodeFunction2(m); - throw new NotImplementedException(); + return new CodeFunction2(context, (IMethodModel)m); default: throw new NotSupportedException("Invalid value for SymbolKind"); } @@ -63,12 +61,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE // default is vsCMPart.vsCMPartWholeWithAttributes public virtual global::EnvDTE.TextPoint GetStartPoint() { - return null; + if (symbolModel != null) + return TextPoint.CreateStartPoint(context, symbolModel.Region); + else + return null; } public virtual global::EnvDTE.TextPoint GetEndPoint() { - return null; + if (symbolModel != null) + return TextPoint.CreateEndPoint(context, symbolModel.Region); + else + return null; } public virtual global::EnvDTE.vsCMInfoLocation InfoLocation { @@ -100,6 +104,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE return context.FilteredFileName == region.FileName; } + protected CodeElementsList GetAttributes(IEntityModel entityModel) + { + var list = new CodeElementsList(); + var td = entityModel.Resolve(); + if (td != null) { + foreach (var attr in td.Attributes) { + if (IsInFilter(attr.Region)) + list.Add(new CodeAttribute2(context, attr)); + } + } + return list; + } + protected override bool GetIsDerivedFrom(string fullName) { return false; diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs index ba2890bad8..e191d7ff86 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction.cs @@ -1,98 +1,100 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeFunction : CodeElement, global::EnvDTE.CodeFunction -// { -// IDocumentLoader documentLoader; -// IVirtualMethodUpdater methodUpdater; -// -// public CodeFunction(IMethod method) -// : this(method, new DocumentLoader(), new VirtualMethodUpdater(method)) -// { -// } -// -// public CodeFunction(IMethod method, IDocumentLoader documentLoader, IVirtualMethodUpdater methodUpdater) -// : base(method) -// { -// this.Method = method; -// this.documentLoader = documentLoader; -// this.methodUpdater = methodUpdater; -// } -// -// public CodeFunction() -// { -// } -// -// public CodeFunction(IProperty property) -// : base(property) -// { -// } -// -// protected IMethodOrProperty Method { get; private set; } -// -// public override global::EnvDTE.vsCMElement Kind { -// get { return global::EnvDTE.vsCMElement.vsCMElementFunction; } -// } -// -// public virtual global::EnvDTE.vsCMAccess Access { -// get { return GetAccess(); } -// set { } -// } -// -// public override global::EnvDTE.TextPoint GetStartPoint() -// { -// return new TextPoint(Method.GetStartPosition(), documentLoader); -// } -// -// public override global::EnvDTE.TextPoint GetEndPoint() -// { -// return new TextPoint(Method.GetEndPosition(), documentLoader); -// } -// -// public virtual global::EnvDTE.CodeElements Parameters { -// get { return new CodeParameters(Method.ProjectContent, Method.Parameters); } -// } -// -// public virtual global::EnvDTE.CodeTypeRef2 Type { -// get { return new CodeTypeRef2(Method.ProjectContent, this, Method.ReturnType); } -// } -// -// public virtual global::EnvDTE.CodeElements Attributes { -// get { return new CodeAttributes(Method); } -// } -// -// public virtual bool CanOverride { -// get { return Method.IsOverridable; } -// set { -// if (value) { -// methodUpdater.MakeMethodVirtual(); -// } -// } -// } -// -// public virtual global::EnvDTE.vsCMFunction FunctionKind { -// get { return GetFunctionKind(); } -// } -// -// global::EnvDTE.vsCMFunction GetFunctionKind() -// { -// if (Method.IsConstructor()) { -// return global::EnvDTE.vsCMFunction.vsCMFunctionConstructor; -// } -// return global::EnvDTE.vsCMFunction.vsCMFunctionFunction; -// } -// -// public virtual bool IsShared { -// get { return Method.IsStatic; } -// } -// -// public virtual bool MustImplement { -// get { return Method.IsAbstract; } -// } -// } -//} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class CodeFunction : CodeElement, global::EnvDTE.CodeFunction + { + protected readonly IMethodModel methodModel; + + public CodeFunction(CodeModelContext context, IMethodModel methodModel) + : base(context, methodModel) + { + } + + public CodeFunction() + { + } + + public override global::EnvDTE.vsCMElement Kind { + get { return global::EnvDTE.vsCMElement.vsCMElementFunction; } + } + + public virtual global::EnvDTE.vsCMAccess Access { + get { return methodModel.Accessibility.ToAccess(); } + set { + var method = methodModel.Resolve(); + if (method == null) + throw new NotSupportedException(); + context.CodeGenerator.ChangeAccessibility(method, value.ToAccessibility()); + } + } + + public virtual global::EnvDTE.CodeElements Parameters { + get { + var list = new CodeElementsList(); + var method = (IParameterizedMember)methodModel.Resolve(); + if (method != null) { + foreach (var p in method.Parameters) { + list.Add(new CodeParameter2(context, p)); + } + } + return list; + } + } + + public virtual global::EnvDTE.CodeTypeRef2 Type { + get { + var method = methodModel.Resolve(); + if (method == null) + return null; + return new CodeTypeRef2(context, this, method.ReturnType); + } + } + + public virtual global::EnvDTE.CodeElements Attributes { + get { return GetAttributes(methodModel); } + } + + public virtual bool CanOverride { + get { return methodModel.IsOverridable; } + set { + if (value && !methodModel.IsOverridable) { + var method = methodModel.Resolve(); + if (method != null) { + context.CodeGenerator.MakeVirtual(method); + } + } + } + } + + public virtual global::EnvDTE.vsCMFunction FunctionKind { + get { return GetFunctionKind(); } + } + + global::EnvDTE.vsCMFunction GetFunctionKind() + { + switch (methodModel.SymbolKind) { + case SymbolKind.Constructor: + return global::EnvDTE.vsCMFunction.vsCMFunctionConstructor; + //case SymbolKind.Destructor: + //case SymbolKind.Accessor: + //case SymbolKind.Operator: + default: + return global::EnvDTE.vsCMFunction.vsCMFunctionFunction; + } + } + + public virtual bool IsShared { + get { return methodModel.IsStatic; } + } + + public virtual bool MustImplement { + get { return methodModel.IsAbstract; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction2.cs index 425b6cd108..8707763309 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeFunction2.cs @@ -1,40 +1,40 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeFunction2 : CodeFunction, global::EnvDTE.CodeFunction2 -// { -// public CodeFunction2(IMethod method) -// : base(method) -// { -// } -// -// public virtual bool IsGeneric { -// get { return Method.HasTypeParameters(); } -// } -// -// public virtual global::EnvDTE.vsCMOverrideKind OverrideKind { -// get { return GetOverrideKind(); } -// } -// -// global::EnvDTE.vsCMOverrideKind GetOverrideKind() -// { -// if (Method.IsAbstract) { -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindAbstract; -// } else if (Method.IsVirtual) { -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindVirtual; -// } else if (Method.IsOverride) { -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindOverride; -// } else if (Method.IsSealed) { -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindSealed; -// } else if (Method.IsNew) { -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindNew; -// } -// return global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindNone; -// } -// } -//} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class CodeFunction2 : CodeFunction, global::EnvDTE.CodeFunction2 + { + public CodeFunction2(CodeModelContext context, IMethodModel methodModel) + : base(context, methodModel) + { + } + + public virtual bool IsGeneric { + get { return methodModel.TypeParameterCount > 0; } + } + + public virtual global::EnvDTE.vsCMOverrideKind OverrideKind { + get { return GetOverrideKind(); } + } + + global::EnvDTE.vsCMOverrideKind GetOverrideKind() + { + global::EnvDTE.vsCMOverrideKind kind = 0; + if (methodModel.IsAbstract) + kind |= global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindAbstract; + if (methodModel.IsOverride) + kind |= global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindOverride; + if (methodModel.IsVirtual && !methodModel.IsAbstract && !methodModel.IsOverride) + kind |= global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindVirtual; + if (methodModel.IsSealed) + kind |= global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindSealed; + if (methodModel.IsShadowing) + kind |= global::EnvDTE.vsCMOverrideKind.vsCMOverrideKindNew; + return kind; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs deleted file mode 100644 index dd3b447702..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterFunction.cs +++ /dev/null @@ -1,16 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeGetterFunction : CodeGetterOrSetterFunction -// { -// public CodeGetterFunction(IProperty property) -// : base(property, property.GetterModifiers) -// { -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs deleted file mode 100644 index c2a2e65c1f..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeGetterOrSetterFunction.cs +++ /dev/null @@ -1,29 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeGetterOrSetterFunction : CodeFunction -// { -// ModifierEnum modifier; -// -// public CodeGetterOrSetterFunction(IProperty property, ModifierEnum modifier) -// : base(property) -// { -// this.modifier = modifier; -// } -// -// public override global::EnvDTE.vsCMAccess Access { -// get { -// if (modifier == ModifierEnum.None) { -// return base.Access; -// } -// return global::EnvDTE.vsCMAccess.vsCMAccessPrivate; -// } -// set { } -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeImport.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeImport.cs index 694e3b7881..5c3b3d3b41 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeImport.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeImport.cs @@ -1,40 +1,33 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using System.Linq; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeImport : CodeElement, global::EnvDTE.CodeImport -// { -// IUsing import; -// -// public CodeImport() -// { -// } -// -// public CodeImport(IUsing import) -// { -// this.import = import; -// this.Namespace = GetNamespace(); -// } -// -// string GetNamespace() -// { -// if (import.Usings.Any()) { -// return import.Usings.First(); -// } else if (import.HasAliases) { -// return import.Aliases.Values.First().FullyQualifiedName; -// } -// return String.Empty; -// } -// -// public string Namespace { get; private set; } -// -// public override global::EnvDTE.vsCMElement Kind { -// get { return global::EnvDTE.vsCMElement.vsCMElementImportStmt; } -// } -// } -//} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Linq; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class CodeImport : CodeElement, global::EnvDTE.CodeImport + { + string namespaceName; + + public CodeImport() + { + } + + public CodeImport(string namespaceName) + { + this.namespaceName = namespaceName; + } + + public string Namespace { + get { + return namespaceName; + } + } + + public override global::EnvDTE.vsCMElement Kind { + get { return global::EnvDTE.vsCMElement.vsCMElementImportStmt; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs index 3df9d60d04..a83587a998 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeNamespace.cs @@ -9,7 +9,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public class CodeNamespace : CodeElement, global::EnvDTE.CodeNamespace { - readonly INamespaceModel model; + readonly string fullName; + INamespaceModel model; public CodeNamespace(CodeModelContext context, INamespaceModel model) : base(context, model) @@ -17,6 +18,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE this.model = model; } + public CodeNamespace(CodeModelContext context, string fullName) + : base(context) + { + this.fullName = fullName; + } + public override global::EnvDTE.vsCMElement Kind { get { return global::EnvDTE.vsCMElement.vsCMElementNamespace; } } @@ -26,14 +33,21 @@ namespace ICSharpCode.PackageManagement.EnvDTE } public string FullName { - get { return model.FullName; } + get { return fullName; } } + CodeElementsList members; + public virtual global::EnvDTE.CodeElements Members { get { - IModelCollection namespaceMembers = model.ChildNamespaces.Select(ns => new CodeNamespace(context, ns)); - IModelCollection typeMembers = model.Types.Select(td => CodeType.Create(context, td)); - return namespaceMembers.Concat(typeMembers).AsCodeElements(); + if (members == null) { + if (model == null) + throw new NotSupportedException(); + IModelCollection namespaceMembers = model.ChildNamespaces.Select(ns => new CodeNamespace(context, ns)); + IModelCollection typeMembers = model.Types.Select(td => CodeType.Create(context, td)); + members = namespaceMembers.Concat(typeMembers).AsCodeElements(); + } + return members; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs deleted file mode 100644 index a47f540e85..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeSetterFunction.cs +++ /dev/null @@ -1,16 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeSetterFunction : CodeGetterOrSetterFunction -// { -// public CodeSetterFunction(IProperty property) -// : base(property, property.SetterModifiers) -// { -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs index 03d1bcc3f7..5fa3f7f37d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs @@ -66,7 +66,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual global::EnvDTE.vsCMAccess Access { get { return typeModel.Accessibility.ToAccess(); } - set { + set { var td = typeModel.Resolve(); if (td != null) { context.CodeGenerator.ChangeAccessibility(td, value.ToAccessibility()); @@ -125,24 +125,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual global::EnvDTE.CodeElements Attributes { get { - var list = new CodeElementsList(); - var td = typeModel.Resolve(); - if (td != null) { - foreach (var attr in td.Attributes) { - if (IsInFilter(attr.Region)) - list.Add(new CodeAttribute2(context, attr)); - } - } - return list; + return GetAttributes(typeModel); } } public virtual global::EnvDTE.CodeNamespace Namespace { get { - throw new NotImplementedException(); - // if (context.FilteredFileName != null) - // ... - // else + if (context.FilteredFileName != null) + return new FileCodeModel2(context).GetNamespace(typeModel.Namespace); + else + throw new NotImplementedException(); // return new CodeNamespace(context, typeModel.Namespace); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs index 6c68513811..b37a8a78a9 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs @@ -33,15 +33,5 @@ namespace ICSharpCode.PackageManagement.EnvDTE } } } - - public override global::EnvDTE.TextPoint GetStartPoint() - { - return TextPoint.CreateStartPoint(context, field.Region); - } - - public override global::EnvDTE.TextPoint GetEndPoint() - { - return TextPoint.CreateEndPoint(context, field.Region); - } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModel2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModel2.cs index 5f55fa33c8..39a80beb6d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModel2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModel2.cs @@ -1,45 +1,89 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -//using ICSharpCode.SharpDevelop.Project; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class FileCodeModel2 : MarshalByRefObject, global::EnvDTE.FileCodeModel2 -// { -// Project project; -// FileProjectItem projectItem; -// IDocumentNamespaceCreator namespaceCreator; -// -// public FileCodeModel2(Project project, FileProjectItem projectItem) -// : this(project, projectItem, new DocumentNamespaceCreator()) -// { -// } -// -// public FileCodeModel2( -// Project project, -// FileProjectItem projectItem, -// IDocumentNamespaceCreator namespaceCreator) -// { -// this.project = project; -// this.projectItem = projectItem; -// this.namespaceCreator = namespaceCreator; -// } -// -// public global::EnvDTE.CodeElements CodeElements { -// get { return new FileCodeModelCodeElements(GetCompilationUnit()); } -// } -// -// public void AddImport(string name, object position = null, string alias = null) -// { -// namespaceCreator.AddNamespace(GetCompilationUnit(), name); -// } -// -// ICompilationUnit GetCompilationUnit() -// { -// return project.GetCompilationUnit(projectItem.FileName); -// } -// } -//} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Linq; +using ICSharpCode.Core; +using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.CSharp.TypeSystem; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class FileCodeModel2 : MarshalByRefObject, global::EnvDTE.FileCodeModel2 + { + readonly CodeModelContext context; + CodeElementsList codeElements = new CodeElementsList(); + Dictionary namespaces = new Dictionary(); + + public FileCodeModel2(CodeModelContext context) + { + if (context == null || context.FilteredFileName == null) + throw new ArgumentException("context must be restricted to a file"); + this.context = context; + var compilation = SD.ParserService.GetCompilation(context.CurrentProject); + + var projectContent = compilation.MainAssembly.UnresolvedAssembly as IProjectContent; + if (projectContent != null) { + IUnresolvedFile file = projectContent.GetFile(context.FilteredFileName); + if (file != null) { + var csharpFile = file as CSharpUnresolvedFile; + if (csharpFile != null) + AddUsings(codeElements, csharpFile.RootUsingScope, compilation); + + var resolveContext = new SimpleTypeResolveContext(compilation.MainAssembly); + AddTypes(file.TopLevelTypeDefinitions + .Select(td => td.Resolve(resolveContext) as ITypeDefinition) + .Where(td => td != null).Distinct()); + } + } + } + + public global::EnvDTE.CodeElements CodeElements { + get { return codeElements; } + } + + void AddTypes(IEnumerable types) + { + foreach (var td in types) { + var model = td.GetModel(); + if (model == null) + continue; + var codeType = CodeType.Create(context, td); + if (string.IsNullOrEmpty(td.Namespace)) + codeElements.Add(codeType); + else + GetNamespace(td.Namespace).AddMember(codeType); + } + codeElements.AddRange(types.Select(td => CodeType.Create(context, td))); + } + + public static void AddUsings(CodeElementsList codeElements, UsingScope usingScope, ICompilation compilation) + { + var resolvedUsingScope = usingScope.Resolve(compilation); + foreach (var ns in resolvedUsingScope.Usings) { + codeElements.Add(new CodeImport(ns.FullName)); + } + } + + public void AddImport(string name, object position = null, string alias = null) + { + context.CodeGenerator.AddImport(FileName.Create(context.FilteredFileName), name); + } + + internal FileCodeModelCodeNamespace GetNamespace(string namespaceName) + { + FileCodeModelCodeNamespace ns; + if (!namespaces.TryGetValue(namespaceName, out ns)) { + ns = new FileCodeModelCodeNamespace(context, namespaceName); + namespaces.Add(namespaceName, ns); + codeElements.Add(ns); + } + return null; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs index 4ef3937761..1dfc8fe3fc 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/FileCodeModelCodeNamespace.cs @@ -1,36 +1,42 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// /// -// /// File code model namespaces take the full name of the namespace that a class -// /// is inside. So for the FileCodeModelNamespace class the CodeNamespace.Name -// /// would be ICSharpCode.PackageManagement.EnvDTE. -// /// This differs from the CodeModel CodeNamespace which breaks up the namespaces into -// /// parts. -// /// -// public class FileCodeModelCodeNamespace : CodeNamespace -// { -// public FileCodeModelCodeNamespace(IProjectContent projectContent, string namespaceName) -// : base(projectContent, namespaceName) -// { -// } -// -// public override string Name { -// get { return base.FullName; } -// } -// -// public override global::EnvDTE.CodeElements Members { -// get { return members; } -// } -// -// public void AddClass(IProjectContent projectContent, IClass c) -// { -// members.AddClass(projectContent, c); -// } -// } -//} +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + /// + /// File code model namespaces take the full name of the namespace that a class + /// is inside. So for the FileCodeModelNamespace class the CodeNamespace.Name + /// would be ICSharpCode.PackageManagement.EnvDTE. + /// This differs from the CodeModel CodeNamespace which breaks up the namespaces into + /// parts. + /// + public class FileCodeModelCodeNamespace : CodeNamespace + { + public FileCodeModelCodeNamespace(CodeModelContext context, string namespaceName) + : base(context, namespaceName) + { + } + + public override string Name { + get { return base.FullName; } + } + + public override global::EnvDTE.vsCMInfoLocation InfoLocation { + get { return global::EnvDTE.vsCMInfoLocation.vsCMInfoLocationProject; } + } + + CodeElementsList members = new CodeElementsList(); + + public override global::EnvDTE.CodeElements Members { + get { return members; } + } + + internal void AddMember(CodeElement member) + { + members.Add(member); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IDocumentNamespaceCreator.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IDocumentNamespaceCreator.cs deleted file mode 100644 index 0190b9e28a..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IDocumentNamespaceCreator.cs +++ /dev/null @@ -1,13 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement -//{ -// public interface IDocumentNamespaceCreator -// { -// void AddNamespace(ICompilationUnit compilationUnit, string newNamespace); -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/VirtualMethodUpdater.cs b/src/AddIns/Misc/PackageManagement/Project/Src/VirtualMethodUpdater.cs deleted file mode 100644 index b8cae0aae0..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/VirtualMethodUpdater.cs +++ /dev/null @@ -1,67 +0,0 @@ -//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -// -//using System; -//using ICSharpCode.SharpDevelop.Dom; -//using ICSharpCode.SharpDevelop.Dom.Refactoring; -// -//namespace ICSharpCode.PackageManagement -//{ -// public class VirtualMethodUpdater : IVirtualMethodUpdater -// { -// public VirtualMethodUpdater(IMethod method) -// : this(method, new DocumentLoader()) -// { -// } -// -// public VirtualMethodUpdater(IMethod method, IDocumentLoader documentLoader) -// { -// this.Method = method; -// this.DocumentLoader = documentLoader; -// } -// -// IMethod Method { get; set; } -// IDocumentLoader DocumentLoader { get; set; } -// IRefactoringDocument Document { get; set; } -// -// public void MakeMethodVirtual() -// { -// if (Method.IsVirtual) -// return; -// -// OpenFileContainingMethod(); -// int offset = GetVirtualKeywordInsertOffset(); -// InsertVirtualKeyword(offset); -// } -// -// void OpenFileContainingMethod() -// { -// Document = DocumentLoader.LoadRefactoringDocument(Method.CompilationUnit.FileName); -// } -// -// int GetVirtualKeywordInsertOffset() -// { -// IRefactoringDocumentLine line = Document.GetLine(Method.Region.BeginLine); -// int offset = line.Text.IndexOf("public ", StringComparison.OrdinalIgnoreCase); -// if (offset >= 0) { -// int publicKeywordLength = 6; -// return offset + line.Offset + publicKeywordLength + 1; -// } -// throw new ApplicationException("Unable to find 'method' declaration."); -// } -// -// void InsertVirtualKeyword(int offset) -// { -// string virtualKeyword = GetLanguageSpecificVirtualKeyword(); -// Document.Insert(offset, virtualKeyword + " "); -// } -// -// string GetLanguageSpecificVirtualKeyword() -// { -// if (Method.ProjectContent.Language == LanguageProperties.VBNet) { -// return "Overridable"; -// } -// return "virtual"; -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMOverrideKind.vb b/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMOverrideKind.vb index 155533f15a..46f3cb28d2 100644 --- a/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMOverrideKind.vb +++ b/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMOverrideKind.vb @@ -2,6 +2,7 @@ ' This code is distributed under the GNU LGPL (for details please see \doc\license.txt) Namespace EnvDTE + Public Enum vsCMOverrideKind vsCMOverrideKindNone = 0 vsCMOverrideKindAbstract = 1 diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.Reports.Addin.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.Reports.Addin.csproj index 727323d656..3117289d01 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.Reports.Addin.csproj +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/ICSharpCode.Reports.Addin.csproj @@ -12,7 +12,7 @@ False Auto 125829120 - AnyCPU + x86 4096 4 False @@ -58,9 +58,6 @@ False AllRules.ruleset - - False - ..\Libraries\itextsharp.dll diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj index a819aaf373..31e3a9ef76 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj @@ -12,7 +12,7 @@ False Auto 123731968 - AnyCPU + x86 4096 4 False @@ -55,9 +55,6 @@ None False - - False - ..\Libraries\Irony.dll diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs index d524b8ab65..a01d510565 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs @@ -338,7 +338,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring } } - AstType ConvertNamespace(string ns) + public AstType ConvertNamespace(string namespaceName) { if (resolver != null) { // Look if there's an alias to the target namespace @@ -346,27 +346,27 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring for (ResolvedUsingScope usingScope = resolver.CurrentUsingScope; usingScope != null; usingScope = usingScope.Parent) { foreach (var pair in usingScope.UsingAliases) { NamespaceResolveResult nrr = pair.Value as NamespaceResolveResult; - if (nrr != null && nrr.NamespaceName == ns) + if (nrr != null && nrr.NamespaceName == namespaceName) return new SimpleType(pair.Key); } } } } - int pos = ns.LastIndexOf('.'); + int pos = namespaceName.LastIndexOf('.'); if (pos < 0) { - if (IsValidNamespace(ns)) { - return new SimpleType(ns); + if (IsValidNamespace(namespaceName)) { + return new SimpleType(namespaceName); } else { return new MemberType { Target = new SimpleType("global"), IsDoubleColon = true, - MemberName = ns + MemberName = namespaceName }; } } else { - string parentNamespace = ns.Substring(0, pos); - string localNamespace = ns.Substring(pos + 1); + string parentNamespace = namespaceName.Substring(0, pos); + string localNamespace = namespaceName.Substring(pos + 1); return new MemberType { Target = ConvertNamespace(parentNamespace), MemberName = localNamespace diff --git a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs index 370f5ae8ef..133c540efc 100644 --- a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs +++ b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Parser; @@ -18,6 +19,8 @@ namespace ICSharpCode.SharpDevelop.Dom IModelCollection NestedTypes { get; } IModelCollection Members { get; } + IEnumerable GetPartRegions(); + /// /// Resolves the type definition in the current solution snapshot. /// Returns null if the type definition could not be resolved. diff --git a/src/Main/Base/Project/Refactoring/CodeGenerator.cs b/src/Main/Base/Project/Refactoring/CodeGenerator.cs index c47e7889d5..b8bfcdfb10 100644 --- a/src/Main/Base/Project/Refactoring/CodeGenerator.cs +++ b/src/Main/Base/Project/Refactoring/CodeGenerator.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; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Project; @@ -86,5 +87,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring { throw new NotSupportedException("Feature not supported!"); } + + public virtual void AddImport(FileName fileName, string namespaceName) + { + throw new NotSupportedException("Feature not supported!"); + } } } diff --git a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs index a1761cacf9..912b5afd09 100644 --- a/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs +++ b/src/Main/Base/Project/Src/Editor/Commands/SymbolUnderCaretMenuCommand.cs @@ -16,24 +16,24 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands /// /// A menu command that operates on a . /// - /// Supports the following types as : + /// Supports the following types as parameter: /// - ResolveResult /// - IEntityModel /// - /// If the owner isn't one of the types above, the command operates on the caret position in the current editor. + /// If the parameter isn't one of the types above, the command operates on the caret position in the current editor. /// public abstract class ResolveResultMenuCommand : ICommand { public virtual event EventHandler CanExecuteChanged { add {} remove {} } - public bool CanExecute(object parameter) + bool ICommand.CanExecute(object parameter) { ITextEditor editor = SD.GetActiveViewContentService(); ResolveResult resolveResult = GetResolveResult(editor, parameter); return CanExecute(resolveResult); } - public void Execute(object parameter) + void ICommand.Execute(object parameter) { ITextEditor editor = SD.GetActiveViewContentService(); ResolveResult resolveResult = GetResolveResult(editor, parameter); diff --git a/src/Main/Base/Project/Util/SimpleCommand.cs b/src/Main/Base/Project/Util/SimpleCommand.cs index 1c9fa866e5..059ed0af0d 100644 --- a/src/Main/Base/Project/Util/SimpleCommand.cs +++ b/src/Main/Base/Project/Util/SimpleCommand.cs @@ -7,13 +7,13 @@ using System.Windows.Input; namespace ICSharpCode.SharpDevelop { /// - /// Base class for simple ICommand implementation that always returns true from CanExecute. + /// Base class for ICommand implementations. /// public abstract class SimpleCommand : ICommand { - event EventHandler ICommand.CanExecuteChanged { add {} remove {} } + public virtual event EventHandler CanExecuteChanged { add {} remove {} } - bool ICommand.CanExecute(object parameter) + public virtual bool CanExecute(object parameter) { return true; } diff --git a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs index 62ea575d1b..67e518a7e1 100644 --- a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs +++ b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs @@ -334,5 +334,10 @@ namespace ICSharpCode.SharpDevelop.Dom public bool IsShadowing { get { return parts.Any(p => p.IsShadowing); } } + + public IEnumerable GetPartRegions() + { + return parts.Select(p => p.Region); + } } }