Skip to content

Commit

Permalink
Support for multi-dimensional arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Dec 11, 2012
1 parent 917c9c7 commit 02cfb21
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 27 deletions.
Expand Up @@ -68,6 +68,4 @@ public interface Field<O extends JavaSource<O>> extends Member<O, Field<O>>
Field<O> setStringInitializer(String value);

boolean isPrimitive();

boolean isArray();
}
Expand Up @@ -12,7 +12,7 @@

/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*
*
*/
public interface Type<O extends JavaSource<O>> extends Origin<O>
{
Expand All @@ -26,6 +26,8 @@ public interface Type<O extends JavaSource<O>> extends Origin<O>

public abstract boolean isArray();

public abstract int getArrayDimensions();

public abstract boolean isParameterized();

public abstract boolean isPrimitive();
Expand All @@ -34,4 +36,5 @@ public interface Type<O extends JavaSource<O>> extends Origin<O>

public abstract boolean isWildcard();


}
Expand Up @@ -29,7 +29,7 @@ public class Types
// [S=short,
// [Z=boolean
private static final Pattern CLASS_ARRAY_PATTERN = Pattern.compile("\\[+(B|F|C|D|I|J|S|Z|L)([0-9a-zA-Z\\.\\$]*);?");
private static final Pattern SIMPLE_ARRAY_PATTERN = Pattern.compile("(.*)\\[\\]");
private static final Pattern SIMPLE_ARRAY_PATTERN = Pattern.compile("([0-9a-zA-Z\\.\\$\\<\\>\\,]+)(\\[\\])+");
private static final Pattern GENERIC_PATTERN = Pattern.compile(".*<.*>$");

private static final List<String> LANG_TYPES = Arrays.asList(
Expand Down Expand Up @@ -324,4 +324,29 @@ public static boolean isPrimitive(final String result)
{
return Arrays.asList("byte", "short", "int", "long", "float", "double", "boolean", "char").contains(result);
}

/**
* Returns the dimension of the array.
*
* It simply counts the "[" from the string.
*
* @param name an array type, e.g.: byte[] or [Ljava.lang.Boolean;
* @return the array dimension. -1 if the type is not a valid array
*/
public static int getArrayDimension(String name)
{
if (!Types.isArray(name))
{
return -1;
}
int count = 0;
for (char c : name.toCharArray())
{
if (c == '[')
{
count++;
}
}
return count;
}
}
Expand Up @@ -162,24 +162,25 @@ public Import addImport(final Import imprt)
@Override
public Import addImport(final String className)
{
String strippedClassName = Types.stripGenerics(Types.stripArray(className));
Import imprt;
if (Types.isSimpleName(className) && !hasImport(className))
if (Types.isSimpleName(strippedClassName) && !hasImport(strippedClassName))
{
throw new IllegalArgumentException("Cannot import class without a package [" + className + "]");
throw new IllegalArgumentException("Cannot import class without a package [" + strippedClassName + "]");
}

if (!hasImport(className) && validImport(className))
if (!hasImport(strippedClassName) && validImport(strippedClassName))
{
imprt = new ImportImpl(this).setName(className);
imprt = new ImportImpl(this).setName(strippedClassName);
unit.imports().add(imprt.getInternal());
}
else if (hasImport(className))
else if (hasImport(strippedClassName))
{
imprt = getImport(className);
imprt = getImport(strippedClassName);
}
else
{
throw new IllegalArgumentException("Attempted to import the illegal type [" + className + "]");
throw new IllegalArgumentException("Attempted to import the illegal type [" + strippedClassName + "]");
}
return imprt;
}
Expand Down
Expand Up @@ -387,13 +387,14 @@ public Field<O> setType(final String typeName)
if (Types.isArray(typeName))
{
String arrayType = Types.stripArray(typeName);
int arrayDimension = Types.getArrayDimension(typeName);
if (Types.isPrimitive(arrayType))
{
type = ast.newArrayType(ast.newPrimitiveType(PrimitiveType.toCode(arrayType)));
type = ast.newArrayType(ast.newPrimitiveType(PrimitiveType.toCode(arrayType)), arrayDimension);
}
else
{
type = ast.newArrayType(ast.newSimpleType(ast.newSimpleName(arrayType)));
type = ast.newArrayType(ast.newSimpleType(ast.newSimpleName(arrayType)), arrayDimension);
}
}
else
Expand Down Expand Up @@ -524,6 +525,9 @@ else if (!field.equals(other.field))
return true;
}

/**
* TODO: Should we deprecate this method in favor of {@link Field#getTypeInspector()#isPrimitive()} ?
*/
@Override
public boolean isPrimitive()
{
Expand All @@ -535,16 +539,4 @@ public boolean isPrimitive()
}
return result;
}

@Override
public boolean isArray()
{
boolean result = false;
Type type = field.getType();
if (type != null)
{
result = type.isArrayType();
}
return result;
}
}
Expand Up @@ -92,7 +92,8 @@ public List<Type<O>> getTypeArguments()
if (type instanceof ParameterizedType)
{
List<org.eclipse.jdt.core.dom.Type> arguments = ((ParameterizedType) type).typeArguments();
for (org.eclipse.jdt.core.dom.Type t : arguments) {
for (org.eclipse.jdt.core.dom.Type t : arguments)
{
result.add(new TypeImpl<O>(origin, this, t));
}
}
Expand Down Expand Up @@ -165,6 +166,16 @@ public Type<O> getParentType()
return parent;
}

@Override
public int getArrayDimensions()
{
if (isArray())
{
return ((ArrayType) type).getDimensions();
}
return -1;
}

@Override
public String toString()
{
Expand Down
Expand Up @@ -213,7 +213,34 @@ public void testFieldTypeByteArrayTest()
field.setName("content");
field.setType(byte[].class);
Assert.assertEquals("byte", field.getQualifiedType());
Assert.assertTrue(field.isArray());
Assert.assertTrue(field.getTypeInspector().isArray());
}

@Test
public void testFieldMultidimensionalArray()
{
final JavaClass javaClass = JavaParser.create(JavaClass.class);
final Field<JavaClass> field = javaClass.addField();
field.setName("content");
field.setType(byte[][][].class);
Assert.assertEquals("byte", field.getQualifiedType());
Type<JavaClass> typeInspector = field.getTypeInspector();
Assert.assertTrue(typeInspector.isArray());
Assert.assertEquals(3, typeInspector.getArrayDimensions());
}


@Test
public void testFieldMultidimensionalArray2()
{
final JavaClass javaClass = JavaParser.create(JavaClass.class);
final Field<JavaClass> field = javaClass.addField();
field.setName("content");
field.setType(java.util.Vector[][][].class);
Assert.assertEquals("java.util.Vector", field.getQualifiedType());
Type<JavaClass> typeInspector = field.getTypeInspector();
Assert.assertTrue(typeInspector.isArray());
Assert.assertEquals(3, typeInspector.getArrayDimensions());
Assert.assertEquals("Vector", field.getType());
}
}
Expand Up @@ -93,5 +93,18 @@ public void testArray()

assertEquals("int", Types.stripArray(int[][][][][].class.getName()));

assertEquals("int", Types.stripArray(int[][][][][].class.getSimpleName()));
assertEquals("List<Long>", Types.stripArray("List<Long>[]"));

}

@Test
public void testArrayDimensions()
{
assertEquals(-1, Types.getArrayDimension(Boolean.class.getName()));
assertEquals(1, Types.getArrayDimension(int[].class.getName()));
assertEquals(2, Types.getArrayDimension(int[][].class.getName()));
assertEquals(3, Types.getArrayDimension(int[][][].class.getName()));

}
}

0 comments on commit 02cfb21

Please sign in to comment.