From c98417aee09b9e2aef022369b389a5bf6a7e1e86 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 May 2013 20:52:39 +0200 Subject: [PATCH] introduce ILanguageBinding in IProject --- .../Src/SuppressMessageCommand.cs | 4 +- .../Project/Src/CSharpLanguageBinding.cs | 4 ++ .../Project/Src/Project/CSharpProject.cs | 10 +-- .../Src/Refactoring/CSharpCodeGenerator.cs | 57 ++--------------- .../XamlBinding/XamlCompletionItemList.cs | 2 +- .../Src/Snippets/CodeSnippet.cs | 19 +----- .../Src/AbstractEventHandlerService.cs | 2 +- .../Base/Project/Dom/IEntityModelContext.cs | 12 +++- .../Project/Refactoring/ICodeGenerator.cs | 63 ++++++++++++++++++- .../Project/Src/Project/AbstractProject.cs | 4 +- src/Main/Base/Project/Src/Project/IProject.cs | 4 +- 11 files changed, 96 insertions(+), 85 deletions(-) diff --git a/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs b/src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs index 340a014772..96702f3e99 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.CodeGenerator; + ICodeGenerator gen = tag.Project.LanguageBinding.CodeGenerator; ICompilation compilation; if (t.FileName != null) compilation = SD.ParserService.GetCompilationForFile(t.FileName); @@ -38,7 +38,7 @@ namespace ICSharpCode.CodeAnalysis IAttribute attribute = CreateSuppressAttribute(compilation, tag); if (tag.MemberName == null) - gen.AddAssemblyAttribute(attribute); + gen.AddAssemblyAttribute(tag.Project, attribute); else gen.AddAttribute(GetEntity(compilation, tag.TypeName, tag.MemberName), attribute); } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs index 5c4c0d455f..e8e769d38d 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -28,6 +28,10 @@ namespace CSharpBinding public override IBracketSearcher BracketSearcher { get { return new CSharpBracketSearcher(); } } + + public override ICodeGenerator CodeGenerator { + get { return new CSharpCodeGenerator(); } + } } public class CSharpTextEditorExtension : ITextEditorExtension diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index 28b01e331f..a0564a6c32 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -143,13 +143,13 @@ namespace CSharpBinding return new CSharpCodeProvider(); } - Refactoring.CSharpCodeGenerator generator; + ILanguageBinding language; - public override ICSharpCode.SharpDevelop.Refactoring.ICodeGenerator CodeGenerator { + public override ILanguageBinding LanguageBinding { get { - if (generator == null) - generator = new Refactoring.CSharpCodeGenerator(this); - return generator; + if (language == null) + language = SD.LanguageService.GetLanguageByName("CSharp"); + return language; } } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs index fad50cdeb8..7e3725f42f 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs @@ -28,28 +28,17 @@ namespace CSharpBinding.Refactoring /// /// Description of CSharpCodeGenerator. /// - public class CSharpCodeGenerator : ICodeGenerator + public class CSharpCodeGenerator : DefaultCodeGenerator { - IProject project; - ProjectEntityModelContext model; - - public CSharpCodeGenerator(IProject project) - { - if (project == null) - throw new ArgumentNullException("project"); - this.project = project; - this.model = new ProjectEntityModelContext(project, ".cs"); - } - public void AddAttribute(IEntity target, IAttribute attribute) { AddAttribute(target.Region, attribute); } - public void AddAssemblyAttribute(IAttribute attribute) + public void AddAssemblyAttribute(IProject targetProject, IAttribute attribute) { // FIXME : will fail if there are no assembly attributes - ICompilation compilation = SD.ParserService.GetCompilation(project); + ICompilation compilation = SD.ParserService.GetCompilation(targetProject); IAttribute target = compilation.MainAssembly.AssemblyAttributes.LastOrDefault(); if (target == null) throw new InvalidOperationException("no assembly attributes found, cannot continue!"); @@ -66,10 +55,7 @@ namespace CSharpBinding.Refactoring IUnresolvedTypeDefinition match = null; foreach (var part in target.Parts) { - string fileName = part.UnresolvedFile.FileName; - if (!".cs".Equals(Path.GetExtension(fileName), StringComparison.OrdinalIgnoreCase)) - continue; - if (match == null || model.IsBetterPart(part, match)) + if (match == null || EntityModelContextUtils.IsBetterPart(part, match, ".cs")) match = part; } @@ -124,40 +110,5 @@ namespace CSharpBinding.Refactoring script.InsertBefore(node, attr); } } - - public string GetPropertyName(string fieldName) - { - if (string.IsNullOrEmpty(fieldName)) - return fieldName; - if (fieldName.StartsWith("_") && fieldName.Length > 1) - return Char.ToUpper(fieldName[1]) + fieldName.Substring(2); - else if (fieldName.StartsWith("m_") && fieldName.Length > 2) - return Char.ToUpper(fieldName[2]) + fieldName.Substring(3); - else - return Char.ToUpper(fieldName[0]) + fieldName.Substring(1); - } - - public string GetParameterName(string fieldName) - { - if (string.IsNullOrEmpty(fieldName)) - return fieldName; - if (fieldName.StartsWith("_") && fieldName.Length > 1) - return Char.ToLower(fieldName[1]) + fieldName.Substring(2); - else if (fieldName.StartsWith("m_") && fieldName.Length > 2) - return Char.ToLower(fieldName[2]) + fieldName.Substring(3); - else - return Char.ToLower(fieldName[0]) + fieldName.Substring(1); - } - - public string GetFieldName(string propertyName) - { - if (string.IsNullOrEmpty(propertyName)) - return propertyName; - string newName = Char.ToLower(propertyName[0]) + propertyName.Substring(1); - if (newName == propertyName) - return "_" + newName; - else - return newName; - } } } diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs index ee1e82212c..4c0983afb7 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs @@ -139,7 +139,7 @@ namespace ICSharpCode.XamlBinding if (unresolved == null) return false; var compilation = SD.ParserService.GetCompilationForFile(context.Editor.FileName); var definition = unresolved.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)).GetDefinition(); - project.CodeGenerator.InsertEventHandler(definition, completionItem.HandlerName, completionItem.EventType, true); + project.LanguageBinding.CodeGenerator.InsertEventHandler(definition, completionItem.HandlerName, completionItem.EventType, true); return true; } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs index 3595318893..9d778e1d11 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs @@ -216,28 +216,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets if ("toUpper".Equals(name, StringComparison.OrdinalIgnoreCase)) return s => s.ToUpper(); - ICodeGenerator generator = GetCodeGeneratorForFile(context.FileName); - if (generator == null) return null; - if ("toFieldName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => generator.GetFieldName(s); + return s => context.Language.CodeGenerator.GetFieldName(s); if ("toPropertyName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => generator.GetPropertyName(s); + return s => context.Language.CodeGenerator.GetPropertyName(s); if ("toParameterName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => generator.GetParameterName(s); + return s => context.Language.CodeGenerator.GetParameterName(s); return null; } - static ICodeGenerator GetCodeGeneratorForFile(FileName fileName) - { - // ICodeGenerator depends on IProject (at least the C# version of it). - // TODO : what if file is not part of a project? - IProject project = SD.ProjectService.FindProjectContainingFile(fileName); - if (project == null) - return null; - return project.CodeGenerator; - } - sealed class FunctionBoundElement : SnippetBoundElement { internal Func function; diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs index 297de1bce4..c1c834e36d 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs @@ -75,7 +75,7 @@ namespace ICSharpCode.WpfDesign.AddIn if (p != null && c != null) { var e = FindEventDeclaration(c.Compilation, eventProperty.DeclaringType, eventProperty.Name); - p.CodeGenerator.InsertEventHandler(c, handlerName, e, true); + p.LanguageBinding.CodeGenerator.InsertEventHandler(c, handlerName, e, true); } } diff --git a/src/Main/Base/Project/Dom/IEntityModelContext.cs b/src/Main/Base/Project/Dom/IEntityModelContext.cs index cb3f299693..38ab947bb4 100644 --- a/src/Main/Base/Project/Dom/IEntityModelContext.cs +++ b/src/Main/Base/Project/Dom/IEntityModelContext.cs @@ -60,6 +60,14 @@ namespace ICSharpCode.SharpDevelop.Dom } public bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2) + { + return EntityModelContextUtils.IsBetterPart(part1, part2, primaryCodeFileExtension); + } + } + + public static class EntityModelContextUtils + { + public static bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2, string codeFileExtension) { IUnresolvedFile file1 = part1.UnresolvedFile; IUnresolvedFile file2 = part2.UnresolvedFile; @@ -67,8 +75,8 @@ namespace ICSharpCode.SharpDevelop.Dom return true; if (file1 == null) return false; - bool file1HasExtension = file1.FileName.EndsWith(primaryCodeFileExtension, StringComparison.OrdinalIgnoreCase); - bool file2HasExtension = file2.FileName.EndsWith(primaryCodeFileExtension, StringComparison.OrdinalIgnoreCase); + bool file1HasExtension = file1.FileName.EndsWith(codeFileExtension, StringComparison.OrdinalIgnoreCase); + bool file2HasExtension = file2.FileName.EndsWith(codeFileExtension, StringComparison.OrdinalIgnoreCase); if (file1HasExtension && !file2HasExtension) return true; if (!file1HasExtension && file2HasExtension) diff --git a/src/Main/Base/Project/Refactoring/ICodeGenerator.cs b/src/Main/Base/Project/Refactoring/ICodeGenerator.cs index fa9c7c5847..c53774be57 100644 --- a/src/Main/Base/Project/Refactoring/ICodeGenerator.cs +++ b/src/Main/Base/Project/Refactoring/ICodeGenerator.cs @@ -4,6 +4,7 @@ using System; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Refactoring { @@ -13,7 +14,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring public interface ICodeGenerator { void AddAttribute(IEntity target, IAttribute attribute); - void AddAssemblyAttribute(IAttribute attribute); + void AddAssemblyAttribute(IProject targetProject, IAttribute attribute); void AddReturnTypeAttribute(IMethod target, IAttribute attribute); void InsertEventHandler(ITypeDefinition target, string name, IEvent eventDefinition, bool jumpTo); @@ -21,4 +22,64 @@ namespace ICSharpCode.SharpDevelop.Refactoring string GetParameterName(string fieldName); string GetFieldName(string propertyName); } + + public class DefaultCodeGenerator : ICodeGenerator + { + public static readonly DefaultCodeGenerator DefaultInstance = new DefaultCodeGenerator(); + + public virtual void AddAttribute(IEntity target, IAttribute attribute) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual void AddAssemblyAttribute(IProject targetProject, IAttribute attribute) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual void AddReturnTypeAttribute(IMethod target, IAttribute attribute) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual void InsertEventHandler(ITypeDefinition target, string name, IEvent eventDefinition, bool jumpTo) + { + throw new NotSupportedException("Feature not supported!"); + } + + public virtual string GetPropertyName(string fieldName) + { + if (string.IsNullOrEmpty(fieldName)) + return fieldName; + if (fieldName.StartsWith("_") && fieldName.Length > 1) + return Char.ToUpper(fieldName[1]) + fieldName.Substring(2); + else if (fieldName.StartsWith("m_") && fieldName.Length > 2) + return Char.ToUpper(fieldName[2]) + fieldName.Substring(3); + else + return Char.ToUpper(fieldName[0]) + fieldName.Substring(1); + } + + public virtual string GetParameterName(string fieldName) + { + if (string.IsNullOrEmpty(fieldName)) + return fieldName; + if (fieldName.StartsWith("_") && fieldName.Length > 1) + return Char.ToLower(fieldName[1]) + fieldName.Substring(2); + else if (fieldName.StartsWith("m_") && fieldName.Length > 2) + return Char.ToLower(fieldName[2]) + fieldName.Substring(3); + else + return Char.ToLower(fieldName[0]) + fieldName.Substring(1); + } + + public virtual string GetFieldName(string propertyName) + { + if (string.IsNullOrEmpty(propertyName)) + return propertyName; + string newName = Char.ToLower(propertyName[0]) + propertyName.Substring(1); + if (newName == propertyName) + return "_" + newName; + else + return newName; + } + } } diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 93653cd9cb..40b6e4ab71 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -346,9 +346,9 @@ namespace ICSharpCode.SharpDevelop.Project } [Browsable(false)] - public virtual ICodeGenerator CodeGenerator { + public virtual ILanguageBinding LanguageBinding { get { - throw new NotSupportedException("This project does not support code generation!"); + return DefaultLanguageBinding.DefaultInstance; } } diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index 11f9e26f79..57feb5972c 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -300,9 +300,9 @@ namespace ICSharpCode.SharpDevelop.Project IAmbience GetAmbience(); /// - /// Returns the ICodeGenerator implementation for this project. + /// Returns the ILanguageBinding implementation for this project. /// - ICodeGenerator CodeGenerator { get; } + ILanguageBinding LanguageBinding { get; } /// /// Prepares searching for references to the specified entity.