Browse Source

BooBinding: detect indexers in parsed code

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1370 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
3897fc0a33
  1. 8
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs
  2. 2
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs
  3. 12
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  4. 41
      src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs
  5. 8
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs

8
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs

@ -323,6 +323,14 @@ namespace Grunwald.BooBinding @@ -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) {

2
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/CompletionBinding.cs

@ -52,7 +52,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -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;

12
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs

@ -401,6 +401,18 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -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+")");
}

41
src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs

@ -26,10 +26,7 @@ namespace Grunwald.BooBinding.Tests @@ -26,10 +26,7 @@ namespace Grunwald.BooBinding.Tests
T Resolve<T>(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<T>(normalProg, code, marker);
}
T ResolveReg<T>(string code) where T : ResolveResult
@ -39,7 +36,12 @@ namespace Grunwald.BooBinding.Tests @@ -39,7 +36,12 @@ namespace Grunwald.BooBinding.Tests
T ResolveReg<T>(string code, string marker) where T : ResolveResult
{
ResolveResult rr = Resolve(regressionProg, new ExpressionResult(code), marker);
return Resolve<T>(regressionProg, code, marker);
}
T Resolve<T>(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 @@ -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 @@ -145,7 +147,7 @@ namespace Grunwald.BooBinding.Tests
LocalResolveResult rr = Resolve<LocalResolveResult>("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 @@ -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<MemberResolveResult>(prog, "Test()", "/*mark*/");
Assert.AreEqual("OtherClass.Test", rr.ResolvedMember.FullyQualifiedName);
}
#endregion
@ -243,6 +243,25 @@ namespace Grunwald.BooBinding.Tests @@ -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<MemberResolveResult>(prog, "foo[1]", "/*mark*/");
Assert.IsTrue(((IProperty)rr.ResolvedMember).IsIndexer);
Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName);
LocalResolveResult rr2 = Resolve<LocalResolveResult>(prog, "mybool", "/*mark*/");
Assert.AreEqual("System.Boolean", rr2.ResolvedType.FullyQualifiedName);
}
#endregion
#region CtrlSpace

8
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs

@ -303,6 +303,14 @@ namespace ICSharpCode.Core @@ -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) {

Loading…
Cancel
Save