From 10ab47b6c0d664219af4386e97460301dc6ad408 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 5 Aug 2008 17:55:01 +0000 Subject: [PATCH 1/6] Added StyleCop addin to installer. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3297 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Setup/Files.wxs | 14 ++++++++++++++ src/Setup/Setup.wxs | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/src/Setup/Files.wxs b/src/Setup/Files.wxs index fb23e7fa2a..42c890dbc4 100644 --- a/src/Setup/Files.wxs +++ b/src/Setup/Files.wxs @@ -1523,6 +1523,20 @@ + + + + + + + + + + + + + + diff --git a/src/Setup/Setup.wxs b/src/Setup/Setup.wxs index 70fef8842c..283cb2cd17 100644 --- a/src/Setup/Setup.wxs +++ b/src/Setup/Setup.wxs @@ -437,6 +437,11 @@ + + + + + Date: Tue, 5 Aug 2008 19:55:19 +0000 Subject: [PATCH 2/6] ResourceToolkit: Support resolving calls to ComponentResourceManager.ApplyResources which are generated by the forms designer PropertyReflection localization model. Added new ResourcePrefixResolveResult for this purpose, to indicate that a call refers to all resources starting with a specified prefix. Resources used by ApplyResources are no longer listed as unused. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3299 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Refactoring/ResourceRefactoringService.cs | 50 ++++++++++++------- .../SpecificResourceReferenceFinder.cs | 2 +- .../Resolver/BclNRefactoryResourceResolver.cs | 33 +++++++++--- .../Src/Resolver/ResourceResolveResult.cs | 39 +++++++++++++-- .../BclNRefactoryResourceResolverTests.cs | 28 ++++++++++- 5 files changed, 123 insertions(+), 29 deletions(-) diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs index 862623e60c..477823ce28 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/ResourceRefactoringService.cs @@ -109,26 +109,32 @@ namespace Hornung.ResourceToolkit.Refactoring TextLocation docPos = doc.OffsetToPosition(pos); ResourceResolveResult rrr = ResourceResolverService.Resolve(fileName, doc, docPos.Y, docPos.X, null); - if (rrr != null && rrr.ResourceFileContent != null && rrr.Key != null) { + if (rrr != null && rrr.ResourceFileContent != null) { if (finder.IsReferenceToResource(rrr)) { - // The actual location of the key string may be after 'pos' because - // the resolvers may find an expression just before it. - string keyString = rrr.Key; - int keyPos = fileContent.IndexOf(keyString, pos, StringComparison.InvariantCultureIgnoreCase); - - if (keyPos < pos) { - // The key may be escaped in some way in the document. - // Try using the code generator to find this out. - keyPos = FindStringLiteral(fileName, fileContent, rrr.Key, pos, out keyString); - } - - if (keyPos < pos) { - if (monitor != null) monitor.ShowingDialog = true; - MessageService.ShowWarning("ResourceToolkit: The key '"+rrr.Key+"' could not be located at the resolved position in the file '"+fileName+"'."); - if (monitor != null) monitor.ShowingDialog = false; + if (rrr.Key != null) { + + // The actual location of the key string may be after 'pos' because + // the resolvers may find an expression just before it. + string keyString = rrr.Key; + int keyPos = fileContent.IndexOf(keyString, pos, StringComparison.InvariantCultureIgnoreCase); + + if (keyPos < pos) { + // The key may be escaped in some way in the document. + // Try using the code generator to find this out. + keyPos = FindStringLiteral(fileName, fileContent, rrr.Key, pos, out keyString); + } + + if (keyPos < pos) { + if (monitor != null) monitor.ShowingDialog = true; + MessageService.ShowWarning("ResourceToolkit: The key '"+rrr.Key+"' could not be located at the resolved position in the file '"+fileName+"'."); + if (monitor != null) monitor.ShowingDialog = false; + } else { + references.Add(new Reference(fileName, keyPos, keyString.Length, keyString, rrr)); + } + } else { - references.Add(new Reference(fileName, keyPos, keyString.Length, keyString, rrr)); + references.Add(new Reference(fileName, pos, 0, null, rrr)); } } @@ -216,15 +222,22 @@ namespace Hornung.ResourceToolkit.Refactoring // Generate a dictonary of resource file names and the // corresponding referenced keys. Dictionary> referencedKeys = new Dictionary>(); + Dictionary> referencedPrefixes = new Dictionary>(); foreach (Reference reference in references) { ResourceResolveResult rrr = (ResourceResolveResult)reference.ResolveResult; if (rrr.ResourceFileContent != null) { string fileName = rrr.FileName; if (!referencedKeys.ContainsKey(fileName)) { referencedKeys.Add(fileName, new List()); + referencedPrefixes.Add(fileName, new List()); } if (rrr.Key != null && !referencedKeys[fileName].Contains(rrr.Key)) { referencedKeys[fileName].Add(rrr.Key); + } else { + ResourcePrefixResolveResult rprr = rrr as ResourcePrefixResolveResult; + if (rprr != null && rprr.Prefix != null && !referencedPrefixes[fileName].Contains(rprr.Prefix)) { + referencedPrefixes[fileName].Add(rprr.Prefix); + } } } else { if (monitor != null) monitor.ShowingDialog = true; @@ -239,7 +252,8 @@ namespace Hornung.ResourceToolkit.Refactoring LoggingService.Debug("ResourceToolkit: FindUnusedKeys: Referenced resource file '"+fileName+"'"); #endif foreach (KeyValuePair entry in ResourceFileContentRegistry.GetResourceFileContent(fileName).Data) { - if (!referencedKeys[fileName].Contains(entry.Key)) { + if (!referencedKeys[fileName].Contains(entry.Key) && + !referencedPrefixes[fileName].Any(prefix => entry.Key.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase))) { unused.Add(new ResourceItem(fileName, entry.Key)); } } diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/SpecificResourceReferenceFinder.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/SpecificResourceReferenceFinder.cs index 6816deaaa5..d1da496035 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/SpecificResourceReferenceFinder.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Refactoring/SpecificResourceReferenceFinder.cs @@ -65,7 +65,7 @@ namespace Hornung.ResourceToolkit.Refactoring public bool IsReferenceToResource(ResourceResolveResult result) { return FileUtility.IsEqualFileName(this.ResourceFileName, result.FileName) && - result.Key.Equals(this.Key, StringComparison.InvariantCultureIgnoreCase); + this.Key.Equals(result.Key, StringComparison.InvariantCultureIgnoreCase); } // ******************************************************************************************************************************** diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/BclNRefactoryResourceResolver.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/BclNRefactoryResourceResolver.cs index 93dfea0995..d843bd34ea 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/BclNRefactoryResourceResolver.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/BclNRefactoryResourceResolver.cs @@ -45,6 +45,7 @@ namespace Hornung.ResourceToolkit.Resolver * * Something.GetString( * Something.GetString("...") + * Something.ApplyResources(obj, "...") * Something[ * Something["..."] * @@ -65,7 +66,7 @@ namespace Hornung.ResourceToolkit.Resolver MethodGroupResolveResult methrr = resolveResult as MethodGroupResolveResult; if (methrr != null) { - if ((methrr.Name == "GetString" || methrr.Name == "GetObject" || methrr.Name == "GetStream") && + if ((methrr.Name == "GetString" || methrr.Name == "GetObject" || methrr.Name == "GetStream" || methrr.Name == "ApplyResources") && (resolveResult = NRefactoryAstCacheService.ResolveNextOuterExpression(ref expressionResult, caretLine, caretColumn, fileName, fileContent, expressionFinder)) != null) { return ResolveResource(resolveResult, expr); @@ -98,7 +99,7 @@ namespace Hornung.ResourceToolkit.Resolver if (mrr != null) { if (mrr.ResolvedMember is IMethod && - (mrr.ResolvedMember.Name == "GetString" || mrr.ResolvedMember.Name == "GetObject" || mrr.ResolvedMember.Name == "GetStream")) { + (mrr.ResolvedMember.Name == "GetString" || mrr.ResolvedMember.Name == "GetObject" || mrr.ResolvedMember.Name == "GetStream" || mrr.ResolvedMember.Name == "ApplyResources")) { // Something.GetString("...") // This is a MemberResolveResult and we need the reference to "Something". @@ -216,10 +217,14 @@ namespace Hornung.ResourceToolkit.Resolver } if (rsr != null) { - string key = GetKeyFromExpression(expr); + bool isPrefixOnly; + string key = GetKeyFromExpression(expr, out isPrefixOnly); - // TODO: Add information about return type (of the resource, if present). - return new ResourceResolveResult(resolveResult.CallingClass, resolveResult.CallingMember, null, rsr, key); + if (isPrefixOnly) { + return new ResourcePrefixResolveResult(resolveResult.CallingClass, resolveResult.CallingMember, null, rsr, key); + } else { + return new ResourceResolveResult(resolveResult.CallingClass, resolveResult.CallingMember, null, rsr, key); + } } return null; @@ -683,8 +688,9 @@ namespace Hornung.ResourceToolkit.Resolver /// /// Tries to infer the resource key being referenced from the given expression. /// - static string GetKeyFromExpression(Expression expr) + static string GetKeyFromExpression(Expression expr, out bool isPrefixOnly) { + isPrefixOnly = false; #if DEBUG LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver trying to get key from expression: "+expr.ToString()); #endif @@ -722,6 +728,20 @@ namespace Hornung.ResourceToolkit.Resolver } } } + } else if (fre.MemberName == "ApplyResources") { + if (invocation.Arguments.Count >= 2) { + PrimitiveExpression p = invocation.Arguments[1] as PrimitiveExpression; + if (p != null) { + string key = p.Value as string; + if (key != null) { + #if DEBUG + LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver found key prefix: "+key); + #endif + isPrefixOnly = true; + return key; + } + } + } } } } @@ -743,6 +763,7 @@ namespace Hornung.ResourceToolkit.Resolver "GetString", "GetObject", "GetStream", + "ApplyResources", (NRefactoryResourceResolver.GetLanguagePropertiesForFile(fileName) ?? LanguageProperties.None).IndexerExpressionStartToken }; } diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ResourceResolveResult.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ResourceResolveResult.cs index 8317ac960e..779d23dc44 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ResourceResolveResult.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ResourceResolveResult.cs @@ -17,8 +17,8 @@ namespace Hornung.ResourceToolkit.Resolver public class ResourceResolveResult : ResolveResult { - ResourceSetReference resourceSetReference; - string key; + readonly ResourceSetReference resourceSetReference; + readonly string key; /// /// Gets the that describes the resource set being referenced. @@ -44,7 +44,7 @@ namespace Hornung.ResourceToolkit.Resolver /// /// Gets the resource key being referenced. May be null if the key is unknown/not yet typed. /// - public string Key { + public virtual string Key { get { return this.key; } } @@ -90,4 +90,37 @@ namespace Hornung.ResourceToolkit.Resolver this.ResourceSetReference, this.Key); } } + + /// + /// Describes a reference to a group of resource keys with a common prefix. + /// + public sealed class ResourcePrefixResolveResult : ResourceResolveResult + { + /// + /// Initializes a new instance of the class. + /// + /// The class that contains the reference to the resource. + /// The member that contains the reference to the resource. + /// The type of the resource being referenced. + /// The that describes the resource set being referenced. + /// The prefix of the resource keys being referenced. + public ResourcePrefixResolveResult(IClass callingClass, IMember callingMember, IReturnType returnType, ResourceSetReference resourceSetReference, string prefix) + : base(callingClass, callingMember, returnType, resourceSetReference, prefix) + { + } + + public override string Key { + get { return null; } + } + + public string Prefix { + get { return base.Key; } + } + + public override ResolveResult Clone() + { + return new ResourcePrefixResolveResult(this.CallingClass, this.CallingMember, this.ResolvedType, + this.ResourceSetReference, this.Prefix); + } + } } diff --git a/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs b/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs index 6287cede8a..672f9e62ab 100644 --- a/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs +++ b/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using Hornung.ResourceToolkit; using Hornung.ResourceToolkit.Resolver; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; namespace ResourceToolkit.Tests.CSharp { @@ -262,6 +263,30 @@ class A TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B"); } + // ******************************************************************************************************************************** + + const string CodeLocalCRMDeferredInitUsingApplyResources = @"using System.ComponentModel; +class A +{ + void B() + { + ComponentResourceManager mgr; + + mgr = new ComponentResourceManager(typeof(A)); + mgr.ApplyResources(this, ""$this""); + } +} +"; + + [Test] + public void LocalCRMDeferredInitUsingApplyResources() + { + ResourceResolveResult rrr = Resolve(CodeLocalCRMDeferredInitUsingApplyResources, 8, 20, null); + TestHelper.CheckReference(rrr, "A", null, "A", "A.B"); + Assert.That(rrr, Is.InstanceOfType(typeof(ResourcePrefixResolveResult))); + ResourcePrefixResolveResult rprr = (ResourcePrefixResolveResult)rrr; + Assert.That(rprr.Prefix, Is.EqualTo("$this"), "Resource key prefix not detected correctly."); + } #endregion // ******************************************************************************************************************************** @@ -755,8 +780,9 @@ namespace Test { Assert.Contains("GetString", patterns); Assert.Contains("GetStream", patterns); Assert.Contains("GetObject", patterns); + Assert.Contains("ApplyResources", patterns); Assert.Contains("[", patterns); - Assert.AreEqual(4, patterns.Count, "Incorrect number of resource access patterns for C# files."); + Assert.AreEqual(5, patterns.Count, "Incorrect number of resource access patterns for C# files."); } [Test] From cabc7d612b4d84dd3699f338596a4fb91b96ef96 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 6 Aug 2008 18:46:28 +0000 Subject: [PATCH 3/6] r7102@daniel-notebook (orig r3301): daniel | 2008-08-06 15:45:54 +0200 Fixed resolving unknown types git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3301 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Main/Base/Test/NRefactoryResolverTests.cs | 14 ++++++++++++++ .../Src/NRefactoryResolver/ResolveVisitor.cs | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 181e545764..76dd05aa8f 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -267,6 +267,20 @@ interface IInterface2 { Assert.AreEqual("StringBuilder", result.Identifier); } + [Test] + public void UnknownTypeTest() + { + string program = @"class A { + void Method() { + + } +} +"; + UnknownIdentifierResolveResult result = Resolve(program, "StringBuilder", 3, 1, ExpressionContext.Type); + Assert.IsFalse(result.IsValid); + Assert.AreEqual("StringBuilder", result.Identifier); + } + [Test] public void InvalidMethodCallTest() { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs index f792acb9b3..aaac809d46 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs @@ -612,7 +612,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return new NamespaceResolveResult(resolver.CallingClass, resolver.CallingMember, name); } } - return rr; + if (rr != null) { + return rr; + } else { + return new UnknownIdentifierResolveResult(resolver.CallingClass, resolver.CallingMember, reference.Type); + } } public override object VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression, object data) From 8a99cdc6a2b6b5fb3e8e530a7f7207bc3d6c495a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 6 Aug 2008 18:46:32 +0000 Subject: [PATCH 4/6] r7103@daniel-notebook (orig r3302): daniel | 2008-08-06 18:18:54 +0200 When going to a member using the quick class browser, scroll so that the target member is in the center of the text editor git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3302 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/TextEditor/Gui/Editor/QuickClassBrowserPanel.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/QuickClassBrowserPanel.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/QuickClassBrowserPanel.cs index ce2dcc018d..afa40dc313 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/QuickClassBrowserPanel.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/QuickClassBrowserPanel.cs @@ -454,7 +454,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (autoselect) { ComboBoxItem item = (ComboBoxItem)comboBox.Items[comboBox.SelectedIndex]; if (item.IsInCurrentPart) { - textAreaControl.ActiveTextAreaControl.Caret.Position = new TextLocation(item.Column, item.Line); + textAreaControl.ActiveTextAreaControl.CenterViewOn( + item.Line, (int)(0.3 * textAreaControl.ActiveTextAreaControl.TextArea.TextView.VisibleLineCount)); + textAreaControl.ActiveTextAreaControl.JumpTo(item.Line, item.Column); textAreaControl.ActiveTextAreaControl.TextArea.Focus(); } else { IMember m = item.Item as IMember; From 17b3167cf8ceb0df92298138cfbc10707eb2e7f5 Mon Sep 17 00:00:00 2001 From: Ivan Shumilin Date: Wed, 6 Aug 2008 19:35:48 +0000 Subject: [PATCH 5/6] Add some failing tests. Remove tiny bugs from MarkupExtensionTokenizer. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3303 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- samples/XamlDesigner/TestFiles/3.xaml | 11 +++ samples/XamlDesigner/XamlDesigner.csproj | 4 + .../Project/Xaml/XamlModelProperty.cs | 9 +- .../Tests/WpfDesign.Tests.csproj | 3 +- .../Tests/XamlDom/MarkupExtensionTests.cs | 91 +++++++++++++++++++ .../Project/MarkupExtensionParser.cs | 6 +- 6 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 samples/XamlDesigner/TestFiles/3.xaml create mode 100644 src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs diff --git a/samples/XamlDesigner/TestFiles/3.xaml b/samples/XamlDesigner/TestFiles/3.xaml new file mode 100644 index 0000000000..ab648f3b07 --- /dev/null +++ b/samples/XamlDesigner/TestFiles/3.xaml @@ -0,0 +1,11 @@ + + + Title + Width + + + \ No newline at end of file diff --git a/samples/XamlDesigner/XamlDesigner.csproj b/samples/XamlDesigner/XamlDesigner.csproj index e6789e211b..96660f33b0 100644 --- a/samples/XamlDesigner/XamlDesigner.csproj +++ b/samples/XamlDesigner/XamlDesigner.csproj @@ -166,6 +166,10 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs index 995bc88fc7..ad39f7adb4 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs @@ -96,9 +96,12 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml if (IsCollection) throw new DesignerException("Cannot access Value for collection properties."); - //TODO - if (ValueOnInstance == null) return null; - return _designItem.ComponentService.GetDesignItem(ValueOnInstance); + var xamlObject = _property.PropertyValue as XamlObject; + if (xamlObject != null) { + return _designItem.ComponentService.GetDesignItem(xamlObject.Instance); + } + + return null; } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/WpfDesign.Tests.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/WpfDesign.Tests.csproj index 1beb4539f2..c1dc72901b 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/WpfDesign.Tests.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/WpfDesign.Tests.csproj @@ -60,6 +60,7 @@ + @@ -81,7 +82,5 @@ {78CC29AC-CC79-4355-B1F2-97936DF198AC} WpfDesign.Designer - - \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs new file mode 100644 index 0000000000..4a9b4dc87a --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs @@ -0,0 +1,91 @@ +using System; +using NUnit.Framework; +using System.Windows.Markup; + +namespace ICSharpCode.WpfDesign.Tests.XamlDom +{ + [TestFixture] + public class MarkupExtensionTests : TestHelper + { + [Test] + public void Test1() + { + TestMarkupExtension("Title=\"{Binding}\""); + } + + [Test] + public void Test2() + { + TestMarkupExtension("Title=\"{Binding Some}\""); + } + + [Test] + public void Test3() + { + TestMarkupExtension("Title=\"{ Binding Some , ElementName = Some , Mode = TwoWay }\""); + } + + [Test] + public void Test4() + { + TestMarkupExtension("Content=\"{x:Type Button}\""); + } + + [Test] + public void Test5() + { + TestMarkupExtension("Content=\"{t:MyExtension 1, 2}\""); + } + + [Test] + public void Test6() + { + TestMarkupExtension("Background=\"{x:Static SystemColors.ControlBrush}\""); + } + + [Test] + public void Test7() + { + TestMarkupExtension("Background=\"{DynamicResource {x:Static SystemColors.ControlBrushKey}}\""); + } + + [Test] + public void Test8() + { + TestMarkupExtension("Content=\"{Binding Some, RelativeSource={RelativeSource Self}}\""); + } + + [Test] + [ExpectedException] // Must differ from official XamlReader result + public void Test9() + { + TestMarkupExtension("Content=\"{x:Static t:MyStaticClass.StaticString}\""); + } + + static void TestMarkupExtension(string s) + { + TestLoading(@""); + } + } + + public static class MyStaticClass + { + public static string StaticString = "a"; + } + + public class MyExtension : MarkupExtension + { + public MyExtension(object p1, object p2) + { + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return null; + } + } +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs index 7058935091..866dcc8fda 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.WpfDesign.XamlDom while (pos < text.Length) { switch (text[pos]) { case '}': - AddToken(MarkupExtensionTokenKind.CloseBrace, "{"); + AddToken(MarkupExtensionTokenKind.CloseBrace, "}"); pos++; break; case '=': @@ -70,7 +70,9 @@ namespace ICSharpCode.WpfDesign.XamlDom pos++; break; case '{': - throw new XamlMarkupExtensionParseException("'{' is invalid at this location"); + AddToken(MarkupExtensionTokenKind.OpenBrace, "{"); + pos++; + break; default: MembernameOrString(); break; From 06cd1555075fd560d6d13d47b448f16cb8b2276d Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 6 Aug 2008 19:38:07 +0000 Subject: [PATCH 6/6] Fixed invalid cast exception when creating tool strip items due to the ToolbarItemDoozer now returning a ToolbarItemDescriptor. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3304 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/ShowDisplayOptionsDropDown.cs | 15 ++------------- .../ClassBrowser/ClassBrowserToolbarCommands.cs | 9 +-------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs index 8026dbdc87..30827c2be2 100644 --- a/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs +++ b/src/AddIns/Misc/CodeCoverage/Project/Src/ShowDisplayOptionsDropDown.cs @@ -24,18 +24,7 @@ namespace ICSharpCode.CodeCoverage { base.OnOwnerChanged(e); dropDownButton = (ToolBarDropDownButton)Owner; - GenerateDropDownItems(); - } - - void GenerateDropDownItems() - { - ToolStripItem[] items = (ToolStripItem[])(AddInTree.GetTreeNode("/SharpDevelop/Pads/CodeCoveragePad/Toolbar/CodeCoveragePadDisplayOptions").BuildChildItems(this)).ToArray(typeof(ToolStripItem)); - foreach (ToolStripItem item in items) { - if (item is IStatusUpdate) { - ((IStatusUpdate)item).UpdateStatus(); - } - } - dropDownButton.DropDownItems.AddRange(items); - } + MenuService.AddItemsToMenu(dropDownButton.DropDownItems, this, "/SharpDevelop/Pads/CodeCoveragePad/Toolbar/CodeCoveragePadDisplayOptions"); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/ClassBrowserToolbarCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/ClassBrowserToolbarCommands.cs index dd86f94adc..3c23b850b8 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/ClassBrowserToolbarCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ClassBrowser/ClassBrowserToolbarCommands.cs @@ -51,14 +51,7 @@ namespace ICSharpCode.SharpDevelop.Gui.ClassBrowser { base.OnOwnerChanged(e); dropDownButton = (ToolBarDropDownButton)Owner; - ToolStripItem[] items = (ToolStripItem[])(AddInTree.GetTreeNode("/SharpDevelop/Pads/ClassBrowser/Toolbar/SelectFilter").BuildChildItems(this)).ToArray(typeof(ToolStripItem)); - foreach (ToolStripItem item in items) { - if (item is IStatusUpdate) { - ((IStatusUpdate)item).UpdateStatus(); - } - } - - dropDownButton.DropDownItems.AddRange(items); + MenuService.AddItemsToMenu(dropDownButton.DropDownItems, this, "/SharpDevelop/Pads/ClassBrowser/Toolbar/SelectFilter"); } }