diff --git a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatchTest.java b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatchTest.java index c8ea6987e7e5..0e2049ad830d 100644 --- a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatchTest.java +++ b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatchTest.java @@ -16,7 +16,9 @@ package org.intellij.plugins.intelliLang.inject.java.validation; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; /** * @author Bas Leijdekkers @@ -30,6 +32,11 @@ public class LanguageMismatchTest extends LightJavaCodeInsightFixtureTestCase { myFixture.enableInspections(inspection); } + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return JAVA_21_ANNOTATED; + } + public void testParenthesesHighlighting() { highlightTest(""" import org.intellij.lang.annotations.Language; @@ -66,6 +73,16 @@ public class LanguageMismatchTest extends LightJavaCodeInsightFixtureTestCase { } """, "Annotate field 'JS_CODE' as '@Language'"); } + + public void testProcessorReassigned() { + highlightTest(""" + import org.intellij.lang.annotations.Language; + + class Hello { + @Language("JAVA") + public static final StringTemplate.Processor JAVA = STR; + }"""); + } public void testEmptyArrayConstant() { highlightTest(""" diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatch.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatch.java index 66d68f047777..3d54c87bf669 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatch.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/LanguageMismatch.java @@ -24,7 +24,9 @@ import com.intellij.codeInspection.options.OptPane; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.psi.*; +import com.intellij.psi.util.JavaPsiStringTemplateUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.SmartList; import com.siyeh.ig.psiutils.CollectionUtils; @@ -99,20 +101,24 @@ public class LanguageMismatch extends LocalInspectionTool { } } else if (CHECK_NON_ANNOTATED_REFERENCES) { - final PsiElement var = + final PsiElement decl = PsiTreeUtil.getParentOfType(expression, PsiVariable.class, PsiExpressionList.class, PsiAssignmentExpression.class); // only nag about direct assignment or passing the reference as parameter - if (var instanceof PsiVariable) { - if (((PsiVariable)var).getInitializer() != expression) { + if (decl instanceof PsiVariable variable) { + if (variable.getInitializer() != expression) { + return; + } + if (JavaPsiStringTemplateUtil.isStrTemplate(expression)) { + // Allow reassigning STR processor to apply language for standard concatenation return; } } - else if (var instanceof PsiExpressionList list) { + else if (decl instanceof PsiExpressionList list) { if (!ArrayUtil.contains(expression, list.getExpressions())) { return; } } - else if (var instanceof PsiAssignmentExpression a) { + else if (decl instanceof PsiAssignmentExpression a) { if (a.getRExpression() != expression) { return; }