Skip to content

Commit 497eff6

Browse files
committed
StringToArrayConverter: purge Parsington usage
The "Use ParseService" commit (73239ad) was an incomplete update. This commit finishes the job, and fixes a bug in the recursive canConvert logic for multidimensional arrays.
1 parent 42db182 commit 497eff6

File tree

1 file changed

+10
-28
lines changed

1 file changed

+10
-28
lines changed

src/main/java/org/scijava/convert/StringToArrayConverter.java

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,16 @@
2929

3030
package org.scijava.convert;
3131

32+
import java.lang.reflect.Array;
33+
import java.lang.reflect.Type;
34+
3235
import org.scijava.Priority;
3336
import org.scijava.parse.Items;
3437
import org.scijava.parse.ParseService;
35-
import org.scijava.parsington.ExpressionParser;
36-
import org.scijava.parsington.SyntaxTree;
3738
import org.scijava.plugin.Parameter;
3839
import org.scijava.plugin.Plugin;
3940
import org.scijava.util.Types;
4041

41-
import java.lang.reflect.Array;
42-
import java.lang.reflect.Type;
43-
4442
/**
4543
* A {@link Converter} that specializes in converting {@link String}s to
4644
* n-dimensional arrays. This {@link Converter} can convert any array whose
@@ -58,8 +56,6 @@ public class StringToArrayConverter extends AbstractConverter<String, Object> {
5856
@Parameter(required = false)
5957
private ParseService parseService;
6058

61-
private final ExpressionParser parser = new ExpressionParser();
62-
6359
@Override
6460
public boolean canConvert(final Class<?> src, final Class<?> dest) {
6561
if (src == null) return false;
@@ -80,22 +76,22 @@ public boolean canConvert(final Object src, final Class<?> dest) {
8076
// First, ensure the base types conform
8177
if (!canConvert(src.getClass(), dest)) return false;
8278
// Then, ensure we can parse the string
83-
SyntaxTree tree;
79+
Items tree;
8480
try {
85-
tree = parser.parseTree((String) src);
81+
tree = parseService.parse((String) src);
8682
}
87-
catch (IllegalArgumentException e) {
83+
catch (final IllegalArgumentException e) {
8884
return false;
8985
}
9086
// We can always convert empty arrays as we don't have to create Objects
91-
if (tree.count() == 0) return true;
87+
if (tree.size() == 0) return true;
9288
// Finally, ensure that we can convert the elements of the array.
9389
// NB this check is merely a heuristic. In the case of a heterogeneous
9490
// array, canConvert may falsely return positive, if later elements in the
9591
// string-ified array cannot be converted into Objects. We make this
9692
// compromise in the interest of speed, however, as ensuring correctness
9793
// would require a premature conversion of the entire array.
98-
Object testSrc = firstElement(tree);
94+
Object testSrc = tree.get(0).value();
9995
Class<?> testDest = unitComponentType(dest);
10096
return convertService.supports(testSrc, testDest);
10197
}
@@ -111,7 +107,7 @@ public Object convert(Object src, Type dest) {
111107
parseService.parse((String) src), //
112108
Types.raw(componentType));
113109
}
114-
catch (IllegalArgumentException e) {
110+
catch (final IllegalArgumentException e) {
115111
return null;
116112
}
117113
}
@@ -161,20 +157,6 @@ private Object convertToArray(Items tree, final Class<?> componentType) {
161157
*/
162158
private Class<?> unitComponentType(Class<?> c) {
163159
if (!c.isArray()) return c;
164-
return unitComponentType(c.getComponentType());
160+
return c.getComponentType();
165161
}
166-
167-
/**
168-
* Traverses {@code tree} to find the first element
169-
*
170-
* @param tree the {@link SyntaxTree} containing elements
171-
* @return the first {@link Object} in {@code tree}
172-
*/
173-
private Object firstElement(SyntaxTree tree) {
174-
while (tree.count() > 0) {
175-
tree = tree.child(0);
176-
}
177-
return tree.token();
178-
}
179-
180162
}

0 commit comments

Comments
 (0)