Program: 27943
Project: 27943
Buggy source:
/** 
 * Extracts the text found on the current line and all subsequent until either an annotation, end of comment or end of file is reached. Note that if this method detects an end of line as the first token, it will quit immediately (indicating that there is no text where it was expected).  Note that token = info.token; should be called after this method is used to update the token properly in the parser.
 * @param token The start token.
 * @param option How to handle whitespace.
 * @return The extraction information.
 */
@SuppressWarnings("String_Node_Str") private ExtractionInfo extractMultilineTextualBlock(JsDocToken token,WhitespaceOption option){
  if (token == JsDocToken.EOC || token == JsDocToken.EOL || token == JsDocToken.EOF) {
    return new ExtractionInfo("String_Node_Str",token);
  }
  stream.update();
  int startLineno=stream.getLineno();
  int startCharno=stream.getCharno() + 1;
  String line=stream.getRemainingJSDocLine();
  if (option != WhitespaceOption.PRESERVE) {
    line=line.trim();
  }
  StringBuilder builder=new StringBuilder();
  builder.append(line);
  state=State.SEARCHING_ANNOTATION;
  token=next();
  boolean ignoreStar=false;
  int lineStartChar=-1;
  do {
switch (token) {
case STAR:
      if (ignoreStar) {
        lineStartChar=stream.getCharno() + 1;
      }
 else {
        if (builder.length() > 0) {
          builder.append(' ');
        }
        builder.append('*');
      }
    token=next();
  continue;
case EOL:
if (option != WhitespaceOption.SINGLE_LINE) {
  builder.append("String_Node_Str");
}
ignoreStar=true;
lineStartChar=0;
token=next();
continue;
default :
ignoreStar=false;
state=State.SEARCHING_ANNOTATION;
boolean isEOC=token == JsDocToken.EOC;
if (!isEOC) {
if (lineStartChar != -1 && option == WhitespaceOption.PRESERVE) {
int numSpaces=stream.getCharno() - lineStartChar;
for (int i=0; i < numSpaces; i++) {
builder.append(' ');
}
lineStartChar=-1;
}
 else if (builder.length() > 0) {
builder.append(' ');
}
}
if (token == JsDocToken.EOC || token == JsDocToken.EOF || (token == JsDocToken.ANNOTATION && option != WhitespaceOption.PRESERVE)) {
String multilineText=builder.toString();
if (option != WhitespaceOption.PRESERVE) {
multilineText=multilineText.trim();
}
int endLineno=stream.getLineno();
int endCharno=stream.getCharno();
if (multilineText.length() > 0) {
jsdocBuilder.markText(multilineText,startLineno,startCharno,endLineno,endCharno);
}
return new ExtractionInfo(multilineText,token);
}
builder.append(toString(token));
line=stream.getRemainingJSDocLine();
if (option != WhitespaceOption.PRESERVE) {
line=trimEnd(line);
}
builder.append(line);
token=next();
}
}
 while (true);
}

Fixed version (ground truth):
/** 
 * Extracts the text found on the current line and all subsequent until either an annotation, end of comment or end of file is reached. Note that if this method detects an end of line as the first token, it will quit immediately (indicating that there is no text where it was expected).  Note that token = info.token; should be called after this method is used to update the token properly in the parser.
 * @param token The start token.
 * @param option How to handle whitespace.
 * @return The extraction information.
 */
@SuppressWarnings("String_Node_Str") private ExtractionInfo extractMultilineTextualBlock(JsDocToken token,WhitespaceOption option){
  if (token == JsDocToken.EOC || token == JsDocToken.EOL || token == JsDocToken.EOF) {
    return new ExtractionInfo("String_Node_Str",token);
  }
  stream.update();
  int startLineno=stream.getLineno();
  int startCharno=stream.getCharno() + 1;
  String line=getRemainingJSDocLine();
  if (option != WhitespaceOption.PRESERVE) {
    line=line.trim();
  }
  StringBuilder builder=new StringBuilder();
  builder.append(line);
  state=State.SEARCHING_ANNOTATION;
  token=next();
  boolean ignoreStar=false;
  int lineStartChar=-1;
  do {
switch (token) {
case STAR:
      if (ignoreStar) {
        lineStartChar=stream.getCharno() + 1;
      }
 else {
        if (builder.length() > 0) {
          builder.append(' ');
        }
        builder.append('*');
      }
    token=next();
  continue;
case EOL:
if (option != WhitespaceOption.SINGLE_LINE) {
  builder.append("String_Node_Str");
}
ignoreStar=true;
lineStartChar=0;
token=next();
continue;
default :
ignoreStar=false;
state=State.SEARCHING_ANNOTATION;
boolean isEOC=token == JsDocToken.EOC;
if (!isEOC) {
if (lineStartChar != -1 && option == WhitespaceOption.PRESERVE) {
int numSpaces=stream.getCharno() - lineStartChar;
for (int i=0; i < numSpaces; i++) {
builder.append(' ');
}
lineStartChar=-1;
}
 else if (builder.length() > 0) {
builder.append(' ');
}
}
if (token == JsDocToken.EOC || token == JsDocToken.EOF || (token == JsDocToken.ANNOTATION && option != WhitespaceOption.PRESERVE)) {
String multilineText=builder.toString();
if (option != WhitespaceOption.PRESERVE) {
multilineText=multilineText.trim();
}
int endLineno=stream.getLineno();
int endCharno=stream.getCharno();
if (multilineText.length() > 0) {
jsdocBuilder.markText(multilineText,startLineno,startCharno,endLineno,endCharno);
}
return new ExtractionInfo(multilineText,token);
}
builder.append(toString(token));
line=getRemainingJSDocLine();
if (option != WhitespaceOption.PRESERVE) {
line=trimEnd(line);
}
builder.append(line);
token=next();
}
}
 while (true);
}