442 * @param name the name for the new {@code IdentNode}. It will be de-duplicated. 443 * @return a newly constructed {@code IdentNode} with the specified token, finish, and name; the name will 444 * be deduplicated. 445 */ 446 protected IdentNode createIdentNode(final long identToken, final int identFinish, final String name) { 447 final String existingName = canonicalNames.putIfAbsent(name, name); 448 final String canonicalName = existingName != null ? existingName : name; 449 return new IdentNode(identToken, identFinish, canonicalName); 450 } 451 452 /** 453 * Check if current token is in identifier name 454 * 455 * @return true if current token is an identifier name 456 */ 457 protected final boolean isIdentifierName() { 458 final TokenKind kind = type.getKind(); 459 if (kind == TokenKind.KEYWORD || kind == TokenKind.FUTURE || kind == TokenKind.FUTURESTRICT) { 460 return true; 461 } 462 // Fake out identifier. 463 final long identToken = Token.recast(token, IDENT); 464 // Get IDENT. 465 final String ident = (String)getValue(identToken); 466 return !ident.isEmpty() && Character.isJavaIdentifierStart(ident.charAt(0)); 467 } 468 469 /** 470 * Create an IdentNode from the current token 471 * 472 * @return an IdentNode representing the current token 473 */ 474 protected final IdentNode getIdentifierName() { 475 if (type == IDENT) { 476 return getIdent(); 477 } else if (isIdentifierName()) { 478 // Fake out identifier. 479 final long identToken = Token.recast(token, IDENT); 480 // Get IDENT. 481 final String ident = (String)getValue(identToken); | 442 * @param name the name for the new {@code IdentNode}. It will be de-duplicated. 443 * @return a newly constructed {@code IdentNode} with the specified token, finish, and name; the name will 444 * be deduplicated. 445 */ 446 protected IdentNode createIdentNode(final long identToken, final int identFinish, final String name) { 447 final String existingName = canonicalNames.putIfAbsent(name, name); 448 final String canonicalName = existingName != null ? existingName : name; 449 return new IdentNode(identToken, identFinish, canonicalName); 450 } 451 452 /** 453 * Check if current token is in identifier name 454 * 455 * @return true if current token is an identifier name 456 */ 457 protected final boolean isIdentifierName() { 458 final TokenKind kind = type.getKind(); 459 if (kind == TokenKind.KEYWORD || kind == TokenKind.FUTURE || kind == TokenKind.FUTURESTRICT) { 460 return true; 461 } 462 463 // only literals allowed are null, false and true 464 if (kind == TokenKind.LITERAL) { 465 switch (type) { 466 case FALSE: 467 case NULL: 468 case TRUE: 469 return true; 470 default: 471 return false; 472 } 473 } 474 475 // Fake out identifier. 476 final long identToken = Token.recast(token, IDENT); 477 // Get IDENT. 478 final String ident = (String)getValue(identToken); 479 return !ident.isEmpty() && Character.isJavaIdentifierStart(ident.charAt(0)); 480 } 481 482 /** 483 * Create an IdentNode from the current token 484 * 485 * @return an IdentNode representing the current token 486 */ 487 protected final IdentNode getIdentifierName() { 488 if (type == IDENT) { 489 return getIdent(); 490 } else if (isIdentifierName()) { 491 // Fake out identifier. 492 final long identToken = Token.recast(token, IDENT); 493 // Get IDENT. 494 final String ident = (String)getValue(identToken); |