From 51cf5a796dbf3a185bb80044976dc8f32ebbf040 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Tue, 24 May 2022 15:13:42 +0200 Subject: Properly support new expression matching in @Pattern Used to only compare the arguments, nether the class nor the qualifier (the outer class instance for inner classes constructor calls). --- .../com/replaymod/gradle/remap/PsiPattern.kt | 2 + .../gradle/remap/pattern/TestNewExpression.kt | 69 ++++++++++++++++++++++ src/testA/java/a/pkg/AParent.java | 3 + 3 files changed, 74 insertions(+) create mode 100644 src/test/kotlin/com/replaymod/gradle/remap/pattern/TestNewExpression.kt diff --git a/src/main/kotlin/com/replaymod/gradle/remap/PsiPattern.kt b/src/main/kotlin/com/replaymod/gradle/remap/PsiPattern.kt index 9a067da..9bf1e90 100644 --- a/src/main/kotlin/com/replaymod/gradle/remap/PsiPattern.kt +++ b/src/main/kotlin/com/replaymod/gradle/remap/PsiPattern.kt @@ -84,6 +84,8 @@ internal class PsiPattern( is PsiParenthesizedExpression -> expr is PsiParenthesizedExpression && match(pattern.expression, expr.expression) is PsiNewExpression -> expr is PsiNewExpression + && pattern.classReference?.resolve() == expr.classReference?.resolve() + && match(pattern.qualifier, expr.qualifier) && match(pattern.argumentList, expr.argumentList) is PsiLiteralExpression -> expr is PsiLiteralExpression && pattern.text == expr.text diff --git a/src/test/kotlin/com/replaymod/gradle/remap/pattern/TestNewExpression.kt b/src/test/kotlin/com/replaymod/gradle/remap/pattern/TestNewExpression.kt new file mode 100644 index 0000000..669cffb --- /dev/null +++ b/src/test/kotlin/com/replaymod/gradle/remap/pattern/TestNewExpression.kt @@ -0,0 +1,69 @@ +package com.replaymod.gradle.remap.pattern + +import com.replaymod.gradle.remap.util.TestData +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test + +class TestNewExpression { + @Test + fun `should find regular constructor`() { + TestData.remap(""" + class Test { + private void test() { + new a.pkg.A(null); + new a.pkg.A().new a.pkg.A.Inner(); + new a.pkg.AParent(null); + } + } + """.trimIndent(), """ + @remap.Pattern + private a.pkg.A matchNew(a.pkg.A arg) { + return new a.pkg.A(arg); + } + """.trimIndent(), """ + @remap.Pattern + private b.pkg.B matchNew(b.pkg.B arg) { + return arg; + } + """.trimIndent()) shouldBe """ + class Test { + private void test() { + null; + new b.pkg.B().new b.pkg.B.Inner(); + new b.pkg.BParent(null); + } + } + """.trimIndent() + } + + @Test + fun `should find inner class constructor`() { + TestData.remap(""" + class Test { + private void test() { + new a.pkg.A(null); + new a.pkg.A().new Inner(); + new a.pkg.AParent(null); + } + } + """.trimIndent(), """ + @remap.Pattern + private a.pkg.A.Inner matchNew(a.pkg.A arg) { + return arg.new a.pkg.A.Inner(); + } + """.trimIndent(), """ + @remap.Pattern + private b.pkg.B matchNew(b.pkg.B arg) { + return arg; + } + """.trimIndent()) shouldBe """ + class Test { + private void test() { + new b.pkg.B(null); + new b.pkg.B(); + new b.pkg.BParent(null); + } + } + """.trimIndent() + } +} \ No newline at end of file diff --git a/src/testA/java/a/pkg/AParent.java b/src/testA/java/a/pkg/AParent.java index ac0ea7c..3edf2a9 100644 --- a/src/testA/java/a/pkg/AParent.java +++ b/src/testA/java/a/pkg/AParent.java @@ -4,4 +4,7 @@ public class AParent { public AParent aParentMethod() { return this; } + + public AParent() {} + public AParent(A arg) {} } -- cgit