core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 12:58:12 +0100
branchemul
changeset 694 0d277415ed02
parent 443 9359b006782b
child 757 70ff060e1674
permissions -rw-r--r--
Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
jaroslav@432
     1
/**
jaroslav@432
     2
 * Back 2 Browser Bytecode Translator
jaroslav@432
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@432
     4
 *
jaroslav@432
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@432
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@432
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@432
     8
 *
jaroslav@432
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@432
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@432
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@432
    12
 * GNU General Public License for more details.
jaroslav@432
    13
 *
jaroslav@432
    14
 * You should have received a copy of the GNU General Public License
jaroslav@432
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@432
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@432
    17
 */
jaroslav@432
    18
package org.apidesign.bck2brwsr.core.impl;
jaroslav@432
    19
jaroslav@432
    20
import java.util.Collections;
jaroslav@432
    21
import java.util.HashSet;
jaroslav@432
    22
import java.util.List;
jaroslav@432
    23
import java.util.Set;
jaroslav@432
    24
import javax.annotation.processing.AbstractProcessor;
jaroslav@432
    25
import javax.annotation.processing.Completion;
jaroslav@432
    26
import javax.annotation.processing.Completions;
jaroslav@432
    27
import javax.annotation.processing.Processor;
jaroslav@432
    28
import javax.annotation.processing.RoundEnvironment;
jaroslav@432
    29
import javax.lang.model.element.AnnotationMirror;
jaroslav@432
    30
import javax.lang.model.element.Element;
jaroslav@432
    31
import javax.lang.model.element.ElementKind;
jaroslav@432
    32
import javax.lang.model.element.ExecutableElement;
jaroslav@432
    33
import javax.lang.model.element.TypeElement;
jaroslav@432
    34
import javax.lang.model.element.VariableElement;
jaroslav@432
    35
import javax.tools.Diagnostic;
jaroslav@432
    36
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@432
    37
import org.openide.util.lookup.ServiceProvider;
jaroslav@432
    38
jaroslav@432
    39
/**
jaroslav@432
    40
 *
jaroslav@432
    41
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@432
    42
 */
jaroslav@432
    43
@ServiceProvider(service = Processor.class)
jaroslav@432
    44
public final class JavaScriptProcesor extends AbstractProcessor {
jaroslav@432
    45
    @Override
jaroslav@432
    46
    public Set<String> getSupportedAnnotationTypes() {
jaroslav@432
    47
        Set<String> set = new HashSet<>();
jaroslav@432
    48
        set.add(JavaScriptBody.class.getName());
jaroslav@432
    49
        return set;
jaroslav@432
    50
    }
jaroslav@432
    51
    
jaroslav@432
    52
    @Override
jaroslav@432
    53
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
jaroslav@432
    54
        for (Element e : roundEnv.getElementsAnnotatedWith(JavaScriptBody.class)) {
jaroslav@443
    55
            if (e.getKind() != ElementKind.METHOD && e.getKind() != ElementKind.CONSTRUCTOR) {
jaroslav@432
    56
                continue;
jaroslav@432
    57
            }
jaroslav@432
    58
            ExecutableElement ee = (ExecutableElement)e;
jaroslav@432
    59
            List<? extends VariableElement> params = ee.getParameters();
jaroslav@432
    60
            
jaroslav@432
    61
            JavaScriptBody jsb = e.getAnnotation(JavaScriptBody.class);
jaroslav@575
    62
            if (jsb == null) {
jaroslav@575
    63
                continue;
jaroslav@575
    64
            }
jaroslav@432
    65
            String[] arr = jsb.args();
jaroslav@443
    66
            if (params.size() != arr.length) {
jaroslav@432
    67
                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Number of args arguments does not match real arguments!", e);
jaroslav@432
    68
            }
jaroslav@432
    69
        }
jaroslav@432
    70
        return true;
jaroslav@432
    71
    }
jaroslav@432
    72
jaroslav@432
    73
    @Override
jaroslav@432
    74
    public Iterable<? extends Completion> getCompletions(Element e, 
jaroslav@432
    75
        AnnotationMirror annotation, ExecutableElement member, String userText
jaroslav@432
    76
    ) {
jaroslav@432
    77
        StringBuilder sb = new StringBuilder();
jaroslav@432
    78
        if (e.getKind() == ElementKind.METHOD && member.getSimpleName().contentEquals("args")) {
jaroslav@432
    79
            ExecutableElement ee = (ExecutableElement) e;
jaroslav@443
    80
            String sep = "";
jaroslav@443
    81
            sb.append("{ ");
jaroslav@432
    82
            for (VariableElement ve : ee.getParameters()) {
jaroslav@432
    83
                sb.append(sep).append('"').append(ve.getSimpleName())
jaroslav@432
    84
                    .append('"');
jaroslav@432
    85
                sep = ", ";
jaroslav@432
    86
            }
jaroslav@432
    87
            sb.append(" }");
jaroslav@432
    88
            return Collections.nCopies(1, Completions.of(sb.toString()));
jaroslav@432
    89
        }
jaroslav@432
    90
        return null;
jaroslav@432
    91
    }
jaroslav@432
    92
jaroslav@432
    93
    
jaroslav@432
    94
}