From fc1c4219cfa13b1078040545dff5f2c229910510 Mon Sep 17 00:00:00 2001 From: Martin Monperrus Date: Sun, 18 Feb 2018 12:24:15 +0100 Subject: [PATCH] feat: one could add a type member that already exists (equals but not same) and modify it afterwards (#1864) --- .../reflect/declaration/CtTypeImpl.java | 2 +- .../java/spoon/test/ctClass/CtClassTest.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java index 61e727eafb7..60ebcd4cf6d 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java @@ -123,7 +123,7 @@ public > C addTypeMemberAt(int position, CtTypeMember member if (this.typeMembers == CtElementImpl.emptyList()) { this.typeMembers = new SortedList<>(new CtLineElementComparator()); } - if (!this.typeMembers.contains(member)) { + if (!this.typeMembers.stream().anyMatch(m -> m == member)) { member.setParent(this); CtRole role; if (member instanceof CtMethod) { diff --git a/src/test/java/spoon/test/ctClass/CtClassTest.java b/src/test/java/spoon/test/ctClass/CtClassTest.java index 99f5bb28af2..54cbfc15b67 100644 --- a/src/test/java/spoon/test/ctClass/CtClassTest.java +++ b/src/test/java/spoon/test/ctClass/CtClassTest.java @@ -8,9 +8,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static spoon.testing.utils.ModelUtils.build; import static spoon.testing.utils.ModelUtils.buildClass; import static spoon.testing.utils.ModelUtils.canBeBuilt; @@ -20,10 +22,12 @@ import org.junit.Test; import spoon.Launcher; +import spoon.SpoonException; import spoon.reflect.CtModel; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtNewClass; +import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; @@ -60,6 +64,21 @@ public void getConstructor() throws Exception { typeStringArrayArray.setComponentType(typeStringArray); constructor = foo.getConstructor(typeStringArrayArray); assertEquals(typeStringArrayArray, constructor.getParameters().get(0).getType()); + + // contract: one could add a type member that already exists (equals but not same) and modify it afterwards + // this adds some flexibility for client code + // see https://github.com/INRIA/spoon/issues/1862 + CtConstructor cons = foo.getConstructors().toArray(new CtConstructor[0])[0].clone(); + foo.addConstructor(cons); + // as long as we have not changed the signature, getConstructors, which is based on signatures, + // thinks there is one single constructor (and that's OK) + assertEquals(3, foo.getConstructors().size()); + cons.addParameter(cons.getFactory().createParameter().setType(cons.getFactory().Type().OBJECT)); + // now that we have changed the signature we can call getConstructors safely + assertEquals(4, foo.getConstructors().size()); + assertSame(cons, foo.getTypeMembers().get(3)); + // the parent is set (the core problem described in the issue has been fixed) + assertSame(foo, cons.getParent()); } @Test