MemberModel: do not suggest moving into class if there's enclosing class present (IDEA-274893)

GitOrigin-RevId: 8800ed4e42320a3df002be58955a8a02f6149c17
This commit is contained in:
Artemiy Sartakov
2021-08-04 18:05:29 +07:00
committed by intellij-monorepo-bot
parent 358420d1ea
commit fb9bddf05c
3 changed files with 35 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
@@ -35,7 +36,7 @@ public class MemberModel {
}
public static @Nullable MemberModel create(@NotNull PsiErrorElement errorElement) {
if (hasClassesWithUnclosedBraces(errorElement.getContainingFile())) return null;
if (inClass(errorElement) || hasClassesWithUnclosedBraces(errorElement.getContainingFile())) return null;
List<PsiElement> children = new ArrayList<>();
PsiElement prevSibling = errorElement.getPrevSibling();
while (isMemberPart(prevSibling)) {
@@ -52,7 +53,19 @@ public class MemberModel {
Collections.addAll(children, errorElement.getChildren());
return new MemberParser(ContainerUtil.filter(children, c -> !isWsOrComment(c))).parse();
}
private static boolean inClass(@NotNull PsiErrorElement psiErrorElement) {
PsiClass psiClass = PsiTreeUtil.getParentOfType(psiErrorElement, PsiClass.class);
if (psiClass == null) return false;
PsiElement lBrace = psiClass.getLBrace();
if (lBrace == null) return true;
PsiElement rBrace = psiClass.getRBrace();
if (rBrace == null) return true;
TextRange errorRange = psiErrorElement.getTextRange();
return lBrace.getTextOffset() <= errorRange.getStartOffset() &&
rBrace.getTextOffset() + 1 >= errorRange.getEndOffset();
}
private static boolean hasClassesWithUnclosedBraces(@Nullable PsiFile psiFile) {
PsiJavaFile javaFile = tryCast(psiFile, PsiJavaFile.class);
return javaFile == null || ContainerUtil.exists(javaFile.getClasses(), c -> c.getRBrace() == null);

View File

@@ -50,7 +50,7 @@ class D {
}
interface IllegalMods {
<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>
void m1()<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,19 @@
// "Move member into class" "false"
public class beforeIncompleteMethodInClass {
private String testInt;
public beforeIncompleteMethodInClass(int testInt) {
this.testInt = "aaaa";
}
public String getTestInt() {
return testInt;
}
public void setTestInt(String testInt) {
this.testInt = testInt;
}
public<caret>
}