MemberModel: fixed case when there is more than one member out of class (IJ-CR-6471)

GitOrigin-RevId: f84b1e8acee891a84ab637ad7fc48492674e5468
This commit is contained in:
Artemiy Sartakov
2021-05-27 11:39:18 +07:00
committed by intellij-monorepo-bot
parent 5b3be771e8
commit 88b4660169
5 changed files with 37 additions and 2 deletions

View File

@@ -35,6 +35,7 @@ public class MemberModel {
}
public static @Nullable MemberModel create(@NotNull PsiErrorElement errorElement) {
if (hasClassesWithUnclosedBraces(errorElement.getContainingFile())) return null;
List<PsiElement> children = new ArrayList<>();
PsiElement prevSibling = errorElement.getPrevSibling();
while (isMemberPart(prevSibling)) {
@@ -43,6 +44,7 @@ public class MemberModel {
}
else {
children.add(prevSibling);
if (prevSibling instanceof PsiField || prevSibling instanceof PsiMethod) break;
}
prevSibling = prevSibling.getPrevSibling();
}
@@ -50,6 +52,11 @@ public class MemberModel {
Collections.addAll(children, errorElement.getChildren());
return new MemberParser(ContainerUtil.filter(children, c -> !isWsOrComment(c))).parse();
}
private static boolean hasClassesWithUnclosedBraces(@Nullable PsiFile psiFile) {
PsiJavaFile javaFile = tryCast(psiFile, PsiJavaFile.class);
return javaFile == null || ContainerUtil.exists(javaFile.getClasses(), c -> c.getRBrace() == null);
}
private static boolean isWsOrComment(@NotNull PsiElement psiElement) {
return psiElement instanceof PsiWhiteSpace || psiElement instanceof PsiComment;

View File

@@ -56,7 +56,9 @@ public class MoveMemberIntoClassFix extends LocalQuickFixAndIntentionActionOnPsi
documentManager.commitDocument(document);
psiClass = classPtr.getElement();
if (psiClass == null) return;
psiClass.add(member);
PsiElement rBrace = psiClass.getRBrace();
if (rBrace == null) return;
psiClass.addBefore(member, rBrace);
}
@Override

View File

@@ -50,7 +50,7 @@ class D {
}
interface IllegalMods {
void m1()<error descr="'{' or ';' expected"> </error>default<error descr="Identifier or type expected">;</error> <error descr="Not allowed in interface">{ }</error>
<error descr="Class member declared outside of a class">void m1()</error><error descr="'{' or ';' expected"> </error>default<error descr="Identifier or type expected">;</error> <error descr="Not allowed in interface">{ }</error>
<error descr="Static methods in interfaces should have a body">static void m2()</error>;
<error descr="Illegal combination of modifiers: 'static' and 'default'">static</error> <error descr="Illegal combination of modifiers: 'default' and 'static'">default</error> void m3() { }

View File

@@ -0,0 +1,13 @@
// "Move member into class" "true"
class beforeTwoMethods {
void bar() {
}
}
void bar() {
}

View File

@@ -0,0 +1,13 @@
// "Move member into class" "true"
class beforeTwoMethods {
}
void bar() {
}
void bar<caret>() {
}