From cf9d7e47664ff522f77f1305ddaedbc2ac052dd5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 9 Feb 2010 20:31:23 +0000 Subject: [PATCH] XAML binding now uses correct modifiers for classes and fields (implemented x:ClassModifier and x:FieldModifier support) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5485 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Project/Src/BooAmbience.cs | 12 ++++----- .../CompilationUnitCreatorVisitor.cs | 25 +++++++++++++++++-- .../UnitTesting/Test/Utils/MockAmbience.cs | 5 ++++ .../Services/AmbienceService/NetAmbience.cs | 5 ++++ src/Main/Base/Test/Utils/MockAmbience.cs | 5 ++++ .../Project/Src/Ambience.cs | 3 +++ .../Project/Src/CSharp/CSharpAmbience.cs | 12 ++++----- .../Project/Src/VBNet/VBNetAmbience.cs | 12 ++++----- 8 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs index f52f9083d8..7fdd01e5e3 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs @@ -95,18 +95,18 @@ namespace Grunwald.BooBinding return (modifier & query) == query; } - string ConvertAccessibility(ModifierEnum modifier) + public override string ConvertAccessibility(ModifierEnum accessibility) { if (ShowAccessibility) { - if (ModifierIsSet(modifier, ModifierEnum.Public)) { + if (ModifierIsSet(accessibility, ModifierEnum.Public)) { return "public "; - } else if (ModifierIsSet(modifier, ModifierEnum.Private)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Private)) { return "private "; - } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.ProtectedAndInternal)) { return "protected internal "; - } else if (ModifierIsSet(modifier, ModifierEnum.Internal)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Internal)) { return "internal "; - } else if (ModifierIsSet(modifier, ModifierEnum.Protected)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Protected)) { return "protected "; } } diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompilationUnitCreatorVisitor.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompilationUnitCreatorVisitor.cs index 3466b44b05..40e822f2c4 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompilationUnitCreatorVisitor.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompilationUnitCreatorVisitor.cs @@ -23,6 +23,7 @@ namespace ICSharpCode.XamlBinding IClass generatedClass; IProjectContent projectContent; Stack nodeStack; + IAmbience currentAmbience; /// /// string representation of the document, used to create DOM regions. @@ -39,6 +40,7 @@ namespace ICSharpCode.XamlBinding this.fileContent = fileContent; this.lexerTags = lexerTags; this.projectContent = projectContent; + this.currentAmbience = projectContent.Language.GetAmbience(); this.nodeStack = new Stack(); } @@ -66,7 +68,16 @@ namespace ICSharpCode.XamlBinding IReturnType type = TypeFromXmlNode(CompilationUnit, attribute.ParentElement); DomRegion position = CreateRegion(attribute.ParentElement.StartOffset, attribute.ParentElement.StartOffset + attribute.ParentElement.Name.Length); - generatedClass.Fields.Add(new DefaultField(type, name, ModifierEnum.Internal, position, generatedClass)); + ModifierEnum fieldModifier = ModifierEnum.Internal; + + string modifierValue = (attribute.ParentElement.GetAttributeValue(CompletionDataHelper.XamlNamespace, "FieldModifier") ?? string.Empty).Trim(); + + string publicString = currentAmbience.ConvertAccessibility(ModifierEnum.Public).Trim(); + + if (projectContent.Language.NameComparer.Compare(modifierValue, publicString) == 0) + fieldModifier = ModifierEnum.Public; + + generatedClass.Fields.Add(new DefaultField(type, name, fieldModifier, position, generatedClass)); } } } @@ -100,7 +111,7 @@ namespace ICSharpCode.XamlBinding { AXmlTag tag = element.Children.FirstOrDefault() as AXmlTag; - if (tag != null && tag.IsStartOrEmptyTag) { + if (tag != null && tag.IsStartOrEmptyTag) { NodeWrapper node = new NodeWrapper() { ElementName = element.LocalName, StartOffset = element.StartOffset, @@ -128,7 +139,17 @@ namespace ICSharpCode.XamlBinding IClass AddClass(string className, AXmlElement element) { DefaultClass c = new DefaultClass(CompilationUnit, className); + string modifierValue = (element.GetAttributeValue(CompletionDataHelper.XamlNamespace, "ClassModifier") ?? string.Empty).Trim(); + c.Modifiers = ModifierEnum.Partial; + + string internalString = currentAmbience.ConvertAccessibility(ModifierEnum.Internal).Trim(); + + if (projectContent.Language.NameComparer.Compare(modifierValue, internalString) == 0) + c.Modifiers |= ModifierEnum.Internal; + else + c.Modifiers |= ModifierEnum.Public; + c.Region = CreateRegion(element.StartOffset, element.EndOffset); c.BaseTypes.Add(TypeFromXmlNode(CompilationUnit, element)); CompilationUnit.Classes.Add(c); diff --git a/src/AddIns/Misc/UnitTesting/Test/Utils/MockAmbience.cs b/src/AddIns/Misc/UnitTesting/Test/Utils/MockAmbience.cs index 010a908063..a5a895c111 100644 --- a/src/AddIns/Misc/UnitTesting/Test/Utils/MockAmbience.cs +++ b/src/AddIns/Misc/UnitTesting/Test/Utils/MockAmbience.cs @@ -93,5 +93,10 @@ namespace UnitTesting.Tests.Utils { return String.Empty; } + + public string ConvertAccessibility(ModifierEnum accessibility) + { + return String.Empty; + } } } diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs index c47ae0bd52..3a1224a0c4 100644 --- a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs +++ b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs @@ -284,5 +284,10 @@ namespace ICSharpCode.SharpDevelop { return dotNetTypeName; } + + public override string ConvertAccessibility(ModifierEnum accessibility) + { + return string.Empty; + } } } diff --git a/src/Main/Base/Test/Utils/MockAmbience.cs b/src/Main/Base/Test/Utils/MockAmbience.cs index 81022dfd09..bb08e15c1c 100644 --- a/src/Main/Base/Test/Utils/MockAmbience.cs +++ b/src/Main/Base/Test/Utils/MockAmbience.cs @@ -78,5 +78,10 @@ namespace ICSharpCode.SharpDevelop.Tests.Utils { return String.Empty; } + + public override string ConvertAccessibility(ModifierEnum accessibility) + { + return String.Empty; + } } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Ambience.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Ambience.cs index cc88f227cc..30f36cd40b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Ambience.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Ambience.cs @@ -99,6 +99,8 @@ namespace ICSharpCode.SharpDevelop.Dom string Convert(IParameter param); string Convert(IReturnType returnType); + string ConvertAccessibility(ModifierEnum accessibility); + string WrapAttribute(string attribute); string WrapComment(string comment); @@ -239,5 +241,6 @@ namespace ICSharpCode.SharpDevelop.Dom public abstract string WrapAttribute(string attribute); public abstract string WrapComment(string comment); public abstract string GetIntrinsicTypeName(string dotNetTypeName); + public abstract string ConvertAccessibility(ModifierEnum accessibility); } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs index d295c7f050..a76b46a3c3 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/CSharpAmbience.cs @@ -24,18 +24,18 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp return (modifier & query) == query; } - string ConvertAccessibility(ModifierEnum modifier) + public override string ConvertAccessibility(ModifierEnum accessibility) { if (ShowAccessibility) { - if (ModifierIsSet(modifier, ModifierEnum.Public)) { + if (ModifierIsSet(accessibility, ModifierEnum.Public)) { return "public "; - } else if (ModifierIsSet(modifier, ModifierEnum.Private)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Private)) { return "private "; - } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.ProtectedAndInternal)) { return "protected internal "; - } else if (ModifierIsSet(modifier, ModifierEnum.Internal)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Internal)) { return "internal "; - } else if (ModifierIsSet(modifier, ModifierEnum.Protected)) { + } else if (ModifierIsSet(accessibility, ModifierEnum.Protected)) { return "protected "; } } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs index 0fc70994e9..dba00d818d 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetAmbience.cs @@ -50,19 +50,19 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet return builder.ToString(); } - string ConvertAccessibility(ModifierEnum modifier) + public override string ConvertAccessibility(ModifierEnum accessibility) { StringBuilder builder = new StringBuilder(); if (ShowAccessibility) { - if ((modifier & ModifierEnum.Public) == ModifierEnum.Public) { + if ((accessibility & ModifierEnum.Public) == ModifierEnum.Public) { builder.Append("Public"); - } else if ((modifier & ModifierEnum.Private) == ModifierEnum.Private) { + } else if ((accessibility & ModifierEnum.Private) == ModifierEnum.Private) { builder.Append("Private"); - } else if ((modifier & (ModifierEnum.Protected | ModifierEnum.Internal)) == (ModifierEnum.Protected | ModifierEnum.Internal)) { + } else if ((accessibility & (ModifierEnum.Protected | ModifierEnum.Internal)) == (ModifierEnum.Protected | ModifierEnum.Internal)) { builder.Append("Protected Friend"); - } else if ((modifier & ModifierEnum.Internal) == ModifierEnum.Internal) { + } else if ((accessibility & ModifierEnum.Internal) == ModifierEnum.Internal) { builder.Append("Friend"); - } else if ((modifier & ModifierEnum.Protected) == ModifierEnum.Protected) { + } else if ((accessibility & ModifierEnum.Protected) == ModifierEnum.Protected) { builder.Append("Protected"); } builder.Append(' ');