1 package com.github.javaparser.ast.validator.chunks; 2 3 import com.github.javaparser.ast.NodeList; 4 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 5 import com.github.javaparser.ast.body.InitializerDeclaration; 6 import com.github.javaparser.ast.expr.*; 7 import com.github.javaparser.ast.validator.SimpleValidator; 8 import com.github.javaparser.ast.validator.SingleNodeTypeValidator; 9 import com.github.javaparser.ast.validator.TreeVisitorValidator; 10 import com.github.javaparser.ast.validator.Validators; 11 import com.github.javaparser.metamodel.NodeMetaModel; 12 import com.github.javaparser.metamodel.PropertyMetaModel; 13 14 import java.util.Optional; 15 16 /** 17 * Contains validations that are valid for every Java version. 18 */ 19 public class CommonValidators extends Validators { 20 public CommonValidators() { 21 super( 22 new SimpleValidator<>(ClassOrInterfaceDeclaration.class, 23 n -> !n.isInterface() && n.getExtendedTypes().size() > 1, 24 (n, reporter) -> reporter.report(n.getExtendedTypes(1), "A class cannot extend more than one other class.") 25 ), 26 new SimpleValidator<>(ClassOrInterfaceDeclaration.class, 27 n -> n.isInterface() && !n.getImplementedTypes().isEmpty(), 28 (n, reporter) -> reporter.report(n.getImplementedTypes(0), "An interface cannot implement other interfaces.") 29 ), 30 new SingleNodeTypeValidator<>(ClassOrInterfaceDeclaration.class, (n, reporter) -> { 31 if (n.isInterface()) { 32 n.getMembers().forEach(mem -> { 33 if (mem instanceof InitializerDeclaration) { 34 reporter.report(mem, "An interface cannot have initializers."); 35 } 36 }); 37 } 38 } 39 ), 40 new SingleNodeTypeValidator<>(AssignExpr.class, (n, reporter) -> { 41 // https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26 42 Expression target = n.getTarget(); 43 while (target instanceof EnclosedExpr) { 44 target = ((EnclosedExpr) target).getInner(); 45 } 46 if (target instanceof NameExpr 47 || target instanceof ArrayAccessExpr 48 || target instanceof FieldAccessExpr) { 49 return; 50 } 51 reporter.report(n.getTarget(), "Illegal left hand side of an assignment."); 52 } 53 ), 54 new TreeVisitorValidator((node, problemReporter) -> { 55 NodeMetaModel mm = node.getMetaModel(); 56 for (PropertyMetaModel ppm : mm.getAllPropertyMetaModels()) { 57 if (ppm.isNonEmpty()) { 58 if (ppm.isNodeList()) { 59 NodeList value = (NodeList) ppm.getValue(node); 60 if (value.isEmpty()) { 61 problemReporter.report(node, "%s.%s can not be empty.", mm.getTypeName(), ppm.getName()); 62 } 63 } 64 // No need to check empty strings, it should be impossible to set them to "" 65 } 66 } 67 }) 68 ); 69 } 70 } 71