Only send the relevant characters into the matcher
diff --git a/src/main/java/com/squareup/javapoet/CodeBlock.java b/src/main/java/com/squareup/javapoet/CodeBlock.java
index 6fcdb59..1ed5b53 100644
--- a/src/main/java/com/squareup/javapoet/CodeBlock.java
+++ b/src/main/java/com/squareup/javapoet/CodeBlock.java
@@ -62,7 +62,7 @@
*/
public final class CodeBlock {
private static final Pattern NAMED_ARGUMENT =
- Pattern.compile("\\$(?<argumentName>[\\w_]+):(?<typeChar>[\\w]).*", Pattern.DOTALL);
+ Pattern.compile("\\$(?<argumentName>[\\w_]+):(?<typeChar>[\\w]).*");
private static final Pattern LOWERCASE = Pattern.compile("[a-z]+[\\w_]*");
/** A heterogeneous list containing string literals and value placeholders. */
@@ -151,15 +151,21 @@
formatParts.add(format.substring(p, nextP));
p = nextP;
}
- Matcher matcher = NAMED_ARGUMENT.matcher(format.subSequence(p, format.length()));
- if (matcher.matches()) {
+
+ Matcher matcher = null;
+ int colon = format.indexOf(':', p);
+ if (colon != -1) {
+ int endIndex = Math.min(colon + 2, format.length());
+ matcher = NAMED_ARGUMENT.matcher(format.substring(p, endIndex));
+ }
+ if (matcher != null && matcher.lookingAt()) {
String argumentName = matcher.group("argumentName");
checkArgument(arguments.containsKey(argumentName), "Missing named argument for $%s",
argumentName);
char formatChar = matcher.group("typeChar").charAt(0);
addArgument(format, formatChar, arguments.get(argumentName));
formatParts.add("$" + formatChar);
- p += matcher.regionStart() + argumentName.length() + 3;
+ p += matcher.regionEnd();
} else {
checkArgument(p < format.length() - 1, "dangling $ at end");
checkArgument(isNoArgPlaceholder(format.charAt(p + 1)),