All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.freedesktop.jaccall.compiletime.CheckWellFormedLib Maven / Gradle / Ivy

The newest version!
package org.freedesktop.jaccall.compiletime;

import org.freedesktop.jaccall.Symbol;

import javax.annotation.processing.Messager;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
import javax.tools.Diagnostic;

final class CheckWellFormedLib {

    private final Messager messager;
    private       boolean  error;

    CheckWellFormedLib(final Messager messager) {
        this.messager = messager;
    }

    public boolean hasErrors(final TypeElement typeElement) {

        isClass(typeElement);
        isNotNested(typeElement);

        final MethodValidator methodValidator = new MethodValidator(this.messager);

        for (final ExecutableElement executableElement : ElementFilter.methodsIn(typeElement.getEnclosedElements())) {

            boolean symbol = false;
            for (final AnnotationMirror annotationMirror : executableElement.getAnnotationMirrors()) {
                if (annotationMirror.getAnnotationType()
                                    .asElement()
                                    .getSimpleName()
                                    .toString()
                                    .equals(Symbol.class.getSimpleName())) {
                    symbol = true;
                    break;
                }
            }

            //validate as C symbol
            if (symbol) {
                methodValidator.validateSymbol(executableElement);
            }
            else {
                //validate as C method
                methodValidator.validateIfNative(executableElement);
            }
        }

        this.error |= methodValidator.errorRaised();

        return this.error;
    }

    private void raiseError() {
        this.error |= true;
    }

    private void isNotNested(final TypeElement typeElement) {
        if (!typeElement.getEnclosingElement()
                        .getKind()
                        .equals(ElementKind.PACKAGE) || typeElement.getNestingKind()
                                                                   .isNested()) {
            this.messager.printMessage(Diagnostic.Kind.ERROR,
                                       "@Lib annotation should be placed on top level class types only.",
                                       typeElement);
            raiseError();
        }
    }

    private void isClass(final TypeElement typeElement) {
        if (!typeElement.getKind()
                        .equals(ElementKind.CLASS)) {
            this.messager.printMessage(Diagnostic.Kind.ERROR,
                                       "@Lib annotation should be placed on class type only.",
                                       typeElement);
            raiseError();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy