Skip to content

Commit

Permalink
Move all movable validations from grammar to framework
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Mar 5, 2017
1 parent d3c9e35 commit 45bbaf5
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 66 deletions.
Expand Up @@ -35,8 +35,7 @@
import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.validator.DefaultValidator;
import com.github.javaparser.ast.validator.NoProblemsValidator;
import com.github.javaparser.ast.validator.BaseJavaValidator;
import com.github.javaparser.ast.validator.ProblemReporter;
import com.github.javaparser.ast.validator.Validator;
import com.github.javaparser.javadoc.Javadoc;
Expand Down Expand Up @@ -94,7 +93,7 @@ private GeneratedJavaParser getParserForProvider(Provider provider) {
* @deprecated use the other parse method.
*/
public <N extends Node> ParseResult<N> parse(ParseStart<N> start, Provider provider) {
return parse(start, provider, new DefaultValidator());
return parse(start, provider, new BaseJavaValidator());
}

/**
Expand Down Expand Up @@ -374,7 +373,7 @@ public static Statement parseStatement(final String statement) {
}

private static <T extends Node> T simplifiedParse(ParseStart<T> context, Provider provider) {
ParseResult<T> result = new JavaParser(new ParserConfiguration()).parse(context, provider, new DefaultValidator());
ParseResult<T> result = new JavaParser(new ParserConfiguration()).parse(context, provider, new BaseJavaValidator());
if (result.isSuccessful()) {
return result.getResult().get();
}
Expand Down
@@ -0,0 +1,83 @@
package com.github.javaparser.ast.validator;

import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.InitializerDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.stmt.TryStmt;

/**
* Contains validations that are valid for every Java version.
* Used by default by the static JavaParser methods.
*/
public class BaseJavaValidator extends Validators {
public BaseJavaValidator() {
super(
new VisitorValidator() {
@Override
public void visit(TryStmt n, ProblemReporter reporter) {
if (n.getCatchClauses().isEmpty()
&& n.getResources().isEmpty()
&& !n.getFinallyBlock().isPresent()) {
reporter.report("Try has no finally, no catch, and no resources", n);
}
}
},
new VisitorValidator() {
@Override
public void visit(ClassOrInterfaceDeclaration n, ProblemReporter reporter) {
if (!n.isInterface() && n.getExtendedTypes().size() > 1) {
reporter.report("A class cannot extend more than one other class", n.getExtendedTypes(1));
}
}
},
new VisitorValidator() {
@Override
public void visit(ClassOrInterfaceDeclaration n, ProblemReporter reporter) {
if (n.isInterface() && !n.getImplementedTypes().isEmpty()) {
reporter.report("An interface cannot implement other interfaces", n.getImplementedTypes(0));
}
}
},
new VisitorValidator() {
@Override
public void visit(ClassOrInterfaceDeclaration n, ProblemReporter reporter) {
if (n.isInterface()) {
new VisitorValidator() {
public void visit(InitializerDeclaration n, ProblemReporter reporter1) {
reporter.report("An interface cannot have initializers", n);
}
}.validate(n, reporter);
}
}
},
new VisitorValidator() {
@Override
public void visit(ClassOrInterfaceDeclaration n, ProblemReporter reporter) {
if (n.isInterface()) {
new VisitorValidator() {
public void visit(MethodDeclaration n, ProblemReporter reporter1) {
if (n.isDefault() && !n.getBody().isPresent()) {
reporter.report("\"default\" methods must have a body", n);
}
}
}.validate(n, reporter);
}
}
},
new VisitorValidator() {
@Override
public void visit(ClassOrInterfaceDeclaration n, ProblemReporter reporter) {
if (!n.isInterface()) {
new VisitorValidator() {
public void visit(MethodDeclaration n, ProblemReporter reporter1) {
if (n.isDefault()) {
reporter.report("A class cannot have default members", n);
}
}
}.validate(n, reporter);
}
}
}
);
}
}

This file was deleted.

21 changes: 3 additions & 18 deletions javaparser-core/src/main/javacc/java.jj
Expand Up @@ -1601,22 +1601,11 @@ BodyDeclaration<?> ClassOrInterfaceBodyDeclaration(boolean isInterface):
(
LOOKAHEAD(2)
ret = InitializerDeclaration()
{
if (isInterface)
addProblem("An interface cannot have initializers");
}
|
modifier = Modifiers() [ "default" modifier2= Modifiers()
{
if(!isInterface)
{
addProblem("A class cannot have default members");
}
isDefault = true;
}]
// Just get all the modifiers out of the way. If you want to do
// more checks, pass the modifiers down to the member
modifier = Modifiers() [ "default" modifier2= Modifiers() { isDefault = true; }]

// Just get all the modifiers out of the way. If you want to do
// more checks, pass the modifiers down to the member
(
ret = ClassOrInterfaceDeclaration(modifier)
|
Expand All @@ -1632,10 +1621,6 @@ BodyDeclaration<?> ClassOrInterfaceBodyDeclaration(boolean isInterface):
|
ret = MethodDeclaration(modifier)
{
if(isDefault && ret!= null && ((MethodDeclaration)ret).getBody() == null)
{
addProblem("\"default\" methods must have a body");
}
((MethodDeclaration)ret).setDefault(isDefault);
if(modifier2!= null)
{
Expand Down
Expand Up @@ -11,23 +11,41 @@
import static com.github.javaparser.Providers.provider;
import static org.junit.Assert.assertEquals;

public class DefaultValidatorTest {
public class BaseJavaValidatorTest {
@Test
public void tryWithoutAnything() {
ParseResult<Statement> result = new JavaParser().parse(STATEMENT, provider("try{}"), new DefaultValidator());
ParseResult<Statement> result = new JavaParser().parse(STATEMENT, provider("try{}"), new BaseJavaValidator());
assertEquals("[(line 1,col 1) Try has no finally, no catch, and no resources]", result.getProblems().toString());
}

@Test
public void classExtendingMoreThanOne() {
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("class X extends Y, Z {}"), new DefaultValidator());
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("class X extends Y, Z {}"), new BaseJavaValidator());
assertEquals("[(line 1,col 20) A class cannot extend more than one other class]", result.getProblems().toString());
}

@Test
public void interfaceUsingImplements() {
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("interface X implements Y {}"), new DefaultValidator());
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("interface X implements Y {}"), new BaseJavaValidator());
assertEquals("[(line 1,col 24) An interface cannot implement other interfaces]", result.getProblems().toString());
}

@Test
public void interfaceWithInitializer() {
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("interface X {{}}"), new BaseJavaValidator());
assertEquals("[(line 1,col 14) An interface cannot have initializers]", result.getProblems().toString());
}

@Test
public void defaultMethodWithoutBody() {
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("interface X {default void a();}"), new BaseJavaValidator());
assertEquals("[(line 1,col 22) \"default\" methods must have a body]", result.getProblems().toString());
}

@Test
public void defaultInClass() {
ParseResult<CompilationUnit> result = new JavaParser().parse(COMPILATION_UNIT, provider("class X {default void a(){};}"), new BaseJavaValidator());
assertEquals("[(line 1,col 18) A class cannot have default members]", result.getProblems().toString());
}

}

0 comments on commit 45bbaf5

Please sign in to comment.