[java] highlighting for incorrect first statement in switch (IDEA-148514)

This commit is contained in:
Roman Shevchenko
2015-11-30 18:48:32 +01:00
parent 2c2b27fc5d
commit a1f7aa76fb
3 changed files with 35 additions and 33 deletions
@@ -2438,14 +2438,16 @@ public class HighlightUtil extends HighlightUtilBase {
@Nullable
static HighlightInfo checkStatementPrependedWithCaseInsideSwitch(@NotNull PsiStatement statement) {
if (!(statement instanceof PsiSwitchLabelStatement) && statement.getParent() instanceof PsiCodeBlock &&
statement.getParent().getParent() instanceof PsiSwitchStatement &&
((PsiCodeBlock)statement.getParent()).getStatements().length != 0 &&
statement == ((PsiCodeBlock)statement.getParent()).getStatements()[0]) {
String description = JavaErrorMessages.message("statement.must.be.prepended.with.case.label");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create();
static HighlightInfo checkStatementPrependedWithCaseInsideSwitch(@NotNull PsiSwitchStatement statement) {
PsiCodeBlock body = statement.getBody();
if (body != null) {
PsiElement first = PsiTreeUtil.skipSiblingsForward(body.getLBrace(), PsiWhiteSpace.class, PsiComment.class);
if (first != null && !(first instanceof PsiSwitchLabelStatement) && !PsiUtil.isJavaToken(first, JavaTokenType.RBRACE)) {
String description = JavaErrorMessages.message("statement.must.be.prepended.with.case.label");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(first).descriptionAndTooltip(description).create();
}
}
return null;
}
@@ -1437,7 +1437,6 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
public void visitStatement(PsiStatement statement) {
super.visitStatement(statement);
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkNotAStatement(statement));
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkStatementPrependedWithCaseInsideSwitch(statement));
}
@Override
@@ -1455,6 +1454,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
@Override
public void visitSwitchStatement(PsiSwitchStatement statement) {
super.visitSwitchStatement(statement);
myHolder.add(HighlightUtil.checkStatementPrependedWithCaseInsideSwitch(statement));
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkSwitchSelectorType(statement, myLanguageLevel));
}
@@ -1,35 +1,35 @@
// switch statement
class a {
void m() {
{
<error descr="Case statement outside switch">case 0:</error>
}
{
<error descr="Case statement outside switch">default:</error>
<error descr="Case statement outside switch">case 0:</error>
}
{
switch (0) {
case 0<error descr="':' expected">;</error>
}
switch (0) {
default<error descr="':' expected">;</error>
}
switch (0) {
////////////////
/**
*/
<error descr="Statement must be prepended with case label">System.out.println();</error>
default<error descr="':' expected">;</error>
}
switch (0) {
<error descr="Statement must be prepended with case label">break;</error>
}
<error descr="Case statement outside switch">default:</error>
}
switch (0) {
case 0<error descr="':' expected">;</error>
}
switch (0) {
default<error descr="':' expected">;</error>
}
switch (0) {
////////////////
/** */
<error descr="Statement must be prepended with case label">System.out.println();</error>
}
switch (0) {
<error descr="Statement must be prepended with case label">break;</error>
}
switch (0) {
<error descr="Statement must be prepended with case label">return;</error>
}
}
}