From 3897fc0a335430593048267c5cb74d13db7c8efc Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Apr 2006 10:46:56 +0000 Subject: [PATCH] BooBinding: detect indexers in parsed code git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1370 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Boo/BooBinding/Project/Src/BooAmbience.cs | 8 ++++ .../Src/CodeCompletion/CompletionBinding.cs | 2 +- .../Src/CodeCompletion/ConvertVisitor.cs | 12 ++++++ .../Boo/BooBinding/Test/ResolverTests.cs | 41 ++++++++++++++----- .../Project/Src/CSharpAmbience.cs | 8 ++++ 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs index 24836c6af2..f23191f5c2 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs @@ -323,6 +323,14 @@ namespace Grunwald.BooBinding } if (property.IsIndexer) { + if (property.DeclaringType != null) { + if (UseFullyQualifiedMemberNames) { + builder.Append(property.DeclaringType.FullyQualifiedName); + } else { + builder.Append(property.DeclaringType.Name); + } + builder.Append('.'); + } builder.Append("self"); } else { if (IncludeHTMLMarkup) { diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs index b7a994fc30..dda759faba 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs @@ -52,7 +52,7 @@ namespace Grunwald.BooBinding.CodeCompletion public override bool HandleKeyword(SharpDevelopTextAreaControl editor, string word) { - switch (word.ToLower(CultureInfo.InvariantCulture)) { + switch (word.ToLowerInvariant()) { case "import": editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(ExpressionContext.Importable), ' '); return true; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index 08d411a5fa..d0e5c8c642 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -401,6 +401,18 @@ namespace Grunwald.BooBinding.CodeCompletion private void LeaveTypeDefinition(AST.TypeDefinition node) { DefaultClass c = _currentClass.Pop(); + foreach (AST.Attribute att in node.Attributes) { + if (att.Name == "System.Reflection.DefaultMemberAttribute" && att.Arguments.Count == 1) { + AST.StringLiteralExpression sle = att.Arguments[0] as AST.StringLiteralExpression; + if (sle != null) { + foreach (DefaultProperty p in c.Properties) { + if (p.Name == sle.Value) { + p.IsIndexer = true; + } + } + } + } + } //LoggingService.Debug("Leave "+node.GetType().Name+" "+node.FullName+" (Class = "+c.FullyQualifiedName+")"); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index e0894a6252..2803ab4dbd 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -26,10 +26,7 @@ namespace Grunwald.BooBinding.Tests T Resolve(string code, string marker) where T : ResolveResult { - ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); - Assert.IsNotNull(rr, "Resolve must not return null"); - Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); - return (T)rr; + return Resolve(normalProg, code, marker); } T ResolveReg(string code) where T : ResolveResult @@ -39,7 +36,12 @@ namespace Grunwald.BooBinding.Tests T ResolveReg(string code, string marker) where T : ResolveResult { - ResolveResult rr = Resolve(regressionProg, new ExpressionResult(code), marker); + return Resolve(regressionProg, code, marker); + } + + T Resolve(string prog, string code, string marker) where T : ResolveResult + { + ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker); Assert.IsNotNull(rr, "Resolve must not return null"); Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name); return (T)rr; @@ -92,7 +94,7 @@ namespace Grunwald.BooBinding.Tests #endregion #region Basic tests - const string prog = + const string normalProg = "import System\n" + "def MyMethod(arg as string):\n" + "\tlocalVar = arg\n" + @@ -145,7 +147,7 @@ namespace Grunwald.BooBinding.Tests LocalResolveResult rr = Resolve("e", "/*inClosure*/"); Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName); - Assert.IsNull(Resolve(prog, new ExpressionResult("e"), "/*1*/")); + Assert.IsNull(Resolve(normalProg, new ExpressionResult("e"), "/*1*/")); } [Test] @@ -207,10 +209,8 @@ namespace Grunwald.BooBinding.Tests "\tdef Test():\n" + "\t\t/*mark*/\n" + "\t\tpass\n"; - ResolveResult rr = Resolve(prog, new ExpressionResult("Test()"), "/*mark*/"); - Assert.IsNotNull(rr); - Assert.IsInstanceOfType(typeof(MemberResolveResult), rr); - Assert.AreEqual("OtherClass.Test", (rr as MemberResolveResult).ResolvedMember.FullyQualifiedName); + MemberResolveResult rr = Resolve(prog, "Test()", "/*mark*/"); + Assert.AreEqual("OtherClass.Test", rr.ResolvedMember.FullyQualifiedName); } #endregion @@ -243,6 +243,25 @@ namespace Grunwald.BooBinding.Tests Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName); Assert.IsNull(Resolve(regressionProg, new ExpressionResult("boo640a"), "/*1*/")); } + + [Test] + public void IndexerRecognition() + { + string prog = + "class Foo:\n" + + "\tself[index as int]:\n" + + "\t\tget:\n" + + "\t\t\treturn true\n" + + "def example():\n" + + "\tfoo = Foo()\n" + + "\tmybool = foo[1] /*mark*/\n" + + "\tprint mybool\n"; + MemberResolveResult rr = Resolve(prog, "foo[1]", "/*mark*/"); + Assert.IsTrue(((IProperty)rr.ResolvedMember).IsIndexer); + Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName); + LocalResolveResult rr2 = Resolve(prog, "mybool", "/*mark*/"); + Assert.AreEqual("System.Boolean", rr2.ResolvedType.FullyQualifiedName); + } #endregion #region CtrlSpace diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs index 01f78e2b27..8de64ec886 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs @@ -303,6 +303,14 @@ namespace ICSharpCode.Core } if (property.IsIndexer) { + if (property.DeclaringType != null) { + if (UseFullyQualifiedMemberNames) { + builder.Append(property.DeclaringType.FullyQualifiedName); + } else { + builder.Append(property.DeclaringType.Name); + } + builder.Append('.'); + } builder.Append("this"); } else { if (IncludeHTMLMarkup) {