diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java10Validator.java b/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java10Validator.java index b182e8db5d..42e5c61c8a 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java10Validator.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java10Validator.java @@ -1,14 +1,38 @@ package com.github.javaparser.ast.validator; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.VariableDeclarator; +import com.github.javaparser.ast.expr.VariableDeclarationExpr; +import com.github.javaparser.ast.stmt.ForStmt; +import com.github.javaparser.ast.stmt.ForeachStmt; import com.github.javaparser.ast.type.VarType; +import java.util.Optional; + /** * This validator validates according to Java 10 syntax rules. */ public class Java10Validator extends Java9Validator { protected final Validator varOnlyOnLocalVariableDefinitionAndFor = new SingleNodeTypeValidator<>(VarType.class, (n, reporter) -> { - // TODO issue 1407 + Optional variableDeclarator = n.findParent(VariableDeclarator.class); + if (!variableDeclarator.isPresent()) { + reporter.report(n, "\"var\" is not allowed here."); + return; + } + variableDeclarator.ifPresent(vd -> { + Optional container = vd.getParentNode(); + if (!container.isPresent()) { + reporter.report(n, "\"var\" is not allowed here."); + return; + } + container.ifPresent(c -> { + boolean positionIsFine = c instanceof ForStmt || c instanceof ForeachStmt || c instanceof VariableDeclarationExpr; + if (!positionIsFine) { + reporter.report(n, "\"var\" is not allowed here."); + } + }); + }); }); public Java10Validator() { diff --git a/javaparser-testing/src/test/java/com/github/javaparser/ast/validator/Java10ValidatorTest.java b/javaparser-testing/src/test/java/com/github/javaparser/ast/validator/Java10ValidatorTest.java new file mode 100644 index 0000000000..b4b3d038b9 --- /dev/null +++ b/javaparser-testing/src/test/java/com/github/javaparser/ast/validator/Java10ValidatorTest.java @@ -0,0 +1,56 @@ +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.CompilationUnit; +import com.github.javaparser.ast.stmt.Statement; +import org.junit.Test; + +import static com.github.javaparser.ParseStart.COMPILATION_UNIT; +import static com.github.javaparser.ParseStart.STATEMENT; +import static com.github.javaparser.ParserConfiguration.LanguageLevel.*; +import static com.github.javaparser.Providers.provider; +import static com.github.javaparser.ast.validator.Java1_1ValidatorTest.allModifiers; +import static com.github.javaparser.utils.TestUtils.assertNoProblems; +import static com.github.javaparser.utils.TestUtils.assertProblems; + +public class Java10ValidatorTest { + public static final JavaParser javaParser = new JavaParser(new ParserConfiguration().setLanguageLevel(JAVA_10_PREVIEW)); + + @Test + public void varAllowedInLocalVariableDeclaration() { + ParseResult result = javaParser.parse(STATEMENT, provider("var a = 5;")); + assertNoProblems(result); + } + + @Test + public void varAllowedInForEach() { + ParseResult result = javaParser.parse(STATEMENT, provider("for(var a : as){}")); + assertNoProblems(result); + } + + @Test + public void varAllowedInOldFor() { + ParseResult result = javaParser.parse(STATEMENT, provider("for(var a = 5;a<9;a++){}")); + assertNoProblems(result); + } + + @Test + public void varNotAllowedInCast() { + ParseResult result = javaParser.parse(STATEMENT, provider("int a = (var)20;")); + assertNoProblems(result); + } + + @Test + public void varNotAllowedInTypeArguments() { + ParseResult result = javaParser.parse(STATEMENT, provider("new X();")); + assertProblems(result, "(line 1,col 7) \"var\" is not allowed here."); + } + + @Test + public void varNotAllowedInLambdaParameters() { + ParseResult result = javaParser.parse(STATEMENT, provider("x((var x) -> null);")); + assertProblems(result, "(line 1,col 4) \"var\" is not allowed here."); + } +} diff --git a/javaparser-testing/src/test/java/com/github/javaparser/version/Java10PostProcessorTest.java b/javaparser-testing/src/test/java/com/github/javaparser/version/Java10PostProcessorTest.java index 87f7990a13..8747543bc9 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/version/Java10PostProcessorTest.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/version/Java10PostProcessorTest.java @@ -26,22 +26,4 @@ public void varIsAType() { assertEquals(1, allVarTypes.size()); } - - @Test - public void varAllowedInLocalVariableDeclaration() { - ParseResult result = javaParser.parse(STATEMENT, provider("var a = 5;")); - assertNoProblems(result); - } - - @Test - public void varAllowedInForEach() { - ParseResult result = javaParser.parse(STATEMENT, provider("for(var a : as){}")); - assertNoProblems(result); - } - - @Test - public void varAllowedInOldFor() { - ParseResult result = javaParser.parse(STATEMENT, provider("for(var a = 5;a<9;a++){}")); - assertNoProblems(result); - } }