diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin index 3410dde9fd..5256e29e13 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.addin @@ -44,6 +44,10 @@ class = "Grunwald.BooBinding.CodeCompletion.BooParser"/> + + + + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj index 885ed9e79f..018c3b604c 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/BooBinding.csproj @@ -84,6 +84,7 @@ + diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs index f4802feabb..6d4f5ebe2a 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -429,6 +429,19 @@ namespace Grunwald.BooBinding.CodeCompletion } #endregion + public override void OnGeneratorExpression(GeneratorExpression node) + { + ClearResult(); + node.Expression.Accept(this); + + if (resolveResult != null) { + IClass enumerable = ProjectContentRegistry.Mscorlib.GetClass("System.Collections.Generic.IEnumerable", 1); + MakeResult(new ConstructedReturnType(enumerable.DefaultReturnType, new IReturnType[] { resolveResult.ResolvedType })); + } else { + MakeResult(new GetClassReturnType(projectContent, "System.Collections.IEnumerable", 0)); + } + } + public override void OnBinaryExpression(BinaryExpression node) { switch (node.Operator) { diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs index 3b1f71d9b9..29d52f3f98 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs @@ -108,6 +108,23 @@ namespace Grunwald.BooBinding.CodeCompletion InferResult(node.Iterator, node.Declarations[0].Name, node.LexicalInfo, true); } } + + public override void OnGeneratorExpression(GeneratorExpression node) + { + if (node.LexicalInfo.Line != resolver.CaretLine) + return; + LoggingService.Warn("GeneratorExpression: " + node.EndSourceLocation.Line); + if (node.Declarations.Count != 1) { + // TODO: support unpacking + base.OnGeneratorExpression(node); + return; + } + if (node.Declarations[0].Name == lookFor) { + Visit(node.Declarations[0]); + InferResult(node.Iterator, node.Declarations[0].Name, node.LexicalInfo, true); + } + base.OnGeneratorExpression(node); + } } /// diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/FormattingStrategy.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/FormattingStrategy.cs new file mode 100644 index 0000000000..1b2071a739 --- /dev/null +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/FormattingStrategy.cs @@ -0,0 +1,40 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 22.10.2005 + * Time: 21:51 + */ + +using System; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.TextEditor.Actions; + +namespace Grunwald.BooBinding +{ + public class BooFormattingStrategy : DefaultFormattingStrategy + { + protected override int SmartIndentLine(TextArea area, int line) + { + IDocument document = area.Document; + LineSegment previousLine = document.GetLineSegment(line-1); + + if (document.GetText(previousLine).EndsWith(":")) { + LineSegment currentLine = document.GetLineSegment(line); + string indentation = GetIndentation(area, line-1); + indentation += Tab.GetIndentationString(document); + document.Replace(currentLine.Offset, + currentLine.Length, + indentation + document.GetText(currentLine)); + return indentation.Length; + } + + return base.SmartIndentLine(area, line); + } + + // Deactivate indenting multiple lines with Ctrl-I + public override void IndentLines(TextArea textArea, int begin, int end) + { + } + } +} diff --git a/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs b/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs index 8edb890c54..ca858dae5f 100644 --- a/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs +++ b/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs @@ -692,6 +692,11 @@ namespace ICSharpCode.SharpDevelop.Dom { IClass c = returnType.GetUnderlyingClass(); if (c == null) return null; + if (baseClass.CompareTo(c) == 0) { + if (returnType.TypeArguments == null || baseClassTypeParameterIndex >= returnType.TypeArguments.Count) + return null; + return returnType.TypeArguments[baseClassTypeParameterIndex]; + } foreach (IReturnType baseType in c.BaseTypes) { if (baseClass.CompareTo(baseType.GetUnderlyingClass()) == 0) { if (baseType.TypeArguments == null || baseClassTypeParameterIndex >= baseType.TypeArguments.Count) diff --git a/src/Main/Base/Test/MemberLookupHelperTests.cs b/src/Main/Base/Test/MemberLookupHelperTests.cs index 8def52249a..9a1c0aa26c 100644 --- a/src/Main/Base/Test/MemberLookupHelperTests.cs +++ b/src/Main/Base/Test/MemberLookupHelperTests.cs @@ -40,5 +40,14 @@ namespace ICSharpCode.SharpDevelop.Tests Assert.AreEqual("System.String", res.TypeArguments[0].FullyQualifiedName); Assert.AreEqual("System.Int32", res.TypeArguments[1].FullyQualifiedName); } + + [Test] + public void TypeParameterPassedToBaseClassSameClass() + { + IReturnType[] stringArr = { ReflectionReturnType.String }; + IReturnType rrt = new ConstructedReturnType(EnumerableClass.DefaultReturnType, stringArr); + IReturnType res = MemberLookupHelper.GetTypeParameterPassedToBaseClass(rrt, EnumerableClass, 0); + Assert.AreEqual("System.String", res.FullyQualifiedName); + } } }