[java-generating] IDEA-345603 Generate -> override methods doesn't work with implicit classes

- allow to invoke everywhere in implicit classes
 - don't create {}
 - don't allow constructors

GitOrigin-RevId: 8f0b17b498035ffd1c20b26543de0a2d21eabf87
This commit is contained in:
Mikhail Pyltsin
2024-02-09 14:45:39 +00:00
committed by intellij-monorepo-bot
parent 798178da08
commit cf8999446b
5 changed files with 58 additions and 4 deletions
@@ -789,13 +789,13 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
try {
int offset = editor.getCaretModel().getOffset();
PsiElement brace = aClass.getLBrace();
if (brace == null) {
if (brace == null && !(aClass instanceof PsiImplicitClass)) {
PsiClass psiClass = JavaPsiFacade.getElementFactory(aClass.getProject()).createClass("X");
brace = aClass.addRangeAfter(psiClass.getLBrace(), psiClass.getRBrace(), aClass.getLastChild());
LOG.assertTrue(brace != null, aClass.getLastChild());
}
int lbraceOffset = brace.getTextOffset();
int lbraceOffset = brace == null ? 0 : brace.getTextOffset();
List<PsiGenerationInfo<PsiMethod>> resultMembers;
if (offset <= lbraceOffset || aClass.isEnum()) {
resultMembers = new ArrayList<>();
@@ -904,6 +904,13 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
final PsiClass aClass = (PsiClass)element;
if (aClass instanceof PsiSyntheticClass) return null;
if (file instanceof PsiJavaFile javaFile) {
PsiClass[] classes = javaFile.getClasses();
if (classes.length == 1 && classes[0] instanceof PsiImplicitClass implicitClass &&
implicitClass.getFirstChild() != null && PsiMethodUtil.hasMainMethod(implicitClass)) {
return classes[0];
}
}
return aClass == null || !allowInterface && aClass.isInterface() ? null : aClass;
}
@@ -65,7 +65,9 @@ public class OverrideImplementExploreUtil {
PsiClass hisClass = method.getContainingClass();
if (hisClass == null) continue;
// filter non-immediate super constructors
if (method.isConstructor() && (!aClass.isInheritor(hisClass, false) || aClass instanceof PsiAnonymousClass || aClass.isEnum())) {
if (method.isConstructor() &&
(!aClass.isInheritor(hisClass, false) || aClass instanceof PsiAnonymousClass ||
aClass.isEnum() || aClass instanceof PsiImplicitClass)) {
continue;
}
// filter already implemented
@@ -0,0 +1,29 @@
public static void main(String[] args) {
}
@Override
public int hashCode() {
<selection><caret>return super.hashCode();</selection>
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return super.toString();
}
@Override
protected void finalize() throws Throwable {
super.finalize();
}
@@ -0,0 +1,5 @@
public static void main(String[] args) {
}
<caret>
@@ -12,6 +12,8 @@ import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiImplicitClass;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.PsiTestUtil;
@@ -53,6 +55,10 @@ public class OverrideImplementTest extends LightJavaCodeInsightFixtureTestCase {
doTest(false);
}
public void testOverrideForImplicitClass() {
doTest(false);
}
public void testImplementExtensionMethods() { doTest(true); }
public void testOverrideExtensionMethods() { doTest(false); }
@@ -528,7 +534,12 @@ public class OverrideImplementTest extends LightJavaCodeInsightFixtureTestCase {
private void invokeAction(boolean toImplement) {
int offset = myFixture.getEditor().getCaretModel().getOffset();
PsiClass psiClass = PsiTreeUtil.findElementOfClassAtOffset(myFixture.getFile(), offset, PsiClass.class, false);
PsiFile psiFile = myFixture.getFile();
PsiClass psiClass = PsiTreeUtil.findElementOfClassAtOffset(psiFile, offset, PsiClass.class, false);
if (psiFile instanceof PsiJavaFile javaFile && javaFile.getClasses().length == 1 &&
javaFile.getClasses()[0] instanceof PsiImplicitClass implicitClass) {
psiClass = implicitClass;
}
assertNotNull(psiClass);
OverrideImplementUtil.chooseAndOverrideOrImplementMethods(getProject(), myFixture.getEditor(), psiClass, toImplement);
NonBlockingReadActionImpl.waitForAsyncTaskCompletion();