public static DataType parse(String typeString) { typeString = StringUtil.trimToEmpty(typeString); DataType dataType = new DataType(); Matcher nameMatcher = Pattern.compile("^(\\w+)").matcher(typeString); if (nameMatcher.find()) { dataType.name = nameMatcher.group(1); } else { return dataType; } Matcher matcher = Pattern.compile("(.*)\\((.*)\\)(.*)").matcher(typeString); if (matcher.find()) { String beforeParens = matcher.group(1); String inParens = matcher.group(2); String afterParens = matcher.group(3); List<String> params = StringUtil.splitAndTrim(inParens, "\\s*,\\s*"); dataType.parameters = params; dataType.clausesBeforeParameters = new StringClauses(" ") .append(StringUtil.trimToNull(beforeParens.substring(dataType.name.length()))); dataType.clausesAfterParameters = new StringClauses(" ").append(afterParens); } else { dataType.clausesBeforeParameters = new StringClauses(" ") .append(StringUtil.trimToNull(typeString.substring(dataType.name.length()))); } dataType.standardType = standardType(dataType.name); if (dataType.standardType != null) { dataType.valueType = dataType.standardType.valueType; } return dataType; }