diff options
author | Jonas Herzig <me@johni0702.de> | 2022-05-24 15:13:42 +0200 |
---|---|---|
committer | Jonas Herzig <me@johni0702.de> | 2022-05-27 08:46:01 +0200 |
commit | 51cf5a796dbf3a185bb80044976dc8f32ebbf040 (patch) | |
tree | d06b45bea0f262b8a7e90d296450502011dfc7a4 | |
parent | 1e3fab153d134f7dec5601cbdbca3c27d6aebc58 (diff) | |
download | Remap-51cf5a796dbf3a185bb80044976dc8f32ebbf040.tar.gz Remap-51cf5a796dbf3a185bb80044976dc8f32ebbf040.tar.bz2 Remap-51cf5a796dbf3a185bb80044976dc8f32ebbf040.zip |
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).
-rw-r--r-- | src/main/kotlin/com/replaymod/gradle/remap/PsiPattern.kt | 2 | ||||
-rw-r--r-- | src/test/kotlin/com/replaymod/gradle/remap/pattern/TestNewExpression.kt | 69 | ||||
-rw-r--r-- | src/testA/java/a/pkg/AParent.java | 3 |
3 files changed, 74 insertions, 0 deletions
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) {} } |