Skip to content

Commit

Permalink
fix: clone metadata for elements created via template (#4396)
Browse files Browse the repository at this point in the history
  • Loading branch information
algomaster99 authored Jan 6, 2022
1 parent cb2477e commit cfa9115
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/main/java/spoon/pattern/internal/node/ElementNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ public <U> void generateTargets(DefaultGenerator generator, ResultHolder<U> resu
@SuppressWarnings("rawtypes")
CtElement clone = generator.getFactory().Core().create((Class) elementType.getMetamodelInterface().getActualClass());
generateSingleNodeAttributes(generator, clone, parameters);
clone.setAllMetadata(templateElement.getAllMetadata());
generator.applyGeneratedBy(clone, generator.getGeneratedByComment(templateElement));
result.addResult((U) clone);
}
Expand Down
18 changes: 18 additions & 0 deletions src/test/java/spoon/test/template/PatternTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1647,4 +1647,22 @@ private Map<String, Object> getMap(Match match, String name) {
assertNotNull(v);
return ((ImmutableMap) v).asMap();
}

@Test
void testGeneratorCopiesMetadataOfTemplateElement() {
// contract: metadata should be cloned for all elements generated via template

String c1 = "public class A { int getOne() { return 1; } }";
CtType <?> type = Launcher.parseClass(c1);
String key = "foo";
String val = "bar";

// attach metadata
type.descendantIterator().forEachRemaining(ctElement -> ctElement.putMetadata(key, val));

// create clone using the above type as template
CtType <?> cloneType = PatternBuilder.create(type).build().generator().generate("B", new HashMap<>());

cloneType.descendantIterator().forEachRemaining(ctElement -> assertEquals(val, ctElement.getMetadata(key), "Metadata does not match for: " + ctElement));
}
}

0 comments on commit cfa9115

Please sign in to comment.