.publicOverridesMethod("getProxy") .append(Stmt.nestedCall(Stmt.newObject(remoteProxy.getClassDefinition())).returnValue()) .finish()
private ObjectBuilder createJsTypeProvider(final MetaClass type) { return newObject(DummyJsTypeProvider.class) .extend() .publicOverridesMethod("getInstance") .append(nestedCall(createAnonymousImpl(type)).returnValue()) .finish() .publicOverridesMethod("getName") .append(loadLiteral("Anti-inlining impl for: " + type.getFullyQualifiedName()).returnValue()) .finish() .finish(); }
private ObjectBuilder createAnonymousImpl(final MetaClass type) { final AnonymousClassStructureBuilder builder = newObject(type).extend(); stream(type.getMethods()) .filter(m -> m.isPublic() && m.isAbstract()) .forEach(m -> { builder .publicOverridesMethod(m.getName(), of(m.getParameters())) .append(Stmt.throw_(RuntimeException.class)) .finish(); }); return builder.finish(); }
@Override public void generateDecorator(final Decorable decorable, final FactoryController controller) { final Statement callbackStmt = Stmt.newObject(Runnable.class).extend() .publicOverridesMethod("run") .append(decorable.getAccessStatement()) .finish() .finish(); controller.addInitializationStatements(Collections.<Statement>singletonList(Stmt.invokeStatic(InitVotes.class, "registerOneTimeInitCallback", callbackStmt))); } }
private ObjectBuilder createAnnoImpl(final MetaClass annoType) { final AnonymousClassStructureBuilder builder = ObjectBuilder.newInstanceOf(annoType).extend(); Arrays.stream(annoType.getDeclaredMethods()) .forEach(m -> builder.publicOverridesMethod(m.getName()) .append(castTo(m.getReturnType(), loadVariable("parameters").invoke("get", m.getName())).returnValue()).finish()); builder.publicOverridesMethod("annotationType").append(loadLiteral(annoType).returnValue()).finish(); return builder.finish(); }
private Statement generateFactoryLoader(final Injectable injectable, final MetaClass factoryClass) { final Statement runAsyncCallback = ObjectBuilder.newInstanceOf(DefaultRunAsyncCallback.class).extend() .publicOverridesMethod("onSuccess").append(loadVariable("callback").invoke("callback", castTo(Factory.class, invokeStatic(GWT.class, "create", loadLiteral(factoryClass))))) .finish().finish(); final Class<?> fragmentId = getAsyncFragmentId(injectable); final Object[] runAsyncParams = (fragmentId.equals(LoadAsync.NO_FRAGMENT.class) ? new Object[] { runAsyncCallback } : new Object[] { fragmentId, runAsyncCallback }); return ObjectBuilder.newInstanceOf(FactoryLoader.class).extend() .publicOverridesMethod("call", finalOf(FactoryLoaderCallback.class, "callback")) .append(invokeStatic(GWT.class, "runAsync", runAsyncParams)).finish().finish(); }
/** * Generates an anonymous {@link DataSyncCallback} that will invoke the decorated sync method. */ private Statement createSyncCallback(Decorable decorable) { return Stmt.newObject(DataSyncCallback.class) .extend() .publicOverridesMethod("onSync", Parameter.of(SyncResponses.class, "responses", true)) .append(decorable.getAccessStatement(Stmt.loadVariable("responses"))) .finish() .finish(); }
private static Statement supplierOf(final Statement value) { return newInstanceOf(parameterizedAs(Supplier.class, typeParametersOf(value.getType()))) .extend() .publicOverridesMethod("get") .append(Stmt.nestedCall(value).returnValue()) .finish() .finish(); }
private static Statement supplierOf(final Statement value) { return newInstanceOf(parameterizedAs(Supplier.class, typeParametersOf(value.getType()))) .extend() .publicOverridesMethod("get") .append(Stmt.nestedCall(value).returnValue()) .finish() .finish(); }
private Object createHandlerForMethod(final MetaMethod method) { return ObjectBuilder .newInstanceOf(PropertyChangeHandler.class) .extend() .publicOverridesMethod("onPropertyChange", finalOf(PropertyChangeEvent.class, "event")) .append(castTo(method.getDeclaringClass(), loadVariable("agent").loadField("target")).invoke(method, loadVariable("event"))) .finish() .finish(); }
private Object createHandlerForMethod(final MetaMethod method) { return ObjectBuilder .newInstanceOf(PropertyChangeHandler.class) .extend() .publicOverridesMethod("onPropertyChange", finalOf(PropertyChangeEvent.class, "event")) .append(castTo(method.getDeclaringClass(), loadVariable("agent").loadField("target")).invoke(method, loadVariable("event"))) .finish() .finish(); }
private static ObjectBuilder anonymousAttributeAccessorFor(final MetaMethod attr) { return newInstanceOf(Function.class).extend() .publicOverridesMethod("apply", Parameter.finalOf(Object.class, "anno")) .append(invokeStatic(SharedAnnotationSerializer.class, "stringify", castTo(attr.getDeclaringClass(), loadVariable("anno")).invoke(attr)) .returnValue()) .finish().finish(); }
@Override public Statement deferred(final MetaClass type, final MetaClass marshaller) { return Stmt.newObject(parameterizedAs(DeferredMarshallerCreationCallback.class, typeParametersOf(type))) .extend() .publicOverridesMethod("create", Parameter.of(Class.class, "type")) .append( Stmt.nestedCall( Stmt.newObject(QualifyingMarshallerWrapper.class, Stmt.castTo(Marshaller.class, Stmt.invokeStatic(GWT.class, "create", marshaller)), type)) .returnValue()) .finish() .finish(); } }
@Override public Statement deferred(final MetaClass type, final MetaClass marshaller) { return Stmt.newObject(parameterizedAs(DeferredMarshallerCreationCallback.class, typeParametersOf(type))) .extend() .publicOverridesMethod("create", Parameter.of(Class.class, "type")) .append( Stmt.nestedCall( Stmt.newObject(QualifyingMarshallerWrapper.class, Stmt.castTo(Marshaller.class, Stmt.invokeStatic(GWT.class, "create", marshaller)), type)) .returnValue()) .finish() .finish(); } }
private Statement declareAndInitHandlerVar(final Decorable decorable, final FactoryController controller, final String name, final boolean enclosingTypeDependent) { final MetaClass throwableConsumerClass = parameterizedAs(Consumer.class, typeParametersOf(Throwable.class)); final BlockBuilder<AnonymousClassStructureBuilder> initBuilder = newObject(throwableConsumerClass) .extend().publicOverridesMethod("accept", Parameter.of(Throwable.class, "t")); if (!enclosingTypeDependent) { final MetaClass enclosingType = decorable.getEnclosingInjectable().getInjectedType(); initBuilder.append(declareFinalVariable("instance", enclosingType, castTo(enclosingType, invokeStatic(Factory.class, "maybeUnwrapProxy", controller.contextGetInstanceStmt())))); } final ObjectBuilder initStmt = initBuilder.append(decorable.call(Refs.get("t"))).finish().finish(); final Statement handlerStatement = declareFinalVariable(name, throwableConsumerClass, initStmt); return handlerStatement; } }
@Test public void testParameterizedImplementation() throws Exception { final MetaClass mrshlrClass = parameterizedAs(Mrshlr.class, typeParametersOf(Bar.class)); final ObjectBuilder builder = Stmt.newObject(mrshlrClass).extend() .publicOverridesMethod("get") .finish() .finish(); final String javaString = builder.toJavaString(); assertEquals("new org.jboss.errai.codegen.test.model.Mrshlr<org.jboss.errai.codegen.test.model.Bar>() {\n" + " public Class<org.jboss.errai.codegen.test.model.Bar> get() {\n" + "\n" + " }\n" + "}", javaString); } }
@Test public void testAnonymousAnnotation() { String src = ObjectBuilder.newInstanceOf(Retention.class) .extend() .publicOverridesMethod("annotationType") .append(Stmt.load(Retention.class).returnValue()) .finish() .finish() .toJavaString(); assertEquals("failed to generate anonymous annotation with overloaded method", "new java.lang.annotation.Retention() {\n" + "public Class annotationType() {\n" + "return java.lang.annotation.Retention.class;\n" + "}\n" + "}", src); }
@Test public void testAnonymousClass() { String src = ObjectBuilder.newInstanceOf(Bar.class, Context.create().autoImport()) .extend() .publicOverridesMethod("setName", Parameter.of(String.class, "name")) .append(Stmt.loadClassMember("name").assignValue(Variable.get("name"))) .finish() .finish() .toJavaString(); assertEquals("failed to generate anonymous class with overloaded construct", "new Bar() {\n" + "public void setName(String name) {\n" + "this.name = name;\n" + "}\n" + "}", src); }
@Test public void testAnonymousClassWithConstructor() { String src = ObjectBuilder.newInstanceOf(Bar.class, Context.create().autoImport()) .extend("test") .publicOverridesMethod("setName", Parameter.of(String.class, "name")) .append(Stmt.loadClassMember("name").assignValue(Variable.get("name"))) .finish() .finish() .toJavaString(); assertEquals("failed to generate anonymous class with overloaded construct", "new Bar(\"test\") {\n" + "public void setName(String name) {\n" + "this.name = name;\n" + "}\n" + "}", src); }
/** Regression test for ERRAI-363. */ @Test public void testReferenceToAnonymousClassMember() throws Exception { ClassStructureBuilder<?> builder = ClassBuilder.define("com.foo.A").publicScope().body(); builder.privateMethod(void.class, "method") .append(ObjectBuilder.newInstanceOf(Runnable.class).extend() .privateField("memberOfRunnable", Object.class).finish() .publicOverridesMethod("run").append(Stmt.loadVariable("memberOfRunnable").invoke("hashCode")).finish() .finish()) .finish(); String javaString = builder.toJavaString(); assertEquals("package com.foo; public class A { private void method() { new Runnable() { private Object memberOfRunnable; public void run() { memberOfRunnable.hashCode(); } }; } }", javaString); }