Skip to content

Commit b9cfd0a

Browse files
committed
GROOVY-9907
1 parent 623da1d commit b9cfd0a

File tree

4 files changed

+89
-3
lines changed

4 files changed

+89
-3
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -776,4 +776,24 @@ public void testTypeChecked9903() {
776776
"that you either use an explicit class or @DelegatesTo.Target with a correct id\n" +
777777
"----------\n");
778778
}
779+
780+
@Test
781+
public void testTypeChecked9907() {
782+
//@formatter:off
783+
String[] sources = {
784+
"Main.groovy",
785+
"@groovy.transform.TypeChecked\n" +
786+
"Integer foo(x) {\n" +
787+
" if (x instanceof Integer) {\n" +
788+
" def bar = { -> return x }\n" +
789+
" return bar.call()\n" +
790+
" }\n" +
791+
" return 0\n" +
792+
"}\n" +
793+
"println(foo(1))\n",
794+
};
795+
//@formatter:on
796+
797+
runConformTest(sources, "1");
798+
}
779799
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -322,9 +322,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
322322
protected final ReturnAdder.ReturnStatementListener returnListener = new ReturnAdder.ReturnStatementListener() {
323323
public void returnStatementAdded(final ReturnStatement returnStatement) {
324324
if (isNullConstant(returnStatement.getExpression())) return;
325+
/* GRECLIPSE edit -- GROOVY-9907
325326
checkReturnType(returnStatement);
326327
if (typeCheckingContext.getEnclosingClosure() != null) {
327328
addClosureReturnType(getType(returnStatement.getExpression()));
329+
*/
330+
ClassNode returnType = checkReturnType(returnStatement);
331+
if (typeCheckingContext.getEnclosingClosure() != null) {
332+
addClosureReturnType(returnType);
333+
// GRECLIPSE end
328334
} else if (typeCheckingContext.getEnclosingMethod() != null) {
329335
} else {
330336
throw new GroovyBugError("Unexpected return statement at "
@@ -692,7 +698,11 @@ public void visitVariableExpression(VariableExpression vexp) {
692698
*/
693699

694700
if (!(accessedVariable instanceof DynamicVariable)) {
701+
/* GRECLIPSE edit -- GROOVY-9907
695702
if (typeCheckingContext.getEnclosingClosure() == null) {
703+
*/
704+
{
705+
// GRECLIPSE end
696706
VariableExpression variable = null;
697707
if (accessedVariable instanceof Parameter) {
698708
variable = new ParameterVariableExpression((Parameter) accessedVariable);
@@ -2332,6 +2342,7 @@ private ClassNode infer(ClassNode target, ClassNode source) {
23322342

23332343
protected ClassNode checkReturnType(final ReturnStatement statement) {
23342344
Expression expression = statement.getExpression();
2345+
/* GRECLIPSE edit -- GROOVY-9907
23352346
ClassNode type = getType(expression);
23362347
23372348
if (typeCheckingContext.getEnclosingClosure() != null) {
@@ -2341,8 +2352,19 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
23412352
if ((expression instanceof VariableExpression) && hasInferredReturnType(expression)) {
23422353
type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
23432354
}
2355+
*/
2356+
ClassNode type;
2357+
if (expression instanceof VariableExpression && hasInferredReturnType(expression)) {
2358+
type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
2359+
} else {
2360+
type = getType(expression);
2361+
}
2362+
if (typeCheckingContext.getEnclosingClosure() != null) {
2363+
return type;
2364+
}
2365+
// GRECLIPSE end
23442366
MethodNode enclosingMethod = typeCheckingContext.getEnclosingMethod();
2345-
if (enclosingMethod != null && typeCheckingContext.getEnclosingClosure() == null) {
2367+
if (enclosingMethod != null) {
23462368
if (!enclosingMethod.isVoidMethod()
23472369
&& !type.equals(void_WRAPPER_TYPE)
23482370
&& !type.equals(VOID_TYPE)

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
334334
@Override
335335
public void returnStatementAdded(final ReturnStatement returnStatement) {
336336
if (isNullConstant(returnStatement.getExpression())) return;
337+
/* GRECLIPSE edit -- GROOVY-9907
337338
checkReturnType(returnStatement);
338339
if (typeCheckingContext.getEnclosingClosure() != null) {
339340
addClosureReturnType(getType(returnStatement.getExpression()));
341+
*/
342+
ClassNode returnType = checkReturnType(returnStatement);
343+
if (typeCheckingContext.getEnclosingClosure() != null) {
344+
addClosureReturnType(returnType);
345+
// GRECLIPSE end
340346
} else if (typeCheckingContext.getEnclosingMethod() == null) {
341347
throw new GroovyBugError("Unexpected return statement at " + returnStatement.getLineNumber() + ":" + returnStatement.getColumnNumber() + " " + returnStatement.getText());
342348
}
@@ -630,7 +636,11 @@ public void visitVariableExpression(final VariableExpression vexp) {
630636
}
631637
}
632638
}
639+
/* GRECLIPSE edit -- GROOVY-9907
633640
} else if (enclosingClosure == null) {
641+
*/
642+
} else {
643+
// GRECLIPSE end
634644
VariableExpression localVariable;
635645
if (accessedVariable instanceof Parameter) {
636646
Parameter parameter = (Parameter) accessedVariable;
@@ -2161,6 +2171,7 @@ private ClassNode infer(final ClassNode target, final ClassNode source) {
21612171

21622172
protected ClassNode checkReturnType(final ReturnStatement statement) {
21632173
Expression expression = statement.getExpression();
2174+
/* GRECLIPSE edit -- GROOVY-9907
21642175
ClassNode type = getType(expression);
21652176
21662177
if (typeCheckingContext.getEnclosingClosure() != null) {
@@ -2170,8 +2181,19 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
21702181
if ((expression instanceof VariableExpression) && hasInferredReturnType(expression)) {
21712182
type = expression.getNodeMetaData(INFERRED_RETURN_TYPE);
21722183
}
2184+
*/
2185+
ClassNode type;
2186+
if (expression instanceof VariableExpression && hasInferredReturnType(expression)) {
2187+
type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
2188+
} else {
2189+
type = getType(expression);
2190+
}
2191+
if (typeCheckingContext.getEnclosingClosure() != null) {
2192+
return type;
2193+
}
2194+
// GRECLIPSE end
21732195
MethodNode enclosingMethod = typeCheckingContext.getEnclosingMethod();
2174-
if (enclosingMethod != null && typeCheckingContext.getEnclosingClosure() == null) {
2196+
if (enclosingMethod != null) {
21752197
if (!enclosingMethod.isVoidMethod()
21762198
&& !type.equals(void_WRAPPER_TYPE)
21772199
&& !type.equals(VOID_TYPE)

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
334334
@Override
335335
public void returnStatementAdded(final ReturnStatement returnStatement) {
336336
if (isNullConstant(returnStatement.getExpression())) return;
337+
/* GRECLIPSE edit -- GROOVY-9907
337338
checkReturnType(returnStatement);
338339
if (typeCheckingContext.getEnclosingClosure() != null) {
339340
addClosureReturnType(getType(returnStatement.getExpression()));
341+
*/
342+
ClassNode returnType = checkReturnType(returnStatement);
343+
if (typeCheckingContext.getEnclosingClosure() != null) {
344+
addClosureReturnType(returnType);
345+
// GRECLIPSE end
340346
} else if (typeCheckingContext.getEnclosingMethod() == null) {
341347
throw new GroovyBugError("Unexpected return statement at " + returnStatement.getLineNumber() + ":" + returnStatement.getColumnNumber() + " " + returnStatement.getText());
342348
}
@@ -630,7 +636,11 @@ public void visitVariableExpression(final VariableExpression vexp) {
630636
}
631637
}
632638
}
639+
/* GRECLIPSE edit -- GROOVY-9907
633640
} else if (enclosingClosure == null) {
641+
*/
642+
} else {
643+
// GRECLIPSE end
634644
VariableExpression localVariable;
635645
if (accessedVariable instanceof Parameter) {
636646
Parameter parameter = (Parameter) accessedVariable;
@@ -2148,6 +2158,7 @@ private ClassNode infer(final ClassNode target, final ClassNode source) {
21482158

21492159
protected ClassNode checkReturnType(final ReturnStatement statement) {
21502160
Expression expression = statement.getExpression();
2161+
/* GRECLIPSE edit -- GROOVY-9907
21512162
ClassNode type = getType(expression);
21522163
21532164
if (typeCheckingContext.getEnclosingClosure() != null) {
@@ -2157,8 +2168,19 @@ protected ClassNode checkReturnType(final ReturnStatement statement) {
21572168
if ((expression instanceof VariableExpression) && hasInferredReturnType(expression)) {
21582169
type = expression.getNodeMetaData(INFERRED_RETURN_TYPE);
21592170
}
2171+
*/
2172+
ClassNode type;
2173+
if (expression instanceof VariableExpression && hasInferredReturnType(expression)) {
2174+
type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
2175+
} else {
2176+
type = getType(expression);
2177+
}
2178+
if (typeCheckingContext.getEnclosingClosure() != null) {
2179+
return type;
2180+
}
2181+
// GRECLIPSE end
21602182
MethodNode enclosingMethod = typeCheckingContext.getEnclosingMethod();
2161-
if (enclosingMethod != null && typeCheckingContext.getEnclosingClosure() == null) {
2183+
if (enclosingMethod != null) {
21622184
if (!enclosingMethod.isVoidMethod()
21632185
&& !type.equals(void_WRAPPER_TYPE)
21642186
&& !type.equals(VOID_TYPE)

0 commit comments

Comments
 (0)