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.