diff --git a/src/main/java/spoon/reflect/declaration/CtModifiable.java b/src/main/java/spoon/reflect/declaration/CtModifiable.java index 1c9aca85f16..897b3e55f59 100644 --- a/src/main/java/spoon/reflect/declaration/CtModifiable.java +++ b/src/main/java/spoon/reflect/declaration/CtModifiable.java @@ -59,7 +59,6 @@ public interface CtModifiable extends CtElement { * add a modifier * * @param modifier - * @return true if this element changed as a result of the call */ @PropertySetter(role = MODIFIER) T addModifier(ModifierKind modifier); @@ -68,10 +67,9 @@ public interface CtModifiable extends CtElement { * remove a modifier * * @param modifier - * @return true if this element changed as a result of the call */ @PropertySetter(role = MODIFIER) - boolean removeModifier(ModifierKind modifier); + T removeModifier(ModifierKind modifier); /** * Sets the visibility of this modifiable element (replaces old visibility). diff --git a/src/main/java/spoon/support/reflect/CtModifierHandler.java b/src/main/java/spoon/support/reflect/CtModifierHandler.java index fbdc89e50f3..c38e639546d 100644 --- a/src/main/java/spoon/support/reflect/CtModifierHandler.java +++ b/src/main/java/spoon/support/reflect/CtModifierHandler.java @@ -94,14 +94,15 @@ public CtModifierHandler addModifier(ModifierKind modifier) { return this; } - public boolean removeModifier(ModifierKind modifier) { + public CtModifierHandler removeModifier(ModifierKind modifier) { if (this.modifiers == CtElementImpl.emptySet()) { - return false; + return this; } getFactory().getEnvironment().getModelChangeListener().onSetDelete(element, MODIFIER, modifiers, modifier); // we want to remove implicit OR explicit modifier - boolean b = modifiers.remove(new CtExtendedModifier(modifier)); - return b || modifiers.remove(new CtExtendedModifier(modifier, true)); + modifiers.remove(new CtExtendedModifier(modifier)); + modifiers.remove(new CtExtendedModifier(modifier, true)); + return this; } public CtModifierHandler setVisibility(ModifierKind visibility) { diff --git a/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java b/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java index 141b27d3fa5..c3d78605786 100644 --- a/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java @@ -197,8 +197,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java b/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java index 539448bff05..920b6bc6b4c 100644 --- a/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java @@ -130,8 +130,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java b/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java index 63f8527b8fa..a605910ab81 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtAnonymousExecutableImpl.java @@ -53,8 +53,9 @@ public T addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public T removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (T) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java b/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java index a261d8f5050..fa72f67e55b 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtConstructorImpl.java @@ -158,8 +158,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java b/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java index 29e352e2202..5e2f6b5e706 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtFieldImpl.java @@ -136,8 +136,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java b/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java index 8a49047e3ee..84cf21a7f21 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtMethodImpl.java @@ -166,8 +166,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java b/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java index e7d0e8fbc77..a96e0ffc9be 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtParameterImpl.java @@ -134,8 +134,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java index 7003ddea795..3aea05647f3 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java @@ -479,8 +479,9 @@ public C addModifier(ModifierKind modifier) { } @Override - public boolean removeModifier(ModifierKind modifier) { - return modifierHandler.removeModifier(modifier); + public C removeModifier(ModifierKind modifier) { + modifierHandler.removeModifier(modifier); + return (C) this; } @Override diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java index 305bd34ce56..ecda4097625 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java @@ -212,9 +212,9 @@ public C addModifier(ModifierKind modifier) { @Override @UnsettableProperty - public boolean removeModifier(ModifierKind modifier) { + public C removeModifier(ModifierKind modifier) { // unsettable property - return true; + return (C) this; } @Override diff --git a/src/test/java/spoon/test/modifiers/TestModifiers.java b/src/test/java/spoon/test/modifiers/TestModifiers.java index bf20c902279..06790378825 100644 --- a/src/test/java/spoon/test/modifiers/TestModifiers.java +++ b/src/test/java/spoon/test/modifiers/TestModifiers.java @@ -37,6 +37,24 @@ public void testMethodWithVarargsDoesNotBecomeTransient() { spoon.run(); } + @Test + public void testCtModifiableAddRemoveReturnCtModifiable() { + // contract: CtModifiable#addModifier and CtModifiable#removeModifier should return CtModifiable + + Launcher spoon = new Launcher(); + spoon.addInputResource("./src/test/java/spoon/test/modifiers/testclasses/MethodVarArgs.java"); + spoon.buildModel(); + + CtType myClass = spoon.getFactory().Type().get(MethodVarArgs.class); + CtMethod methodVarargs = myClass.getMethodsByName("getInitValues").get(0); + + Object o = methodVarargs.addModifier(ModifierKind.FINAL); + assertEquals(methodVarargs, o); + + o = methodVarargs.removeModifier(ModifierKind.FINAL); + assertEquals(methodVarargs, o); + } + @Test public void testSetVisibility() { // contract: setVisibility should only work with public/private/protected modifiers