|
56 | 56 | import spoon.support.compiler.VirtualFile; |
57 | 57 | import spoon.test.refactoring.processors.ThisTransformationProcessor; |
58 | 58 | import spoon.test.refactoring.testclasses.AClass; |
| 59 | +import spoon.test.refactoring.testclasses.GenericRenaming; |
| 60 | +import spoon.test.refactoring.testclasses.MethodGenericRenaming; |
| 61 | +import spoon.testing.utils.ModelUtils; |
59 | 62 | import spoon.test.refactoring.testclasses.AnnotationMethodRenaming; |
60 | 63 | import spoon.test.refactoring.testclasses.ExampleAnnotation; |
61 | 64 | import spoon.test.refactoring.testclasses.InterfaceRenaming; |
62 | 65 | import spoon.test.refactoring.testclasses.MethodRenaming; |
63 | | -import spoon.testing.utils.ModelUtils; |
64 | 66 |
|
65 | 67 | public class RefactoringTest { |
66 | 68 | @Test |
@@ -223,6 +225,69 @@ void renameClassInVirtualFile() { |
223 | 225 | ); |
224 | 226 | } |
225 | 227 |
|
| 228 | + @Test |
| 229 | + void testRenameType() throws Exception { |
| 230 | + Factory factory = ModelUtils.build(GenericRenaming.class); |
| 231 | + CtClass<?> clazz = factory.Class().get(GenericRenaming.class); |
| 232 | + var nestedClass = clazz.getNestedType("SomeNestedType"); |
| 233 | + Refactoring.changeTypeName(nestedClass, "RenamedNestedType"); |
| 234 | + |
| 235 | + assertEquals("RenamedNestedType", nestedClass.getSimpleName()); |
| 236 | + |
| 237 | + var refs = clazz.getElements(new TypeFilter<>(CtTypeReference.class)).stream().filter(t -> t.getSimpleName().equals("RenamedNestedType")).toList(); |
| 238 | + assertEquals(2, refs.size()); |
| 239 | + for (var ref : refs) { |
| 240 | + assertEquals(nestedClass, ref.getDeclaration()); |
| 241 | + } |
| 242 | + } |
| 243 | + |
| 244 | + @Test |
| 245 | + void testRenameGenerics() throws Exception { |
| 246 | + Factory factory = ModelUtils.build(GenericRenaming.class); |
| 247 | + CtClass<?> clazz = factory.Class().get(GenericRenaming.class); |
| 248 | + List<CtType<?>> types = clazz.getElements(new TypeFilter<>(CtType.class)); |
| 249 | + |
| 250 | + renameAndCheckClassGeneric(clazz, types, "SomeIdentifier", "TNew1", 15); |
| 251 | + renameAndCheckClassGeneric(clazz, types, "SomeOther", "TNew2", 17); |
| 252 | + renameAndCheckMethodGeneric(clazz, "doTheThing", types, "SomeMethodGeneric", "TNew3", 2); |
| 253 | + } |
| 254 | + |
| 255 | + @Test |
| 256 | + void testRenameGenericsShouldRespectScope() throws Exception { |
| 257 | + Factory factory = ModelUtils.build(MethodGenericRenaming.class); |
| 258 | + CtClass<?> clazz = factory.Class().get(MethodGenericRenaming.class); |
| 259 | + List<CtType<?>> types = clazz.getElements(new TypeFilter<>(CtType.class)); |
| 260 | + renameAndCheckMethodGeneric(clazz, "sort", types, "T", "TNew", 3); |
| 261 | + } |
| 262 | + |
| 263 | + private static void renameAndCheckMethodGeneric(CtClass<?> clazz, String method, List<CtType<?>> types, String oldName, String newName, int expectedRefs) { |
| 264 | + var generic = clazz.getMethodsByName(method).get(0).getElements(new TypeFilter<>(CtType.class)) |
| 265 | + .stream().filter(t -> t.getSimpleName().equals(oldName)).findFirst().orElseThrow(); |
| 266 | + Refactoring.changeTypeName(generic, newName); |
| 267 | + assertEquals(newName, generic.getSimpleName()); |
| 268 | + |
| 269 | + var typeRefs = clazz.getElements(new TypeFilter<>(CtTypeReference.class)) |
| 270 | + .stream().filter(typeRef -> typeRef.getSimpleName().equals(newName)).toList(); |
| 271 | + assertEquals(expectedRefs, typeRefs.size()); |
| 272 | + for (var typeRef : typeRefs) { |
| 273 | + assertEquals(generic.getParent(CtMethod.class), typeRef.getParent(CtMethod.class)); |
| 274 | + } |
| 275 | + } |
| 276 | + |
| 277 | + private static void renameAndCheckClassGeneric(CtClass<?> clazz, List<CtType<?>> types, String oldName, String newName, int expectedRefs) { |
| 278 | + var classGeneric = types.stream().filter((CtType<?> t) -> t.getSimpleName().equals(oldName)).findFirst().orElseThrow(); |
| 279 | + Refactoring.changeTypeName(classGeneric, newName); |
| 280 | + assertEquals(newName, classGeneric.getSimpleName()); |
| 281 | + |
| 282 | + var typeRefs = clazz.getElements(new TypeFilter<>(CtTypeReference.class)) |
| 283 | + .stream().filter(typeRef -> typeRef.getSimpleName().equals(newName)).toList(); |
| 284 | + |
| 285 | + assertEquals(expectedRefs, typeRefs.size()); |
| 286 | + for (var typeRef : typeRefs) { |
| 287 | + assertEquals(classGeneric, typeRef.getDeclaration()); |
| 288 | + } |
| 289 | + } |
| 290 | + |
226 | 291 | @Test |
227 | 292 | void testChangeMethodName() throws Exception { |
228 | 293 | String newName = "methodRenamed"; |
|
0 commit comments