User: joe Date: 12 May 25 16:40 Revision: c32d9dd81f05e5e4a7a5948c340b8f1abb97f856 Summary: Fix entrypoint checks on non-ending parts of entrypoint references, and handle escapes in entrypoint reference strings. Fixes #2468 TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=10002&personal=false Index: src/main/kotlin/platform/fabric/inspection/FabricEntrypointsInspection.kt =================================================================== --- src/main/kotlin/platform/fabric/inspection/FabricEntrypointsInspection.kt (revision 52fe56e0752de88a4cf2ad7ff305f29fa671a0a6) +++ src/main/kotlin/platform/fabric/inspection/FabricEntrypointsInspection.kt (revision c32d9dd81f05e5e4a7a5948c340b8f1abb97f856) @@ -79,6 +79,10 @@ ) } + if (!reference.isFinalPart) { + continue + } + val element = resolved.singleOrNull()?.element when { element is PsiClass && !literal.text.contains("::") -> { Index: src/main/kotlin/platform/fabric/reference/EntryPointReference.kt =================================================================== --- src/main/kotlin/platform/fabric/reference/EntryPointReference.kt (revision 52fe56e0752de88a4cf2ad7ff305f29fa671a0a6) +++ src/main/kotlin/platform/fabric/reference/EntryPointReference.kt (revision c32d9dd81f05e5e4a7a5948c340b8f1abb97f856) @@ -35,6 +35,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementResolveResult import com.intellij.psi.PsiField +import com.intellij.psi.PsiLanguageInjectionHost import com.intellij.psi.PsiMethod import com.intellij.psi.PsiModifier import com.intellij.psi.PsiPolyVariantReference @@ -51,12 +52,17 @@ object EntryPointReference : PsiReferenceProvider() { override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array { - if (element !is JsonStringLiteral) { + if (element !is JsonStringLiteral || element !is PsiLanguageInjectionHost) { return PsiReference.EMPTY_ARRAY } val manipulator = element.manipulator ?: return PsiReference.EMPTY_ARRAY val range = manipulator.getRangeInElement(element) - val text = element.text.substring(range.startOffset, range.endOffset) + val escaper = element.createLiteralTextEscaper() + val text = buildString { + if (!escaper.decode(range, this)) { + return PsiReference.EMPTY_ARRAY + } + } val memberParts = text.split("::", limit = 2) val clazzParts = memberParts[0].split("$", limit = 0) val references = mutableListOf() @@ -68,7 +74,10 @@ references.add( Reference( element, - range.cutOut(TextRange.from(cursor, clazzPart.length)), + TextRange.create( + escaper.getOffsetInHost(cursor, range), + escaper.getOffsetInHost(cursor + clazzPart.length, range) + ), innerClassDepth, false, ), @@ -80,12 +89,16 @@ references.add( Reference( element, - range.cutOut(TextRange.from(cursor, memberParts[1].length)), + TextRange.create( + escaper.getOffsetInHost(cursor, range), + escaper.getOffsetInHost(cursor + memberParts[1].length, range), + ), innerClassDepth, true, ), ) } + references.lastOrNull()?.isFinalPart = true return references.toTypedArray() } @@ -167,6 +180,9 @@ PsiPolyVariantReference, InspectionReference { + var isFinalPart = false + internal set + override val description = "entry point '%s'" override val unresolved = resolve() == null