Program: 27515
Project: 27515
Buggy source:
void add(Node n,Context context){
  if (!cc.continueProcessing()) {
    return;
  }
  if (preserveTypeAnnotations && n.getJSDocInfo() != null) {
    add(JSDocInfoPrinter.print(n.getJSDocInfo()));
  }
  int type=n.getType();
  String opstr=NodeUtil.opToStr(type);
  int childCount=n.getChildCount();
  Node first=n.getFirstChild();
  Node last=n.getLastChild();
  if (opstr != null && first != last) {
    Preconditions.checkState(childCount == 2,"String_Node_Str",opstr,childCount);
    int p=NodeUtil.precedence(type);
    Context rhsContext=getContextForNoInOperator(context);
    if (NodeUtil.isAssignmentOp(n) && NodeUtil.isAssignmentOp(last)) {
      addExpr(first,p,context);
      cc.addOp(opstr,true);
      addExpr(last,p,rhsContext);
    }
 else {
      unrollBinaryOperator(n,type,opstr,context,rhsContext,p,p + 1);
    }
    return;
  }
  cc.startSourceMapping(n);
switch (type) {
case Token.TRY:
{
      Preconditions.checkState(first.getNext().isBlock() && !first.getNext().hasMoreThanOneChild());
      Preconditions.checkState(childCount >= 2 && childCount <= 3);
      add("String_Node_Str");
      add(first,Context.PRESERVE_BLOCK);
      Node catchblock=first.getNext().getFirstChild();
      if (catchblock != null) {
        add(catchblock);
      }
      if (childCount == 3) {
        cc.maybeInsertSpace();
        add("String_Node_Str");
        add(last,Context.PRESERVE_BLOCK);
      }
      break;
    }
case Token.CATCH:
  Preconditions.checkState(childCount == 2);
cc.maybeInsertSpace();
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(last,Context.PRESERVE_BLOCK);
break;
case Token.THROW:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
cc.maybeInsertSpace();
add(first);
cc.endStatement(true);
break;
case Token.RETURN:
add("String_Node_Str");
if (childCount == 1) {
cc.maybeInsertSpace();
add(first);
}
 else {
Preconditions.checkState(childCount == 0);
}
cc.endStatement();
break;
case Token.VAR:
if (first != null) {
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
}
break;
case Token.CONST:
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
break;
case Token.LET:
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
break;
case Token.LABEL_NAME:
Preconditions.checkState(!n.getString().isEmpty());
addIdentifier(n.getString());
break;
case Token.NAME:
addIdentifier(n.getString());
maybeAddOptional(n);
maybeAddTypeDecl(n);
if (first != null && !first.isEmpty()) {
Preconditions.checkState(childCount == 1);
cc.addOp("String_Node_Str",true);
if (first.isComma()) {
addExpr(first,NodeUtil.precedence(Token.ASSIGN),Context.OTHER);
}
 else {
addExpr(first,0,getContextForNoInOperator(context));
}
}
break;
case Token.ARRAYLIT:
add("String_Node_Str");
addArrayList(first);
add("String_Node_Str");
break;
case Token.ARRAY_PATTERN:
addArrayPattern(n);
maybeAddTypeDecl(n);
break;
case Token.PARAM_LIST:
add("String_Node_Str");
addList(first);
add("String_Node_Str");
break;
case Token.DEFAULT_VALUE:
add(first);
maybeAddTypeDecl(n);
cc.addOp("String_Node_Str",true);
add(first.getNext());
break;
case Token.COMMA:
Preconditions.checkState(childCount == 2);
unrollBinaryOperator(n,Token.COMMA,"String_Node_Str",context,getContextForNoInOperator(context),0,0);
break;
case Token.NUMBER:
Preconditions.checkState(childCount == 0);
cc.addNumber(n.getDouble());
break;
case Token.TYPEOF:
case Token.VOID:
case Token.NOT:
case Token.BITNOT:
case Token.POS:
{
Preconditions.checkState(childCount == 1);
cc.addOp(NodeUtil.opToStrNoFail(type),false);
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
break;
}
case Token.NEG:
{
Preconditions.checkState(childCount == 1);
if (n.getFirstChild().isNumber()) {
cc.addNumber(-n.getFirstChild().getDouble());
}
 else {
cc.addOp(NodeUtil.opToStrNoFail(type),false);
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
}
break;
}
case Token.HOOK:
{
Preconditions.checkState(childCount == 3);
int p=NodeUtil.precedence(type);
Context rhsContext=getContextForNoInOperator(context);
addExpr(first,p + 1,context);
cc.addOp("String_Node_Str",true);
addExpr(first.getNext(),1,rhsContext);
cc.addOp("String_Node_Str",true);
addExpr(last,1,rhsContext);
break;
}
case Token.REGEXP:
if (!first.isString() || !last.isString()) {
throw new Error("String_Node_Str");
}
String regexp=regexpEscape(first.getString(),outputCharsetEncoder);
if (childCount == 2) {
add(regexp + last.getString());
}
 else {
Preconditions.checkState(childCount == 1);
add(regexp);
}
break;
case Token.FUNCTION:
{
if (n.getClass() != Node.class) {
throw new Error("String_Node_Str");
}
Preconditions.checkState(childCount == 3);
boolean isArrow=n.isArrowFunction();
boolean notSingleExpr=n.getParent() == null || !n.getParent().isExprResult();
boolean funcNeedsParens=(context == Context.START_OF_EXPR) && (!isArrow || notSingleExpr);
if (funcNeedsParens) {
add("String_Node_Str");
}
if (!isArrow) {
add("String_Node_Str");
}
if (n.isGeneratorFunction()) {
add("String_Node_Str");
if (!first.getString().isEmpty()) {
cc.maybeInsertSpace();
}
}
add(first);
maybeAddGenericTypes(first);
add(first.getNext());
maybeAddTypeDecl(n);
if (isArrow) {
cc.addOp("String_Node_Str",true);
}
add(last,Context.PRESERVE_BLOCK);
cc.endFunction(context == Context.STATEMENT);
if (funcNeedsParens) {
add("String_Node_Str");
}
break;
}
case Token.REST:
add("String_Node_Str");
add(n.getString());
maybeAddTypeDecl(n);
break;
case Token.SPREAD:
add("String_Node_Str");
add(n.getFirstChild());
break;
case Token.EXPORT:
add("String_Node_Str");
if (n.getBooleanProp(Node.EXPORT_DEFAULT)) {
add("String_Node_Str");
}
if (n.getBooleanProp(Node.EXPORT_ALL_FROM)) {
add("String_Node_Str");
Preconditions.checkState(first != null && first.isEmpty());
}
 else {
add(first);
}
if (childCount == 2) {
add("String_Node_Str");
add(last);
}
cc.endStatement();
break;
case Token.MODULE:
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(last);
cc.endStatement();
break;
case Token.IMPORT:
add("String_Node_Str");
Node second=first.getNext();
if (!first.isEmpty()) {
add(first);
if (!second.isEmpty()) {
cc.listSeparator();
}
}
if (!second.isEmpty()) {
add(second);
}
if (!first.isEmpty() || !second.isEmpty()) {
add("String_Node_Str");
}
add(last);
cc.endStatement();
break;
case Token.EXPORT_SPECS:
case Token.IMPORT_SPECS:
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c != first) {
cc.listSeparator();
}
add(c);
}
add("String_Node_Str");
break;
case Token.EXPORT_SPEC:
case Token.IMPORT_SPEC:
add(first);
if (first != last) {
add("String_Node_Str");
add(last);
}
break;
case Token.IMPORT_STAR:
add("String_Node_Str");
add("String_Node_Str");
add(n.getString());
break;
case Token.CLASS:
{
Preconditions.checkState(childCount == 3);
boolean classNeedsParens=(context == Context.START_OF_EXPR);
if (classNeedsParens) {
add("String_Node_Str");
}
Node name=first;
Node superClass=first.getNext();
Node members=last;
add("String_Node_Str");
if (!name.isEmpty()) {
add(name);
}
maybeAddGenericTypes(first);
if (!superClass.isEmpty()) {
add("String_Node_Str");
add(superClass);
}
Node interfaces=(Node)n.getProp(Node.IMPLEMENTS);
if (interfaces != null) {
add("String_Node_Str");
Node child=interfaces.getFirstChild();
add(child);
while ((child=child.getNext()) != null) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(child);
}
}
add(members);
cc.endClass(context == Context.STATEMENT);
if (classNeedsParens) {
add("String_Node_Str");
}
}
break;
case Token.CLASS_MEMBERS:
case Token.INTERFACE_MEMBERS:
cc.beginBlock();
for (Node c=first; c != null; c=c.getNext()) {
add(c);
cc.endLine();
}
cc.endBlock(false);
break;
case Token.ENUM_MEMBERS:
cc.beginBlock();
for (Node c=first; c != null; c=c.getNext()) {
add(c);
if (c.getNext() != null) {
add("String_Node_Str");
}
cc.endLine();
}
cc.endBlock(false);
break;
case Token.GETTER_DEF:
case Token.SETTER_DEF:
case Token.MEMBER_FUNCTION_DEF:
case Token.MEMBER_VARIABLE_DEF:
{
n.getParent().toStringTree();
Preconditions.checkState(n.getParent().isObjectLit() || n.getParent().isClassMembers() || n.getParent().isInterfaceMembers()|| n.getParent().isRecordType());
if (n.isStaticMember()) {
add("String_Node_Str");
}
if (!n.isMemberVariableDef() && n.getFirstChild().isGeneratorFunction()) {
Preconditions.checkState(type == Token.MEMBER_FUNCTION_DEF);
add("String_Node_Str");
}
switch (type) {
case Token.GETTER_DEF:
Preconditions.checkState(!first.getChildAtIndex(1).hasChildren());
add("String_Node_Str");
break;
case Token.SETTER_DEF:
Preconditions.checkState(first.getChildAtIndex(1).hasOneChild());
add("String_Node_Str");
break;
case Token.MEMBER_FUNCTION_DEF:
case Token.MEMBER_VARIABLE_DEF:
break;
}
String name=n.getString();
if (n.isMemberVariableDef()) {
add(n.getString());
maybeAddOptional(n);
maybeAddTypeDecl(n);
if (!n.getParent().isRecordType()) {
add("String_Node_Str");
}
}
 else {
Preconditions.checkState(childCount == 1);
Preconditions.checkState(first.isFunction());
Preconditions.checkState(first.getFirstChild().getString().isEmpty());
Node fn=first;
Node parameters=fn.getChildAtIndex(1);
Node body=fn.getLastChild();
if (!n.isQuotedString() && TokenStream.isJSIdentifier(name) && NodeUtil.isLatin(name)) {
add(name);
maybeAddGenericTypes(fn.getFirstChild());
}
 else {
double d=getSimpleNumber(name);
if (!Double.isNaN(d)) {
cc.addNumber(d);
}
 else {
addJsString(n);
}
}
maybeAddOptional(fn);
add(parameters);
maybeAddTypeDecl(fn);
if (body.isEmpty()) {
add("String_Node_Str");
}
 else {
add(body,Context.PRESERVE_BLOCK);
}
}
break;
}
case Token.SCRIPT:
case Token.BLOCK:
{
if (n.getClass() != Node.class) {
throw new Error("String_Node_Str");
}
boolean preserveBlock=context == Context.PRESERVE_BLOCK;
if (preserveBlock) {
cc.beginBlock();
}
boolean preferLineBreaks=type == Token.SCRIPT || (type == Token.BLOCK && !preserveBlock && n.getParent() != null && n.getParent().isScript());
for (Node c=first; c != null; c=c.getNext()) {
add(c,Context.STATEMENT);
if (NodeUtil.isNameDeclaration(c)) {
cc.endStatement();
}
if (c.isFunction() || c.isClass()) {
cc.maybeLineBreak();
}
if (preferLineBreaks) {
cc.notePreferredLineBreak();
}
}
if (preserveBlock) {
cc.endBlock(cc.breakAfterBlockFor(n,context == Context.STATEMENT));
}
break;
}
case Token.FOR:
if (childCount == 4) {
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
if (NodeUtil.isNameDeclaration(first)) {
add(first,Context.IN_FOR_INIT_CLAUSE);
}
 else {
addExpr(first,0,Context.IN_FOR_INIT_CLAUSE);
}
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
add(first.getNext().getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
 else {
Preconditions.checkState(childCount == 3);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
break;
case Token.FOR_OF:
Preconditions.checkState(childCount == 3);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.DO:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
addNonEmptyStatement(first,Context.OTHER,false);
cc.maybeInsertSpace();
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(last);
add("String_Node_Str");
cc.endStatement();
break;
case Token.WHILE:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.EMPTY:
Preconditions.checkState(childCount == 0);
break;
case Token.GETPROP:
{
Preconditions.checkState(childCount == 2,"String_Node_Str",childCount);
Preconditions.checkState(last.isString(),"String_Node_Str");
boolean needsParens=(first.isNumber());
if (needsParens) {
add("String_Node_Str");
}
addExpr(first,NodeUtil.precedence(type),context);
if (needsParens) {
add("String_Node_Str");
}
if (this.languageMode == LanguageMode.ECMASCRIPT3 && TokenStream.isKeyword(last.getString())) {
add("String_Node_Str");
add(last);
add("String_Node_Str");
}
 else {
add("String_Node_Str");
addIdentifier(last.getString());
}
break;
}
case Token.GETELEM:
Preconditions.checkState(childCount == 2,"String_Node_Str",childCount);
addExpr(first,NodeUtil.precedence(type),context);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
break;
case Token.WITH:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
add(first);
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.INC:
case Token.DEC:
{
Preconditions.checkState(childCount == 1);
String o=type == Token.INC ? "String_Node_Str" : "String_Node_Str";
boolean postProp=n.getBooleanProp(Node.INCRDECR_PROP);
if (postProp) {
addExpr(first,NodeUtil.precedence(type),context);
cc.addOp(o,false);
}
 else {
cc.addOp(o,false);
add(first);
}
break;
}
case Token.CALL:
if (isIndirectEval(first) || n.getBooleanProp(Node.FREE_CALL) && NodeUtil.isGet(first)) {
add("String_Node_Str");
addExpr(first,NodeUtil.precedence(Token.COMMA),Context.OTHER);
add("String_Node_Str");
}
 else {
addExpr(first,NodeUtil.precedence(type),context);
}
Node args=first.getNext();
add("String_Node_Str");
addList(args);
add("String_Node_Str");
break;
case Token.IF:
boolean hasElse=childCount == 3;
boolean ambiguousElseClause=context == Context.BEFORE_DANGLING_ELSE && !hasElse;
if (ambiguousElseClause) {
cc.beginBlock();
}
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
if (childCount == 1) {
break;
}
if (hasElse) {
addNonEmptyStatement(first.getNext(),Context.BEFORE_DANGLING_ELSE,false);
cc.maybeInsertSpace();
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
 else {
addNonEmptyStatement(first.getNext(),Context.OTHER,false);
Preconditions.checkState(childCount == 2);
}
if (ambiguousElseClause) {
cc.endBlock();
}
break;
case Token.NULL:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.THIS:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
break;
case Token.SUPER:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
break;
case Token.YIELD:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
cc.maybeInsertSpace();
if (n.isYieldFor()) {
add("String_Node_Str");
}
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
break;
case Token.FALSE:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.TRUE:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.CONTINUE:
Preconditions.checkState(childCount <= 1);
add("String_Node_Str");
if (childCount == 1) {
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add("String_Node_Str");
add(first);
}
cc.endStatement();
break;
case Token.DEBUGGER:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
cc.endStatement();
break;
case Token.BREAK:
Preconditions.checkState(childCount <= 1);
add("String_Node_Str");
if (childCount == 1) {
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add("String_Node_Str");
add(first);
}
cc.endStatement();
break;
case Token.EXPR_RESULT:
Preconditions.checkState(childCount == 1);
add(first,Context.START_OF_EXPR);
cc.endStatement();
break;
case Token.NEW:
add("String_Node_Str");
int precedence=NodeUtil.precedence(type);
if (NodeUtil.containsType(first,Token.CALL,NodeUtil.MATCH_NOT_FUNCTION)) {
precedence=NodeUtil.precedence(first.getType()) + 1;
}
addExpr(first,precedence,Context.OTHER);
Node next=first.getNext();
if (next != null) {
add("String_Node_Str");
addList(next);
add("String_Node_Str");
}
break;
case Token.STRING_KEY:
addStringKey(n);
break;
case Token.STRING:
Preconditions.checkState(childCount == 0,"String_Node_Str");
if (n.getBooleanProp(Node.COOKED_STRING)) {
add("String_Node_Str" + n.getString() + "String_Node_Str");
}
 else {
addJsString(n);
}
break;
case Token.DELPROP:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
add(first);
break;
case Token.OBJECTLIT:
{
boolean needsParens=(context == Context.START_OF_EXPR);
if (needsParens) {
add("String_Node_Str");
}
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c != first) {
cc.listSeparator();
}
Preconditions.checkState(c.isComputedProp() || c.isGetterDef() || c.isSetterDef()|| c.isStringKey()|| c.isMemberFunctionDef());
add(c);
}
add("String_Node_Str");
if (needsParens) {
add("String_Node_Str");
}
break;
}
case Token.COMPUTED_PROP:
if (n.getBooleanProp(Node.COMPUTED_PROP_GETTER)) {
add("String_Node_Str");
}
 else if (n.getBooleanProp(Node.COMPUTED_PROP_SETTER)) {
add("String_Node_Str");
}
 else if (last.getBooleanProp(Node.GENERATOR_FN)) {
add("String_Node_Str");
}
add("String_Node_Str");
add(first);
add("String_Node_Str");
maybeAddTypeDecl(n);
if (n.getBooleanProp(Node.COMPUTED_PROP_METHOD) || n.getBooleanProp(Node.COMPUTED_PROP_GETTER) || n.getBooleanProp(Node.COMPUTED_PROP_SETTER)) {
Node function=first.getNext();
Node params=function.getFirstChild().getNext();
Node body=function.getLastChild();
add(params);
add(body,Context.PRESERVE_BLOCK);
}
 else {
boolean isInClass=n.getParent().getType() == Token.CLASS_MEMBERS;
Node initializer=first.getNext();
if (initializer != null) {
Preconditions.checkState(!isInClass,"String_Node_Str");
cc.addOp("String_Node_Str",false);
add(initializer);
}
 else {
Preconditions.checkState(n.getBooleanProp(Node.COMPUTED_PROP_VARIABLE));
}
if (isInClass) {
add("String_Node_Str");
}
}
break;
case Token.OBJECT_PATTERN:
addObjectPattern(n,context);
maybeAddTypeDecl(n);
break;
case Token.SWITCH:
add("String_Node_Str");
add(first);
add("String_Node_Str");
cc.beginBlock();
addAllSiblings(first.getNext());
cc.endBlock(context == Context.STATEMENT);
break;
case Token.CASE:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
add(first);
addCaseBody(last);
break;
case Token.DEFAULT_CASE:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
addCaseBody(first);
break;
case Token.LABEL:
Preconditions.checkState(childCount == 2);
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add(first);
add("String_Node_Str");
if (!last.isBlock()) {
cc.maybeInsertSpace();
}
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),true);
break;
case Token.CAST:
add("String_Node_Str");
add(first);
add("String_Node_Str");
break;
case Token.TAGGED_TEMPLATELIT:
add(first,Context.START_OF_EXPR);
add(first.getNext());
break;
case Token.TEMPLATELIT:
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c.isString()) {
add(c.getString());
}
 else {
cc.append("String_Node_Str");
add(c.getFirstChild(),Context.START_OF_EXPR);
add("String_Node_Str");
}
}
add("String_Node_Str");
break;
case Token.STRING_TYPE:
add("String_Node_Str");
break;
case Token.BOOLEAN_TYPE:
add("String_Node_Str");
break;
case Token.NUMBER_TYPE:
add("String_Node_Str");
break;
case Token.ANY_TYPE:
add("String_Node_Str");
break;
case Token.VOID_TYPE:
add("String_Node_Str");
break;
case Token.NAMED_TYPE:
add(first);
break;
case Token.ARRAY_TYPE:
addExpr(first,NodeUtil.precedence(Token.ARRAY_TYPE),context);
add("String_Node_Str");
break;
case Token.FUNCTION_TYPE:
Node returnType=first;
add("String_Node_Str");
addList(first.getNext());
add("String_Node_Str");
cc.addOp("String_Node_Str",true);
add(returnType);
break;
case Token.UNION_TYPE:
addList(first,"String_Node_Str");
break;
case Token.RECORD_TYPE:
add("String_Node_Str");
addList(first,false,Context.OTHER,"String_Node_Str");
add("String_Node_Str");
break;
case Token.PARAMETERIZED_TYPE:
add(first);
add("String_Node_Str");
addList(first.getNext());
add("String_Node_Str");
break;
case Token.GENERIC_TYPE_LIST:
add("String_Node_Str");
addList(first,false,Context.STATEMENT,"String_Node_Str");
add("String_Node_Str");
break;
case Token.GENERIC_TYPE:
addIdentifier(n.getString());
if (n.hasChildren()) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(n.getFirstChild());
}
break;
case Token.INTERFACE:
{
Preconditions.checkState(childCount == 3);
Node name=first;
Node superTypes=first.getNext();
Node members=last;
add("String_Node_Str");
add(name);
maybeAddGenericTypes(name);
if (!superTypes.isEmpty()) {
add("String_Node_Str");
Node superType=superTypes.getFirstChild();
add(superType);
while ((superType=superType.getNext()) != null) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(superType);
}
}
add(members);
}
break;
case Token.ENUM:
{
Preconditions.checkState(childCount == 2);
Node name=first;
Node members=last;
add("String_Node_Str");
add(name);
add(members);
break;
}
case Token.TYPE_ALIAS:
add("String_Node_Str");
add(n.getString());
cc.addOp("String_Node_Str",true);
add(last);
cc.endStatement();
break;
case Token.DECLARE:
add("String_Node_Str");
add(first);
cc.endStatement();
break;
default :
throw new RuntimeException("String_Node_Str" + Token.name(type) + "String_Node_Str"+ n.toStringTree());
}
cc.endSourceMapping(n);
}

Fixed version (ground truth):
void add(Node n,Context context){
  if (!cc.continueProcessing()) {
    return;
  }
  if (preserveTypeAnnotations && n.getJSDocInfo() != null) {
    add(JSDocInfoPrinter.print(n.getJSDocInfo()));
  }
  int type=n.getType();
  String opstr=NodeUtil.opToStr(type);
  int childCount=n.getChildCount();
  Node first=n.getFirstChild();
  Node last=n.getLastChild();
  if (opstr != null && first != last) {
    Preconditions.checkState(childCount == 2,"String_Node_Str",opstr,childCount);
    int p=NodeUtil.precedence(type);
    Context rhsContext=getContextForNoInOperator(context);
    if (NodeUtil.isAssignmentOp(n) && NodeUtil.isAssignmentOp(last)) {
      addExpr(first,p,context);
      cc.addOp(opstr,true);
      addExpr(last,p,rhsContext);
    }
 else {
      unrollBinaryOperator(n,type,opstr,context,rhsContext,p,p + 1);
    }
    return;
  }
  cc.startSourceMapping(n);
switch (type) {
case Token.TRY:
{
      Preconditions.checkState(first.getNext().isBlock() && !first.getNext().hasMoreThanOneChild());
      Preconditions.checkState(childCount >= 2 && childCount <= 3);
      add("String_Node_Str");
      add(first,Context.PRESERVE_BLOCK);
      Node catchblock=first.getNext().getFirstChild();
      if (catchblock != null) {
        add(catchblock);
      }
      if (childCount == 3) {
        cc.maybeInsertSpace();
        add("String_Node_Str");
        add(last,Context.PRESERVE_BLOCK);
      }
      break;
    }
case Token.CATCH:
  Preconditions.checkState(childCount == 2);
cc.maybeInsertSpace();
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(last,Context.PRESERVE_BLOCK);
break;
case Token.THROW:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
cc.maybeInsertSpace();
add(first);
cc.endStatement(true);
break;
case Token.RETURN:
add("String_Node_Str");
if (childCount == 1) {
cc.maybeInsertSpace();
add(first);
}
 else {
Preconditions.checkState(childCount == 0);
}
cc.endStatement();
break;
case Token.VAR:
if (first != null) {
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
}
break;
case Token.CONST:
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
break;
case Token.LET:
add("String_Node_Str");
addList(first,false,getContextForNoInOperator(context),"String_Node_Str");
break;
case Token.LABEL_NAME:
Preconditions.checkState(!n.getString().isEmpty());
addIdentifier(n.getString());
break;
case Token.NAME:
addIdentifier(n.getString());
maybeAddOptional(n);
maybeAddTypeDecl(n);
if (first != null && !first.isEmpty()) {
Preconditions.checkState(childCount == 1);
cc.addOp("String_Node_Str",true);
if (first.isComma()) {
addExpr(first,NodeUtil.precedence(Token.ASSIGN),Context.OTHER);
}
 else {
addExpr(first,0,getContextForNoInOperator(context));
}
}
break;
case Token.ARRAYLIT:
add("String_Node_Str");
addArrayList(first);
add("String_Node_Str");
break;
case Token.ARRAY_PATTERN:
addArrayPattern(n);
maybeAddTypeDecl(n);
break;
case Token.PARAM_LIST:
add("String_Node_Str");
addList(first);
add("String_Node_Str");
break;
case Token.DEFAULT_VALUE:
add(first);
maybeAddTypeDecl(n);
cc.addOp("String_Node_Str",true);
add(first.getNext());
break;
case Token.COMMA:
Preconditions.checkState(childCount == 2);
unrollBinaryOperator(n,Token.COMMA,"String_Node_Str",context,getContextForNoInOperator(context),0,0);
break;
case Token.NUMBER:
Preconditions.checkState(childCount == 0);
cc.addNumber(n.getDouble());
break;
case Token.TYPEOF:
case Token.VOID:
case Token.NOT:
case Token.BITNOT:
case Token.POS:
{
Preconditions.checkState(childCount == 1);
cc.addOp(NodeUtil.opToStrNoFail(type),false);
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
break;
}
case Token.NEG:
{
Preconditions.checkState(childCount == 1);
if (n.getFirstChild().isNumber()) {
cc.addNumber(-n.getFirstChild().getDouble());
}
 else {
cc.addOp(NodeUtil.opToStrNoFail(type),false);
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
}
break;
}
case Token.HOOK:
{
Preconditions.checkState(childCount == 3);
int p=NodeUtil.precedence(type);
Context rhsContext=getContextForNoInOperator(context);
addExpr(first,p + 1,context);
cc.addOp("String_Node_Str",true);
addExpr(first.getNext(),1,rhsContext);
cc.addOp("String_Node_Str",true);
addExpr(last,1,rhsContext);
break;
}
case Token.REGEXP:
if (!first.isString() || !last.isString()) {
throw new Error("String_Node_Str");
}
String regexp=regexpEscape(first.getString(),outputCharsetEncoder);
if (childCount == 2) {
add(regexp + last.getString());
}
 else {
Preconditions.checkState(childCount == 1);
add(regexp);
}
break;
case Token.FUNCTION:
{
if (n.getClass() != Node.class) {
throw new Error("String_Node_Str");
}
Preconditions.checkState(childCount == 3);
if (n.isArrowFunction()) {
addArrowFunction(n,first,last,context);
}
 else {
addFunction(n,first,last,context);
}
break;
}
case Token.REST:
add("String_Node_Str");
add(n.getString());
maybeAddTypeDecl(n);
break;
case Token.SPREAD:
add("String_Node_Str");
add(n.getFirstChild());
break;
case Token.EXPORT:
add("String_Node_Str");
if (n.getBooleanProp(Node.EXPORT_DEFAULT)) {
add("String_Node_Str");
}
if (n.getBooleanProp(Node.EXPORT_ALL_FROM)) {
add("String_Node_Str");
Preconditions.checkState(first != null && first.isEmpty());
}
 else {
add(first);
}
if (childCount == 2) {
add("String_Node_Str");
add(last);
}
cc.endStatement();
break;
case Token.MODULE:
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(last);
cc.endStatement();
break;
case Token.IMPORT:
add("String_Node_Str");
Node second=first.getNext();
if (!first.isEmpty()) {
add(first);
if (!second.isEmpty()) {
cc.listSeparator();
}
}
if (!second.isEmpty()) {
add(second);
}
if (!first.isEmpty() || !second.isEmpty()) {
add("String_Node_Str");
}
add(last);
cc.endStatement();
break;
case Token.EXPORT_SPECS:
case Token.IMPORT_SPECS:
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c != first) {
cc.listSeparator();
}
add(c);
}
add("String_Node_Str");
break;
case Token.EXPORT_SPEC:
case Token.IMPORT_SPEC:
add(first);
if (first != last) {
add("String_Node_Str");
add(last);
}
break;
case Token.IMPORT_STAR:
add("String_Node_Str");
add("String_Node_Str");
add(n.getString());
break;
case Token.CLASS:
{
Preconditions.checkState(childCount == 3);
boolean classNeedsParens=(context == Context.START_OF_EXPR);
if (classNeedsParens) {
add("String_Node_Str");
}
Node name=first;
Node superClass=first.getNext();
Node members=last;
add("String_Node_Str");
if (!name.isEmpty()) {
add(name);
}
maybeAddGenericTypes(first);
if (!superClass.isEmpty()) {
add("String_Node_Str");
add(superClass);
}
Node interfaces=(Node)n.getProp(Node.IMPLEMENTS);
if (interfaces != null) {
add("String_Node_Str");
Node child=interfaces.getFirstChild();
add(child);
while ((child=child.getNext()) != null) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(child);
}
}
add(members);
cc.endClass(context == Context.STATEMENT);
if (classNeedsParens) {
add("String_Node_Str");
}
}
break;
case Token.CLASS_MEMBERS:
case Token.INTERFACE_MEMBERS:
cc.beginBlock();
for (Node c=first; c != null; c=c.getNext()) {
add(c);
cc.endLine();
}
cc.endBlock(false);
break;
case Token.ENUM_MEMBERS:
cc.beginBlock();
for (Node c=first; c != null; c=c.getNext()) {
add(c);
if (c.getNext() != null) {
add("String_Node_Str");
}
cc.endLine();
}
cc.endBlock(false);
break;
case Token.GETTER_DEF:
case Token.SETTER_DEF:
case Token.MEMBER_FUNCTION_DEF:
case Token.MEMBER_VARIABLE_DEF:
{
n.getParent().toStringTree();
Preconditions.checkState(n.getParent().isObjectLit() || n.getParent().isClassMembers() || n.getParent().isInterfaceMembers()|| n.getParent().isRecordType());
if (n.isStaticMember()) {
add("String_Node_Str");
}
if (!n.isMemberVariableDef() && n.getFirstChild().isGeneratorFunction()) {
Preconditions.checkState(type == Token.MEMBER_FUNCTION_DEF);
add("String_Node_Str");
}
switch (type) {
case Token.GETTER_DEF:
Preconditions.checkState(!first.getChildAtIndex(1).hasChildren());
add("String_Node_Str");
break;
case Token.SETTER_DEF:
Preconditions.checkState(first.getChildAtIndex(1).hasOneChild());
add("String_Node_Str");
break;
case Token.MEMBER_FUNCTION_DEF:
case Token.MEMBER_VARIABLE_DEF:
break;
}
String name=n.getString();
if (n.isMemberVariableDef()) {
add(n.getString());
maybeAddOptional(n);
maybeAddTypeDecl(n);
if (!n.getParent().isRecordType()) {
add("String_Node_Str");
}
}
 else {
Preconditions.checkState(childCount == 1);
Preconditions.checkState(first.isFunction());
Preconditions.checkState(first.getFirstChild().getString().isEmpty());
Node fn=first;
Node parameters=fn.getChildAtIndex(1);
Node body=fn.getLastChild();
if (!n.isQuotedString() && TokenStream.isJSIdentifier(name) && NodeUtil.isLatin(name)) {
add(name);
maybeAddGenericTypes(fn.getFirstChild());
}
 else {
double d=getSimpleNumber(name);
if (!Double.isNaN(d)) {
cc.addNumber(d);
}
 else {
addJsString(n);
}
}
maybeAddOptional(fn);
add(parameters);
maybeAddTypeDecl(fn);
if (body.isEmpty()) {
add("String_Node_Str");
}
 else {
add(body,Context.PRESERVE_BLOCK);
}
}
break;
}
case Token.SCRIPT:
case Token.BLOCK:
{
if (n.getClass() != Node.class) {
throw new Error("String_Node_Str");
}
boolean preserveBlock=context == Context.PRESERVE_BLOCK;
if (preserveBlock) {
cc.beginBlock();
}
boolean preferLineBreaks=type == Token.SCRIPT || (type == Token.BLOCK && !preserveBlock && n.getParent() != null && n.getParent().isScript());
for (Node c=first; c != null; c=c.getNext()) {
add(c,Context.STATEMENT);
if (NodeUtil.isNameDeclaration(c)) {
cc.endStatement();
}
if (c.isFunction() || c.isClass()) {
cc.maybeLineBreak();
}
if (preferLineBreaks) {
cc.notePreferredLineBreak();
}
}
if (preserveBlock) {
cc.endBlock(cc.breakAfterBlockFor(n,context == Context.STATEMENT));
}
break;
}
case Token.FOR:
if (childCount == 4) {
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
if (NodeUtil.isNameDeclaration(first)) {
add(first,Context.IN_FOR_INIT_CLAUSE);
}
 else {
addExpr(first,0,Context.IN_FOR_INIT_CLAUSE);
}
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
add(first.getNext().getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
 else {
Preconditions.checkState(childCount == 3);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
break;
case Token.FOR_OF:
Preconditions.checkState(childCount == 3);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.DO:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
addNonEmptyStatement(first,Context.OTHER,false);
cc.maybeInsertSpace();
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(last);
add("String_Node_Str");
cc.endStatement();
break;
case Token.WHILE:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.EMPTY:
Preconditions.checkState(childCount == 0);
break;
case Token.GETPROP:
{
Preconditions.checkState(childCount == 2,"String_Node_Str",childCount);
Preconditions.checkState(last.isString(),"String_Node_Str");
boolean needsParens=(first.isNumber());
if (needsParens) {
add("String_Node_Str");
}
addExpr(first,NodeUtil.precedence(type),context);
if (needsParens) {
add("String_Node_Str");
}
if (this.languageMode == LanguageMode.ECMASCRIPT3 && TokenStream.isKeyword(last.getString())) {
add("String_Node_Str");
add(last);
add("String_Node_Str");
}
 else {
add("String_Node_Str");
addIdentifier(last.getString());
}
break;
}
case Token.GETELEM:
Preconditions.checkState(childCount == 2,"String_Node_Str",childCount);
addExpr(first,NodeUtil.precedence(type),context);
add("String_Node_Str");
add(first.getNext());
add("String_Node_Str");
break;
case Token.WITH:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
add(first);
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
break;
case Token.INC:
case Token.DEC:
{
Preconditions.checkState(childCount == 1);
String o=type == Token.INC ? "String_Node_Str" : "String_Node_Str";
boolean postProp=n.getBooleanProp(Node.INCRDECR_PROP);
if (postProp) {
addExpr(first,NodeUtil.precedence(type),context);
cc.addOp(o,false);
}
 else {
cc.addOp(o,false);
add(first);
}
break;
}
case Token.CALL:
if (isIndirectEval(first) || n.getBooleanProp(Node.FREE_CALL) && NodeUtil.isGet(first)) {
add("String_Node_Str");
addExpr(first,NodeUtil.precedence(Token.COMMA),Context.OTHER);
add("String_Node_Str");
}
 else {
addExpr(first,NodeUtil.precedence(type),context);
}
Node args=first.getNext();
add("String_Node_Str");
addList(args);
add("String_Node_Str");
break;
case Token.IF:
boolean hasElse=childCount == 3;
boolean ambiguousElseClause=context == Context.BEFORE_DANGLING_ELSE && !hasElse;
if (ambiguousElseClause) {
cc.beginBlock();
}
add("String_Node_Str");
cc.maybeInsertSpace();
add("String_Node_Str");
add(first);
add("String_Node_Str");
if (childCount == 1) {
break;
}
if (hasElse) {
addNonEmptyStatement(first.getNext(),Context.BEFORE_DANGLING_ELSE,false);
cc.maybeInsertSpace();
add("String_Node_Str");
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),false);
}
 else {
addNonEmptyStatement(first.getNext(),Context.OTHER,false);
Preconditions.checkState(childCount == 2);
}
if (ambiguousElseClause) {
cc.endBlock();
}
break;
case Token.NULL:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.THIS:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
break;
case Token.SUPER:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
break;
case Token.YIELD:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
cc.maybeInsertSpace();
if (n.isYieldFor()) {
add("String_Node_Str");
}
addExpr(first,NodeUtil.precedence(type),Context.OTHER);
break;
case Token.FALSE:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.TRUE:
Preconditions.checkState(childCount == 0);
cc.addConstant("String_Node_Str");
break;
case Token.CONTINUE:
Preconditions.checkState(childCount <= 1);
add("String_Node_Str");
if (childCount == 1) {
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add("String_Node_Str");
add(first);
}
cc.endStatement();
break;
case Token.DEBUGGER:
Preconditions.checkState(childCount == 0);
add("String_Node_Str");
cc.endStatement();
break;
case Token.BREAK:
Preconditions.checkState(childCount <= 1);
add("String_Node_Str");
if (childCount == 1) {
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add("String_Node_Str");
add(first);
}
cc.endStatement();
break;
case Token.EXPR_RESULT:
Preconditions.checkState(childCount == 1);
add(first,Context.START_OF_EXPR);
cc.endStatement();
break;
case Token.NEW:
add("String_Node_Str");
int precedence=NodeUtil.precedence(type);
if (NodeUtil.containsType(first,Token.CALL,NodeUtil.MATCH_NOT_FUNCTION)) {
precedence=NodeUtil.precedence(first.getType()) + 1;
}
addExpr(first,precedence,Context.OTHER);
Node next=first.getNext();
if (next != null) {
add("String_Node_Str");
addList(next);
add("String_Node_Str");
}
break;
case Token.STRING_KEY:
addStringKey(n);
break;
case Token.STRING:
Preconditions.checkState(childCount == 0,"String_Node_Str");
if (n.getBooleanProp(Node.COOKED_STRING)) {
add("String_Node_Str" + n.getString() + "String_Node_Str");
}
 else {
addJsString(n);
}
break;
case Token.DELPROP:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
add(first);
break;
case Token.OBJECTLIT:
{
boolean needsParens=(context == Context.START_OF_EXPR);
if (needsParens) {
add("String_Node_Str");
}
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c != first) {
cc.listSeparator();
}
Preconditions.checkState(c.isComputedProp() || c.isGetterDef() || c.isSetterDef()|| c.isStringKey()|| c.isMemberFunctionDef());
add(c);
}
add("String_Node_Str");
if (needsParens) {
add("String_Node_Str");
}
break;
}
case Token.COMPUTED_PROP:
if (n.getBooleanProp(Node.COMPUTED_PROP_GETTER)) {
add("String_Node_Str");
}
 else if (n.getBooleanProp(Node.COMPUTED_PROP_SETTER)) {
add("String_Node_Str");
}
 else if (last.getBooleanProp(Node.GENERATOR_FN)) {
add("String_Node_Str");
}
add("String_Node_Str");
add(first);
add("String_Node_Str");
maybeAddTypeDecl(n);
if (n.getBooleanProp(Node.COMPUTED_PROP_METHOD) || n.getBooleanProp(Node.COMPUTED_PROP_GETTER) || n.getBooleanProp(Node.COMPUTED_PROP_SETTER)) {
Node function=first.getNext();
Node params=function.getFirstChild().getNext();
Node body=function.getLastChild();
add(params);
add(body,Context.PRESERVE_BLOCK);
}
 else {
boolean isInClass=n.getParent().getType() == Token.CLASS_MEMBERS;
Node initializer=first.getNext();
if (initializer != null) {
Preconditions.checkState(!isInClass,"String_Node_Str");
cc.addOp("String_Node_Str",false);
add(initializer);
}
 else {
Preconditions.checkState(n.getBooleanProp(Node.COMPUTED_PROP_VARIABLE));
}
if (isInClass) {
add("String_Node_Str");
}
}
break;
case Token.OBJECT_PATTERN:
addObjectPattern(n,context);
maybeAddTypeDecl(n);
break;
case Token.SWITCH:
add("String_Node_Str");
add(first);
add("String_Node_Str");
cc.beginBlock();
addAllSiblings(first.getNext());
cc.endBlock(context == Context.STATEMENT);
break;
case Token.CASE:
Preconditions.checkState(childCount == 2);
add("String_Node_Str");
add(first);
addCaseBody(last);
break;
case Token.DEFAULT_CASE:
Preconditions.checkState(childCount == 1);
add("String_Node_Str");
addCaseBody(first);
break;
case Token.LABEL:
Preconditions.checkState(childCount == 2);
if (!first.isLabelName()) {
throw new Error("String_Node_Str");
}
add(first);
add("String_Node_Str");
if (!last.isBlock()) {
cc.maybeInsertSpace();
}
addNonEmptyStatement(last,getContextForNonEmptyExpression(context),true);
break;
case Token.CAST:
add("String_Node_Str");
add(first);
add("String_Node_Str");
break;
case Token.TAGGED_TEMPLATELIT:
add(first,Context.START_OF_EXPR);
add(first.getNext());
break;
case Token.TEMPLATELIT:
add("String_Node_Str");
for (Node c=first; c != null; c=c.getNext()) {
if (c.isString()) {
add(c.getString());
}
 else {
cc.append("String_Node_Str");
add(c.getFirstChild(),Context.START_OF_EXPR);
add("String_Node_Str");
}
}
add("String_Node_Str");
break;
case Token.STRING_TYPE:
add("String_Node_Str");
break;
case Token.BOOLEAN_TYPE:
add("String_Node_Str");
break;
case Token.NUMBER_TYPE:
add("String_Node_Str");
break;
case Token.ANY_TYPE:
add("String_Node_Str");
break;
case Token.VOID_TYPE:
add("String_Node_Str");
break;
case Token.NAMED_TYPE:
add(first);
break;
case Token.ARRAY_TYPE:
addExpr(first,NodeUtil.precedence(Token.ARRAY_TYPE),context);
add("String_Node_Str");
break;
case Token.FUNCTION_TYPE:
Node returnType=first;
add("String_Node_Str");
addList(first.getNext());
add("String_Node_Str");
cc.addOp("String_Node_Str",true);
add(returnType);
break;
case Token.UNION_TYPE:
addList(first,"String_Node_Str");
break;
case Token.RECORD_TYPE:
add("String_Node_Str");
addList(first,false,Context.OTHER,"String_Node_Str");
add("String_Node_Str");
break;
case Token.PARAMETERIZED_TYPE:
add(first);
add("String_Node_Str");
addList(first.getNext());
add("String_Node_Str");
break;
case Token.GENERIC_TYPE_LIST:
add("String_Node_Str");
addList(first,false,Context.STATEMENT,"String_Node_Str");
add("String_Node_Str");
break;
case Token.GENERIC_TYPE:
addIdentifier(n.getString());
if (n.hasChildren()) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(n.getFirstChild());
}
break;
case Token.INTERFACE:
{
Preconditions.checkState(childCount == 3);
Node name=first;
Node superTypes=first.getNext();
Node members=last;
add("String_Node_Str");
add(name);
maybeAddGenericTypes(name);
if (!superTypes.isEmpty()) {
add("String_Node_Str");
Node superType=superTypes.getFirstChild();
add(superType);
while ((superType=superType.getNext()) != null) {
add("String_Node_Str");
cc.maybeInsertSpace();
add(superType);
}
}
add(members);
}
break;
case Token.ENUM:
{
Preconditions.checkState(childCount == 2);
Node name=first;
Node members=last;
add("String_Node_Str");
add(name);
add(members);
break;
}
case Token.TYPE_ALIAS:
add("String_Node_Str");
add(n.getString());
cc.addOp("String_Node_Str",true);
add(last);
cc.endStatement();
break;
case Token.DECLARE:
add("String_Node_Str");
add(first);
cc.endStatement();
break;
default :
throw new RuntimeException("String_Node_Str" + Token.name(type) + "String_Node_Str"+ n.toStringTree());
}
cc.endSourceMapping(n);
}