From fab280de6b1cf86618668a9f9a2b7e2a735a87c5 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 19 Dec 2023 13:26:15 +0100 Subject: [PATCH] [java-refactoring] IJ-CR-122503 IDEA-340596 Unable to rename file with implicit class - check identifier GitOrigin-RevId: 143e8d34a9eae594133c3f9ff66b18affa60ed53 --- .../daemon/impl/analysis/HighlightImplicitClassUtil.java | 5 ++--- .../refactoring/rename/RenameJavaImplicitClassProcessor.java | 2 +- .../refactoring/rename/RenameJavaImplicitClassRenamer.java | 4 +++- .../implicitClass/Incorrect.implicit.class.name.java | 1 + .../java/codeInsight/daemon/ImplicitClassHighlightingTest.kt | 5 +++++ 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/Incorrect.implicit.class.name.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightImplicitClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightImplicitClassUtil.java index e855d7a20c34..085331cd9987 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightImplicitClassUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightImplicitClassUtil.java @@ -6,7 +6,6 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; import com.intellij.codeInsight.intention.QuickFixFactory; import com.intellij.psi.*; -import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.JavaImplicitClassUtil; import com.intellij.psi.util.PsiMethodUtil; import com.intellij.util.containers.ContainerUtil; @@ -38,8 +37,8 @@ public final class HighlightImplicitClassUtil { if (!HighlightingFeature.IMPLICIT_CLASSES.isAvailable(file)) return null; PsiImplicitClass implicitClass = JavaImplicitClassUtil.getImplicitClassFor(file); if (implicitClass == null) return null; - String name = ClassUtil.getJVMClassName(implicitClass); - if (!PsiNameHelper.getInstance(file.getProject()).isQualifiedName(name)) { + String name = implicitClass.getQualifiedName(); + if (!PsiNameHelper.getInstance(file.getProject()).isIdentifier(name)) { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) .range(file) .fileLevelAnnotation() diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassProcessor.java index 607f3f8c0479..720bab3125e7 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassProcessor.java @@ -55,7 +55,7 @@ public class RenameJavaImplicitClassProcessor extends RenamePsiFileProcessor { protected void canRun() throws ConfigurationException { String name = super.getNewName(); if (Comparing.strEqual(name, myImplicitClass.getQualifiedName())) throw new ConfigurationException(null); - if (!PsiNameHelper.getInstance(myImplicitClass.getProject()).isQualifiedName(name)) { + if (!PsiNameHelper.getInstance(myImplicitClass.getProject()).isIdentifier(name)) { throw new ConfigurationException(LangBundle.message("dialog.message.valid.identifier", getNewName())); } } diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassRenamer.java b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassRenamer.java index 8961159d3952..3ce14dfec382 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassRenamer.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaImplicitClassRenamer.java @@ -3,6 +3,7 @@ package com.intellij.refactoring.rename; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -15,6 +16,7 @@ import org.jetbrains.annotations.TestOnly; public class RenameJavaImplicitClassRenamer implements RenameHandler { private final RenameJavaImplicitClassProcessor myProcessor = new RenameJavaImplicitClassProcessor(); + private static final Logger LOG = Logger.getInstance(RenameJavaImplicitClassRenamer.class); @Override public boolean isAvailableOnDataContext(@NotNull DataContext dataContext) { @@ -37,7 +39,7 @@ public class RenameJavaImplicitClassRenamer implements RenameHandler { @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { - //do nothing, it is not expected to be call from editor + LOG.error("Must not be called, because implicit classes are not available from editor"); } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/Incorrect.implicit.class.name.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/Incorrect.implicit.class.name.java new file mode 100644 index 000000000000..d53e9e3c03d8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/Incorrect.implicit.class.name.java @@ -0,0 +1 @@ +void main() {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt index fb518fe6d4bb..477d6a968fe2 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt @@ -32,6 +32,11 @@ class ImplicitClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() { doTest() } + fun testIncorrectImplicitClassName() { + myFixture.configureByFile( "Incorrect.implicit.class.name.java") + myFixture.checkHighlighting() + } + fun testNestedReferenceHighlighting() { doTest() }