You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/12/06 02:59:13 UTC
[groovy] branch master updated: GROOVY-6097, GROOVY-7300, GROOVY-8474, GROOVY-10133: `super.name` update
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 7846085 GROOVY-6097, GROOVY-7300, GROOVY-8474, GROOVY-10133: `super.name` update
7846085 is described below
commit 7846085b07732a2370f76a22f2d350ea3ea9be0f
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Dec 5 19:36:59 2021 -0600
GROOVY-6097, GROOVY-7300, GROOVY-8474, GROOVY-10133: `super.name` update
---
.../groovy/classgen/AsmClassGenerator.java | 60 +---
.../classgen/asm/sc/StaticInvocationWriter.java | 20 +-
.../transformers/StaticCompilationTransformer.java | 48 ++-
.../transform/stc/StaticTypeCheckingVisitor.java | 2 +-
src/test/groovy/PropertyTest.groovy | 37 +++
src/test/groovy/bugs/Groovy10133.groovy | 10 +-
src/test/groovy/bugs/Groovy6097.groovy | 13 +-
.../{Groovy8474Bug.groovy => Groovy8474.groovy} | 345 ++++++++++-----------
.../groovy/classgen/asm/sc/bugs/Groovy7300.groovy | 2 +-
9 files changed, 261 insertions(+), 276 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 44b1dd5..32c9ce5 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -151,8 +151,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.attrX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
import static org.codehaus.groovy.ast.tools.GeneralUtils.maybeFallsThrough;
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.thisPropX;
@@ -239,8 +237,8 @@ public class AsmClassGenerator extends ClassGenerator {
// properties
public static final MethodCallerMultiAdapter setProperty = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "setProperty", false, false);
private static final MethodCallerMultiAdapter getProperty = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "getProperty", false, false);
- //private static final MethodCallerMultiAdapter setPropertyOnSuper = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "setPropertyOnSuper", false, false);
- //private static final MethodCallerMultiAdapter getPropertyOnSuper = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "getPropertyOnSuper", false, false);
+ private static final MethodCallerMultiAdapter setPropertyOnSuper = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "setPropertyOnSuper", false, false);
+ private static final MethodCallerMultiAdapter getPropertyOnSuper = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "getPropertyOnSuper", false, false);
private static final MethodCallerMultiAdapter setGroovyObjectProperty = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "setGroovyObjectProperty", false, false);
private static final MethodCallerMultiAdapter getGroovyObjectProperty = MethodCallerMultiAdapter.newStatic(ScriptBytecodeAdapter.class, "getGroovyObjectProperty", false, false);
@@ -1128,50 +1126,6 @@ public class AsmClassGenerator extends ClassGenerator {
}
}
- private boolean tryPropertyOfSuperClass(final PropertyExpression pexp, final String propertyName) {
- ClassNode classNode = controller.getClassNode();
-
- if (!controller.getCompileStack().isLHS()) {
- String methodName = getGetterName(propertyName); // TODO: "is"
- callX(pexp.getObjectExpression(), methodName).visit(this);
- return true;
- }
-
- FieldNode fieldNode = classNode.getSuperClass().getField(propertyName);
-
- if (fieldNode == null) {
- throw new RuntimeParserException("Failed to find field[" + propertyName + "] of " + classNode.getName() + "'s super class", pexp);
- }
- if (fieldNode.isFinal()) {
- throw new RuntimeParserException("Cannot modify final field[" + propertyName + "] of " + classNode.getName() + "'s super class", pexp);
- }
-
- MethodNode setter = classNode.getSuperClass().getSetterMethod(getSetterName(propertyName));
- MethodNode getter = classNode.getSuperClass().getGetterMethod(getGetterName(propertyName));
-
- if (fieldNode.isPrivate() && (setter == null || getter == null || !setter.getDeclaringClass().equals(getter.getDeclaringClass()))) {
- throw new RuntimeParserException("Cannot access private field[" + propertyName + "] of " + classNode.getName() + "'s super class", pexp);
- }
-
- OperandStack operandStack = controller.getOperandStack();
- operandStack.doAsType(fieldNode.getType());
-
- MethodVisitor mv = controller.getMethodVisitor();
- mv.visitVarInsn(ALOAD, 0);
- operandStack.push(classNode);
-
- operandStack.swap();
-
- String owner = BytecodeHelper.getClassInternalName(classNode.getSuperClass().getName());
- String desc = BytecodeHelper.getTypeDescription(fieldNode.getType());
- if (fieldNode.isPublic() || fieldNode.isProtected()) {
- mv.visitFieldInsn(PUTFIELD, owner, propertyName, desc);
- } else {
- mv.visitMethodInsn(INVOKESPECIAL, owner, setter.getName(), BytecodeHelper.getMethodDescriptor(setter), false);
- }
- return true;
- }
-
private boolean checkStaticOuterField(final PropertyExpression pexp, final String propertyName) {
for (final ClassNode outer : controller.getClassNode().getOuterClasses()) {
FieldNode field = outer.getDeclaredField(propertyName);
@@ -1207,7 +1161,7 @@ public class AsmClassGenerator extends ClassGenerator {
}
private boolean isGroovyObject(final Expression objectExpression) {
- if (ExpressionUtils.isThisExpression(objectExpression)) return true;
+ if (isThisOrSuper(objectExpression)) return true; //GROOVY-8693
if (objectExpression instanceof ClassExpression) return false;
ClassNode objectExpressionType = controller.getTypeChooser().resolveType(objectExpression, controller.getClassNode());
@@ -1243,10 +1197,6 @@ public class AsmClassGenerator extends ClassGenerator {
fieldNode = classNode.getSuperClass().getDeclaredField(name);
// GROOVY-4497: do not visit super class field if it is private
if (fieldNode != null && fieldNode.isPrivate()) fieldNode = null;
-
- if (fieldNode == null) {
- visited = tryPropertyOfSuperClass(expression, name);
- }
}
if (fieldNode != null) {
@@ -1262,9 +1212,9 @@ public class AsmClassGenerator extends ClassGenerator {
MethodCallerMultiAdapter adapter;
if (controller.getCompileStack().isLHS()) {
- adapter = useMetaObjectProtocol ? setGroovyObjectProperty : setProperty;
+ adapter = ExpressionUtils.isSuperExpression(objectExpression) ? setPropertyOnSuper : useMetaObjectProtocol ? setGroovyObjectProperty : setProperty;
} else {
- adapter = useMetaObjectProtocol ? getGroovyObjectProperty : getProperty;
+ adapter = ExpressionUtils.isSuperExpression(objectExpression) ? getPropertyOnSuper : useMetaObjectProtocol ? getGroovyObjectProperty : getProperty;
}
visitAttributeOrProperty(expression, adapter);
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 20a5483..5c72843 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -75,6 +75,10 @@ import static org.apache.groovy.ast.tools.ClassNodeUtils.samePackageName;
import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
import static org.apache.groovy.ast.tools.ExpressionUtils.isSuperExpression;
import static org.apache.groovy.ast.tools.ExpressionUtils.isThisOrSuper;
+import static org.codehaus.groovy.ast.ClassHelper.isGStringType;
+import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
+import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveVoid;
+import static org.codehaus.groovy.ast.ClassHelper.isStringType;
import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
@@ -84,10 +88,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.ast.ClassHelper.isGStringType;
-import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveVoid;
-import static org.codehaus.groovy.ast.ClassHelper.isStringType;
import static org.codehaus.groovy.transform.trait.Traits.isTrait;
import static org.objectweb.asm.Opcodes.ACONST_NULL;
import static org.objectweb.asm.Opcodes.ALOAD;
@@ -127,12 +127,12 @@ public class StaticInvocationWriter extends InvocationWriter {
@Override
protected boolean makeDirectCall(final Expression origin, final Expression receiver, final Expression message, final Expression arguments, final MethodCallerMultiAdapter adapter, final boolean implicitThis, final boolean containsSpreadExpression) {
if (origin instanceof MethodCallExpression && isSuperExpression(receiver)) {
- ClassNode superClass = receiver.getNodeMetaData(StaticCompilationMetadataKeys.PROPERTY_OWNER);
- if (superClass != null && !controller.getCompileStack().isLHS()) {
- // GROOVY-7300
- MethodCallExpression mce = (MethodCallExpression) origin;
- MethodNode node = superClass.getDeclaredMethod(mce.getMethodAsString(), Parameter.EMPTY_ARRAY);
- mce.setMethodTarget(node);
+ MethodCallExpression mce = (MethodCallExpression) origin;
+ if (mce.getMethodTarget() == null && !controller.getCompileStack().isLHS()) { // GROOVY-7300
+ ClassNode owner = receiver.getNodeMetaData(StaticCompilationMetadataKeys.PROPERTY_OWNER);
+ if (owner != null) {
+ mce.setMethodTarget(owner.getDeclaredMethod(mce.getMethodAsString(), Parameter.EMPTY_ARRAY));
+ }
}
}
return super.makeDirectCall(origin, receiver, message, arguments, adapter, implicitThis, containsSpreadExpression);
diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
index e2a5a79..0a8f8a7 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
@@ -32,6 +32,7 @@ import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.ListExpression;
import org.codehaus.groovy.ast.expr.MethodCallExpression;
+import org.codehaus.groovy.ast.expr.PropertyExpression;
import org.codehaus.groovy.ast.expr.RangeExpression;
import org.codehaus.groovy.ast.expr.StaticMethodCallExpression;
import org.codehaus.groovy.ast.expr.VariableExpression;
@@ -41,10 +42,13 @@ import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.syntax.Types;
import org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor;
+import org.codehaus.groovy.transform.stc.StaticTypesMarker;
import java.util.Iterator;
import java.util.Map;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isSuperExpression;
+
/**
* Some expressions use symbols as aliases to method calls (<<, +=, ...). In static compilation,
* if such a method call is found, we transform the original binary expression into a method
@@ -105,15 +109,9 @@ public class StaticCompilationTransformer extends ClassCodeExpressionTransformer
}
@Override
- public Expression transform(Expression expr) {
- if (expr instanceof StaticMethodCallExpression) {
- return staticMethodCallExpressionTransformer.transformStaticMethodCallExpression((StaticMethodCallExpression) expr);
- }
+ public Expression transform(final Expression expr) {
if (expr instanceof BinaryExpression) {
- return binaryExpressionTransformer.transformBinaryExpression((BinaryExpression)expr);
- }
- if (expr instanceof MethodCallExpression) {
- return methodCallExpressionTransformer.transformMethodCallExpression((MethodCallExpression) expr);
+ return binaryExpressionTransformer.transformBinaryExpression((BinaryExpression) expr);
}
if (expr instanceof ClosureExpression) {
return closureExpressionTransformer.transformClosureExpression((ClosureExpression) expr);
@@ -121,20 +119,44 @@ public class StaticCompilationTransformer extends ClassCodeExpressionTransformer
if (expr instanceof ConstructorCallExpression) {
return constructorCallTransformer.transformConstructorCall((ConstructorCallExpression) expr);
}
+ if (expr instanceof MethodCallExpression) {
+ return methodCallExpressionTransformer.transformMethodCallExpression((MethodCallExpression) expr);
+ }
+ if (expr instanceof StaticMethodCallExpression) {
+ return staticMethodCallExpressionTransformer.transformStaticMethodCallExpression((StaticMethodCallExpression) expr);
+ }
if (expr instanceof BooleanExpression) {
- return booleanExpressionTransformer.transformBooleanExpression((BooleanExpression)expr);
+ return booleanExpressionTransformer.transformBooleanExpression((BooleanExpression) expr);
}
if (expr instanceof VariableExpression) {
- return variableExpressionTransformer.transformVariableExpression((VariableExpression)expr);
+ return variableExpressionTransformer.transformVariableExpression((VariableExpression) expr);
+ }
+ if (expr instanceof PropertyExpression && isSuperExpression(((PropertyExpression) expr).getObjectExpression())) { // TODO: all obj exp
+ // TODO: delegate to propertyExpressionTransformer.transformPropertyExpression((PropertyExpression) expr);
+ MethodNode dmct = expr.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
+ // NOTE: BinaryExpressionTransformer handles the setter
+ if (dmct != null && dmct.getParameters().length == 0) {
+ PropertyExpression pe = (PropertyExpression) expr;
+
+ MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), dmct.getName(), MethodCallExpression.NO_ARGUMENTS);
+ mce.setImplicitThis(pe.isImplicitThis());
+ mce.setSpreadSafe(pe.isSpreadSafe());
+ mce.setType(dmct.getReturnType());
+ mce.setMethodTarget(dmct);
+ mce.setSourcePosition(pe);
+ mce.copyNodeMetaData(pe);
+ mce.setSafe(pe.isSafe());
+ return mce;
+ }
}
if (expr instanceof RangeExpression) {
- return rangeExpressionTransformer.transformRangeExpression(((RangeExpression)expr));
+ return rangeExpressionTransformer.transformRangeExpression(((RangeExpression) expr));
}
if (expr instanceof ListExpression) {
return listExpressionTransformer.transformListExpression((ListExpression) expr);
}
if (expr instanceof CastExpression) {
- return castExpressionTransformer.transformCastExpression(((CastExpression)expr));
+ return castExpressionTransformer.transformCastExpression(((CastExpression) expr));
}
return super.transform(expr);
}
@@ -142,7 +164,7 @@ public class StaticCompilationTransformer extends ClassCodeExpressionTransformer
/**
* Called by helpers when super.transform() is needed.
*/
- final Expression superTransform(Expression expr) {
+ final Expression superTransform(final Expression expr) {
return super.transform(expr);
}
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 5d7b402..3e2a1da 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -3812,7 +3812,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
&& directMethodCallCandidate.isStatic()
&& directMethodCallCandidate.getDeclaringClass().isInterface()
&& !(directMethodCallCandidate instanceof ExtensionMethodNode)) {
- typeCheckingContext.getEnclosingClassNode().putNodeMetaData(MINIMUM_BYTECODE_VERSION, CompilerConfiguration.DEFAULT.getBytecodeVersion());
+ typeCheckingContext.getEnclosingClassNode().putNodeMetaData(MINIMUM_BYTECODE_VERSION, CompilerConfiguration.JDK8);
}
checkOrMarkPrivateAccess(call, directMethodCallCandidate);
diff --git a/src/test/groovy/PropertyTest.groovy b/src/test/groovy/PropertyTest.groovy
index 7d3119c..b4957a2 100644
--- a/src/test/groovy/PropertyTest.groovy
+++ b/src/test/groovy/PropertyTest.groovy
@@ -172,6 +172,43 @@ class PropertyTest extends GroovyTestCase {
assert c.xpropViaMethod == 'bar4foo x prop'
}
+ // GROOVY-1736, GROOVY-9609
+ void testGetSuperProperties2() {
+ for (vis in ['', 'public', 'protected', '@groovy.transform.PackageScope']) {
+ assertScript """
+ abstract class A {
+ $vis def getX() { 'A' }
+ }
+ class C extends A {
+ def getX() { super.x + 'C' } // no stack overflow
+ def m() {
+ '' + x + this.x + super.x // TODO: test safe and spread
+ }
+ }
+ String result = new C().m()
+ assert result == 'ACACA'
+ """
+ }
+ }
+
+ // GROOVY-6097
+ void testGetSuperProperties3() {
+ for (vis in ['', 'public', 'protected', '@groovy.transform.PackageScope']) {
+ assertScript """
+ abstract class A {
+ $vis boolean isX() { true }
+ }
+ class C extends A {
+ def m() {
+ '' + x + this.x + super.x // hardwired to "super.getX()"
+ }
+ }
+ String result = new C().m()
+ assert result == 'truetruetrue'
+ """
+ }
+ }
+
void testSetSuperProperties() {
def c = new Child()
assert c.superField == 'bar'
diff --git a/src/test/groovy/bugs/Groovy10133.groovy b/src/test/groovy/bugs/Groovy10133.groovy
index b474b4e..31d4ea8 100644
--- a/src/test/groovy/bugs/Groovy10133.groovy
+++ b/src/test/groovy/bugs/Groovy10133.groovy
@@ -45,7 +45,7 @@ final class Groovy10133 {
void test2() {
assert x
assert this.x
- assert !super.x // GROOVY-6097
+ assert super.x // GROOVY-6097
}
}
@@ -109,11 +109,7 @@ final class Groovy10133 {
void test2() {
assert x
assert this.x
- try {
- assert super.x // GROOVY-6097
- assert false : 'remove catch'
- } catch (MissingMethodException mme) {
- }
+ assert super.x // GROOVY-6097
}
}
@@ -188,7 +184,7 @@ final class Groovy10133 {
void test2() {
assert x
assert this.x
- assert !super.x // GROOVY-6097
+ assert super.x // GROOVY-6097
}
}
diff --git a/src/test/groovy/bugs/Groovy6097.groovy b/src/test/groovy/bugs/Groovy6097.groovy
index 767093b..bbbc33a 100644
--- a/src/test/groovy/bugs/Groovy6097.groovy
+++ b/src/test/groovy/bugs/Groovy6097.groovy
@@ -18,16 +18,16 @@
*/
package groovy.bugs
-import groovy.test.NotYetImplemented
import groovy.transform.CompileStatic
import org.junit.Test
import static groovy.test.GroovyAssert.assertScript
+import static groovy.test.GroovyAssert.shouldFail
@CompileStatic
final class Groovy6097 {
- @NotYetImplemented @Test
+ @Test
void testSuperIsser1() {
assertScript '''
class A {
@@ -46,9 +46,9 @@ final class Groovy6097 {
'''
}
- @NotYetImplemented @Test
+ @Test // GROOVY-9382, GROOVY-10133
void testSuperIsser2() {
- assertScript '''
+ def err = shouldFail '''
class A {
Boolean isBool() { Boolean.TRUE }
}
@@ -63,9 +63,10 @@ final class Groovy6097 {
new B()
'''
+ assert err =~ /MissingPropertyException: No such property: bool for class: B/
}
- @NotYetImplemented @Test
+ @Test
void testSuperIsser3() {
assertScript '''
class A {
@@ -86,7 +87,7 @@ final class Groovy6097 {
'''
}
- @NotYetImplemented @Test
+ @Test
void testSuperIsser4() {
assertScript '''
class A {
diff --git a/src/test/groovy/bugs/Groovy8474Bug.groovy b/src/test/groovy/bugs/Groovy8474.groovy
similarity index 56%
rename from src/test/groovy/bugs/Groovy8474Bug.groovy
rename to src/test/groovy/bugs/Groovy8474.groovy
index e7c4ed7..a921108 100644
--- a/src/test/groovy/bugs/Groovy8474Bug.groovy
+++ b/src/test/groovy/bugs/Groovy8474.groovy
@@ -18,309 +18,296 @@
*/
package groovy.bugs
-import groovy.test.GroovyTestCase
+import org.junit.Test
-class Groovy8474Bug extends GroovyTestCase {
+import static groovy.test.GroovyAssert.assertScript
+import static groovy.test.GroovyAssert.shouldFail
+
+final class Groovy8474 {
+
+ @Test
void testSettingSuperProperty() {
assertScript '''
class T {
- String group
+ String group
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperProperty2() {
assertScript '''
class T {
- String group
- String group2
- String group3
+ String group
+ String group2
+ String group3
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- super.group2 = 'Hello2'
- super.group3 = 'Hello3'
- }
+ S() {
+ super.group = 'Hello'
+ super.group2 = 'Hello2'
+ super.group3 = 'Hello3'
+ }
}
-
assert 'Hello' == new S().group
assert 'Hello2' == new S().group2
assert 'Hello3' == new S().group3
'''
}
+ @Test
void testSettingSuperProperty3() {
assertScript '''
class K {
String group
}
class T extends K {
-
}
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperProperty4() {
assertScript '''
class K {
- private String name
- public String getName() {
- name
- }
- public void setName(String name) {
- this.name = name
- }
+ private String name
+ public String getName() {
+ name
+ }
+ public void setName(String name) {
+ this.name = name
+ }
}
class T extends K {
- String group
+ String group
}
class S extends T {
- S() {
- super.group = 'Hello'
- super.name = 'World'
- }
-
- public String helloWorld() {
- "$group, $name"
- }
+ S() {
+ super.group = 'Hello'
+ super.name = 'World'
+ }
+ public String helloWorld() {
+ "$group, $name"
+ }
}
-
assert 'Hello, World' == new S().helloWorld()
'''
}
+ @Test
void testSettingSuperProperty5() {
assertScript '''
class T {
- Integer group
+ Integer group
}
-
class S extends T {
- S() {
- super.group = 1
- }
+ S() {
+ super.group = 1
+ }
}
-
assert 1 == new S().group
'''
}
+ @Test
void testSettingSuperProperty6() {
assertScript '''
class T {
- Long group
+ Long group
}
-
class S extends T {
- S() {
- super.group = 1
- }
+ S() {
+ super.group = 1
+ }
}
-
assert 1 == new S().group
'''
}
+ @Test
void testSettingSuperProperty7() {
assertScript '''
class T {
- Long group
+ Long group
}
-
class S extends T {
- S() {
- super.group = Long.MAX_VALUE
- }
+ S() {
+ super.group = Long.MAX_VALUE
+ }
}
-
assert Long.MAX_VALUE == new S().group
'''
}
+ @Test
void testSettingSuperProperty8() {
assertScript '''
class T {
- int group
+ int group
}
-
class S extends T {
- S() {
- super.group = Integer.MAX_VALUE
- }
+ S() {
+ super.group = Integer.MAX_VALUE
+ }
}
-
assert Integer.MAX_VALUE == new S().group
'''
}
+ @Test
void testSettingSuperProperty9() {
assertScript '''
class T {
- long group
+ long group
}
-
class S extends T {
- S() {
- super.group = Long.MAX_VALUE
- }
+ S() {
+ super.group = Long.MAX_VALUE
+ }
}
-
assert Long.MAX_VALUE == new S().group
'''
}
+ @Test
void testSettingSuperProperty10() {
assertScript '''
class T {
- int group
+ int group
}
-
class S extends T {
- S() {
- super.group = 1
- }
+ S() {
+ super.group = 1
+ }
}
-
assert 1 == new S().group
'''
}
+ @Test
void testSettingSuperProperty11() {
assertScript '''
class T {
- long group
+ long group
}
-
class S extends T {
- S() {
- super.group = 123456789123456789
- }
+ S() {
+ super.group = 123456789123456789
+ }
}
-
assert 123456789123456789 == new S().group
'''
}
+ @Test
void testSettingSuperProperty12() {
assertScript '''
class T {
- boolean group
+ boolean group
}
-
class S extends T {
- S() {
- super.group = true
- }
+ S() {
+ super.group = true
+ }
}
-
assert true == new S().group
'''
}
+ @Test
void testSettingSuperProtectedField() {
assertScript '''
class T {
- protected String group
+ protected String group
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperProtectedField2() {
assertScript '''
class T {
- protected String group
- protected String group2
- protected String group3
+ protected String group
+ protected String group2
+ protected String group3
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- super.group2 = 'Hello2'
- super.group3 = 'Hello3'
- }
+ S() {
+ super.group = 'Hello'
+ super.group2 = 'Hello2'
+ super.group3 = 'Hello3'
+ }
}
-
assert 'Hello' == new S().group
assert 'Hello2' == new S().group2
assert 'Hello3' == new S().group3
'''
}
+ @Test
void testSettingSuperProtectedField3() {
assertScript '''
class K {
protected String group
}
class T extends K {
-
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperPublicField() {
assertScript '''
class T {
- public String group
+ public String group
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperPublicField2() {
assertScript '''
class T {
- public String group
- public String group2
- public String group3
+ public String group
+ public String group2
+ public String group3
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- super.group2 = 'Hello2'
- super.group3 = 'Hello3'
- }
+ S() {
+ super.group = 'Hello'
+ super.group2 = 'Hello2'
+ super.group3 = 'Hello3'
+ }
}
assert 'Hello' == new S().group
@@ -329,115 +316,107 @@ class Groovy8474Bug extends GroovyTestCase {
'''
}
+ @Test
void testSettingSuperPublicField3() {
assertScript '''
class K {
public String group
}
class T extends K {
-
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
-
assert 'Hello' == new S().group
'''
}
+ @Test
void testSettingSuperPrivateProperty() {
- def errMsg = shouldFail '''
+ def err = shouldFail '''
class T {
- private String group
+ private String group
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
'''
- assert errMsg.contains('Cannot access private field')
+ //assert err =~ 'Cannot access private field'
}
+ @Test
void testSettingSuperPrivateProperty2() {
- def errMsg = shouldFail '''
+ def err = shouldFail '''
class T {
- private String group
-
- public String getGroup() {
- return group
- }
+ private String group
+ public String getGroup() {
+ return group
+ }
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
'''
-
- assert errMsg.contains('Cannot access private field')
+ //assert err =~ 'Cannot access private field'
}
+ @Test
void testSettingSuperPrivateProperty3() {
- def errMsg = shouldFail '''
+ def err = shouldFail '''
class T {
- private String group
-
- public void setGroup(String group) {
- this.group = group
- }
+ private String group
+ public void setGroup(String group) {
+ this.group = group
+ }
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
'''
-
- assert errMsg.contains('Cannot access private field')
+ //assert err =~ 'Cannot access private field'
}
+ @Test
void testSettingSuperPrivateProperty4() {
- def errMsg = shouldFail '''
+ def err = shouldFail '''
class K {
- private String group
-
- public void setGroup(String group) {
- this.group = group
- }
+ private String group
+ public void setGroup(String group) {
+ this.group = group
+ }
}
class T extends K {
- public String getGroup() {
- return group
- }
+ public String getGroup() {
+ return group
+ }
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
'''
-
- assert errMsg.contains('Cannot access private field')
+ //assert err =~ 'Cannot access private field'
}
+ @Test
void testSettingSuperFinalProperty() {
- shouldFail '''
+ def err = shouldFail '''
class T {
- protected final String group = 'Hi'
+ protected final String group = 'Hi'
}
-
class S extends T {
- S() {
- super.group = 'Hello'
- }
+ S() {
+ super.group = 'Hello'
+ }
}
'''
}
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
index 58908dd..ba2f4a5 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7300.groovy
@@ -33,7 +33,7 @@ final class Groovy7300 extends StaticTypeCheckingTestCase implements StaticCompi
@Override
def getX() { super.x }
}
- assert new B().getX() == 1 // TODO: Why use A#x and not A#getX?
+ assert new B().getX() == 2
'''
}