ThemisXAnalysisMod.java

/*
 * Themis: Java Project Framework
 * Copyright 2012-2026. Tony Washer
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.  You may obtain a copy
 * of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package io.github.tonywasher.joceanus.themis.xanalysis.parser.mod;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.modules.ModuleDeclaration;
import com.github.javaparser.ast.modules.ModuleExportsDirective;
import com.github.javaparser.ast.modules.ModuleOpensDirective;
import com.github.javaparser.ast.modules.ModuleProvidesDirective;
import com.github.javaparser.ast.modules.ModuleRequiresDirective;
import com.github.javaparser.ast.modules.ModuleUsesDirective;
import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
import io.github.tonywasher.joceanus.themis.xanalysis.parser.base.ThemisXAnalysisInstance.ThemisXAnalysisId;
import io.github.tonywasher.joceanus.themis.xanalysis.parser.base.ThemisXAnalysisParserDef;

import java.util.function.Predicate;

/**
 * Analysis Module.
 */
public enum ThemisXAnalysisMod
        implements ThemisXAnalysisId {
    /**
     * Exports.
     */
    EXPORTS(ModuleExportsDirective.class::isInstance),

    /**
     * Module.
     */
    MODULE(ModuleDeclaration.class::isInstance),

    /**
     * Opens.
     */
    OPENS(ModuleOpensDirective.class::isInstance),

    /**
     * Provides.
     */
    PROVIDES(ModuleProvidesDirective.class::isInstance),

    /**
     * Requires.
     */
    REQUIRES(ModuleRequiresDirective.class::isInstance),

    /**
     * Uses.
     */
    USES(ModuleUsesDirective.class::isInstance);

    /**
     * The test.
     */
    private final Predicate<Node> theTester;

    /**
     * Constructor.
     *
     * @param pTester the test method
     */
    ThemisXAnalysisMod(final Predicate<Node> pTester) {
        theTester = pTester;
    }

    /**
     * Determine type of module.
     *
     * @param pParser the parser
     * @param pMod    the module
     * @return the modType
     * @throws OceanusException on error
     */
    public static ThemisXAnalysisMod determineModule(final ThemisXAnalysisParserDef pParser,
                                                     final Node pMod) throws OceanusException {
        /* Loop testing each node type */
        for (ThemisXAnalysisMod myMod : values()) {
            if (myMod.theTester.test(pMod)) {
                return myMod;
            }
        }

        /* Unrecognised moduleType */
        throw pParser.buildException("Unexpected Module", pMod);
    }
}