Program: 27539
Project: 27539
Buggy source:
/** 
 * Initializes a message builder from a CALL node. <p> The tree should look something like: <pre> call |-- getprop |   |-- name 'goog' |   +-- string 'getMsg' | |-- string 'Hi {$userName}! Welcome to {$product}.' +-- objlit |-- string 'userName' |-- name 'someUserName' |-- string 'product' +-- call +-- name 'getProductName' </pre>
 * @param builder the message builder
 * @param node the call node from where we extract the message
 * @throws MalformedException if the parsed message is invalid
 */
private void extractFromCallNode(Builder builder,Node node) throws MalformedException {
  if (!node.isCall()) {
    throw new MalformedException("String_Node_Str" + MSG_FUNCTION_NAME + "String_Node_Str",node);
  }
  Node fnNameNode=node.getFirstChild();
  if (!fnNameNode.matchesQualifiedName(MSG_FUNCTION_NAME)) {
    throw new MalformedException("String_Node_Str" + "String_Node_Str" + MSG_FUNCTION_NAME + "String_Node_Str",fnNameNode);
  }
  Node stringLiteralNode=fnNameNode.getNext();
  if (stringLiteralNode == null) {
    throw new MalformedException("String_Node_Str",stringLiteralNode);
  }
  parseMessageTextNode(builder,stringLiteralNode);
  Node objLitNode=stringLiteralNode.getNext();
  Set<String> phNames=new HashSet<>();
  if (objLitNode != null) {
    if (!objLitNode.isObjectLit()) {
      throw new MalformedException("String_Node_Str",objLitNode);
    }
    for (Node aNode=objLitNode.getFirstChild(); aNode != null; aNode=aNode.getNext()) {
      if (!aNode.isStringKey()) {
        throw new MalformedException("String_Node_Str",aNode);
      }
      String phName=aNode.getString();
      if (!isLowerCamelCaseWithNumericSuffixes(phName)) {
        throw new MalformedException("String_Node_Str" + phName,aNode);
      }
      if (phNames.contains(phName)) {
        throw new MalformedException("String_Node_Str" + phName,aNode);
      }
      phNames.add(phName);
    }
  }
  Set<String> usedPlaceholders=builder.getPlaceholders();
  for (  String phName : usedPlaceholders) {
    if (!phNames.contains(phName)) {
      throw new MalformedException("String_Node_Str" + phName,objLitNode);
    }
  }
  for (  String phName : phNames) {
    if (!usedPlaceholders.contains(phName)) {
      throw new MalformedException("String_Node_Str" + phName,objLitNode);
    }
  }
}

Fixed version (ground truth):
/** 
 * Initializes a message builder from a CALL node. <p> The tree should look something like: <pre> call |-- getprop |   |-- name 'goog' |   +-- string 'getMsg' | |-- string 'Hi {$userName}! Welcome to {$product}.' +-- objlit |-- string 'userName' |-- name 'someUserName' |-- string 'product' +-- call +-- name 'getProductName' </pre>
 * @param builder the message builder
 * @param node the call node from where we extract the message
 * @throws MalformedException if the parsed message is invalid
 */
private void extractFromCallNode(Builder builder,Node node) throws MalformedException {
  if (!node.isCall()) {
    throw new MalformedException("String_Node_Str" + MSG_FUNCTION_NAME + "String_Node_Str",node);
  }
  Node fnNameNode=node.getFirstChild();
  if (!fnNameNode.matchesQualifiedName(MSG_FUNCTION_NAME)) {
    throw new MalformedException("String_Node_Str" + "String_Node_Str" + MSG_FUNCTION_NAME + "String_Node_Str",fnNameNode);
  }
  Node stringLiteralNode=fnNameNode.getNext();
  if (stringLiteralNode == null) {
    throw new MalformedException("String_Node_Str",stringLiteralNode);
  }
  parseMessageTextNode(builder,stringLiteralNode);
  Node objLitNode=stringLiteralNode.getNext();
  Set<String> phNames=new HashSet<>();
  if (objLitNode != null) {
    if (!objLitNode.isObjectLit()) {
      throw new MalformedException("String_Node_Str",objLitNode);
    }
    for (Node aNode=objLitNode.getFirstChild(); aNode != null; aNode=aNode.getNext()) {
      if (!aNode.isStringKey()) {
        throw new MalformedException("String_Node_Str",aNode);
      }
      String phName=aNode.getString();
      if (!isLowerCamelCaseWithNumericSuffixes(phName)) {
        throw new MalformedException("String_Node_Str" + phName,aNode);
      }
      if (phNames.contains(phName)) {
        throw new MalformedException("String_Node_Str" + phName,aNode);
      }
      phNames.add(phName);
    }
  }
  Set<String> usedPlaceholders=builder.getPlaceholders();
  for (  String phName : usedPlaceholders) {
    if (!phNames.contains(phName)) {
      throw new MalformedException("String_Node_Str" + phName,node);
    }
  }
  for (  String phName : phNames) {
    if (!usedPlaceholders.contains(phName)) {
      throw new MalformedException("String_Node_Str" + phName,node);
    }
  }
}