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 @@ -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);
}

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

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

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

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

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

@ -80,6 +80,7 @@ namespace Grunwald.BooBinding.Tests @@ -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 @@ -94,7 +95,6 @@ namespace Grunwald.BooBinding.Tests
"\t\treturn recursiveClosure()\n" +
"\t/*3*/\n";
#region Basic tests
[Test]
public void MethodParameter()
{

Loading…
Cancel
Save