From eb609a936e21ec65e00e7238a1463b53c9e4f66b Mon Sep 17 00:00:00 2001 From: Matyrobbrt <65940752+Matyrobbrt@users.noreply.github.com> Date: Thu, 4 Jul 2024 23:06:18 +0300 Subject: [PATCH] Fix indices of method parameters when using tsrg files (#32) * Fix indices of method parameters when using tsrg files * Fix enum parameter offsets * Fix tests * Fix inner ctors --- .../java/net/neoforged/jst/api/PsiHelper.java | 2 +- .../jst/parchment/GatherReplacementsVisitor.java | 15 ++++++++++++++- .../namesanddocs/NamesAndDocsForMethod.java | 2 +- .../parchment/ParchmentNamesAndDocsForMethod.java | 4 ++-- .../srgutils/MappingFileMethodData.java | 2 +- .../tsrg_file/expected/pkg/TestClass.java | 12 ++++++++++++ tests/data/parchment/tsrg_file/merged.tsrg | 13 +++++++++++-- .../parchment/tsrg_file/source/pkg/TestClass.java | 12 ++++++++++++ 8 files changed, 54 insertions(+), 8 deletions(-) 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 9a5d843..46d9fe5 100644 --- a/api/src/main/java/net/neoforged/jst/api/PsiHelper.java +++ b/api/src/main/java/net/neoforged/jst/api/PsiHelper.java @@ -184,7 +184,7 @@ private static boolean isNonStaticInnerClassConstructor(PsiMethod method) { return false; } - private static boolean isNonStaticInnerClass(PsiClass psiClass) { + public static boolean isNonStaticInnerClass(PsiClass psiClass) { return psiClass.getContainingClass() != null && !psiClass.hasModifierProperty(PsiModifier.STATIC); } diff --git a/parchment/src/main/java/net/neoforged/jst/parchment/GatherReplacementsVisitor.java b/parchment/src/main/java/net/neoforged/jst/parchment/GatherReplacementsVisitor.java index e5aa9ca..840e5d9 100644 --- a/parchment/src/main/java/net/neoforged/jst/parchment/GatherReplacementsVisitor.java +++ b/parchment/src/main/java/net/neoforged/jst/parchment/GatherReplacementsVisitor.java @@ -104,6 +104,19 @@ public void visitElement(@NotNull PsiElement element) { var parameters = psiMethod.getParameterList().getParameters(); var parametersLvtIndices = PsiHelper.getParameterLvtIndices(psiMethod); boolean hadReplacements = false; + + int parameterOffset = 0; + if (psiMethod.isConstructor()) { + // Enums offset the parameter index by 2 since they add an int and a string param which are not visible in the source + if (psiMethod.getContainingClass().isEnum()) { + parameterOffset = 2; + } + // Non-static inner classes capture their owner as the first parameter + else if (PsiHelper.isNonStaticInnerClass(psiMethod.getContainingClass())) { + parameterOffset = 1; + } + } + for (int i = 0; i < parameters.length; i++) { var psiParameter = parameters[i]; // We cannot replace parameters with no name, sadly @@ -115,7 +128,7 @@ public void visitElement(@NotNull PsiElement element) { // to account for synthetic parameter not found in the source-code, we must adjust the index accordingly. var jvmIndex = parametersLvtIndices[i]; - var paramData = methodData.getParameter(jvmIndex); + var paramData = methodData.getParameter(parameterOffset + i, jvmIndex); // Optionally replace the parameter name, but skip record constructors, since those could have // implications for the field names. if (paramData != null && paramData.getName() != null && !PsiHelper.isRecordConstructor(psiMethod)) { diff --git a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/NamesAndDocsForMethod.java b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/NamesAndDocsForMethod.java index bff1fa2..7031908 100644 --- a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/NamesAndDocsForMethod.java +++ b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/NamesAndDocsForMethod.java @@ -5,5 +5,5 @@ public interface NamesAndDocsForMethod { List getJavadoc(); - NamesAndDocsForParameter getParameter(int index); + NamesAndDocsForParameter getParameter(int index, int jvmIndex); } diff --git a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/parchment/ParchmentNamesAndDocsForMethod.java b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/parchment/ParchmentNamesAndDocsForMethod.java index 2e0680b..fa7b7b9 100644 --- a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/parchment/ParchmentNamesAndDocsForMethod.java +++ b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/parchment/ParchmentNamesAndDocsForMethod.java @@ -19,8 +19,8 @@ public List getJavadoc() { } @Override - public NamesAndDocsForParameter getParameter(int index) { - var paramData = methodData.getParameter((byte) index); + public NamesAndDocsForParameter getParameter(int index, int jvmIndex) { + var paramData = methodData.getParameter((byte) jvmIndex); return paramData != null ? new ParchmentNamesAndDocsForParameter(paramData) : null; } } diff --git a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/srgutils/MappingFileMethodData.java b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/srgutils/MappingFileMethodData.java index 3147bc3..06e139c 100644 --- a/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/srgutils/MappingFileMethodData.java +++ b/parchment/src/main/java/net/neoforged/jst/parchment/namesanddocs/srgutils/MappingFileMethodData.java @@ -20,7 +20,7 @@ public List getJavadoc() { } @Override - public NamesAndDocsForParameter getParameter(int index) { + public NamesAndDocsForParameter getParameter(int index, int jvmIndex) { var paramData = methodData.getParameter(index); if (paramData == null || paramData.getMapped() == null) { return null; diff --git a/tests/data/parchment/tsrg_file/expected/pkg/TestClass.java b/tests/data/parchment/tsrg_file/expected/pkg/TestClass.java index b29d9a6..60fa354 100644 --- a/tests/data/parchment/tsrg_file/expected/pkg/TestClass.java +++ b/tests/data/parchment/tsrg_file/expected/pkg/TestClass.java @@ -5,4 +5,16 @@ public class TestClass { public void m(String p_254545_, List p_254546_) { } + + public class Inner { + public Inner(int p_298711_) { + + } + } + + public enum Enm { + ; + + Enm(boolean p_123452_) {} + } } diff --git a/tests/data/parchment/tsrg_file/merged.tsrg b/tests/data/parchment/tsrg_file/merged.tsrg index 5aa6285..6d25e0d 100644 --- a/tests/data/parchment/tsrg_file/merged.tsrg +++ b/tests/data/parchment/tsrg_file/merged.tsrg @@ -1,5 +1,14 @@ tsrg2 left right obfuscated_c pkg/TestClass obfuscated_m (Ljava/lang/String;Ljava/util/List;)V m - 1 o p_254545_ - 2 o p_254546_ + 0 o p_254545_ + 1 o p_254546_ +obfuscated_c$i pkg/TestClass$Inner + (Lpkg/TestClass;I)V + 0 o p_298710_ + 1 o p_298711_ +obfuscated_c$e pkg/TestClass$Enm + (Ljava/lang/String;IZ)V + 0 o p_123450_ + 1 o p_123451_ + 2 o p_123452_ diff --git a/tests/data/parchment/tsrg_file/source/pkg/TestClass.java b/tests/data/parchment/tsrg_file/source/pkg/TestClass.java index 778fcdc..1f68bf0 100644 --- a/tests/data/parchment/tsrg_file/source/pkg/TestClass.java +++ b/tests/data/parchment/tsrg_file/source/pkg/TestClass.java @@ -5,4 +5,16 @@ public class TestClass { public void m(String a1, List a2) { } + + public class Inner { + public Inner(int a1) { + + } + } + + public enum Enm { + ; + + Enm(boolean a3) {} + } }