⁠
joseph burton: Add support for MixinExtras expressions (#2274 )
* Start on MixinExtras Expression language
* MEExpression color settings page
* MEExpression annotator
* MEExpression brace matcher and quote handler
* Switch LHS of MEExpression assignmentExpression to themselves be certain types of expression
* MEExpression language injection inside @Expression
* Fix formatting and licenses
* Add MIXINEXTRAS:EXPRESSION injection point and add @Expression annotation on completion
* Fix licenser errors
* Add new ME expression features
* Implement MixinExtras expression collect visitor
* Fix cast expressions
* Simple best-effort source matching for ME expressions
* Fix name expression source matching
* Fix MEName.isWildcard
* Fix MELitExpression source matching
* operationSign - operationTokenType
* Add built-in definitions
* Update MixinExtras
* Start with ME definition references
* Attempt to overhaul ME expression injection
* Some fixes to the new injection + navigation
* MixinExtras: Add handler signature support for expressions. (#2244 )
* Partially fix ME definition renaming
* Attempt to get inplace rename refactoring to work (it doesn't)
* MixinExtras: Use expression-suggested parameter names if they're present. (#2257 )
* Fix MEExpressionInjector. Rename refactoring works!
* Suppress deprecation warning
* ME expression `@Definition` find usages
* Fix/expressions int like types (#2261 )
* Mixin: Combine parameter and return type inspections.
* MixinExtras: Offer a choice between all valid int-like types.
* Mixin: Fix tests for handler signature inspection.
* Add simple keyword completion to ME expressions
* Why didn't my local ktlint tell me about these
* Store whether a declaration is a type in the ME PSI
* Add completions for items that already have a definition
* Extract some ME expression matching into its own class, and cache some more things
* Remove some debug...
* Start on MixinExtras Expression language
* MEExpression color settings page
* MEExpression annotator
* MEExpression brace matcher and quote handler
* Switch LHS of MEExpression assignmentExpression to themselves be certain types of expression
* MEExpression language injection inside @Expression
* Fix formatting and licenses
* Add MIXINEXTRAS:EXPRESSION injection point and add @Expression annotation on completion
* Fix licenser errors
* Add new ME expression features
* Implement MixinExtras expression collect visitor
* Fix cast expressions
* Simple best-effort source matching for ME expressions
* Fix name expression source matching
* Fix MEName.isWildcard
* Fix MELitExpression source matching
* operationSign - operationTokenType
* Add built-in definitions
* Update MixinExtras
* Start with ME definition references
* Attempt to overhaul ME expression injection
* Some fixes to the new injection + navigation
* MixinExtras: Add handler signature support for expressions. (#2244 )
* Partially fix ME definition renaming
* Attempt to get inplace rename refactoring to work (it doesn't)
* MixinExtras: Use expression-suggested parameter names if they're present. (#2257 )
* Fix MEExpressionInjector. Rename refactoring works!
* Suppress deprecation warning
* ME expression `@Definition` find usages
* Fix/expressions int like types (#2261 )
* Mixin: Combine parameter and return type inspections.
* MixinExtras: Offer a choice between all valid int-like types.
* Mixin: Fix tests for handler signature inspection.
* Add simple keyword completion to ME expressions
* Why didn't my local ktlint tell me about these
* Store whether a declaration is a type in the ME PSI
* Add completions for items that already have a definition
* Extract some ME expression matching into its own class, and cache some more things
* Remove some debug...
- /*
- * Minecraft Development for IntelliJ
- *
- * https://mcdev.io/
- *
- * Copyright (C) 2024 minecraft-dev
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, version 3.0 only.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
- package com.demonwav.mcdev.platform.mixin.expression
- import com.demonwav.mcdev.MinecraftProjectSettings
- import com.demonwav.mcdev.framework.EdtInterceptor
- import com.demonwav.mcdev.platform.mixin.BaseMixinTest
- import com.demonwav.mcdev.util.BeforeOrAfter
- import com.intellij.codeInsight.lookup.impl.LookupImpl
- import org.intellij.lang.annotations.Language
- import org.junit.jupiter.api.Assertions.assertEquals
- import org.junit.jupiter.api.Assertions.assertFalse
- import org.junit.jupiter.api.Assertions.assertNotEquals
- import org.junit.jupiter.api.Assertions.assertNotNull
- import org.junit.jupiter.api.Assertions.assertNull
- import org.junit.jupiter.api.Assertions.assertTrue
- import org.junit.jupiter.api.Assertions.fail
- import org.junit.jupiter.api.DisplayName
- import org.junit.jupiter.api.Test
- import org.junit.jupiter.api.extension.ExtendWith
- @ExtendWith(EdtInterceptor::class)
- @DisplayName("MixinExtras expression completion test")
- class MEExpressionCompletionTest : BaseMixinTest() {
- private fun assertLookupAppears(
- lookupString: String,
- @Language("JAVA") code: String,
- shouldAppear: Boolean = true
- ) {
- buildProject {
- dir("test") {
- java("MEExpressionCompletionTest.java", code)
- }
- }
- fixture.completeBasic()
- val lookups = fixture.lookupElementStrings
- if (lookups != null) {
- if (shouldAppear) {
- assertTrue(lookupString in lookups)
- } else {
- assertFalse(lookupString in lookups)
- }
- } else {
- if (shouldAppear) {
- assertEquals(lookupString, fixture.elementAtCaret.text)
- } else {
- assertNotEquals(lookupString, fixture.elementAtCaret.text)
- }
- }
- }
- private fun doBeforeAfterTest(
- lookupString: String,
- @Language("JAVA") code: String,
- @Language("JAVA") expectedAfter: String?
- ) {
- buildProject {
- dir("test") {
- java("MEExpressionCompletionTest.java", code)
- }
- }
- MinecraftProjectSettings.getInstance(fixture.project).definitionPosRelativeToExpression = BeforeOrAfter.BEFORE
- val possibleItems = fixture.completeBasic()
- if (possibleItems != null) {
- val itemToComplete = possibleItems.firstOrNull { it.lookupString == lookupString }
- if (expectedAfter != null) {
- assertNotNull(itemToComplete, "Expected a completion matching \"$lookupString\"")
- (fixture.lookup as LookupImpl).finishLookup('\n', itemToComplete)
- } else {
- assertNull(itemToComplete, "Expected no completions matching \"$lookupString\"")
- return
- }
- } else if (expectedAfter == null) {
- fail<Unit>("Expected no completions matching \"$lookupString\"")
- return
- }
- fixture.checkResult(expectedAfter)
- }
- @Test
- @DisplayName("Local Variable Implicit Completion Test")
- fun localVariableImplicitCompletionTest() {
- doBeforeAfterTest(
- "one",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import com.llamalad7.mixinextras.sugar.Local;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "one", local = @Local(type = int.class))
- @Expression("one")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Local Variable Ordinal Completion Test")
- fun localVariableOrdinalCompletionTest() {
- doBeforeAfterTest(
- "local1",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import com.llamalad7.mixinextras.sugar.Local;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "local1", local = @Local(type = String.class, ordinal = 0))
- @Expression("local1")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Local Variable Inaccessible Type Completion Test")
- fun localVariableInaccessibleTypeCompletionTest() {
- doBeforeAfterTest(
- "varOfInaccessibleType",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "acceptInaccessibleType", method = "Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData;acceptInaccessibleType(Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData${'$'}InaccessibleType;)V")
- @Expression("acceptInaccessibleType(<caret>)")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import com.llamalad7.mixinextras.sugar.Local;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "acceptInaccessibleType", method = "Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData;acceptInaccessibleType(Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData${'$'}InaccessibleType;)V")
- @Definition(id = "varOfInaccessibleType", local = @Local(ordinal = 0))
- @Expression("acceptInaccessibleType(varOfInaccessibleType)")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Field Completion Test")
- fun fieldCompletionTest() {
- doBeforeAfterTest(
- "out",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "out", field = "Ljava/lang/System;out:Ljava/io/PrintStream;")
- @Expression("out")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Method Completion Test")
- fun methodCompletionTest() {
- doBeforeAfterTest(
- "acceptInaccessibleType",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "acceptInaccessibleType", method = "Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData;acceptInaccessibleType(Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData${'$'}InaccessibleType;)V")
- @Expression("acceptInaccessibleType(<caret>)")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Method No-Arg Completion Test")
- fun methodNoArgCompletionTest() {
- doBeforeAfterTest(
- "noArgMethod",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "noArgMethod", method = "Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData;noArgMethod()V")
- @Expression("noArgMethod()<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Type Completion Test")
- fun typeCompletionTest() {
- doBeforeAfterTest(
- "ArrayList",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("new <caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- import java.util.ArrayList;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "ArrayList", type = ArrayList.class)
- @Expression("new ArrayList(<caret>)")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- )
- }
- @Test
- @DisplayName("Inaccessible Type Completion Test")
- fun inaccessibleTypeCompletionTest() {
- doBeforeAfterTest(
- "InaccessibleType",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("new <caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- null,
- )
- }
- @Test
- @DisplayName("Array Creation Completion Test")
- fun arrayCreationCompletionTest() {
- doBeforeAfterTest(
- "String",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("new <caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent(),
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "String", type = String.class)
- @Expression("new String[<caret>]")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("LHS Of Complete Assignment Test")
- fun lhsOfCompleteAssignmentTest() {
- assertLookupAppears(
- "local1",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret> = 'Hello'")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Cast Test")
- fun castTest() {
- assertLookupAppears(
- "Integer",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("(<caret>)")
- @Inject(method = "getStingerCount", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Member Function Test")
- fun memberFunctionTest() {
- assertLookupAppears(
- "get",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "Integer", type = Integer.class)
- @Definition(id = "synchedData", field = "Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData;synchedData:Lcom/demonwav/mcdev/mixintestdata/meExpression/MEExpressionTestData${'$'}SynchedDataManager;")
- @Expression("(Integer) this.synchedData.<caret>")
- @Inject(method = "getStingerCount", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Array Length Test")
- fun arrayLengthTest() {
- assertLookupAppears(
- "one",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "String", type = String.class)
- @Expression("new String[<caret>]")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Array Element Test")
- fun arrayElementTest() {
- assertLookupAppears(
- "local2",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Definition;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Definition(id = "String", type = String.class)
- @Expression("new String[]{?, <caret>}")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Static Method Reference Test")
- fun staticMethodReferenceTest() {
- assertLookupAppears(
- "staticMapper",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("::<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Non Static Method Reference Test")
- fun nonStaticMethodReferenceTest() {
- assertLookupAppears(
- "nonStaticMapper",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("this::<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- @Test
- @DisplayName("Constructor Method Reference Test")
- fun constructorMethodReferenceTest() {
- assertLookupAppears(
- "ConstructedByMethodReference",
- """
- package test;
- import com.demonwav.mcdev.mixintestdata.meExpression.MEExpressionTestData;
- import com.llamalad7.mixinextras.expression.Expression;
- import org.spongepowered.asm.mixin.Mixin;
- import org.spongepowered.asm.mixin.injection.At;
- import org.spongepowered.asm.mixin.injection.Inject;
- @Mixin(MEExpressionTestData.class)
- class MEExpressionCompletionTest {
- @Expression("<caret>")
- @Inject(method = "complexFunction", at = @At("MIXINEXTRAS:EXPRESSION"))
- }
- """.trimIndent()
- )
- }
- }