Skip to content

Commit

Permalink
Add validation for switch statements and expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Feb 11, 2019
1 parent 62c49dd commit ccef967
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 34 deletions.
Expand Up @@ -10,6 +10,7 @@
import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_11;
import static com.github.javaparser.Providers.provider;
import static com.github.javaparser.utils.TestUtils.assertNoProblems;
import static com.github.javaparser.utils.TestUtils.assertProblems;

class Java11ValidatorTest {
public static final JavaParser javaParser = new JavaParser(new ParserConfiguration().setLanguageLevel(JAVA_11));
Expand All @@ -19,4 +20,22 @@ void varAllowedInLocalVariableDeclaration() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("x((var x, var y) -> x+y);"));
assertNoProblems(result);
}

@Test
void expressionsInLabelsNotAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case 3+4+5: ;}"));
assertProblems(result, "(line 1,col 11) Only 'int's, enums, and strings in switch statements are supported.");
}

@Test
void switchExpressionNotAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("int a = switch(x){};"));
assertProblems(result, "(line 1,col 9) Switch expressions are not supported.");
}

@Test
void multiLabelCaseNotAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case 3,4,5: ;}"));
assertProblems(result, "(line 1,col 11) Only one label allowed in a switch-case.");
}
}
@@ -1,23 +1,35 @@
package com.github.javaparser.ast.validator;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseResult;
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ast.stmt.Statement;
import org.junit.jupiter.api.Test;

import static com.github.javaparser.ParseStart.STATEMENT;
import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_12;
import static com.github.javaparser.Providers.provider;
import static com.github.javaparser.utils.TestUtils.assertNoProblems;
import static com.github.javaparser.utils.TestUtils.assertProblems;

class Java12ValidatorTest {
public static final JavaParser javaParser = new JavaParser(new ParserConfiguration().setLanguageLevel(JAVA_12));

@Test
void switchExpressionAllowed() {
void expressionsInLabelsNotAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case 3+4+5: ;}"));
assertNoProblems(result);
}

@Test
void newCaseAllowed() {
void switchExpressionNotAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("int a = switch(x){};"));
assertNoProblems(result);
}

@Test
void multilineStringAllowed() {
void multiLabelCaseAllowed() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case 3,4,5: ;}"));
assertNoProblems(result);
}
}
Expand Up @@ -67,4 +67,10 @@ void enumAllowedAsIdentifier() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("int enum;"));
assertNoProblems(result);
}

@Test
void noEnumInSwitch() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case GREEN: ;}"));
assertProblems(result, "(line 1,col 11) Only 'int's in switch statements are supported.");
}
}
Expand Up @@ -164,4 +164,10 @@ void enumAllowedAsIdentifier() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("int enum;"));
assertProblems(result, "(line 1,col 5) 'enum' cannot be used as an identifier as it is a keyword.");
}

@Test
void enumAllowedInSwitch() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case GREEN: ;}"));
assertNoProblems(result);
}
}
Expand Up @@ -19,7 +19,7 @@ class Java6ValidatorTest {
@Test
void noStringsInSwitch() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case \"abc\": ;}"));
assertProblems(result, "(line 1,col 11) Strings in switch statements are not supported.");
assertProblems(result, "(line 1,col 11) Only 'int's and enums in switch statements are supported.");
}

@Test
Expand Down
Expand Up @@ -58,25 +58,6 @@ public static String readTextResource(Class<?> relativeClass, String resourceNam
fail(e);
return null;
}
// try () {
// if (resourceAsStream == null) {
// fail("not found: " + relativeClass.getPackage().getName().replace(".", "/") + "/" + resourceName);
// }
//
//
// try (final InputStreamReader reader = new InputStreamReader(resourceAsStream, UTF_8);
// final BufferedReader br = new BufferedReader(reader)) {
// final StringBuilder builder = new StringBuilder();
// String line;
// while ((line = br.readLine()) != null) {
// builder.append(line).append(EOL);
// }
// return builder.toString();
// }
// } catch (IOException e) {
// fail(e);
// return null;
// }
}

public static void assertInstanceOf(Class<?> expectedType, Object instance) {
Expand Down
Expand Up @@ -7,5 +7,8 @@ public class Java12Validator extends Java11Validator {

public Java12Validator() {
super();
remove(intAndEnumAndStringSwitch);
remove(noSwitchExpressions);
remove(onlyOneLabelInSwitchCase);
}
}
Expand Up @@ -3,10 +3,7 @@
import com.github.javaparser.ast.ImportDeclaration;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.expr.ClassExpr;
import com.github.javaparser.ast.expr.LambdaExpr;
import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.modules.ModuleDeclaration;
import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments;
import com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters;
Expand Down Expand Up @@ -79,9 +76,13 @@ public class Java1_0Validator extends Validators {
ImportDeclaration::isStatic,
(n, reporter) -> reporter.report(n, "Static imports are not supported.")
);
final Validator noStringsInSwitch = new SimpleValidator<>(SwitchEntry.class,
n -> n.getLabels().stream().anyMatch(l -> l instanceof StringLiteralExpr),
(n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Strings in switch statements are not supported.")
final Validator intOnlySwitch = new SimpleValidator<>(SwitchEntry.class,
n -> !n.getLabels().stream().allMatch(l -> l instanceof IntegerLiteralExpr),
(n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Only 'int's in switch statements are supported.")
);
final Validator onlyOneLabelInSwitchCase = new SimpleValidator<>(SwitchEntry.class,
n -> n.getLabels().size() != 1,
(n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Only one label allowed in a switch-case.")
);
final Validator noBinaryIntegerLiterals = new NoBinaryIntegerLiteralsValidator();
final Validator noUnderscoresInIntegerLiterals = new NoUnderscoresInIntegerLiteralsValidator();
Expand All @@ -97,6 +98,10 @@ public class Java1_0Validator extends Validators {
n -> true,
(n, reporter) -> reporter.report(n, "Modules are not supported.")
);
final Validator noSwitchExpressions= new SimpleValidator<>(SwitchExpr.class,
n -> true,
(n, reporter) -> reporter.report(n, "Switch expressions are not supported.")
);

public Java1_0Validator() {
super(new CommonValidators());
Expand All @@ -111,11 +116,13 @@ public Java1_0Validator() {
add(noVarargs);
add(noForEach);
add(noStaticImports);
add(noStringsInSwitch);
add(intOnlySwitch);
add(onlyOneLabelInSwitchCase);
add(noBinaryIntegerLiterals);
add(noUnderscoresInIntegerLiterals);
add(noMultiCatch);
add(noLambdas);
add(noModules);
add(noSwitchExpressions);
}
}
@@ -1,11 +1,12 @@
package com.github.javaparser.ast.validator;

import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.expr.IntegerLiteralExpr;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments;
import com.github.javaparser.ast.stmt.ForEachStmt;
import com.github.javaparser.ast.stmt.SwitchEntry;
import com.github.javaparser.ast.type.PrimitiveType;
import com.github.javaparser.ast.type.Type;

Expand All @@ -24,7 +25,7 @@ public class Java5Validator extends Java1_4Validator {
}
});

final Validator noPrimitiveGenericArguments = new TreeVisitorValidator((node, reporter) -> {
protected final Validator noPrimitiveGenericArguments = new TreeVisitorValidator((node, reporter) -> {
if (node instanceof NodeWithTypeArguments) {
Optional<NodeList<Type>> typeArguments = ((NodeWithTypeArguments<? extends Node>) node).getTypeArguments();
typeArguments.ifPresent(types -> types.forEach(ty -> {
Expand All @@ -46,11 +47,18 @@ public class Java5Validator extends Java1_4Validator {
}
});

final Validator intAndEnumSwitch = new SimpleValidator<>(SwitchEntry.class,
n -> !n.getLabels().stream().allMatch(l -> l.isIntegerLiteralExpr() || l.isNameExpr()),
(n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Only 'int's and enums in switch statements are supported.")
);


final Validator enumNotAllowed = new ReservedKeywordValidator("enum");

public Java5Validator() {
super();
replace(noGenerics, genericsWithoutDiamondOperator);
replace(intOnlySwitch, intAndEnumSwitch);
add(noPrimitiveGenericArguments);
add(enumNotAllowed);
add(forEachStmt);
Expand Down
@@ -1,6 +1,7 @@
package com.github.javaparser.ast.validator;

import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.stmt.SwitchEntry;
import com.github.javaparser.ast.stmt.TryStmt;
import com.github.javaparser.ast.type.UnionType;

Expand All @@ -27,11 +28,16 @@ public class Java7Validator extends Java6Validator {
}
});

final Validator intAndEnumAndStringSwitch = new SimpleValidator<>(SwitchEntry.class,
n -> !n.getLabels().stream().allMatch(l -> l.isIntegerLiteralExpr() || l.isNameExpr() || l.isStringLiteralExpr()),
(n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Only 'int's, enums, and strings in switch statements are supported.")
);

public Java7Validator() {
super();
remove(genericsWithoutDiamondOperator);
replace(tryWithoutResources, tryWithLimitedResources);
remove(noStringsInSwitch);
replace(intAndEnumSwitch, intAndEnumAndStringSwitch);
remove(noBinaryIntegerLiterals);
remove(noUnderscoresInIntegerLiterals);
replace(noMultiCatch, multiCatch);
Expand Down

0 comments on commit ccef967

Please sign in to comment.