Eclipse – `open call hierarchy` arrête de chercher dans la chaîne lambda

Voici mon exemple de code Java:

public class Test { public static void main(Ssortingng[] args) { methodDepth0( ()-> methodDepth1( ()-> methodDepth2() ) ); } static Object methodDepth2() { return null; } interface MyIF { void call(); } static void methodDepth0(MyIF myIf){ myIf.call(); } interface MyIF2 { void call(); } static void methodDepth1(MyIF2 myIf2){ myIf2.call(); } } 

Lorsque j’ouvre la hiérarchie d’appels de la méthode methodDepth2() depuis Eclipse (4.4), la open call hierarchy arrête la recherche de l’appelant suivant: ouvrir la hiérarchie des appels arrêter de rechercher la méthode appelant suivante

Ce que j’attends, c’est comme ouvrir la hiérarchie des appels de la méthode methodDepth1() qui montre jusqu’à la méthode main . <img src="http://soffr.miximages.com/java/VJ45c.png" alt="ouverture de la hiérarchie des appels de la méthode methodDepth1 () qui indique la méthode main “>

D’après ce que je peux dire, le manque de profondeur dans la hiérarchie des appels est dû à la (ré) évaluation du code au moment de l’exécution. Cela est expliqué dans 15.27.4 Évaluation au moment de l’ exécution des expressions lambda dans la spécification du langage Java.

Au moment de l’exécution, l’évaluation d’une expression lambda est similaire à l’évaluation d’une expression de création d’instance de classe, dans la mesure où l’achèvement normal génère une référence à un object. L’évaluation d’une expression lambda est distincte de l’exécution du corps lambda.

Comme le montre clairement la deuxième image, Eclipse est capable de suivre la hiérarchie des appels via la méthode appelée myIf.call() intérieur de methodDepth0 . Ceci est correct car lambda (externe) implémente la méthode MyIF.call() .

Le fait que le même modèle ne fonctionne pas dans le niveau d’imbrication suivant ressemble à un bogue. Veuillez envisager de déposer un bogue pour JDT / UI. TIA.

Notez simplement que pour les lambdas implémentant des types de bibliothèques comme Consumer , le nombre d’appelants dans accept(T) dans un espace de travail peut facilement devenir ingérable, similaire à toute hiérarchie d’appels, par exemple, Runnable.run() . ne vous interrogez pas sur l’utilité générale des hiérarchies d’appels à travers les lambda.