private void generateSet(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); String item = context.getParameterName(3); writer.append("var type = " + array + ".constructor.$meta.item;").softNewLine(); boolean first = true; for (int i = 0; i < primitives.length; ++i) { String wrapper = "java.lang." + primitiveWrappers[i]; MethodReference methodRef = new MethodReference(wrapper, primitives[i].toLowerCase() + "Value", primitiveTypes[i]); ClassReader cls = context.getClassSource().get(methodRef.getClassName()); if (cls == null || cls.getMethod(methodRef.getDescriptor()) == null) { continue; } if (!first) { writer.append(" else "); } first = false; writer.append("if (type === $rt_" + primitives[i].toLowerCase() + "cls()) {").indent().softNewLine(); writer.append(item + " = ").appendMethodBody(methodRef).append("(" + item + ");").softNewLine(); writer.outdent().append("}"); } writer.softNewLine(); writer.append(array + ".data[" + context.getParameterName(2) + "] = " + item + ";").softNewLine(); }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { ClassReader cls = context.getClassSource().get(methodRef.getClassName()); MethodReader method = cls.getMethod(methodRef.getDescriptor()); AnnotationReader refAnnot = method.getAnnotations().get(MetadataProviderRef.class.getName()); methodRef = MethodReference.parse(refAnnot.getValue("value").getString()); MetadataGenerator generator = MetadataUtils.createMetadataGenerator(context.getClassLoader(), method, new CallLocation(methodRef), context.getDiagnostics()); if (generator == null) { return; } DefaultMetadataGeneratorContext metadataContext = new DefaultMetadataGeneratorContext(context.getClassSource(), context.getClassLoader(), context.getProperties(), context); // Generate resource loader Resource resource = generator.generateMetadata(metadataContext, methodRef); writer.append("return "); ResourceWriterHelper.write(writer, resource); writer.append(';').softNewLine(); } }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { JSBodyRepository emitterRepository = context.getService(JSBodyRepository.class); JSBodyEmitter emitter = emitterRepository.emitters.get(methodRef); emitter.emit(context, writer, methodRef); } }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { switch (methodRef.getName()) { case "compare": writer.append("return Long_compare(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; case "divideUnsigned": writer.append("return Long_udiv(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; case "remainderUnsigned": writer.append("return Long_urem(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; } } }
@Override public void emit(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { emit(writer, index -> writer.append(context.getParameterName(index + 1))); }
private void generateCreateFieldsForClass(GeneratorContext context, SourceWriter writer, String className) throws IOException { ReflectionDependencyListener reflection = context.getService(ReflectionDependencyListener.class); Set<String> accessibleFields = reflection.getAccessibleFields(className); ClassReader cls = context.getClassSource().get(className); if (cls == null) { return; } writer.appendClass(className).append(".$meta.fields").ws().append('=').ws().append('[').indent(); generateCreateMembers(writer, cls.getFields(), field -> { appendProperty(writer, "type", false, () -> writer.append(context.typeToClassString(field.getType()))); appendProperty(writer, "getter", false, () -> { if (accessibleFields != null && accessibleFields.contains(field.getName())) { renderGetter(writer, field); } else { writer.append("null"); } }); appendProperty(writer, "setter", false, () -> { if (accessibleFields != null && accessibleFields.contains(field.getName())) { renderSetter(writer, field); } else { writer.append("null"); } }); }); writer.outdent().append("];").softNewLine(); }
private void generateCreateMethodsForClass(GeneratorContext context, SourceWriter writer, String className) throws IOException { ReflectionDependencyListener reflection = context.getService(ReflectionDependencyListener.class); Set<MethodDescriptor> accessibleMethods = reflection.getAccessibleMethods(className); ClassReader cls = context.getInitialClassSource().get(className); if (cls == null) { return; writer.append(',').ws(); writer.append(context.typeToClassString(method.parameterType(i))); writer.append(context.typeToClassString(method.getResultType())); });
private void generatePrepareNewInstance(GeneratorContext context, SourceWriter writer) throws IOException { writer.append("var c").ws().append("=").ws().append("'$$constructor$$';").softNewLine(); for (String clsName : context.getClassSource().getClassNames()) { ClassReader cls = context.getClassSource().get(clsName); MethodReader method = cls.getMethod(new MethodDescriptor("<init>", void.class)); if (method != null) { writer.appendClass(clsName).append("[c]").ws().append("=").ws() .appendMethodBody(method.getReference()).append(";").softNewLine(); } } }
sb.append(naming.getFullNameFor(JavaScriptConvGenerator.fromJsMethod)).append("(p").append(i) .append(", ") .append(context.typeToClassString(paramType)).append(")");
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { boolean autodetect = Boolean.parseBoolean( context.getProperties().getProperty("java.util.TimeZone.autodetect", "false")); writer.append("return " + Boolean.toString(autodetect) + ";"); } }
private void generateArrayCopy(GeneratorContext context, SourceWriter writer) throws IOException { String src = context.getParameterName(1); String srcPos = context.getParameterName(2); String dest = context.getParameterName(3); String destPos = context.getParameterName(4); String length = context.getParameterName(5); writer.append("if (" + src + " !== " + dest + " || " + destPos + " < " + srcPos + ") {").indent().newLine(); writer.append("for (var i = 0; i < " + length + "; i = (i + 1) | 0) {").indent().softNewLine(); writer.append(dest + ".data[" + destPos + "++] = " + src + ".data[" + srcPos + "++];").softNewLine(); writer.outdent().append("}").softNewLine(); writer.outdent().append("} else {").indent().softNewLine(); writer.append(srcPos + " = (" + srcPos + " + " + length + ") | 0;").softNewLine(); writer.append(destPos + " = (" + destPos + " + " + length + ") | 0;").softNewLine(); writer.append("for (var i = 0; i < " + length + "; i = (i + 1) | 0) {").indent().softNewLine(); writer.append(dest + ".data[--" + destPos + "] = " + src + ".data[--" + srcPos + "];").softNewLine(); writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generatePrepareNewInstance(GeneratorContext context, SourceWriter writer) throws IOException { writer.append("var c").ws().append("=").ws().append("'$$constructor$$';").softNewLine(); for (String clsName : context.getClassSource().getClassNames()) { ClassReader cls = context.getClassSource().get(clsName); MethodReader method = cls.getMethod(new MethodDescriptor("<init>", void.class)); if (method != null) { writer.appendClass(clsName).append("[c]").ws().append("=").ws() .appendMethodBody(method.getReference()).append(";").softNewLine(); } } }
private void unwrapValue(GeneratorContext context, SourceWriter writer, ValueType type) throws IOException { writer.appendMethodBody(JavaScriptConvGenerator.fromJsMethod); writer.append("(").append("result").append(",").ws().append(context.typeToClassString(type)) .append(")"); }
private void generateLookup(GeneratorContext context, SourceWriter writer) throws IOException { String param = context.getParameterName(1); writer.append("switch ($rt_ustr(" + param + ")) {").softNewLine().indent(); for (String name : context.getClassSource().getClassNames()) { writer.append("case \"" + name + "\": ").appendClass(name).append(".$clinit(); ") .append("return ").appendClass(name).append(";").softNewLine(); } writer.append("default: return null;").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generateNewInstance(GeneratorContext context, SourceWriter writer) throws IOException { String type = context.getParameterName(1); String length = context.getParameterName(2); writer.append("if (").append(type).append(".$meta.primitive) {").softNewLine().indent(); for (String primitive : primitives) { writer.append("if (" + type + " == $rt_" + primitive.toLowerCase() + "cls()) {").indent().softNewLine(); writer.append("return $rt_create" + primitive + "Array(" + length + ");").softNewLine(); writer.outdent().append("}").softNewLine(); } writer.outdent().append("} else {").indent().softNewLine(); writer.append("return $rt_createArray(" + type + ", " + length + ")").softNewLine(); writer.outdent().append("}").softNewLine(); }
ClassReader cls = context.getClassSource().get(methodRef.getClassName()); MethodReader method = cls.getMethod(methodRef.getDescriptor()); AnnotationReader providerAnnot = method.getAnnotations().get(ClassScopedMetadataProvider.class.getName()); context.getDiagnostics().error(new CallLocation(methodRef), "Method {{m0}} is marked with " + "{{c1}} annotation, but it is not native", methodRef, ClassScopedMetadataProvider.class.getName()); Class<?> generatorClass; try { generatorClass = Class.forName(generatorClassName, true, context.getClassLoader()); } catch (ClassNotFoundException e) { context.getDiagnostics().error(new CallLocation(methodRef), "Can't find metadata provider class {{c0}}", generatorClassName); return; cons = generatorClass.getConstructor(); } catch (NoSuchMethodException e) { context.getDiagnostics().error(new CallLocation(methodRef), "Metadata generator {{c0}} does not have " + "a public no-arg constructor", generatorClassName); return; generator = (ClassScopedMetadataGenerator) cons.newInstance(); } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) { context.getDiagnostics().error(new CallLocation(methodRef), "Error instantiating metadata " + "generator {{c0}}", generatorClassName); return; DefaultMetadataGeneratorContext metadataContext = new DefaultMetadataGeneratorContext(context.getClassSource(),
private void generateCreateMetadata(GeneratorContext context, SourceWriter writer) throws IOException { ReflectionDependencyListener reflection = context.getService(ReflectionDependencyListener.class); for (String className : reflection.getClassesWithReflectableFields()) { generateCreateFieldsForClass(context, writer, className); } for (String className : reflection.getClassesWithReflectableMethods()) { generateCreateMethodsForClass(context, writer, className); } }
private void generateGet(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); writer.append("var item = " + array + ".data[" + context.getParameterName(2) + "];").softNewLine(); writer.append("var type = " + array + ".constructor.$meta.item;").softNewLine(); for (int i = 0; i < primitives.length; ++i) { String wrapper = "java.lang." + primitiveWrappers[i]; MethodReference methodRef = new MethodReference(wrapper, "valueOf", primitiveTypes[i], ValueType.object(wrapper)); ClassReader cls = context.getClassSource().get(methodRef.getClassName()); if (cls == null || cls.getMethod(methodRef.getDescriptor()) == null) { continue; } writer.append("if (type === $rt_" + primitives[i].toLowerCase() + "cls()) {").indent().softNewLine(); writer.append("return ").appendMethodBody(methodRef).append("(item);").softNewLine(); writer.outdent().append("} else "); } writer.append("{").indent().softNewLine(); writer.append("return item;").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generateGetLength(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); writer.append("if (" + array + " === null || " + array + ".constructor.$meta.item === undefined) {") .softNewLine().indent(); MethodReference cons = new MethodReference("java.lang.IllegalArgumentException", "<init>", ValueType.VOID); writer.append("$rt_throw(").appendInit(cons).append("());").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return " + array + ".data.length;").softNewLine(); }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { ClassReader cls = context.getClassSource().get(methodRef.getClassName()); MethodReader method = cls.getMethod(methodRef.getDescriptor()); AnnotationReader refAnnot = method.getAnnotations().get(MetadataProviderRef.class.getName()); methodRef = MethodReference.parse(refAnnot.getValue("value").getString()); MetadataGenerator generator = MetadataUtils.createMetadataGenerator(context.getClassLoader(), method, new CallLocation(methodRef), context.getDiagnostics()); if (generator == null) { return; } DefaultMetadataGeneratorContext metadataContext = new DefaultMetadataGeneratorContext(context.getClassSource(), context.getClassLoader(), context.getProperties(), context); // Generate resource loader Resource resource = generator.generateMetadata(metadataContext, methodRef); writer.append("return "); ResourceWriterHelper.write(writer, resource); writer.append(';').softNewLine(); } }