1 package jfun.yan.xml; 2 3 import java.util.ArrayList ; 4 import java.util.Arrays ; 5 import java.util.HashMap ; 6 import java.util.HashSet ; 7 import java.util.List ; 8 import java.util.Map ; 9 import java.util.Set ; 10 11 import jfun.util.dict.Dict; 12 import jfun.yan.Component; 13 import jfun.yan.Components; 14 15 class ModuleBuilder { 16 private final Import[] parents; 17 private final Statements stmts; 18 private final String [] dependencies; 19 private final String name; 20 private final String description; 21 private final Object module_id; 22 private final StringPredicate exported; 23 24 public String getDescription() { 25 return description; 26 } 27 28 public Object getModuleId() { 29 return module_id; 30 } 31 32 public String getName() { 33 return name; 34 } 35 62 ModuleBuilder(Object module_id, String name, String description, 63 String [] dependencies, Import[] imports, Statements stmts, 64 StringPredicate exported) { 65 this.name = name; 66 this.description = description; 67 this.module_id = module_id; 68 this.dependencies = dependencies; 69 this.parents = imports; 70 this.stmts = stmts; 71 this.exported = exported; 72 } 73 74 75 public String [] getDependencies(){ 76 final Set result = new HashSet (); 77 for(int i=0; i<parents.length; i++){ 78 result.addAll(Arrays.asList(parents[i].getImported().getDependencies())); 79 } 80 result.addAll(Arrays.asList(dependencies)); 81 final String [] ret = new String [result.size()]; 82 result.toArray(ret); 83 return ret; 84 } 85 86 private static Registry toRegistry(final Map map){ 87 return new Map2Registry(map); 88 } 89 private Dict withDependencies(Dict initial_frame){ 90 final Component[] deps = new Component[dependencies.length]; 91 for(int i=0; i<dependencies.length; i++){ 92 deps[i] = Components.useKey(dependencies[i]); 93 } 94 return initial_frame.puts(dependencies, deps); 95 96 } 97 public Module build(Runtime runtime, Dict initial_frame){ 98 final Map imported = new HashMap (); 99 final Registry locals = toRegistry(imported); 100 for(int i=0; i<parents.length; i++){ 101 parents[i].register(locals); 102 } 103 final Object [] keys = imported.keySet().toArray(); 104 final Object [] vals = new Object [keys.length]; 105 for(int i=0; i<keys.length; i++){ 106 vals[i] = imported.get(keys[i]); 107 } 108 final Dict with_deps = withDependencies(initial_frame); 109 Dict myframe = with_deps.puts(keys, vals); 110 final Body body = BodyCompiler.evaluate( 111 stmts.getKeys(), stmts.getStmts(), 112 runtime, myframe); 114 return new SimpleModule(module_id, name, description, 115 getDependencies(), parents, body, exported); 116 } 117 public StringPredicate getExportFilter() { 118 return exported; 119 } 120 121 } 122 | Popular Tags |