From 571f250ca9b7d0162cd040bdcd2201282d39954a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 23 Apr 2006 14:43:56 +0000 Subject: [PATCH] InferredReturnType: use type of last ExpressionStatement for inline closures. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1342 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/CodeCompletion/ConvertVisitor.cs | 4 +-- .../Src/CodeCompletion/InferredReturnType.cs | 26 +++++++++++++++---- .../Src/CodeCompletion/ResolveVisitor.cs | 4 +-- .../Boo/BooBinding/Test/ResolverTests.cs | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) 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 d38e632df6..08d411a5fa 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -280,13 +280,13 @@ namespace Grunwald.BooBinding.CodeCompletion IReturnType CreateReturnType(AST.Method node, IMethod method) { if (node.ReturnType == null) - return new InferredReturnType(node.Body, OuterClass); + return new InferredReturnType(node.Body, OuterClass, false); return CreateReturnType(node.ReturnType, method); } IReturnType CreateReturnType(AST.Property property) { if (property.Type == null && property.Getter != null && property.Getter.Body != null) - return new InferredReturnType(property.Getter.Body, OuterClass); + return new InferredReturnType(property.Getter.Body, OuterClass, false); return CreateReturnType(property.Type); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs index 108501b8b8..c262c98871 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs @@ -29,9 +29,12 @@ namespace Grunwald.BooBinding.CodeCompletion this.expression = expression; } - public InferredReturnType(Block block, IClass context) + bool useLastStatementIfNoReturnStatement; + + public InferredReturnType(Block block, IClass context, bool useLastStatementIfNoReturnStatement) { if (block == null) throw new ArgumentNullException("block"); + this.useLastStatementIfNoReturnStatement = useLastStatementIfNoReturnStatement; this.block = block; this.context = context; } @@ -44,12 +47,17 @@ namespace Grunwald.BooBinding.CodeCompletion Block b = block; block = null; // reset block before calling Visit to prevent StackOverflow v.Visit(b); - if (v.noReturnStatement) - cachedType = ReflectionReturnType.Void; - else if (v.result is NullReturnType) + if (v.noReturnStatement) { + if (useLastStatementIfNoReturnStatement && v.lastExpressionStatement != null) { + cachedType = new BooResolver().GetTypeOfExpression(v.lastExpressionStatement.Expression, context); + } else { + cachedType = ReflectionReturnType.Void; + } + } else if (v.result is NullReturnType) { cachedType = ReflectionReturnType.Object; - else + } else { cachedType = v.result; + } } else if (expression != null) { Expression expr = expression; expression = null; @@ -66,8 +74,10 @@ namespace Grunwald.BooBinding.CodeCompletion { this.context = context; } + public IReturnType result; public bool noReturnStatement = true; + public ExpressionStatement lastExpressionStatement; public override void OnReturnStatement(ReturnStatement node) { @@ -79,6 +89,12 @@ namespace Grunwald.BooBinding.CodeCompletion } } + public override void OnExpressionStatement(ExpressionStatement node) + { + base.OnExpressionStatement(node); + lastExpressionStatement = node; + } + public override void OnYieldStatement(YieldStatement node) { noReturnStatement = false; 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 10f2340b08..235486c7df 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -579,8 +579,8 @@ namespace Grunwald.BooBinding.CodeCompletion if (node.ReturnType != null) { amrt.MethodReturnType = ConvertType(node.ReturnType); } else { - - amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass); + amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass, + node.ContainsAnnotation("inline")); } ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy")); MakeResult(amrt); diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index e8de828d93..a453a028b4 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -80,6 +80,7 @@ namespace Grunwald.BooBinding.Tests } #endregion + #region Basic tests const string prog = "import System\n" + "def MyMethod(arg as string):\n" + @@ -94,7 +95,6 @@ namespace Grunwald.BooBinding.Tests "\t\treturn recursiveClosure()\n" + "\t/*3*/\n"; - #region Basic tests [Test] public void MethodParameter() {