use of org.eclipse.xtend.core.macro.declaration.CompilationUnitImpl in project xtext-xtend by eclipse.
the class AbstractReusableActiveAnnotationTests method testAnnotationDefaultValues_01.
@Test
public void testAnnotationDefaultValues_01() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package myannotation");
_builder.newLine();
_builder.newLine();
_builder.append("import java.util.List");
_builder.newLine();
_builder.append("import java.lang.annotation.RetentionPolicy");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.Active");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.TransformationParticipant");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
_builder.newLine();
_builder.newLine();
_builder.append("@Active(AnnotationDefaultValuesProcessor)");
_builder.newLine();
_builder.append("annotation AnnotationDefaultValues { }");
_builder.newLine();
_builder.newLine();
_builder.append("class AnnotationDefaultValuesProcessor implements TransformationParticipant<MutableClassDeclaration> {");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("override doTransform(List<? extends MutableClassDeclaration> annotationTargets, extension TransformationContext context) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("annotationTargets.forEach[ annotationTarget |");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val annotation = annotationTarget.findAnnotation(findTypeGlobally(MyAnnotation))");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val strings = annotation.getStringArrayValue(\'value\').map[ toString ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("strings.forEach [ annotationTarget.addField(it) [ type = string ] ]");
_builder.newLine();
_builder.append("\t\t");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val booleans = annotation.getBooleanArrayValue(\'booleans\').map[ toString ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("booleans.forEach [ annotationTarget.addField(it) [ type = string ] ]");
_builder.newLine();
_builder.append("\t\t");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val types = annotation.getClassArrayValue(\'types\').map[ toString ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("types.forEach [ annotationTarget.addField(it) [ type = string ] ]");
_builder.newLine();
_builder.append("\t\t");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val policies = annotation.getEnumArrayValue(\'policies\').map[ toString ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("policies.forEach [ annotationTarget.addField(it) [ type = string ] ]");
_builder.newLine();
_builder.append("\t\t");
_builder.newLine();
_builder.append("\t\t");
_builder.append("val nested = annotation.getAnnotationArrayValue(\'nested\').map[ toString ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("nested.forEach [ annotationTarget.addField(it) [ type = string ] ]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("]");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.append("annotation MyAnnotation {");
_builder.newLine();
_builder.append("\t");
_builder.append("String[] value = #[]");
_builder.newLine();
_builder.append("\t");
_builder.append("boolean[] booleans = #[]");
_builder.newLine();
_builder.append("\t");
_builder.append("Class<?>[] types = #[]");
_builder.newLine();
_builder.append("\t");
_builder.append("RetentionPolicy[] policies = #[]");
_builder.newLine();
_builder.append("\t");
_builder.append("Active[] nested = #[]");
_builder.newLine();
_builder.append("}");
_builder.newLine();
Pair<String, String> _mappedTo = Pair.<String, String>of("myannotation/AnnotationDefaultValues.xtend", _builder.toString());
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("package myusercode");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("@myannotation.AnnotationDefaultValues");
_builder_1.newLine();
_builder_1.append("@myannotation.MyAnnotation");
_builder_1.newLine();
_builder_1.append("class MyClass {}");
_builder_1.newLine();
Pair<String, String> _mappedTo_1 = Pair.<String, String>of("myusercode/UserCode.xtend", _builder_1.toString());
final Procedure1<CompilationUnitImpl> _function = (CompilationUnitImpl it) -> {
final MutableClassDeclaration clazz = it.getTypeLookup().findClass("myusercode.MyClass");
Assert.assertTrue(IterableExtensions.isEmpty(clazz.getDeclaredFields()));
};
this.assertProcessing(_mappedTo, _mappedTo_1, _function);
}
use of org.eclipse.xtend.core.macro.declaration.CompilationUnitImpl in project xtext-xtend by eclipse.
the class AbstractReusableActiveAnnotationTests method testSetEmptyListAsAnnotationValue.
@Test
public void testSetEmptyListAsAnnotationValue() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package myannotation");
_builder.newLine();
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.Active");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
_builder.newLine();
_builder.newLine();
_builder.append("@Active(MyAnnotationProcessor)");
_builder.newLine();
_builder.append("annotation MyAnnotation {");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("annotation Values {");
_builder.newLine();
_builder.append("\t");
_builder.append("int[] intValue");
_builder.newLine();
_builder.append("\t");
_builder.append("long[] longValue");
_builder.newLine();
_builder.append("\t");
_builder.append("short[] shortValue");
_builder.newLine();
_builder.append("\t");
_builder.append("double[] doubleValue");
_builder.newLine();
_builder.append("\t");
_builder.append("float[] floatValue");
_builder.newLine();
_builder.append("\t");
_builder.append("byte[] byteValue");
_builder.newLine();
_builder.append("\t");
_builder.append("boolean[] booleanValue");
_builder.newLine();
_builder.append("\t");
_builder.append("char[] charValue");
_builder.newLine();
_builder.append("\t");
_builder.append("String[] stringValue");
_builder.newLine();
_builder.append("\t");
_builder.append("Class<?>[] classValue");
_builder.newLine();
_builder.append("\t");
_builder.append("Enum1[] enumValue");
_builder.newLine();
_builder.append("\t");
_builder.append("Annotation2[] annotationValue");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("enum Enum1 {}");
_builder.newLine();
_builder.append("annotation Annotation2 {}");
_builder.newLine();
_builder.newLine();
_builder.newLine();
_builder.append("class MyAnnotationProcessor extends AbstractClassProcessor {");
_builder.newLine();
_builder.newLine();
_builder.append("\t");
_builder.append("override doTransform(MutableClassDeclaration it, extension TransformationContext context) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("removeAnnotation(annotations.head)");
_builder.newLine();
_builder.append("\t\t");
_builder.append("addAnnotation(Values.newAnnotationReference [");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setIntValue(\'intValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setLongValue(\'longValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setShortValue(\'shortValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setDoubleValue(\'doubleValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setFloatValue(\'floatValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setByteValue(\'byteValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setBooleanValue(\'booleanValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setCharValue(\'charValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setStringValue(\'stringValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setClassValue(\'classValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setEnumValue(\'enumValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setAnnotationValue(\'annotationValue\', emptyList)");
_builder.newLine();
_builder.append("\t\t");
_builder.append("])");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("}");
_builder.newLine();
Pair<String, String> _mappedTo = Pair.<String, String>of("myannotation/MyAnnotation.xtend", _builder.toString());
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("package myusercode");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("import myannotation.*");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("@MyAnnotation");
_builder_1.newLine();
_builder_1.append("class Foo {");
_builder_1.newLine();
_builder_1.append("}");
_builder_1.newLine();
Pair<String, String> _mappedTo_1 = Pair.<String, String>of("myusercode/UserCode.xtend", _builder_1.toString());
final Procedure1<CompilationUnitImpl> _function = (CompilationUnitImpl it) -> {
final MutableClassDeclaration foo = it.getTypeLookup().findClass("myusercode.Foo");
final Type annotationType = it.getTypeLookup().findTypeGlobally("myannotation.Values");
final AnnotationReference values = foo.findAnnotation(annotationType);
Assert.assertEquals(0, ((List<Integer>) Conversions.doWrapArray(values.getIntArrayValue("intValue"))).size());
Assert.assertEquals(0, ((List<Long>) Conversions.doWrapArray(values.getLongArrayValue("longValue"))).size());
Assert.assertEquals(0, ((List<Short>) Conversions.doWrapArray(values.getShortArrayValue("shortValue"))).size());
Assert.assertEquals(0, ((List<Double>) Conversions.doWrapArray(values.getDoubleArrayValue("doubleValue"))).size());
Assert.assertEquals(0, ((List<Float>) Conversions.doWrapArray(values.getFloatArrayValue("floatValue"))).size());
Assert.assertEquals(0, ((List<Byte>) Conversions.doWrapArray(values.getByteArrayValue("byteValue"))).size());
Assert.assertEquals(0, ((List<Boolean>) Conversions.doWrapArray(values.getBooleanArrayValue("booleanValue"))).size());
Assert.assertEquals(0, ((List<Character>) Conversions.doWrapArray(values.getCharArrayValue("charValue"))).size());
Assert.assertEquals(0, ((List<String>) Conversions.doWrapArray(values.getStringArrayValue("stringValue"))).size());
Assert.assertEquals(0, ((List<TypeReference>) Conversions.doWrapArray(values.getClassArrayValue("classValue"))).size());
Assert.assertEquals(0, ((List<EnumerationValueDeclaration>) Conversions.doWrapArray(values.getEnumArrayValue("enumValue"))).size());
Assert.assertEquals(0, ((List<AnnotationReference>) Conversions.doWrapArray(values.getAnnotationArrayValue("annotationValue"))).size());
};
this.assertProcessing(_mappedTo, _mappedTo_1, _function);
}
use of org.eclipse.xtend.core.macro.declaration.CompilationUnitImpl in project xtext-xtend by eclipse.
the class AbstractReusableActiveAnnotationTests method testBug441081.
@Test
public void testBug441081() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package bug441081");
_builder.newLine();
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.Active");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
_builder.newLine();
_builder.newLine();
_builder.append("interface GenericInterface {");
_builder.newLine();
_builder.append("\t");
_builder.append("def <T> T m()");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("@Active(Bug441081Processor)");
_builder.newLine();
_builder.append("annotation Bug441081 {");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("class Bug441081Processor extends AbstractClassProcessor {");
_builder.newLine();
_builder.append("\t");
_builder.append("override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("annotatedClass.implementedInterfaces = annotatedClass.implementedInterfaces + #[findTypeGlobally(GenericInterface).newTypeReference]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("annotatedClass.addMethod(\"m\") [");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("returnType = addTypeParameter(\"T\", object).newTypeReference");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("body = \'");
_builder.append("\'\'return null;\'");
_builder.append("\'\'");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("primarySourceElement = annotatedClass");
_builder.newLine();
_builder.append("\t\t");
_builder.append("]");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
Pair<String, String> _mappedTo = Pair.<String, String>of("bug441081/Bug441081.xtend", _builder.toString());
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("import bug441081.Bug441081");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("@Bug441081");
_builder_1.newLine();
_builder_1.append("class Bug441081Client {");
_builder_1.newLine();
_builder_1.append("}");
_builder_1.newLine();
Pair<String, String> _mappedTo_1 = Pair.<String, String>of("Bug441081Client.xtend", _builder_1.toString());
final Procedure1<CompilationUnitImpl> _function = (CompilationUnitImpl it) -> {
final MutableClassDeclaration c = it.getTypeLookup().findClass("Bug441081Client");
Type _type = c.findDeclaredMethod("m").getReturnType().getType();
final TypeParameterDeclaration typeParam = ((TypeParameterDeclaration) _type);
Assert.assertFalse(IterableExtensions.isEmpty(typeParam.getUpperBounds()));
this.validator.assertNoIssues(it.getXtendFile());
};
this.assertProcessing(_mappedTo, _mappedTo_1, _function);
}
use of org.eclipse.xtend.core.macro.declaration.CompilationUnitImpl in project xtext-xtend by eclipse.
the class AbstractReusableActiveAnnotationTests method testInferredMethodReturnType.
@Test
public void testInferredMethodReturnType() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package myannotation");
_builder.newLine();
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.AbstractMethodProcessor");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.Active");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableMethodDeclaration");
_builder.newLine();
_builder.newLine();
_builder.append("@Active(MyAnnotationProcessor)");
_builder.newLine();
_builder.append("annotation MyAnnotation {");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("class MyAnnotationProcessor extends AbstractMethodProcessor {");
_builder.newLine();
_builder.newLine();
_builder.append("\t");
_builder.append("override doTransform(MutableMethodDeclaration annotatedMethod, extension TransformationContext context) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("annotatedMethod.declaringType.addField(annotatedMethod.simpleName + \'_field\') [");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("type = annotatedMethod.returnType");
_builder.newLine();
_builder.append("\t\t");
_builder.append("]");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("}");
_builder.newLine();
Pair<String, String> _mappedTo = Pair.<String, String>of("myannotation/MyAnnotation.xtend", _builder.toString());
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("package myusercode");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("import myannotation.MyAnnotation");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("class Client {");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("@MyAnnotation");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("def bar() {");
_builder_1.newLine();
_builder_1.append("\t\t");
_builder_1.append("1");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("}");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("@MyAnnotation");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("def create new Integer(1) foo() {");
_builder_1.newLine();
_builder_1.append("\t");
_builder_1.append("}");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("}");
_builder_1.newLine();
Pair<String, String> _mappedTo_1 = Pair.<String, String>of("myusercode/UserCode.xtend", _builder_1.toString());
final Procedure1<CompilationUnitImpl> _function = (CompilationUnitImpl it) -> {
final MutableClassDeclaration foo = it.getTypeLookup().findClass("myusercode.Client");
final TypeReference barType = foo.findDeclaredField("bar_field").getType();
this.assertSameType(barType, it.getTypeReferenceProvider().getPrimitiveInt());
this.assertSameType(barType, foo.findDeclaredMethod("bar").getReturnType());
final TypeReference fooType = foo.findDeclaredField("foo_field").getType();
this.assertSameType(fooType, it.getTypeReferenceProvider().newTypeReference(Integer.class));
this.assertSameType(fooType, foo.findDeclaredMethod("foo").getReturnType());
};
this.assertProcessing(_mappedTo, _mappedTo_1, _function);
}
use of org.eclipse.xtend.core.macro.declaration.CompilationUnitImpl in project xtext-xtend by eclipse.
the class AbstractReusableActiveAnnotationTests method testIntroduceNewTypes.
@Test
public void testIntroduceNewTypes() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package myannotation");
_builder.newLine();
_builder.newLine();
_builder.append("import java.util.List");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.Active");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.RegisterGlobalsContext");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.RegisterGlobalsParticipant");
_builder.newLine();
_builder.append("import org.eclipse.xtend.lib.macro.declaration.ClassDeclaration");
_builder.newLine();
_builder.newLine();
_builder.append("@Active(typeof(NewTypesAddingAnnotationProcessor))");
_builder.newLine();
_builder.append("annotation NewTypesAddingAnnotation { }");
_builder.newLine();
_builder.append("class NewTypesAddingAnnotationProcessor implements RegisterGlobalsParticipant<ClassDeclaration> {");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("override doRegisterGlobals(List<? extends ClassDeclaration> sourceClasses, RegisterGlobalsContext context) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("for (clazz : sourceClasses) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("context.registerClass(clazz.qualifiedName+\".InnerClass\")");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("context.registerInterface(clazz.qualifiedName+\"Interface\")");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("context.registerEnumerationType(clazz.qualifiedName+\"Enum\")");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("context.registerAnnotationType(clazz.qualifiedName+\"Annotation\")");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
Pair<String, String> _mappedTo = Pair.<String, String>of("myannotation/NewTypesAddingAnnotation.xtend", _builder.toString());
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("package myusercode");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("@myannotation.NewTypesAddingAnnotation");
_builder_1.newLine();
_builder_1.append("class MyClass {");
_builder_1.newLine();
_builder_1.append("}");
_builder_1.newLine();
Pair<String, String> _mappedTo_1 = Pair.<String, String>of("myusercode/UserCode.xtend", _builder_1.toString());
final Procedure1<CompilationUnitImpl> _function = (CompilationUnitImpl it) -> {
Assert.assertNotNull(it.getTypeLookup().findClass("myusercode.MyClass"));
Assert.assertNotNull(it.getTypeLookup().findClass("myusercode.MyClass.InnerClass"));
Assert.assertNotNull(it.getTypeLookup().findInterface("myusercode.MyClassInterface"));
Assert.assertNotNull(it.getTypeLookup().findEnumerationType("myusercode.MyClassEnum"));
Assert.assertNotNull(it.getTypeLookup().findAnnotationType("myusercode.MyClassAnnotation"));
};
this.assertProcessing(_mappedTo, _mappedTo_1, _function);
}
Aggregations