public static Statement annotationLiteral(final Annotation qual) { if (qual.annotationType().equals(Any.class)) { return loadStatic(QualifierUtil.class, "ANY_ANNOTATION"); } else if (qual.annotationType().equals(Default.class)) { return loadStatic(QualifierUtil.class, "DEFAULT_ANNOTATION"); } else if (qual.annotationType().equals(Named.class)) { return invokeStatic(QualifierUtil.class, "createNamed", ((Named) qual).value()); } else { return LiteralFactory.getLiteral(qual); } }
private Statement generateRequest(ClassStructureBuilder<?> classBuilder, MetaMethod method, Statement methodParams, boolean intercepted) { final Statement sendable = Stmt .invokeStatic(MessageBuilder.class, "createCall") .invoke("call", remote.getFullyQualifiedName()) .invoke("endpoint", ProxyUtil.createCallSignature(method), Stmt.loadClassMember("qualifiers"), methodParams) .invoke("respondTo", method.getReturnType().asBoxed(), Stmt.loadVariable("remoteCallback")) .invoke("errorsHandledBy", Stmt.loadVariable("errorCallback")); final BlockStatement requestBlock = new BlockStatement(); requestBlock.addStatement(Stmt.declareVariable("sendable", RemoteCallSendable.class, sendable)); requestBlock.addStatement(Stmt.loadStatic(classBuilder.getClassDefinition(), "this") .invoke("sendRequest", Variable.get("bus"), Variable.get("sendable"))); return requestBlock; } }
/** * Generates the call to * {@link RequestBuilder#sendRequest(String, com.google.gwt.http.client.RequestCallback)} for * interceptable methods. * * @return statement representing the request */ private Statement generateInterceptedRequest() { return generateRequest( Stmt.nestedCall(new StringStatement("getRequestBuilder()", MetaClassFactory.get(RequestBuilder.class))), Stmt.loadStatic(declaringClass, "this")); }
@Test public void testTypeInferenceWorksPropertyForParameterizedMethodTypes() { final String s = Stmt.loadStatic(BeanWithTypeParmedMeths.class, "INSTANCE") .invoke("setFooBarMap", Stmt.loadStatic(BeanWithTypeParmedMeths.class, "INSTANCE").invoke("getFooBarMap")) .toJavaString(); assertEquals("org.jboss.errai.codegen.test.model.BeanWithTypeParmedMeths.INSTANCE" + ".setFooBarMap(org.jboss.errai.codegen.test.model.BeanWithTypeParmedMeths.INSTANCE.getFooBarMap())", s); }
@Test public void testEnumReference() { final ContextualStatementBuilder statementBuilder = Stmt.loadStatic(TEnum.class, "FIRST"); assertEquals(TEnum.class.getName() + ".FIRST", statementBuilder.generate(Context.create())); } }
@Override public ContextualStatementBuilder call(final Statement instance, final HasAnnotations annotated, final BuildMetaClass factory, final Statement... params) { final MetaField field = (MetaField) annotated; if (field.isPublic()) { if (field.isStatic()) { return loadStatic(field.getDeclaringClass(), field.getName()); } else { return nestedCall(instance).loadField(field); } } else { final Object[] accessorParams = (field.isStatic() ? new Object[0] : new Object[] { instance }); return invokeStatic(notNull(factory), getPrivateFieldAccessorName(field), accessorParams); } } },
@Test public void testSwitchBlockWithInvalidStatement() { try { StatementBuilder.create() .switch_(Stmt.loadStatic(System.class, "out")) .toJavaString(); fail("expected InvalidTypeException"); } catch (InvalidTypeException e) { // expected } }
@Test public void testSwitchBlockWithFallThrough() { String s = StatementBuilder.create() .declareVariable("n", int.class) .switch_(Stmt.loadVariable("n")) .case_(0) .finish() .case_(1) .append(Stmt.loadStatic(System.class, "out").invoke("println", "1")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate int switch block with fallthrough", SWITCH_BLOCK_INT_FALLTHROUGH, s); }
private Statement generateRequest(ClassStructureBuilder<?> classBuilder, MetaMethod method, Statement methodParams, boolean intercepted) { final Statement sendable = Stmt .invokeStatic(MessageBuilder.class, "createCall") .invoke("call", remote.getFullyQualifiedName()) .invoke("endpoint", ProxyUtil.createCallSignature(method), Stmt.loadClassMember("qualifiers"), methodParams) .invoke("respondTo", method.getReturnType().asBoxed(), Stmt.loadVariable("remoteCallback")) .invoke("errorsHandledBy", Stmt.loadVariable("errorCallback")); final BlockStatement requestBlock = new BlockStatement(); requestBlock.addStatement(Stmt.declareVariable("sendable", RemoteCallSendable.class, sendable)); requestBlock.addStatement(Stmt.loadStatic(classBuilder.getClassDefinition(), "this") .invoke("sendRequest", Variable.get("bus"), Variable.get("sendable"))); return requestBlock; } }
@Test public void testDefineClassWithStaticMethod() { final String cls = ClassBuilder.define("my.test.Clazz") .publicScope().body() .publicMethod(void.class, "test").modifiers(Modifier.Static) .body() .append(Stmt.loadStatic(System.class, "out").invoke("println", "Hello, World!")) .finish() .toJavaString(); assertEquals("failed to generate class with static method", CLASS_WITH_STATIC_METHOD, cls); }
@Test public void testSwitchBlockWithoutDefaultBlock() { String s = StatementBuilder.create() .declareVariable("n", Integer.class) .switch_(Stmt.loadVariable("n")) .case_(0) .append(Stmt.loadStatic(System.class, "out").invoke("println", "0")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .case_(1) .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate Integer switch block without default", SWITCH_BLOCK_INTEGER_NO_DEFAULT, s); }
@Test public void testDefineClassWithJSNIMethod() { final String cls = ClassBuilder.define("my.test.Clazz") .publicScope().body() .publicMethod(void.class, "test").modifiers(Modifier.JSNI) .body() .append(Stmt.loadStatic(System.class, "out").invoke("println", "Hello, World!")) .finish() .toJavaString(); assertEquals("failed to generate class with JSNI method", CLASS_WITH_JSNI_METHOD, cls); }
@Test public void testForeachLoopWithInvoke() { Builder loop = StatementBuilder.create() .declareVariable("map", Map.class) .loadVariable("map") .invoke("keySet") .foreach("key") .append(Stmt.loadStatic(System.class, "out").invoke("println", Variable.get("key"))) .finish(); assertEquals("Failed to generate foreach loop using invoke()", FOREACH_KEYSET_LOOP, loop.toJavaString()); }
@Test public void testSwitchBlockOnInt() { String s = StatementBuilder.create() .declareVariable("n", int.class) .switch_(Stmt.loadVariable("n")) .case_(0) .append(Stmt.loadStatic(System.class, "out").invoke("println", "0")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .case_(1) .append(Stmt.break_()) .finish() .default_() .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate int switch block", SWITCH_BLOCK_INT, s); }
@Test public void testSwitchBlockChained() { String s = StatementBuilder.create() .declareVariable("n", int.class) .loadVariable("n") .switch_() .case_(0) .append(Stmt.loadStatic(System.class, "out").invoke("println", "0")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .case_(1) .append(Stmt.break_()) .finish() .default_() .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate chained switch block", SWITCH_BLOCK_INT, s); }
@Test public void testSwitchBlockChainedOnInvocation() { String s = StatementBuilder.create() .declareVariable("str", String.class) .loadVariable("str") .invoke("length") .switch_() .case_(0) .append(Stmt.loadStatic(System.class, "out").invoke("println", "0")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .case_(1) .append(Stmt.break_()) .finish() .default_() .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate switch block chained on invocation", SWITCH_BLOCK_CHAINED_INVOCATION, s); } }
@Test public void testSwitchBlockOnEnum() { Context c = Context.create().autoImport(); String s = StatementBuilder.create(c) .declareVariable("t", TestEnum.class) .switch_(Stmt.loadVariable("t")) .case_(TestEnum.A) .append(Stmt.loadStatic(System.class, "out").invoke("println", "A")) .append(Stmt.loadStatic(System.class, "out").invoke("println", "break")) .append(Stmt.break_()) .finish() .case_(TestEnum.B) .append(Stmt.break_()) .finish() .default_() .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate enum switch block", SWITCH_BLOCK_ENUM, s); }
@Test public void testIfBlockUnchainedWithExpressionUsingNegation() { Context ctx = Context.create().addVariable("a", boolean.class) .addVariable("b", boolean.class); String s = Stmt.create(ctx) .if_(Bool.expr(Stmt.loadVariable("a"), BooleanOperator.And, Bool.expr(Stmt.loadVariable("b")).negate())) .append(Stmt.loadStatic(System.class, "out").invoke("println", Refs.get("a"))) .finish() .toJavaString(); assertEquals("Failed to generate if block using nested boolean expressions", IF_BLOCK_UNCHAINED_WITH_EXPRESSION_USING_NEGATION, s); }
@Test public void testSwitchBlockChainedOnChar() { String s = StatementBuilder.create() .declareVariable("c", char.class) .loadVariable("c") .switch_() .case_('a') .append(Stmt.loadStatic(System.class, "out").invoke("println", "a")) .append(Stmt.break_()) .finish() .case_('b') .append(Stmt.break_()) .finish() .default_() .append(Stmt.break_()) .finish() .toJavaString(); assertEquals("Failed to generate char switch block", SWITCH_BLOCK_CHAR_CHAINED, s); }
@Test public void testIfBlockUnchainedWithNestedExpressions() { Context ctx = Context.create().addVariable("a", boolean.class) .addVariable("b", boolean.class); String s = Stmt.create(ctx) .if_(Bool.expr( Bool.expr("foo", BooleanOperator.Equals, "bar"), BooleanOperator.Or, Bool.expr( Bool.expr("cat", BooleanOperator.Equals, "dog"), BooleanOperator.And, Bool.expr("girl", BooleanOperator.NotEquals, "boy")))) .finish() .elseif_(Bool.expr(Stmt.loadVariable("a"), BooleanOperator.And, Stmt.loadVariable("b"))) .append(Stmt.loadStatic(System.class, "out").invoke("println", Refs.get("a"))) .finish() .toJavaString(); assertEquals("Failed to generate if block using nested boolean expressions", IF_ELSEIF_BLOCK_UNCHAINED_NESTED_EXPRESSIONS, s); }