diff --git a/api/src/main/java/net/neoforged/jst/api/PsiHelper.java b/api/src/main/java/net/neoforged/jst/api/PsiHelper.java index 95e917e..b347a4a 100644 --- a/api/src/main/java/net/neoforged/jst/api/PsiHelper.java +++ b/api/src/main/java/net/neoforged/jst/api/PsiHelper.java @@ -163,9 +163,18 @@ private static int getNonQualifiedClassIdx(@NotNull final PsiClass psiClass, @No CachedValuesManager.getCachedValue(containingClass, () -> { var map = new ObjectIntHashMap(); int index = 0; - for (var aClass : SyntaxTraverser.psiTraverser().withRoot(containingClass).postOrderDfsTraversal().filter(PsiClass.class)) { + var traverser = SyntaxTraverser.psiTraverser() + .withRoot(containingClass) + // We only care about looking at the direct class children of the containing class + // Only traverse children of either the containing class as root node (which itself is a PsiClass), or anything that isn't + // a PsiClass; this skips traversal of the children of any nested PsiClass + .expand(c -> c == containingClass || !(c instanceof PsiClass)) + .postOrderDfsTraversal() + .filter(PsiClass.class); + for (var aClass : traverser) { // We're only interested in actual classes without qualified names (type parameters are an instance of PsiClass) - if (!(aClass instanceof PsiTypeParameter) && aClass.getQualifiedName() == null) { + // Avoid traversing the root node itself + if (aClass != containingClass && !(aClass instanceof PsiTypeParameter) && aClass.getQualifiedName() == null) { map.put(aClass, ++index); } } diff --git a/tests/data/accesstransformer/anonymous_classes/accesstransformer.cfg b/tests/data/accesstransformer/anonymous_classes/accesstransformer.cfg index 677b740..56567ea 100644 --- a/tests/data/accesstransformer/anonymous_classes/accesstransformer.cfg +++ b/tests/data/accesstransformer/anonymous_classes/accesstransformer.cfg @@ -1,2 +1,6 @@ public example.C$1 method()V +public example.C$1$1 method()V public example.C$2 *() +public example.C$2$1 *() +public example.C$2$1$1 *() +public example.C$2$1$2 *() diff --git a/tests/data/accesstransformer/anonymous_classes/expected/example/C.java b/tests/data/accesstransformer/anonymous_classes/expected/example/C.java index 32e829a..43d2498 100644 --- a/tests/data/accesstransformer/anonymous_classes/expected/example/C.java +++ b/tests/data/accesstransformer/anonymous_classes/expected/example/C.java @@ -1,15 +1,39 @@ package example; public class C { - static C REGULAR = new C() { + static C REGULAR = new C() { // $1 @Override public void method() { + new C() { // $1$1 + @Override + public void method() { // $1$1 method()V + } + }; } }; - static C WILDCARD = new C() { + static C WILDCARD = new C() { // $2 @Override public void method() { + new C() { // $2$1 + @Override + public void method() { + new C() { // $2$1$1 + @Override + public void method() { + } + }; + } + + @Override + public void method2() { + new C() { // $2$1$2 + @Override + public void method2() { + } + }; + } + }; } @Override diff --git a/tests/data/accesstransformer/anonymous_classes/source/example/C.java b/tests/data/accesstransformer/anonymous_classes/source/example/C.java index 244ddcc..e0330d3 100644 --- a/tests/data/accesstransformer/anonymous_classes/source/example/C.java +++ b/tests/data/accesstransformer/anonymous_classes/source/example/C.java @@ -1,15 +1,39 @@ package example; public class C { - static C REGULAR = new C() { + static C REGULAR = new C() { // $1 @Override protected void method() { + new C() { // $1$1 + @Override + protected void method() { // $1$1 method()V + } + }; } }; - static C WILDCARD = new C() { + static C WILDCARD = new C() { // $2 @Override protected void method() { + new C() { // $2$1 + @Override + protected void method() { + new C() { // $2$1$1 + @Override + protected void method() { + } + }; + } + + @Override + protected void method2() { + new C() { // $2$1$2 + @Override + protected void method2() { + } + }; + } + }; } @Override