From b501529965ba0594d5c5eb0e9f74e438e3b2a0f0 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 16 May 2013 20:03:42 +0200 Subject: [PATCH] reimplemented language-specific snippet functions --- .../Src/Refactoring/CSharpCodeGenerator.cs | 35 +++++++++++++++++++ .../Src/Snippets/CodeSnippet.cs | 26 ++++++++++---- .../Project/Refactoring/ICodeGenerator.cs | 4 +++ 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs index cbdd51da93..fad50cdeb8 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs @@ -124,5 +124,40 @@ 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/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs index 9ce1e62e88..3595318893 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs @@ -8,12 +8,15 @@ using System.Linq; using System.Text.RegularExpressions; using ICSharpCode.AvalonEdit.Snippets; +using ICSharpCode.Core; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor.AvalonEdit; using ICSharpCode.SharpDevelop.Editor.CodeCompletion; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.AvalonEdit.AddIn.Snippets { @@ -212,18 +215,29 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets return s => s.ToLower(); if ("toUpper".Equals(name, StringComparison.OrdinalIgnoreCase)) return s => s.ToUpper(); - #warning Reimplement language-specific name conversion functions - /* + + ICodeGenerator generator = GetCodeGeneratorForFile(context.FileName); + if (generator == null) return null; + if ("toFieldName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => context.Language.Properties.CodeGenerator.GetFieldName(s); + return s => generator.GetFieldName(s); if ("toPropertyName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => context.Language.Properties.CodeGenerator.GetPropertyName(s); + return s => generator.GetPropertyName(s); if ("toParameterName".Equals(name, StringComparison.OrdinalIgnoreCase)) - return s => context.Language.Properties.CodeGenerator.GetParameterName(s); - */ + return s => generator.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/Main/Base/Project/Refactoring/ICodeGenerator.cs b/src/Main/Base/Project/Refactoring/ICodeGenerator.cs index 06301bedf1..fa9c7c5847 100644 --- a/src/Main/Base/Project/Refactoring/ICodeGenerator.cs +++ b/src/Main/Base/Project/Refactoring/ICodeGenerator.cs @@ -16,5 +16,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring void AddAssemblyAttribute(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); } }