Browse Source

introduce ILanguageBinding in IProject

pull/32/merge
Siegfried Pammer 12 years ago
parent
commit
c98417aee0
  1. 4
      src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs
  2. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
  3. 10
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
  4. 57
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs
  5. 2
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs
  6. 19
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs
  7. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs
  8. 12
      src/Main/Base/Project/Dom/IEntityModelContext.cs
  9. 63
      src/Main/Base/Project/Refactoring/ICodeGenerator.cs
  10. 4
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  11. 4
      src/Main/Base/Project/Src/Project/IProject.cs

4
src/AddIns/Analysis/CodeAnalysis/Src/SuppressMessageCommand.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.CodeAnalysis @@ -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 @@ -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);
}

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs

@ -28,6 +28,10 @@ namespace CSharpBinding @@ -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

10
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs

@ -143,13 +143,13 @@ namespace CSharpBinding @@ -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;
}
}
}

57
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs

@ -28,28 +28,17 @@ namespace CSharpBinding.Refactoring @@ -28,28 +28,17 @@ namespace CSharpBinding.Refactoring
/// <summary>
/// Description of CSharpCodeGenerator.
/// </summary>
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 @@ -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 @@ -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;
}
}
}

2
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs

@ -139,7 +139,7 @@ namespace ICSharpCode.XamlBinding @@ -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;
}
}

19
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/CodeSnippet.cs

@ -216,28 +216,15 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets @@ -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<string, string> function;

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs

@ -75,7 +75,7 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -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);
}
}

12
src/Main/Base/Project/Dom/IEntityModelContext.cs

@ -60,6 +60,14 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -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)

63
src/Main/Base/Project/Refactoring/ICodeGenerator.cs

@ -4,6 +4,7 @@ @@ -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 @@ -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 @@ -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;
}
}
}

4
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -346,9 +346,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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;
}
}

4
src/Main/Base/Project/Src/Project/IProject.cs

@ -300,9 +300,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -300,9 +300,9 @@ namespace ICSharpCode.SharpDevelop.Project
IAmbience GetAmbience();
/// <summary>
/// Returns the ICodeGenerator implementation for this project.
/// Returns the ILanguageBinding implementation for this project.
/// </summary>
ICodeGenerator CodeGenerator { get; }
ILanguageBinding LanguageBinding { get; }
/// <summary>
/// Prepares searching for references to the specified entity.

Loading…
Cancel
Save