Skip to content

Commit

Permalink
fix: Enum#valueOf is now well shadowed (#2096)
Browse files Browse the repository at this point in the history
  • Loading branch information
surli authored and monperrus committed Jun 22, 2018
1 parent 57d0d39 commit 23c02c8
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ private CtMethod valueOfMethod() {
valueOfMethod.addThrownType(
getFactory().Type().createReference(IllegalArgumentException.class));
valueOfMethod.setType(getReference());
factory.Method().createParameter(valuesMethod, factory.Type().STRING, "name");
factory.Method().createParameter(valueOfMethod, factory.Type().STRING, "name");
}
return valueOfMethod;
}
Expand Down
38 changes: 38 additions & 0 deletions src/test/java/spoon/test/executable/ExecutableTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,23 @@

import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.CtModel;
import spoon.reflect.code.CtBlock;
import spoon.reflect.declaration.CtAnonymousExecutable;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtExecutable;
import spoon.reflect.declaration.CtPackage;
import spoon.reflect.declaration.CtType;
import spoon.reflect.reference.CtExecutableReference;
import spoon.reflect.visitor.Filter;
import spoon.reflect.visitor.Query;
import spoon.reflect.visitor.chain.CtQuery;
import spoon.reflect.visitor.filter.NamedElementFilter;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.test.executable.testclasses.A;
import spoon.test.executable.testclasses.Pozole;
import spoon.test.executable.testclasses.WithEnum;
import spoon.test.main.MainTest;
import spoon.testing.utils.ModelUtils;

import java.util.List;
Expand Down Expand Up @@ -75,4 +84,33 @@ public void testGetReference() throws Exception {
assertEquals(aClass.getFactory().Type().integerPrimitiveType(), methodRef.getType());
assertEquals(aClass.getMethod(methodName), methodRef.getDeclaration());
}

@Test
public void testShadowValueOf() {
// contract: the valueOf method should be correctly retrieved in shadow mode
Launcher launcher = new Launcher();
launcher.addInputResource("./src/test/java/spoon/test/executable/testclasses/WithEnum.java");
CtModel ctModel = launcher.buildModel();
List<CtExecutableReference> listValueOf = ctModel.
filterChildren(new TypeFilter<>(CtExecutableReference.class)).
filterChildren((Filter<CtExecutableReference>) element -> {
return element.getSimpleName().equals("valueOf");
}).list();

assertEquals(1, listValueOf.size());
CtExecutableReference valueOf = listValueOf.get(0);

Launcher launcherShadow = new Launcher();
CtType<?> ctType = launcher.getFactory().Type().get(WithEnum.class);
List<CtExecutableReference> listShadowValueOf = ctType.filterChildren(new TypeFilter<>(CtExecutableReference.class))
.filterChildren((Filter<CtExecutableReference>) element -> {
return element.getSimpleName().equals("valueOf");
}).list();
assertEquals(1, listShadowValueOf.size());
CtExecutableReference shadowValueOf = listShadowValueOf.get(0);

assertEquals(valueOf, shadowValueOf);
assertEquals(valueOf.getDeclaration(), shadowValueOf.getDeclaration());
MainTest.checkShadow(shadowValueOf.getParent(CtPackage.class));
}
}
11 changes: 11 additions & 0 deletions src/test/java/spoon/test/executable/testclasses/WithEnum.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package spoon.test.executable.testclasses;

public class WithEnum {
enum MYENUM {
VALUE1, VALUE2
}

public MYENUM from(String s) {
return MYENUM.valueOf(s);
}
}
2 changes: 1 addition & 1 deletion src/test/java/spoon/test/main/MainTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public void visitCtTypeParameterReference(CtTypeParameterReference ref) {
}.scan(pack);
}

private void checkShadow(CtPackage pack) {
public static void checkShadow(CtPackage pack) {
new CtScanner() {
@Override
public void scan(CtElement element) {
Expand Down

0 comments on commit 23c02c8

Please sign in to comment.