(int i)
| 510 | } |
| 511 | |
| 512 | public int[] getFeatures(int i) { |
| 513 | CodeBuffTokenStream tokens = doc.tokens; |
| 514 | TerminalNode node = tokenToNodeMap.get(tokens.get(i)); |
| 515 | if ( node==null ) { |
| 516 | System.err.println("### No node associated with token "+tokens.get(i)); |
| 517 | return null; |
| 518 | } |
| 519 | |
| 520 | Token curToken = node.getSymbol(); |
| 521 | Token prevToken = tokens.getPreviousRealToken(i); |
| 522 | Token prevPrevToken = prevToken!=null ? doc.tokens.getPreviousRealToken(prevToken.getTokenIndex()) : null; |
| 523 | |
| 524 | boolean prevTokenStartsLine = false; |
| 525 | if ( prevToken!=null && prevPrevToken!=null ) { |
| 526 | prevTokenStartsLine = prevToken.getLine()>prevPrevToken.getLine(); |
| 527 | } |
| 528 | |
| 529 | boolean curTokenStartsNewLine = false; |
| 530 | if ( prevToken==null ) curTokenStartsNewLine = true; // we must be at start of file |
| 531 | else if ( curToken.getLine() > prevToken.getLine() ) curTokenStartsNewLine = true; |
| 532 | |
| 533 | int[] features = getContextFeatures(corpus, tokenToNodeMap, doc, i); |
| 534 | |
| 535 | setListInfoFeatures(corpus.tokenToListInfo, features, curToken); |
| 536 | |
| 537 | features[INDEX_PREV_FIRST_ON_LINE] = prevTokenStartsLine ? 1 : 0; |
| 538 | features[INDEX_FIRST_ON_LINE] = curTokenStartsNewLine ? 1 : 0; |
| 539 | |
| 540 | return features; |
| 541 | } |
| 542 | |
| 543 | /** Get the token type and tree ancestor features. These are computed |
| 544 | * the same for both training and formatting. |
no test coverage detected