Skip to content

Commit 7badf29

Browse files
committed
ROASTER-36: Fixed PropertyImpl.setType
1 parent d2f27e4 commit 7badf29

5 files changed

Lines changed: 91 additions & 9 deletions

File tree

api/src/main/java/org/jboss/forge/roaster/model/source/PropertyHolderSource.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import java.util.List;
1111

12+
import org.jboss.forge.roaster.model.JavaType;
1213
import org.jboss.forge.roaster.model.Property;
1314
import org.jboss.forge.roaster.model.PropertyHolder;
1415

@@ -25,6 +26,16 @@ public interface PropertyHolderSource<O extends JavaSource<O>> extends
2526
*/
2627
PropertySource<O> addProperty(String type, String name);
2728

29+
/**
30+
* Add a new {@link Property} declaration to this {@link O} instance.
31+
*/
32+
PropertySource<O> addProperty(Class<?> type, String name);
33+
34+
/**
35+
* Add a new {@link Property} declaration to this {@link O} instance.
36+
*/
37+
PropertySource<O> addProperty(JavaType<?> type, String name);
38+
2839
/**
2940
* Remove the given {@link Property} from this {@link O} instance, if it exists; otherwise, do nothing.
3041
*/

impl/src/main/java/org/jboss/forge/roaster/model/impl/AbstractJavaSourceMemberHolder.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ public boolean hasMethodSignature(final Method<?, ?> method)
310310
Iterator<ParameterSource<O>> localParams = local.getParameters().iterator();
311311
for (Parameter<? extends JavaType<?>> methodParam : method.getParameters())
312312
{
313-
if (localParams.hasNext() && Strings.areEqual(localParams.next().getType().getName(), methodParam.getType().getName()))
313+
if (localParams.hasNext()
314+
&& Strings.areEqual(localParams.next().getType().getName(), methodParam.getType().getName()))
314315
{
315316
continue;
316317
}
@@ -515,6 +516,18 @@ public org.jboss.forge.roaster.model.Type<O> getType()
515516
return getProperty(name);
516517
}
517518

519+
@Override
520+
public PropertySource<O> addProperty(Class<?> type, String name)
521+
{
522+
return addProperty(type.getName(), name);
523+
}
524+
525+
@Override
526+
public PropertySource<O> addProperty(JavaType<?> type, String name)
527+
{
528+
return addProperty(type.getQualifiedName(), name);
529+
}
530+
518531
@Override
519532
public final AbstractJavaSourceMemberHolder<O> removeProperty(Property<O> property)
520533
{

impl/src/main/java/org/jboss/forge/roaster/model/impl/MethodImpl.java

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
import org.eclipse.jdt.core.dom.Block;
1717
import org.eclipse.jdt.core.dom.CompilationUnit;
1818
import org.eclipse.jdt.core.dom.MethodDeclaration;
19+
import org.eclipse.jdt.core.dom.Name;
20+
import org.eclipse.jdt.core.dom.PrimitiveType;
1921
import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
22+
import org.eclipse.jdt.core.dom.PrimitiveType.Code;
2023
import org.eclipse.jdt.core.dom.SimpleName;
2124
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
2225
import org.eclipse.jdt.core.dom.Statement;
@@ -248,13 +251,51 @@ public MethodSource<O> setReturnTypeVoid()
248251
@Override
249252
public MethodSource<O> setReturnType(final String typeName)
250253
{
251-
String stub = "public class Stub { public " + typeName + " method() {} }";
252-
JavaClassSource temp = (JavaClassSource) Roaster.parse(stub);
253-
List<MethodSource<JavaClassSource>> methods = temp.getMethods();
254-
org.eclipse.jdt.core.dom.Type returnType = ((MethodDeclaration) methods.get(0).getInternal()).getReturnType2();
254+
String simpleName = Types.toSimpleName(typeName);
255+
256+
O origin = getOrigin();
257+
if (!Strings.areEqual(typeName, simpleName) && origin.requiresImport(typeName))
258+
{
259+
origin.addImport(typeName);
260+
}
255261

256-
returnType = (org.eclipse.jdt.core.dom.Type) ASTNode.copySubtree(method.getAST(), returnType);
257-
method.setReturnType2(returnType);
262+
Code primitive = PrimitiveType.toCode(typeName);
263+
264+
org.eclipse.jdt.core.dom.Type type = null;
265+
if (primitive != null)
266+
{
267+
type = ast.newPrimitiveType(primitive);
268+
}
269+
else
270+
{
271+
if (!origin.requiresImport(typeName))
272+
{
273+
if (Types.isArray(typeName))
274+
{
275+
String arrayType = Types.stripArray(typeName);
276+
int arrayDimension = Types.getArrayDimension(typeName);
277+
if (Types.isPrimitive(arrayType))
278+
{
279+
type = ast.newArrayType(ast.newPrimitiveType(PrimitiveType.toCode(arrayType)), arrayDimension);
280+
}
281+
else
282+
{
283+
type = ast.newArrayType(ast.newSimpleType(ast.newSimpleName(arrayType)), arrayDimension);
284+
}
285+
}
286+
else
287+
{
288+
type = ast.newSimpleType(ast.newSimpleName(simpleName));
289+
}
290+
}
291+
else
292+
{
293+
String[] className = Types.tokenizeClassName(typeName);
294+
Name name = ast.newName(className);
295+
type = ast.newSimpleType(name);
296+
}
297+
}
298+
method.setReturnType2(type);
258299

259300
return this;
260301
}

impl/src/main/java/org/jboss/forge/roaster/model/impl/PropertyImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.jboss.forge.roaster.model.source.FieldSource;
2626
import org.jboss.forge.roaster.model.source.JavaSource;
2727
import org.jboss.forge.roaster.model.source.MethodSource;
28+
import org.jboss.forge.roaster.model.source.ParameterSource;
2829
import org.jboss.forge.roaster.model.source.PropertyHolderSource;
2930
import org.jboss.forge.roaster.model.source.PropertySource;
3031
import org.jboss.forge.roaster.model.util.Assert;
@@ -339,7 +340,9 @@ public PropertySource<O> setType(String type)
339340
}
340341
if (mutator != null)
341342
{
342-
mutator.setParameters(String.format("%s %s", type, getName()));
343+
for (ParameterSource<O> param : mutator.getParameters())
344+
mutator.removeParameter(param);
345+
mutator.addParameter(type, getName());
343346
}
344347
if (field != null)
345348
{
@@ -450,7 +453,7 @@ public boolean equals(Object obj)
450453
@Override
451454
public int hashCode()
452455
{
453-
// compatible with Java 6:
456+
// compatible with Java 6:
454457
return Arrays.hashCode(new Object[] { getOrigin(), getName() });
455458
}
456459

impl/src/test/java/org/jboss/forge/test/roaster/model/JavaClassPropertyTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
package org.jboss.forge.test.roaster.model;
99

1010
import java.io.InputStream;
11+
import java.sql.Timestamp;
12+
import java.util.Date;
1113
import java.util.List;
1214

1315
import org.jboss.forge.roaster.Roaster;
@@ -59,4 +61,16 @@ public void testBooleanProperties()
5961
Assert.assertNotNull(source.getProperty("myBoolean").getAccessor());
6062
Assert.assertNotNull(source.getProperty("myBoolean").getMutator());
6163
}
64+
65+
@Test
66+
public void testChangePropertyType()
67+
{
68+
JavaClassSource source = Roaster.create(JavaClassSource.class).setName("MyClass");
69+
PropertySource<JavaClassSource> property = source.addProperty(Date.class, "myDate");
70+
property.setType(Timestamp.class);
71+
Assert.assertEquals("Timestamp", source.getField("myDate").getType().getName());
72+
Assert.assertEquals("Timestamp", source.getMethod("getMyDate").getReturnType().getName());
73+
Assert.assertNotNull(source.getMethod("setMyDate", Timestamp.class));
74+
75+
}
6276
}

0 commit comments

Comments
 (0)