vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 25 Sep 2012 17:30:13 +0200
branchstrings
changeset 34 6fcc0dfbe324
parent 29 dcb98731b000
child 35 7cfa9b56f888
permissions -rw-r--r--
Initial tests to try to support strings
     1 package org.apidesign.vm4brwsr;
     2 
     3 import java.io.BufferedWriter;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.Writer;
     8 import java.util.Arrays;
     9 import java.util.HashSet;
    10 import java.util.LinkedList;
    11 import java.util.List;
    12 import java.util.Set;
    13 
    14 /** Generator of JavaScript from bytecode of classes on classpath of the VM.
    15  *
    16  * @author Jaroslav Tulach <jtulach@netbeans.org>
    17  */
    18 final class GenJS {
    19     private GenJS() {}
    20     
    21     public static void main(String... args) throws IOException {
    22         if (args.length < 2) {
    23             System.err.println("Usage: java -cp ... -jar ... <file_to_generate_js_code_to> java/lang/Class org/your/App ...");
    24             return;
    25         }
    26         
    27         Writer w = new BufferedWriter(new FileWriter(args[0]));
    28         List<String> classes = Arrays.asList(args).subList(1, args.length);
    29         compile(w, classes);
    30         w.close();
    31     }
    32     
    33     static void compile(Appendable out, String... names) throws IOException {
    34         compile(out, Arrays.asList(names));
    35     }
    36     static void compile(Appendable out, List<String> names) throws IOException {
    37         Set<String> processed = new HashSet<String>();
    38         LinkedList<String> toProcess = new LinkedList<String>(names);
    39         for (;;) {
    40             toProcess.removeAll(processed);
    41             if (toProcess.isEmpty()) {
    42                 break;
    43             }
    44             String name = toProcess.getFirst();
    45             processed.add(name);
    46             if (name.startsWith("java/") 
    47                 && !name.equals("java/lang/Object")
    48                 && !name.equals("java/lang/String")
    49             ) {
    50                 continue;
    51             }
    52             InputStream is = GenJS.class.getClassLoader().getResourceAsStream(name + ".class");
    53             if (is == null) {
    54                 throw new IOException("Can't find class " + name); 
    55             }
    56             try {
    57                 ByteCodeToJavaScript.compile(is, out, toProcess);
    58             } catch (RuntimeException ex) {
    59                 if (out instanceof CharSequence) {
    60                     CharSequence seq = (CharSequence)out;
    61                     int lastBlock = seq.length();
    62                     while (lastBlock-- >= 0) {
    63                         if (seq.charAt(lastBlock) == '{') {
    64                             break;
    65                         }
    66                     }
    67                     throw new IOException("Error while compiling " + name + "\n" 
    68                         + seq.subSequence(lastBlock + 1, seq.length()), ex
    69                     );
    70                 } else {
    71                     throw new IOException("Error while compiling " + name + "\n" 
    72                         + out, ex
    73                     );
    74                 }
    75             }
    76         }
    77     }
    78     
    79 }