diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java index 1931c7b88f7..28b795b875b 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java @@ -16,18 +16,6 @@ */ package spoon.support.reflect.declaration; -import static spoon.reflect.ModelElementContainerDefaultCapacities.TYPE_TYPE_PARAMETERS_CONTAINER_DEFAULT_CAPACITY; - -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import spoon.reflect.cu.CompilationUnit; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnnotationType; @@ -59,6 +47,18 @@ import spoon.support.util.QualifiedNameBasedSortedSet; import spoon.support.util.SignatureBasedSortedSet; +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static spoon.reflect.ModelElementContainerDefaultCapacities.TYPE_TYPE_PARAMETERS_CONTAINER_DEFAULT_CAPACITY; + /** * The implementation for {@link spoon.reflect.declaration.CtType}. */ @@ -512,7 +512,7 @@ public boolean isAssignableFrom(CtTypeReference type) { @Override public > C addMethod(CtMethod method) { if (method != null) { - for (CtTypeMember typeMember: typeMembers) { + for (CtTypeMember typeMember: new ArrayList<>(typeMembers)) { if (!(typeMember instanceof CtMethod)) { continue; } diff --git a/src/test/java/spoon/test/method/MethodTest.java b/src/test/java/spoon/test/method/MethodTest.java index f04aa723ca2..283fb77e5a4 100644 --- a/src/test/java/spoon/test/method/MethodTest.java +++ b/src/test/java/spoon/test/method/MethodTest.java @@ -26,9 +26,15 @@ import spoon.test.delete.testclasses.Adobada; import spoon.test.method.testclasses.Tacos; +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.HashSet; + import static org.junit.Assert.assertEquals; +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.createFactory; public class MethodTest { @Test @@ -53,4 +59,16 @@ public void testSearchMethodWithGeneric() throws Exception { method1 = aTacos.getMethod("method1", aTacos.getFactory().Type().objectType()); assertEquals("public void method1(T t) {" + System.lineSeparator() + "}", method1.toString()); } + + @Test + public void testAddSameMethodsTwoTimes() throws Exception { + final Factory factory = createFactory(); + final CtClass tacos = factory.Class().create("Tacos"); + final CtMethod method = factory.Method().create(tacos, new HashSet<>(), factory.Type().voidType(), "m", new ArrayList<>(), new HashSet<>()); + try { + tacos.addMethod(method.clone()); + } catch (ConcurrentModificationException e) { + fail(); + } + } }