Skip to content

Commit

Permalink
refactor(modifier): createCtModifierHandler that handles the modifiers (
Browse files Browse the repository at this point in the history
#1677)

* refactor(modifier): create ctmodifierhandler that handles the modifiers

* fix tests

* fix tests
  • Loading branch information
tdurieux authored and surli committed Nov 6, 2017
1 parent dc6fbc7 commit 6961251
Show file tree
Hide file tree
Showing 11 changed files with 229 additions and 288 deletions.
7 changes: 7 additions & 0 deletions src/main/java/spoon/generating/CloneVisitorGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import spoon.reflect.visitor.Query;
import spoon.reflect.visitor.filter.OverridingMethodFilter;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.reflect.CtModifierHandler;
import spoon.support.visitor.clone.CloneBuilder;

import java.util.ArrayList;
Expand Down Expand Up @@ -405,6 +406,9 @@ private CtInvocation<?> createGetterInvocation(CtParameter<?> element, CtMethod<
* Query to get the setter of given field.
*/
private <T> CtMethod<?> getSetterOf(final CtField<T> ctField) {
if (ctField.getType().equals(getFactory().createCtTypeReference(CtModifierHandler.class))) {
return ctField.getDeclaringType().getMethodsByName("setModifiers").get(0);
}
// Search by name convention.
for (CtMethod<?> ctMethod : ctField.getDeclaringType().getMethods()) {
if (ctMethod.getSimpleName().startsWith("set") && ctMethod.getSimpleName().toLowerCase().contains(ctField.getSimpleName().toLowerCase())) {
Expand Down Expand Up @@ -449,6 +453,9 @@ public boolean matches(CtMethod element) {
* Query to get the getter of the given field.
*/
private <T> CtMethod<?> getGetterOf(CtField<T> ctField) {
if (ctField.getType().equals(getFactory().createCtTypeReference(CtModifierHandler.class))) {
return ctField.getDeclaringType().getMethod("getModifiers");
}
// Search by name convention.
for (CtMethod<?> ctMethod : ctField.getDeclaringType().getMethods()) {
if ((ctMethod.getSimpleName().startsWith("get") || ctMethod.getSimpleName().startsWith("is")) //
Expand Down
152 changes: 152 additions & 0 deletions src/main/java/spoon/support/reflect/CtModifierHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
/**
* Copyright (C) 2006-2017 INRIA and contributors
* Spoon - http://spoon.gforge.inria.fr/
* <p>
* This software is governed by the CeCILL-C License under French law and
* abiding by the rules of distribution of free software. You can use, modify
* and/or redistribute the software under the terms of the CeCILL-C license as
* circulated by CEA, CNRS and INRIA at http://www.cecill.info.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
* <p>
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
package spoon.support.reflect;

import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.ModifierKind;
import spoon.reflect.factory.Factory;
import spoon.support.reflect.declaration.CtElementImpl;

import java.io.Serializable;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;

import static spoon.reflect.path.CtRole.MODIFIER;

public class CtModifierHandler implements Serializable {
private static final long serialVersionUID = 1L;

private Set<ModifierKind> modifiers = CtElementImpl.emptySet();

private CtElement element;

public CtModifierHandler(CtElement element) {
this.element = element;
}

public Factory getFactory() {
return element.getFactory();
}

public Set<ModifierKind> getModifiers() {
return modifiers;
}

public boolean hasModifier(ModifierKind modifier) {
return getModifiers().contains(modifier);
}

public CtModifierHandler setModifiers(Set<ModifierKind> modifiers) {
if (modifiers.size() > 0) {
getFactory().getEnvironment().getModelChangeListener().onSetDeleteAll(element, MODIFIER, this.modifiers, new HashSet<>(this.modifiers));
this.modifiers.clear();
for (ModifierKind modifier : modifiers) {
addModifier(modifier);
}
}
return this;
}

public CtModifierHandler addModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
getFactory().getEnvironment().getModelChangeListener().onSetAdd(element, MODIFIER, this.modifiers, modifier);
modifiers.add(modifier);
return this;
}

public boolean removeModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
return false;
}
getFactory().getEnvironment().getModelChangeListener().onSetDelete(element, MODIFIER, modifiers, modifier);
return modifiers.remove(modifier);
}

public CtModifierHandler setVisibility(ModifierKind visibility) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
if (hasModifier(visibility)) {
return this;
}
if (isPublic()) {
removeModifier(ModifierKind.PUBLIC);
}
if (isProtected()) {
removeModifier(ModifierKind.PROTECTED);
}
if (isPrivate()) {
removeModifier(ModifierKind.PRIVATE);
}
addModifier(visibility);
return this;
}

public ModifierKind getVisibility() {
if (isPublic()) {
return ModifierKind.PUBLIC;
}
if (isProtected()) {
return ModifierKind.PROTECTED;
}
if (isPrivate()) {
return ModifierKind.PRIVATE;
}
return null;
}

public boolean isPublic() {
return getModifiers().contains(ModifierKind.PUBLIC);
}

public boolean isProtected() {
return getModifiers().contains(ModifierKind.PROTECTED);
}

public boolean isPrivate() {
return getModifiers().contains(ModifierKind.PRIVATE);
}

@Override
public int hashCode() {
return getModifiers().hashCode();
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof CtModifierHandler)) {
return false;
}
final CtModifierHandler other = (CtModifierHandler) obj;
if (getVisibility() == null) {
if (other.getVisibility() != null) {
return false;
}
} else if (other.getVisibility() == null) {
return false;
} else if (!getVisibility().equals(other.getVisibility())) {
return false;
}
if (getModifiers().size() != other.getModifiers().size()) {
return false;
}
return getModifiers().containsAll(other.getModifiers());
}
}
36 changes: 7 additions & 29 deletions src/main/java/spoon/support/reflect/code/CtCatchVariableImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,15 @@
import spoon.reflect.visitor.filter.SuperInheritanceHierarchyFunction;
import spoon.support.DerivedProperty;
import spoon.support.UnsettableProperty;
import spoon.support.reflect.CtModifierHandler;
import spoon.support.reflect.declaration.CtElementImpl;

import java.util.ArrayList;
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.CATCH_VARIABLE_MULTI_TYPES_CONTAINER_DEFAULT_CAPACITY;
import static spoon.reflect.path.CtRole.MODIFIER;
import static spoon.reflect.path.CtRole.NAME;
import static spoon.reflect.path.CtRole.TYPE;

Expand All @@ -56,7 +54,7 @@ public class CtCatchVariableImpl<T> extends CtCodeElementImpl implements CtCatch
List<CtTypeReference<?>> types = emptyList();

@MetamodelPropertyField(role = CtRole.MODIFIER)
Set<ModifierKind> modifiers = CtElementImpl.emptySet();
private CtModifierHandler modifierHandler = new CtModifierHandler(this);

@Override
public void accept(CtVisitor visitor) {
Expand Down Expand Up @@ -177,7 +175,7 @@ public <T extends CtMultiTypedElement> T setMultiTypes(List<CtTypeReference<?>>

@Override
public Set<ModifierKind> getModifiers() {
return modifiers;
return modifierHandler.getModifiers();
}

@Override
Expand All @@ -187,44 +185,24 @@ public boolean hasModifier(ModifierKind modifier) {

@Override
public <C extends CtModifiable> C setModifiers(Set<ModifierKind> modifiers) {
if (modifiers.size() > 0) {
getFactory().getEnvironment().getModelChangeListener().onSetDeleteAll(this, MODIFIER, this.modifiers, new HashSet<>(this.modifiers));
this.modifiers.clear();
for (ModifierKind modifier : modifiers) {
addModifier(modifier);
}
}
modifierHandler.setModifiers(modifiers);
return (C) this;
}

@Override
public <C extends CtModifiable> C addModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
getFactory().getEnvironment().getModelChangeListener().onSetAdd(this, MODIFIER, this.modifiers, modifier);
modifiers.add(modifier);
modifierHandler.addModifier(modifier);
return (C) this;
}

@Override
public boolean removeModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
return false;
}
getFactory().getEnvironment().getModelChangeListener().onSetDelete(this, MODIFIER, modifiers, modifier);
return modifiers.remove(modifier);
return modifierHandler.removeModifier(modifier);
}

@Override
public <C extends CtModifiable> C setVisibility(ModifierKind visibility) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
removeModifier(ModifierKind.PUBLIC);
removeModifier(ModifierKind.PROTECTED);
removeModifier(ModifierKind.PRIVATE);
addModifier(visibility);
modifierHandler.setVisibility(visibility);
return (C) this;
}

Expand Down
38 changes: 7 additions & 31 deletions src/main/java/spoon/support/reflect/code/CtLocalVariableImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,11 @@
import spoon.reflect.visitor.CtVisitor;
import spoon.support.DerivedProperty;
import spoon.support.UnsettableProperty;
import spoon.support.reflect.declaration.CtElementImpl;
import spoon.support.reflect.CtModifierHandler;

import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;

import static spoon.reflect.path.CtRole.DEFAULT_EXPRESSION;
import static spoon.reflect.path.CtRole.MODIFIER;
import static spoon.reflect.path.CtRole.NAME;
import static spoon.reflect.path.CtRole.TYPE;

Expand All @@ -55,7 +52,7 @@ public class CtLocalVariableImpl<T> extends CtStatementImpl implements CtLocalVa
CtTypeReference<T> type;

@MetamodelPropertyField(role = CtRole.MODIFIER)
Set<ModifierKind> modifiers = CtElementImpl.emptySet();
private CtModifierHandler modifierHandler = new CtModifierHandler(this);

@Override
public void accept(CtVisitor visitor) {
Expand Down Expand Up @@ -111,7 +108,7 @@ public <C extends CtTypedElement> C setType(CtTypeReference<T> type) {

@Override
public Set<ModifierKind> getModifiers() {
return modifiers;
return modifierHandler.getModifiers();
}

@Override
Expand All @@ -121,45 +118,24 @@ public boolean hasModifier(ModifierKind modifier) {

@Override
public <C extends CtModifiable> C setModifiers(Set<ModifierKind> modifiers) {
if (modifiers.size() > 0) {
getFactory().getEnvironment().getModelChangeListener().onSetDeleteAll(this, MODIFIER, this.modifiers, new HashSet<>(this.modifiers));
this.modifiers.clear();
for (ModifierKind modifier : modifiers) {
addModifier(modifier);
}

}
modifierHandler.setModifiers(modifiers);
return (C) this;
}

@Override
public <C extends CtModifiable> C addModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
getFactory().getEnvironment().getModelChangeListener().onSetAdd(this, MODIFIER, this.modifiers, modifier);
modifiers.add(modifier);
modifierHandler.addModifier(modifier);
return (C) this;
}

@Override
public boolean removeModifier(ModifierKind modifier) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
return false;
}
getFactory().getEnvironment().getModelChangeListener().onSetDelete(this, MODIFIER, modifiers, modifier);
return modifiers.remove(modifier);
return modifierHandler.removeModifier(modifier);
}

@Override
public <C extends CtModifiable> C setVisibility(ModifierKind visibility) {
if (modifiers == CtElementImpl.<ModifierKind>emptySet()) {
this.modifiers = EnumSet.noneOf(ModifierKind.class);
}
removeModifier(ModifierKind.PUBLIC);
removeModifier(ModifierKind.PROTECTED);
removeModifier(ModifierKind.PRIVATE);
addModifier(visibility);
modifierHandler.setVisibility(visibility);
return (C) this;
}

Expand Down
Loading

0 comments on commit 6961251

Please sign in to comment.