J'essaie d'exécuter le morceau de code suivant.

System.out.println(originalElement);
System.out.println(uniqueParent);
((CtClass) originalElement).replace((CtClass) uniqueParent);

originalElement est

class Already {}

Et uniqueParent est

class Already {
    class Klass {}
}

Cependant, lorsque j'essaie de remplacer originalElement par uniqueParent, cela ne fonctionne pas. J'ai essayé l'API de remplacement avec d'autres éléments tels que CtMethod et cela fonctionne là-bas. Je voulais savoir s'il s'agissait du comportement prévu avec CtClass ou est-ce censé être un bogue ?

0
Aman Sharma 7 mars 2021 à 01:14

1 réponse

Meilleure réponse

Pour résumer une discussion à ce sujet sur le forum Spoon, le problème concerne ici la sémantique de CtElement.replace. La signification n'est pas que la cible d'invocation prenne le même état que son argument. Cela signifie que le modèle AST qui contenait l'objet cible de l'invocation en tant que nœud contient désormais l'objet argument en remplacement.

Lorsque vous avez utilisé replace sur un CtMethod, vous avez probablement vérifié le changement avec un élément parent tel qu'un CtClass et non ce CtMethod lui-même. De même, vous pouvez utiliser originalElement.getParent() après le remplacement pour obtenir une partie du modèle actuel afin de vérifier le changement. Dans ce cas, il renverra un CtPackage qui a un élément de type référencé par uniqueParent au lieu de originalElement.

1
Andrew 14 mars 2021 à 16:08