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;
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/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]
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");
}
}
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;
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)
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 @@
+
+
+
+
+