Browse Source

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
shortcuts
Daniel Grunwald 20 years ago
parent
commit
571f250ca9
  1. 4
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  2. 26
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs
  3. 4
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs
  4. 2
      src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs

4
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) IReturnType CreateReturnType(AST.Method node, IMethod method)
{ {
if (node.ReturnType == null) if (node.ReturnType == null)
return new InferredReturnType(node.Body, OuterClass); return new InferredReturnType(node.Body, OuterClass, false);
return CreateReturnType(node.ReturnType, method); return CreateReturnType(node.ReturnType, method);
} }
IReturnType CreateReturnType(AST.Property property) IReturnType CreateReturnType(AST.Property property)
{ {
if (property.Type == null && property.Getter != null && property.Getter.Body != null) 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); return CreateReturnType(property.Type);
} }

26
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs

@ -29,9 +29,12 @@ namespace Grunwald.BooBinding.CodeCompletion
this.expression = expression; 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"); if (block == null) throw new ArgumentNullException("block");
this.useLastStatementIfNoReturnStatement = useLastStatementIfNoReturnStatement;
this.block = block; this.block = block;
this.context = context; this.context = context;
} }
@ -44,12 +47,17 @@ namespace Grunwald.BooBinding.CodeCompletion
Block b = block; Block b = block;
block = null; // reset block before calling Visit to prevent StackOverflow block = null; // reset block before calling Visit to prevent StackOverflow
v.Visit(b); v.Visit(b);
if (v.noReturnStatement) if (v.noReturnStatement) {
cachedType = ReflectionReturnType.Void; if (useLastStatementIfNoReturnStatement && v.lastExpressionStatement != null) {
else if (v.result is NullReturnType) cachedType = new BooResolver().GetTypeOfExpression(v.lastExpressionStatement.Expression, context);
} else {
cachedType = ReflectionReturnType.Void;
}
} else if (v.result is NullReturnType) {
cachedType = ReflectionReturnType.Object; cachedType = ReflectionReturnType.Object;
else } else {
cachedType = v.result; cachedType = v.result;
}
} else if (expression != null) { } else if (expression != null) {
Expression expr = expression; Expression expr = expression;
expression = null; expression = null;
@ -66,8 +74,10 @@ namespace Grunwald.BooBinding.CodeCompletion
{ {
this.context = context; this.context = context;
} }
public IReturnType result; public IReturnType result;
public bool noReturnStatement = true; public bool noReturnStatement = true;
public ExpressionStatement lastExpressionStatement;
public override void OnReturnStatement(ReturnStatement node) 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) public override void OnYieldStatement(YieldStatement node)
{ {
noReturnStatement = false; noReturnStatement = false;

4
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs

@ -579,8 +579,8 @@ namespace Grunwald.BooBinding.CodeCompletion
if (node.ReturnType != null) { if (node.ReturnType != null) {
amrt.MethodReturnType = ConvertType(node.ReturnType); amrt.MethodReturnType = ConvertType(node.ReturnType);
} else { } 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")); ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy"));
MakeResult(amrt); MakeResult(amrt);

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

@ -80,6 +80,7 @@ namespace Grunwald.BooBinding.Tests
} }
#endregion #endregion
#region Basic tests
const string prog = const string prog =
"import System\n" + "import System\n" +
"def MyMethod(arg as string):\n" + "def MyMethod(arg as string):\n" +
@ -94,7 +95,6 @@ namespace Grunwald.BooBinding.Tests
"\t\treturn recursiveClosure()\n" + "\t\treturn recursiveClosure()\n" +
"\t/*3*/\n"; "\t/*3*/\n";
#region Basic tests
[Test] [Test]
public void MethodParameter() public void MethodParameter()
{ {

Loading…
Cancel
Save