jaroslav@432: /** jaroslav@432: * Back 2 Browser Bytecode Translator jaroslav@432: * Copyright (C) 2012 Jaroslav Tulach jaroslav@432: * jaroslav@432: * This program is free software: you can redistribute it and/or modify jaroslav@432: * it under the terms of the GNU General Public License as published by jaroslav@432: * the Free Software Foundation, version 2 of the License. jaroslav@432: * jaroslav@432: * This program is distributed in the hope that it will be useful, jaroslav@432: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@432: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@432: * GNU General Public License for more details. jaroslav@432: * jaroslav@432: * You should have received a copy of the GNU General Public License jaroslav@432: * along with this program. Look for COPYING file in the top folder. jaroslav@432: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@432: */ jaroslav@432: package org.apidesign.bck2brwsr.core.impl; jaroslav@432: jaroslav@432: import java.util.Collections; jaroslav@432: import java.util.HashSet; jaroslav@432: import java.util.List; jaroslav@432: import java.util.Set; jaroslav@432: import javax.annotation.processing.AbstractProcessor; jaroslav@432: import javax.annotation.processing.Completion; jaroslav@432: import javax.annotation.processing.Completions; jaroslav@757: import javax.annotation.processing.Messager; jaroslav@432: import javax.annotation.processing.Processor; jaroslav@432: import javax.annotation.processing.RoundEnvironment; jaroslav@432: import javax.lang.model.element.AnnotationMirror; jaroslav@432: import javax.lang.model.element.Element; jaroslav@432: import javax.lang.model.element.ElementKind; jaroslav@432: import javax.lang.model.element.ExecutableElement; jaroslav@432: import javax.lang.model.element.TypeElement; jaroslav@432: import javax.lang.model.element.VariableElement; jaroslav@757: import javax.lang.model.type.TypeKind; jaroslav@432: import javax.tools.Diagnostic; jaroslav@432: import org.apidesign.bck2brwsr.core.JavaScriptBody; jaroslav@432: import org.openide.util.lookup.ServiceProvider; jaroslav@432: jaroslav@432: /** jaroslav@432: * jaroslav@432: * @author Jaroslav Tulach jaroslav@432: */ jaroslav@432: @ServiceProvider(service = Processor.class) jaroslav@432: public final class JavaScriptProcesor extends AbstractProcessor { jaroslav@432: @Override jaroslav@432: public Set getSupportedAnnotationTypes() { jaroslav@432: Set set = new HashSet<>(); jaroslav@432: set.add(JavaScriptBody.class.getName()); jaroslav@432: return set; jaroslav@432: } jaroslav@432: jaroslav@432: @Override jaroslav@432: public boolean process(Set annotations, RoundEnvironment roundEnv) { jaroslav@757: final Messager msg = processingEnv.getMessager(); jaroslav@432: for (Element e : roundEnv.getElementsAnnotatedWith(JavaScriptBody.class)) { jaroslav@443: if (e.getKind() != ElementKind.METHOD && e.getKind() != ElementKind.CONSTRUCTOR) { jaroslav@432: continue; jaroslav@432: } jaroslav@432: ExecutableElement ee = (ExecutableElement)e; jaroslav@432: List params = ee.getParameters(); jaroslav@432: jaroslav@432: JavaScriptBody jsb = e.getAnnotation(JavaScriptBody.class); jaroslav@575: if (jsb == null) { jaroslav@575: continue; jaroslav@575: } jaroslav@432: String[] arr = jsb.args(); jaroslav@443: if (params.size() != arr.length) { jaroslav@757: msg.printMessage(Diagnostic.Kind.ERROR, "Number of args arguments does not match real arguments!", e); jaroslav@757: } jaroslav@757: if (ee.getReturnType().getKind() == TypeKind.LONG) { jaroslav@757: msg.printMessage(Diagnostic.Kind.WARNING, "Don't return long. Return double and convert it to long in Java code.", e); jaroslav@432: } jaroslav@432: } jaroslav@432: return true; jaroslav@432: } jaroslav@432: jaroslav@432: @Override jaroslav@432: public Iterable getCompletions(Element e, jaroslav@432: AnnotationMirror annotation, ExecutableElement member, String userText jaroslav@432: ) { jaroslav@432: StringBuilder sb = new StringBuilder(); jaroslav@432: if (e.getKind() == ElementKind.METHOD && member.getSimpleName().contentEquals("args")) { jaroslav@432: ExecutableElement ee = (ExecutableElement) e; jaroslav@443: String sep = ""; jaroslav@443: sb.append("{ "); jaroslav@432: for (VariableElement ve : ee.getParameters()) { jaroslav@432: sb.append(sep).append('"').append(ve.getSimpleName()) jaroslav@432: .append('"'); jaroslav@432: sep = ", "; jaroslav@432: } jaroslav@432: sb.append(" }"); jaroslav@432: return Collections.nCopies(1, Completions.of(sb.toString())); jaroslav@432: } jaroslav@432: return null; jaroslav@432: } jaroslav@432: jaroslav@432: jaroslav@432: }