SourceCodeCheckExperiment.java

/*
 * Copyright (c) 2021 Mārtiņš Avots (Martins Avots) and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the MIT License,
 * which is available at https://spdx.org/licenses/MIT.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR MIT
 */
package net.splitcells.dem.source.code;

import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.ImportDeclaration;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.PackageDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.type.Type;
import com.github.javaparser.ast.validator.*;
import com.github.javaparser.ast.visitor.TreeVisitor;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;

import java.io.IOException;
import java.nio.file.Paths;

import static net.splitcells.dem.utils.NotImplementedYet.notImplementedYet;
import static net.splitcells.dem.utils.reflection.ClassesRelated.downCast;

public class SourceCodeCheckExperiment {
    public static void main(String... args) throws IOException {
        final var typeSolver = new CombinedTypeSolver();
        typeSolver.add(new JavaParserTypeSolver(Paths.get("./src/main/java")));
        final var symbolSolver = new JavaSymbolSolver(typeSolver);
        StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);
        // TODO REMOVE When #10 Is one.
        StaticJavaParser.getConfiguration().getPostProcessors().add(new TreeVisitorValidator(new Validator() {
            @Override
            public void accept(Node node, ProblemReporter problemReporter) {
                System.out.println(node.getClass());
                final var accepted = downCast(CompilationUnit.class, node).map(cu -> {
                    if (cu.getComment().isEmpty()) {
                        throw notImplementedYet();
                    }
                    cu.getChildNodes().forEach(c -> {
                        if (downCast(PackageDeclaration.class, c).isPresent()
                                || downCast(ImportDeclaration.class, c).isPresent()
                                || downCast(ClassOrInterfaceDeclaration.class, c).isPresent()) {
                            return;
                        }
                        throw new IllegalArgumentException(c.getClass().toString());
                    });
                    return true;
                }).orElse(false);
                if (accepted) {
                    return;
                }
                throw new IllegalArgumentException(node.getClass().toString());
            }
        }).postProcessor());
        CompilationUnit cu = StaticJavaParser.parse(Paths.get("./src/main/java/net/splitcells/dem/Dem.java"));
        System.out.println(cu);
    }
}