Skip to content

Commit

Permalink
* Set Java 8 as default validation level
Browse files Browse the repository at this point in the history
* Add Java 9 validators with one more validation than Java 8: _ as identifier is invalid
* Sort Problems by beginposition
  • Loading branch information
matozoid committed Mar 13, 2017
1 parent 48e35b4 commit eb5b744
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 3 deletions.
Expand Up @@ -44,6 +44,7 @@
import java.util.TreeSet;

import static com.github.javaparser.ParseStart.*;
import static com.github.javaparser.Problem.PROBLEM_BY_BEGIN_POSITION;
import static com.github.javaparser.Providers.*;
import static com.github.javaparser.Range.range;
import static com.github.javaparser.utils.Utils.assertNotNull;
Expand Down Expand Up @@ -126,6 +127,7 @@ public <N extends Node> ParseResult<N> parse(ParseStart<N> start, Provider provi
}

configuration.getValidator().validate(resultNode, new ProblemReporter(parser.problems));
parser.problems.sort(PROBLEM_BY_BEGIN_POSITION);

return new ParseResult<>(resultNode, parser.problems, parser.getTokens(),
parser.getCommentsCollection());
Expand Down
Expand Up @@ -22,6 +22,7 @@
package com.github.javaparser;

import com.github.javaparser.ast.validator.BaseJavaValidator;
import com.github.javaparser.ast.validator.Java8Validator;
import com.github.javaparser.ast.validator.Validator;

import static com.github.javaparser.utils.Utils.assertNotNull;
Expand All @@ -36,7 +37,7 @@ public class ParserConfiguration {
private boolean doNotAssignCommentsPrecedingEmptyLines = true;
private boolean doNotConsiderAnnotationsAsNodeStartForCodeAttribution = false;
private int tabSize = 1;
private Validator validator = new BaseJavaValidator();
private Validator validator = new Java8Validator();

public boolean isAttributeComments() {
return attributeComments;
Expand Down
19 changes: 19 additions & 0 deletions javaparser-core/src/main/java/com/github/javaparser/Problem.java
Expand Up @@ -21,6 +21,7 @@

package com.github.javaparser;

import java.util.Comparator;
import java.util.Optional;

import static com.github.javaparser.utils.Utils.EOL;
Expand Down Expand Up @@ -92,4 +93,22 @@ public Optional<Range> getRange() {
public Optional<Throwable> getCause() {
return Optional.ofNullable(cause);
}

/**
* Sorts problems on position.
*/
public static Comparator<Problem> PROBLEM_BY_BEGIN_POSITION = (a, b) -> {
if (a.getLocation().isPresent() && b.getLocation().isPresent()) {
return a.getLocation().get().begin.compareTo(b.getLocation().get().begin);
}
if (a.getLocation().isPresent() || b.getLocation().isPresent()) {
if (a.getLocation().isPresent()) {
return 1;
}
return -1;
}
return 0;
};


}
Expand Up @@ -108,7 +108,7 @@ public enum ObserverRegistrationMode {
/**
* This can be used to sort nodes on position.
*/
public static Comparator<Node> NODE_BY_BEGIN_POSITION = (a, b) -> {
public static Comparator<NodeWithRange<?>> NODE_BY_BEGIN_POSITION = (a, b) -> {
if (a.getRange().isPresent() && b.getRange().isPresent()) {
return a.getRange().get().begin.compareTo(b.getRange().get().begin);
}
Expand Down
Expand Up @@ -51,5 +51,4 @@ default boolean isPositionedAfter(Position position) {
default boolean isPositionedBefore(Position position) {
return getRange().map(r -> r.isBefore(position)).orElse(false);
}

}
@@ -0,0 +1,12 @@
package com.github.javaparser.ast.validator;

/**
* This validator validates according to Java 8 syntax rules.
*/
public class Java8Validator extends Validators {
public Java8Validator() {
super(
new BaseJavaValidator()
);
}
}
@@ -0,0 +1,35 @@
package com.github.javaparser.ast.validator;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.SimpleName;

/**
* This validator validates according to Java 9 syntax rules.
*/
public class Java9Validator extends Validators {
public Java9Validator() {
super(
new BaseJavaValidator(),
new VisitorValidator() {
@Override
public void visit(Name n, ProblemReporter arg) {
validateIdentifier(n, n.getIdentifier(), arg);
super.visit(n, arg);
}

@Override
public void visit(SimpleName n, ProblemReporter arg) {
validateIdentifier(n, n.getIdentifier(), arg);
super.visit(n, arg);
}
}
);
}

private static void validateIdentifier(Node n, String id, ProblemReporter arg) {
if (id.equals("_")) {
arg.report(n, "'_' is a reserved keyword.");
}
}
}
@@ -0,0 +1,5 @@
package com.github.javaparser.ast.validator;

public class Java8ValidatorTest {
// Everything is tested in BaseValidatorTest
}
@@ -0,0 +1,26 @@
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.Test;

import static com.github.javaparser.ParseStart.STATEMENT;
import static com.github.javaparser.Providers.provider;
import static com.github.javaparser.utils.TestUtils.assertProblems;

public class Java9ValidatorTest {
private final JavaParser parser = new JavaParser(new ParserConfiguration().setValidator(new Java9Validator()));

@Test
public void tryUnderscoreIdentifiers() {
ParseResult<Statement> result = parser.parse(STATEMENT, provider("a.b._.c.d = act(_, _ -> _);"));
assertProblems(result,
"(line 1,col 5) '_' is a reserved keyword.",
"(line 1,col 17) '_' is a reserved keyword.",
"(line 1,col 20) '_' is a reserved keyword.",
"(line 1,col 25) '_' is a reserved keyword."
);
}
}

0 comments on commit eb5b744

Please sign in to comment.