diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs index 96702f3e99..d141fbf8dd 100644 --- a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs +++ b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.CodeAnalysis FxCopTaskTag tag = t.Tag as FxCopTaskTag; if (tag == null) continue; - ICodeGenerator gen = tag.Project.LanguageBinding.CodeGenerator; + CodeGenerator gen = tag.Project.LanguageBinding.CodeGenerator; ICompilation compilation; if (t.FileName != null) compilation = SD.ParserService.GetCompilationForFile(t.FileName); diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs index 0260b26239..cf7c1e55ad 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -25,7 +25,7 @@ namespace CSharpBinding { this.container.AddService(typeof(IFormattingStrategy), new CSharpFormattingStrategy()); this.container.AddService(typeof(IBracketSearcher), new CSharpBracketSearcher()); - this.container.AddService(typeof(ICodeGenerator), new CSharpCodeGenerator()); + this.container.AddService(typeof(CodeGenerator), new CSharpCodeGenerator()); this.container.AddService(typeof(System.CodeDom.Compiler.CodeDomProvider), new Microsoft.CSharp.CSharpCodeProvider()); } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpFullParseInformation.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpFullParseInformation.cs index 0cb0b92e44..0c407953d2 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpFullParseInformation.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpFullParseInformation.cs @@ -46,7 +46,7 @@ namespace CSharpBinding.Parser // (caching in the parse information could prevent the compilation from being garbage-collected) // Also, don't cache CSharpAstResolvers for every file - doing so would require too much memory, - // and we rarely usually only need to access the same file several times. + // and we usually only need to access the same file several times. // So we use a static key to get the resolver, and verify that it belongs to this parse information. var resolver = compilation.CacheManager.GetShared(ResolverCacheKey) as CSharpAstResolver; if (resolver == null || resolver.RootNode != syntaxTree || resolver.UnresolvedFile != UnresolvedFile) { diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs index 6033153071..a60ef9e2ba 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Windows.Media.Animation; +using CSharpBinding.Parser; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.Core; using ICSharpCode.Core.Presentation; @@ -28,7 +29,7 @@ namespace CSharpBinding.Refactoring /// /// Description of CSharpCodeGenerator. /// - public class CSharpCodeGenerator : DefaultCodeGenerator + public class CSharpCodeGenerator : CodeGenerator { public override void AddAttribute(IEntity target, IAttribute attribute) { @@ -102,8 +103,7 @@ namespace CSharpBinding.Refactoring var view = SD.FileService.OpenFile(new FileName(region.FileName), false); var editor = view.GetRequiredService(); var context = SDRefactoringContext.Create(editor.FileName, editor.Document, region.Begin, CancellationToken.None); - var node = context.RootNode.GetNodeAt(region.Begin); - if (node is ICSharpCode.NRefactory.CSharp.Attribute) node = node.Parent; + var node = context.RootNode.GetNodeAt(region.Begin); var resolver = context.GetResolverStateBefore(node); var builder = new TypeSystemAstBuilder(resolver); @@ -114,5 +114,20 @@ namespace CSharpBinding.Refactoring script.InsertBefore(node, attr); } } + + public override void AddField(ITypeDefinition declaringType, Accessibility accessibility, IType fieldType, string name) + { + SDRefactoringContext context = declaringType.CreateRefactoringContext(); + var typeDecl = context.GetNode(); + using (var script = context.StartScript()) { + var astBuilder = context.CreateTypeSystemAstBuilder(typeDecl.FirstChild); + var fieldDecl = new FieldDeclaration(); + fieldDecl.Modifiers = TypeSystemAstBuilder.ModifierFromAccessibility(accessibility); + fieldDecl.ReturnType = astBuilder.ConvertType(context.Compilation.Import(fieldType)); + fieldDecl.Variables.Add(new VariableInitializer(name)); + script.InsertWithCursor("Add field: " + name, Script.InsertPosition.End, fieldDecl); + } + base.AddField(declaringType, accessibility, fieldType, name); + } } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/OverrideToStringMethodDialog.xaml.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/OverrideToStringMethodDialog.xaml.cs index 67f336cc6c..b9c67dd9c6 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/OverrideToStringMethodDialog.xaml.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/OverrideToStringMethodDialog.xaml.cs @@ -66,7 +66,7 @@ namespace CSharpBinding.Refactoring return null; } - string GenerateFormatString(ITypeDefinition currentClass, ICodeGenerator generator, string[] fields) + string GenerateFormatString(ITypeDefinition currentClass, CodeGenerator generator, string[] fields) { string fieldsString = ""; diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs index 9b4462a1ea..a9b152c8be 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/RefactoringExtensions.cs @@ -3,11 +3,14 @@ using System; using System.Linq; +using CSharpBinding.Parser; using ICSharpCode.Core; using ICSharpCode.NRefactory.CSharp; +using ICSharpCode.NRefactory.CSharp.Resolver; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; -using CSharpBinding.Parser; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Editor; namespace CSharpBinding.Refactoring { @@ -59,5 +62,44 @@ namespace CSharpBinding.Refactoring return null; return parseInfo.SyntaxTree.GetNodeAt(entity.Region.Begin); } + + + /// + /// Returns a refactoring context for the file that contains the entity. + /// This will open the file in the text editor if necessary. + /// + public static SDRefactoringContext CreateRefactoringContext(this IEntity entity) + { + var typeDef = entity as ITypeDefinition; + DomRegion region; + if (typeDef != null) { + IUnresolvedTypeDefinition bestPart = null; + foreach (var part in typeDef.Parts) { + if (bestPart == null || EntityModelContextUtils.IsBetterPart(part, bestPart, ".cs")) + bestPart = part; + } + region = bestPart.Region; + } else { + region = entity.Region; + } + var view = SD.FileService.OpenFile(new FileName(region.FileName), false); + if (view == null) + return null; + var editor = view.GetService(); + if (editor == null) + return null; + var project = entity.ParentAssembly.GetProject(); + var fileName = FileName.Create(region.FileName); + var parseInfo = SD.ParserService.Parse(fileName, editor.Document, project) as CSharpFullParseInformation; + if (parseInfo == null) + return null; + ICompilation compilation; + if (project != null) + compilation = SD.ParserService.GetCompilation(project); + else + compilation = SD.ParserService.GetCompilationForFile(fileName); + var resolver = parseInfo.GetResolver(compilation); + return new SDRefactoringContext(editor, resolver, region.Begin); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 6d8fad1207..2186e43a7a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -105,7 +105,6 @@ - @@ -130,8 +129,6 @@ - - diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute.cs index a3a6a622eb..d6832f081c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute.cs @@ -18,7 +18,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE { } - public CodeAttribute(IAttribute attribute) + public CodeAttribute(CodeModelContext context, IAttribute attribute) + : base(context) { this.attribute = attribute; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute2.cs index f7a3583611..5f657ff6e4 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeAttribute2.cs @@ -13,8 +13,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE { } - public CodeAttribute2(IAttribute attribute) - : base(attribute) + public CodeAttribute2(CodeModelContext context, IAttribute attribute) + : base(context, attribute) { } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs index 4c4d951026..e8b401224b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs @@ -46,11 +46,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE if (td == null) return null; IType fieldType = td.Compilation.FindType(fieldTypeName); - IFieldModel field = typeModel.AddField(Access.ToAccessibility(), fieldType, name); - if (field != null) - return new CodeVariable(context, field); - else - return null; + context.CodeGenerator.AddField(td, Access.ToAccessibility(), fieldType, name); + var fieldModel = typeModel.Members.OfType().FirstOrDefault(f => f.Name == name); + if (fieldModel != null) { + return new CodeVariable(context, fieldModel); + } + return null; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs index 915eab7dc5..003be6f526 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass2.cs @@ -1,58 +1,62 @@ -//// 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 CodeClass2 : CodeClass, global::EnvDTE.CodeClass2 -// { -// IClassKindUpdater classKindUpdater; -// -// public CodeClass2(IProjectContent projectContent, IClass c, IClassKindUpdater classKindUpdater) -// : base(projectContent, c) -// { -// this.classKindUpdater = classKindUpdater; -// } -// -// public CodeClass2(IProjectContent projectContent, IClass c) -// : this(projectContent, c, new ClassKindUpdater(c)) -// { -// } -// -// public global::EnvDTE.CodeElements PartialClasses { -// get { return new PartialClasses(this); } -// } -// -// public static CodeClass2 CreateFromBaseType(IProjectContent projectContent, IReturnType baseType) -// { -// IClass baseTypeClass = baseType.GetUnderlyingClass(); -// return new CodeClass2(projectContent, baseTypeClass); -// } -// -// public bool IsGeneric { -// get { return Class.DotNetName.Contains("`"); } -// } -// -// public global::EnvDTE.vsCMClassKind ClassKind { -// get { -// if (Class.IsPartial) { -// return global::EnvDTE.vsCMClassKind.vsCMClassKindPartialClass; -// } -// return global::EnvDTE.vsCMClassKind.vsCMClassKindMainClass; -// } -// set { -// if (value == global::EnvDTE.vsCMClassKind.vsCMClassKindPartialClass) { -// classKindUpdater.MakeClassPartial(); -// } else { -// throw new NotImplementedException(); -// } -// } -// } -// -// public bool IsAbstract { -// get { return Class.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 System.Linq; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class CodeClass2 : CodeClass, global::EnvDTE.CodeClass2 + { + public CodeClass2(CodeModelContext context, ITypeDefinitionModel typeModel) + : base(context, typeModel) + { + } + + public global::EnvDTE.CodeElements PartialClasses { + get { + var list = new CodeElementsList(); + var td = typeModel.Resolve(); + if (td != null) { + foreach (var fileName in td.Parts.Select(p => p.UnresolvedFile.FileName).Distinct()) { + var newContext = context.WithFilteredFileName(fileName); + list.Add(CodeType.Create(newContext, typeModel)); + } + } else { + list.Add(this); + } + return list; + } + } + + public bool IsGeneric { + get { return typeModel.FullTypeName.TypeParameterCount > 0; } + } + + public global::EnvDTE.vsCMClassKind ClassKind { + get { + if (typeModel.IsPartial) { + return global::EnvDTE.vsCMClassKind.vsCMClassKindPartialClass; + } + return global::EnvDTE.vsCMClassKind.vsCMClassKindMainClass; + } + set { + if (value == this.ClassKind) + return; + if (value == global::EnvDTE.vsCMClassKind.vsCMClassKindPartialClass) { + var td = typeModel.Resolve(); + if (td == null) + throw new NotSupportedException(); + context.CodeGenerator.MakePartial(td); + } else { + throw new NotSupportedException(); + } + } + } + + public bool IsAbstract { + get { return typeModel.IsAbstract; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeDelegate.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeDelegate.cs index 2ccbf724fb..9a797d3b28 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeDelegate.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeDelegate.cs @@ -1,24 +1,24 @@ -//// 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 CodeDelegate : CodeType, global::EnvDTE.CodeDelegate -// { -// public CodeDelegate(IProjectContent projectContent, IClass c) -// : base(projectContent, c) -// { -// } -// -// public CodeDelegate() -// { -// } -// -// public override global::EnvDTE.vsCMElement Kind { -// get { return global::EnvDTE.vsCMElement.vsCMElementDelegate; } -// } -// } -//} +// 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 CodeDelegate : CodeType, global::EnvDTE.CodeDelegate + { + public CodeDelegate(CodeModelContext context, ITypeDefinitionModel typeModel) + : base(context, typeModel) + { + } + + public CodeDelegate() + { + } + + public override global::EnvDTE.vsCMElement Kind { + get { return global::EnvDTE.vsCMElement.vsCMElementDelegate; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs index efa0281f6d..8ce016d763 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeElement.cs @@ -18,6 +18,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE { } + public CodeElement(CodeModelContext context) + { + this.context = context; + } + public CodeElement(CodeModelContext context, ISymbolModel symbolModel) { this.context = context; @@ -88,6 +93,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE get { return global::EnvDTE.vsCMElement.vsCMElementOther; } } + protected bool IsInFilter(DomRegion region) + { + if (context.FilteredFileName == null) + return true; + return context.FilteredFileName == region.FileName; + } + protected override bool GetIsDerivedFrom(string fullName) { return false; diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModelContext.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModelContext.cs index d1851d6ef6..6a23cc9a11 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModelContext.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeModelContext.cs @@ -3,6 +3,7 @@ using System; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.PackageManagement.EnvDTE { @@ -10,5 +11,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public IProject CurrentProject { get; set; } public IDocumentLoader DocumentLoader { get; set; } + public CodeGenerator CodeGenerator { get; set; } + + /// + /// Specifies the file name if this code model context refers to + /// + public string FilteredFileName { get; set; } + + public CodeModelContext WithFilteredFileName(string fileName) + { + CodeModelContext newContext = (CodeModelContext)MemberwiseClone(); + newContext.FilteredFileName = fileName; + return newContext; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs index 32b631728a..a15f69f134 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter.cs @@ -1,37 +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 -//{ -// public class CodeParameter : CodeElement, global::EnvDTE.CodeParameter -// { -// IProjectContent projectContent; -// -// public CodeParameter(IProjectContent projectContent, IParameter parameter) -// { -// this.projectContent = projectContent; -// this.Parameter = parameter; -// } -// -// protected IParameter Parameter { get; private set; } -// -// public override global::EnvDTE.vsCMElement Kind { -// get { return global::EnvDTE.vsCMElement.vsCMElementParameter; } -// } -// -// public override string Name { -// get { return Parameter.Name; } -// } -// -// public virtual global::EnvDTE.CodeTypeRef2 Type { -// get { return new CodeTypeRef2(projectContent, this, Parameter.ReturnType); } -// } -// -// public virtual global::EnvDTE.CodeElements Attributes { -// get { return new CodeAttributes(Parameter); } -// } -// } -//} +// 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 CodeParameter : CodeElement, global::EnvDTE.CodeParameter + { + protected readonly IParameter parameter; + + public CodeParameter(CodeModelContext context, IParameter parameter) + : base(context) + { + this.parameter = parameter; + } + + public override global::EnvDTE.vsCMElement Kind { + get { return global::EnvDTE.vsCMElement.vsCMElementParameter; } + } + + public override string Name { + get { return parameter.Name; } + } + + public virtual global::EnvDTE.CodeTypeRef2 Type { + get { return new CodeTypeRef2(context, this, parameter.Type); } + } + + public virtual global::EnvDTE.CodeElements Attributes { + get { + var list = new CodeElementsList(); + foreach (var attr in parameter.Attributes) { + list.Add(new CodeAttribute2(context, attr)); + } + return list; + } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs index 5f86eb04eb..c901abb9af 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameter2.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 -//{ -// public class CodeParameter2 : CodeParameter, global::EnvDTE.CodeParameter2 -// { -// public CodeParameter2(IProjectContent projectContent, IParameter parameter) -// : base(projectContent, parameter) -// { -// } -// -// public virtual global::EnvDTE.vsCMParameterKind ParameterKind { -// get { return GetParameterKind(); } -// } -// -// global::EnvDTE.vsCMParameterKind GetParameterKind() -// { -// if (Parameter.IsOptional) { -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindOptional; -// } else if (Parameter.IsOut) { -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindOut; -// } else if (Parameter.IsRef) { -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindRef; -// } else if (Parameter.IsParams) { -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindParamArray; -// } else if (Parameter.IsIn()) { -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindIn; -// } -// return global::EnvDTE.vsCMParameterKind.vsCMParameterKindNone; -// } -// } -//} +// 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 CodeParameter2 : CodeParameter, global::EnvDTE.CodeParameter2 + { + public CodeParameter2(CodeModelContext context, IParameter parameter) + : base(context, parameter) + { + } + + public virtual global::EnvDTE.vsCMParameterKind ParameterKind { + get { return GetParameterKind(); } + } + + global::EnvDTE.vsCMParameterKind GetParameterKind() + { + global::EnvDTE.vsCMParameterKind kind = 0; + if (parameter.IsOptional) { + kind |= global::EnvDTE.vsCMParameterKind.vsCMParameterKindOptional; + } + if (parameter.IsOut) { + kind |= global::EnvDTE.vsCMParameterKind.vsCMParameterKindOut; + } + if (parameter.IsRef) { + kind |= global::EnvDTE.vsCMParameterKind.vsCMParameterKindRef; + } + if (parameter.IsParams) { + kind |= global::EnvDTE.vsCMParameterKind.vsCMParameterKindParamArray; + } + if (!(parameter.IsOut || parameter.IsRef)) { + kind |= global::EnvDTE.vsCMParameterKind.vsCMParameterKindIn; + } + return kind; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameters.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameters.cs deleted file mode 100644 index 454d4bff23..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeParameters.cs +++ /dev/null @@ -1,32 +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 System.Collections.Generic; -//using ICSharpCode.SharpDevelop.Dom; -// -//namespace ICSharpCode.PackageManagement.EnvDTE -//{ -// public class CodeParameters : CodeElementsList -// { -// IProjectContent projectContent; -// -// public CodeParameters(IProjectContent projectContent, IEnumerable parameters) -// { -// this.projectContent = projectContent; -// AddParameters(parameters); -// } -// -// void AddParameters(IEnumerable parameters) -// { -// foreach (IParameter parameter in parameters) { -// AddParameters(parameter); -// } -// } -// -// void AddParameters(IParameter parameter) -// { -// AddCodeElement(new CodeParameter2(projectContent, parameter)); -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs index db7d340e39..03d1bcc3f7 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE if (typeDef != null) { var typeModel = typeDef.GetModel(); if (typeModel != null) - return Create(context, typeModel); + return Create(context.WithFilteredFileName(null), typeModel); } return null; } @@ -66,7 +66,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual global::EnvDTE.vsCMAccess Access { get { return typeModel.Accessibility.ToAccess(); } - set { typeModel.Accessibility = value.ToAccessibility(); } + set { + var td = typeModel.Resolve(); + if (td != null) { + context.CodeGenerator.ChangeAccessibility(td, value.ToAccessibility()); + } + } } public virtual string FullName { @@ -89,7 +94,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual global::EnvDTE.CodeElements Members { get { if (members == null) { - members = typeModel.Members.Select(m => CreateMember(context, m)).AsCodeElements(); + members = typeModel.Members + .Where(m => IsInFilter(m.Region)) + .Select(m => CreateMember(context, m)) + .AsCodeElements(); } return members; } @@ -121,7 +129,8 @@ namespace ICSharpCode.PackageManagement.EnvDTE var td = typeModel.Resolve(); if (td != null) { foreach (var attr in td.Attributes) { - list.Add(new CodeAttribute2(attr)); + if (IsInFilter(attr.Region)) + list.Add(new CodeAttribute2(context, attr)); } } return list; @@ -131,7 +140,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE public virtual global::EnvDTE.CodeNamespace Namespace { get { throw new NotImplementedException(); -// return new FileCodeModelCodeNamespace(currentProject, typeModel.Namespace); + // if (context.FilteredFileName != null) + // ... + // else + // return new CodeNamespace(context, typeModel.Namespace); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs index 424f95c325..acb1f92158 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef.cs @@ -1,52 +1,117 @@ -//// 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 CodeTypeRef : MarshalByRefObject, global::EnvDTE.CodeTypeRef -// { -// IProjectContent projectContent; -// CodeElement parent; -// -// public CodeTypeRef() -// { -// } -// -// public CodeTypeRef(IProjectContent projectContent, CodeElement parent, IReturnType returnType) -// { -// this.parent = parent; -// this.projectContent = projectContent; -// this.ReturnType = returnType; -// } -// -// protected IReturnType ReturnType { get; private set; } -// -// public virtual string AsFullName { -// get { return ReturnType.GetFullName(); } -// } -// -// public virtual string AsString { -// get { -// if (projectContent.Language == LanguageProperties.VBNet) { -// return ReturnType.AsVisualBasicString(); -// } -// return ReturnType.AsCSharpString(); -// } -// } -// -// public virtual global::EnvDTE.CodeElement Parent { -// get { return parent; } -// } -// -// public virtual global::EnvDTE.CodeType CodeType { -// get { return new CodeClass2(projectContent, ReturnType.GetUnderlyingClass()); } -// } -// -// public virtual global::EnvDTE.vsCMTypeRef TypeKind { -// get { return ReturnType.GetTypeKind(); } -// } -// } -//} +// 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.CSharp; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class CodeTypeRef : MarshalByRefObject, global::EnvDTE.CodeTypeRef + { + protected readonly CodeModelContext context; + protected readonly CodeElement parent; + protected readonly IType type; + + public CodeTypeRef() + { + } + + public CodeTypeRef(CodeModelContext context, CodeElement parent, IType type) + { + this.context = context; + this.parent = parent; + this.type = type; + } + + public virtual string AsFullName { + get { return type.ReflectionName; } + } + + public virtual string AsString { + get { + return new CSharpAmbience().ConvertType(type); + } + } + + public virtual global::EnvDTE.CodeElement Parent { + get { return parent; } + } + + public virtual global::EnvDTE.CodeType CodeType { + get { + return EnvDTE.CodeType.Create(context, type); + } + } + + public virtual global::EnvDTE.vsCMTypeRef TypeKind { + get { + switch (type.Kind) { + case NRefactory.TypeSystem.TypeKind.Class: + if (type.IsKnownType(KnownTypeCode.String)) + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefString; + else + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefObject; + case NRefactory.TypeSystem.TypeKind.Struct: + var typeDef = type.GetDefinition(); + if (typeDef != null) + return GetStructTypeKind(typeDef.KnownTypeCode); + else + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefOther; + case NRefactory.TypeSystem.TypeKind.Delegate: + case NRefactory.TypeSystem.TypeKind.Interface: + case NRefactory.TypeSystem.TypeKind.Module: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefObject; + case NRefactory.TypeSystem.TypeKind.Void: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefVoid; + case NRefactory.TypeSystem.TypeKind.Array: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefArray; + case NRefactory.TypeSystem.TypeKind.Pointer: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefPointer; + default: + if (type.IsReferenceType == true) + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefObject; + else + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefOther; + } + } + } + + global::EnvDTE.vsCMTypeRef GetStructTypeKind(KnownTypeCode knownTypeCode) + { + switch (knownTypeCode) { + case KnownTypeCode.Boolean: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefBool; + case KnownTypeCode.Char: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefChar; + case KnownTypeCode.SByte: + case KnownTypeCode.Byte: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefByte; + case KnownTypeCode.Int16: + case KnownTypeCode.UInt16: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefShort; + case KnownTypeCode.Int32: + case KnownTypeCode.UInt32: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefInt; + case KnownTypeCode.Int64: + case KnownTypeCode.UInt64: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefLong; + case KnownTypeCode.Single: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefFloat; + case KnownTypeCode.Double: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefDouble; + case KnownTypeCode.Decimal: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefDecimal; + case KnownTypeCode.Void: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefVoid; + case KnownTypeCode.IntPtr: + case KnownTypeCode.UIntPtr: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefPointer; + default: + return global::EnvDTE.vsCMTypeRef.vsCMTypeRefOther; + } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs index 49b82643a3..21b00af8be 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeTypeRef2.cs @@ -1,20 +1,21 @@ -//// 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 CodeTypeRef2 : CodeTypeRef, global::EnvDTE.CodeTypeRef2 -// { -// public CodeTypeRef2(IProjectContent projectContent, CodeElement parent, IReturnType returnType) -// : base(projectContent, parent, returnType) -// { -// } -// -// public bool IsGeneric { -// get { return ReturnType.DotNetName.Contains("{"); } -// } -// } -//} +// 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 CodeTypeRef2 : CodeTypeRef, global::EnvDTE.CodeTypeRef2 + { + public CodeTypeRef2(CodeModelContext context, CodeElement parent, IType type) + : base(context, parent, type) + { + } + + public bool IsGeneric { + get { return type.IsParameterized; } + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs index 0377696b66..6c68513811 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeVariable.cs @@ -26,7 +26,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE public global::EnvDTE.vsCMAccess Access { get { return field.Accessibility.ToAccess(); } - set { field.Accessibility = value.ToAccessibility(); } + set { + var f = field.Resolve(); + if (f != null) { + context.CodeGenerator.ChangeAccessibility(f, value.ToAccessibility()); + } + } } public override global::EnvDTE.TextPoint GetStartPoint() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/NamespaceName.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/NamespaceName.cs deleted file mode 100644 index 8fea477cce..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/NamespaceName.cs +++ /dev/null @@ -1,43 +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; - -namespace ICSharpCode.PackageManagement.EnvDTE -{ - public class NamespaceName - { - public NamespaceName(string parentNamespace, string name) - : this(GetQualifiedNamespaceName(parentNamespace, name)) - { - } - - static string GetQualifiedNamespaceName(string parentNamespace, string name) - { - if (String.IsNullOrEmpty(parentNamespace)) { - return name; - } - return String.Format("{0}.{1}", parentNamespace, name); - } - - public NamespaceName(string qualifiedName) - { - this.QualifiedName = qualifiedName; - LastPart = GetLastPartOfNamespace(); - } - - string GetLastPartOfNamespace() - { - int index = QualifiedName.LastIndexOf('.'); - return QualifiedName.Substring(index + 1); - } - - public string LastPart { get; private set; } - public string QualifiedName { get; private set; } - - public NamespaceName CreateChildNamespaceName(string name) - { - return new NamespaceName(QualifiedName, name); - } - } -} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/PartialClasses.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/PartialClasses.cs deleted file mode 100644 index 75ccafe162..0000000000 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/PartialClasses.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 PartialClasses : CodeElementsList -// { -// public PartialClasses(CodeClass2 codeClass) -// { -// AddCodeElement(codeClass); -// } -// } -//} diff --git a/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMParameterKind.vb b/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMParameterKind.vb index b3806d3c60..b32bb22646 100644 --- a/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMParameterKind.vb +++ b/src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/vsCMParameterKind.vb @@ -2,6 +2,7 @@ ' This code is distributed under the GNU LGPL (for details please see \doc\license.txt) Namespace EnvDTE + Public Enum vsCMParameterKind vsCMParameterKindNone = 0 vsCMParameterKindIn = 1 diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index a5951c9662..5fae98d922 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -105,7 +105,6 @@ - diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/NamespaceNameTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/NamespaceNameTests.cs deleted file mode 100644 index 9f067893bf..0000000000 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/NamespaceNameTests.cs +++ /dev/null @@ -1,40 +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.PackageManagement.EnvDTE; -using NUnit.Framework; - -namespace PackageManagement.Tests.EnvDTE -{ - [TestFixture] - public class NamespaceNameTests - { - NamespaceName namespaceName; - - void CreateNamespaceName(string parent, string name) - { - namespaceName = new NamespaceName(parent, name); - } - - [Test] - public void QualifiedName_ParentNamespaceIsTest_ReturnsTestPrefix() - { - CreateNamespaceName("Test", "Child"); - - string name = namespaceName.QualifiedName; - - Assert.AreEqual("Test.Child", name); - } - - [Test] - public void QualifiedName_ParentNamespaceIsEmptyString_ReturnsJustChildNamespaceName() - { - CreateNamespaceName(String.Empty, "Child"); - - string name = namespaceName.QualifiedName; - - Assert.AreEqual("Child", name); - } - } -} diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs index 2b311c2daf..69814217e3 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs @@ -91,7 +91,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring static EntityDeclaration GenerateMemberImplementation(RefactoringContext context, IMember member, bool explicitImplementation) { - var builder = context.CreateTypeSytemAstBuilder(); + var builder = context.CreateTypeSystemAstBuilder(); builder.GenerateBody = true; builder.ShowModifiers = false; builder.ShowAccessibility = true; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompilerErrors/CS0029InvalidConversionIssue.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompilerErrors/CS0029InvalidConversionIssue.cs index 5a9cc75248..05fb40479f 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompilerErrors/CS0029InvalidConversionIssue.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompilerErrors/CS0029InvalidConversionIssue.cs @@ -1,10 +1,10 @@ // -// ExpressionOfCompatibleTypeCastIssue.cs +// CS0029InvalidConversionIssue.cs // // Author: -// Ciprian Khlud +// Daniel Grunwald // -// Copyright (c) 2013 Ciprian Khlud +// Copyright (c) 2013 Daniel Grunwald // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs index 4270865424..4668715750 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring public abstract TextLocation Location { get; } - public TypeSystemAstBuilder CreateTypeSytemAstBuilder() + public TypeSystemAstBuilder CreateTypeSystemAstBuilder() { var csResolver = Resolver.GetResolverStateBefore(GetNode()); return new TypeSystemAstBuilder(csResolver); @@ -53,13 +53,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring public virtual AstType CreateShortType (IType fullType) { - var builder = CreateTypeSytemAstBuilder(); + var builder = CreateTypeSystemAstBuilder(); return builder.ConvertType(fullType); } public virtual AstType CreateShortType(string ns, string name, int typeParameterCount = 0) { - var builder = CreateTypeSytemAstBuilder(); + var builder = CreateTypeSystemAstBuilder(); return builder.ConvertType(new TopLevelTypeName(ns, name, typeParameterCount)); } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs index 2d3eaa162c..d524b8ab65 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs @@ -841,7 +841,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring #endregion #region Convert Modifiers - static Modifiers ModifierFromAccessibility(Accessibility accessibility) + public static Modifiers ModifierFromAccessibility(Accessibility accessibility) { switch (accessibility) { case Accessibility.Private: diff --git a/src/Main/Base/Project/Dom/IEntityModel.cs b/src/Main/Base/Project/Dom/IEntityModel.cs index 966186e846..ed122ccd32 100644 --- a/src/Main/Base/Project/Dom/IEntityModel.cs +++ b/src/Main/Base/Project/Dom/IEntityModel.cs @@ -17,7 +17,25 @@ namespace ICSharpCode.SharpDevelop.Dom /// /// Gets/sets the accessibility of the entity. /// - Accessibility Accessibility { get; set; } + Accessibility Accessibility { get; } + + /// + /// Gets whether this entity is static. + /// Returns true if either the 'static' or the 'const' modifier is set. + /// + bool IsStatic { get; } + + /// + /// Returns whether this entity is abstract. + /// + /// Static classes also count as abstract classes. + bool IsAbstract { get; } + + /// + /// Returns whether this entity is sealed. + /// + /// Static classes also count as sealed classes. + bool IsSealed { get; } /// /// Resolves the entity in the current solution snapshot. diff --git a/src/Main/Base/Project/Dom/IEntityModelContext.cs b/src/Main/Base/Project/Dom/IEntityModelContext.cs index 38ab947bb4..48f8c01ddc 100644 --- a/src/Main/Base/Project/Dom/IEntityModelContext.cs +++ b/src/Main/Base/Project/Dom/IEntityModelContext.cs @@ -5,6 +5,7 @@ using System; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.SharpDevelop.Dom { diff --git a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs index cefa5e1fdf..370f5ae8ef 100644 --- a/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs +++ b/src/Main/Base/Project/Dom/ITypeDefinitionModel.cs @@ -41,6 +41,6 @@ namespace ICSharpCode.SharpDevelop.Dom /// void Update(IUnresolvedTypeDefinition oldPart, IUnresolvedTypeDefinition newPart); - IFieldModel AddField(Accessibility accessiblity, IType type, string name); + bool IsPartial { get; } } } diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 94d71d21f3..1ad8434875 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -172,7 +172,7 @@ - + diff --git a/src/Main/Base/Project/Refactoring/ICodeGenerator.cs b/src/Main/Base/Project/Refactoring/CodeGenerator.cs similarity index 76% rename from src/Main/Base/Project/Refactoring/ICodeGenerator.cs rename to src/Main/Base/Project/Refactoring/CodeGenerator.cs index c53774be57..2143a49cb7 100644 --- a/src/Main/Base/Project/Refactoring/ICodeGenerator.cs +++ b/src/Main/Base/Project/Refactoring/CodeGenerator.cs @@ -8,24 +8,9 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Refactoring { - /// - /// Description of ICodeGenerator. - /// - public interface ICodeGenerator + public class CodeGenerator { - void AddAttribute(IEntity target, IAttribute attribute); - void AddAssemblyAttribute(IProject targetProject, IAttribute attribute); - void AddReturnTypeAttribute(IMethod target, IAttribute attribute); - void InsertEventHandler(ITypeDefinition target, string name, IEvent eventDefinition, bool jumpTo); - - string GetPropertyName(string fieldName); - string GetParameterName(string fieldName); - string GetFieldName(string propertyName); - } - - public class DefaultCodeGenerator : ICodeGenerator - { - public static readonly DefaultCodeGenerator DefaultInstance = new DefaultCodeGenerator(); + public static readonly CodeGenerator DummyCodeGenerator = new CodeGenerator(); public virtual void AddAttribute(IEntity target, IAttribute attribute) { @@ -81,5 +66,20 @@ namespace ICSharpCode.SharpDevelop.Refactoring else return newName; } + + public virtual void AddField(ITypeDefinition declaringType, Accessibility accessibility, IType fieldType, string name) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual void ChangeAccessibility(IEntity entity, Accessibility newAccessiblity) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual void MakePartial(ITypeDefinition td) + { + throw new NotSupportedException("Feature not supported!"); + } } } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs index 7b35604b5d..a64fe61920 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.SharpDevelop this.container = new ServiceContainer(); this.container.AddService(typeof(IFormattingStrategy), DefaultFormattingStrategy.DefaultInstance); this.container.AddService(typeof(IBracketSearcher), DefaultBracketSearcher.DefaultInstance); - this.container.AddService(typeof(ICodeGenerator), DefaultCodeGenerator.DefaultInstance); + this.container.AddService(typeof(CodeGenerator), CodeGenerator.DummyCodeGenerator); } else { this.container = new ServiceContainer(DefaultInstance); } @@ -43,9 +43,9 @@ namespace ICSharpCode.SharpDevelop } } - public ICodeGenerator CodeGenerator { + public CodeGenerator CodeGenerator { get { - return this.GetService(); + return this.GetService(); } } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs index f7051565f8..9a3b1c210c 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop /// /// Provides access to the code generator for this language. /// - ICodeGenerator CodeGenerator { + CodeGenerator CodeGenerator { get; } diff --git a/src/Main/SharpDevelop/Dom/MemberModel.cs b/src/Main/SharpDevelop/Dom/MemberModel.cs index a56d00b274..f4aa39519a 100644 --- a/src/Main/SharpDevelop/Dom/MemberModel.cs +++ b/src/Main/SharpDevelop/Dom/MemberModel.cs @@ -94,5 +94,17 @@ namespace ICSharpCode.SharpDevelop.Dom return Resolve(solutionSnapshot); } #endregion + + public bool IsStatic { + get { return member.IsStatic; } + } + + public bool IsAbstract { + get { return member.IsAbstract; } + } + + public bool IsSealed { + get { return member.IsSealed; } + } } } diff --git a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs index 6cb205ae92..6ba5769a8a 100644 --- a/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs +++ b/src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs @@ -51,16 +51,13 @@ namespace ICSharpCode.SharpDevelop.Dom } public Accessibility Accessibility { - get { + get { var td = Resolve(); if (td != null) return td.Accessibility; else return Accessibility.None; } - set { - throw new NotImplementedException(); - } } public FullTypeName FullTypeName { @@ -316,9 +313,22 @@ namespace ICSharpCode.SharpDevelop.Dom } #endregion - public IFieldModel AddField(Accessibility accessiblity, IType type, string name) - { - throw new NotImplementedException(); + public bool IsPartial { + get { + return parts.Count > 1; // TODO: check for partial modifier on single part + } + } + + public bool IsAbstract { + get { return parts.Any(p => p.IsAbstract); } + } + + public bool IsStatic { + get { return parts.Any(p => p.IsStatic); } + } + + public bool IsSealed { + get { return parts.Any(p => p.IsSealed); } } } }