Home | History | Annotate | Download | only in chunks
      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