primaryDiagnosis method

RepairCandidate primaryDiagnosis(
  1. PrimaryRepairInfo repair
)

Implementation

RepairCandidate primaryDiagnosis(PrimaryRepairInfo repair) {
  //
  //  Issue diagnostic.
  //
  var prevtok = buffer[repair.bufferPosition - 1],
      current_token = buffer[repair.bufferPosition];

  switch (repair.code) {
    case INSERTION_CODE:
    case BEFORE_CODE:
      {
        var name_index = (repair.symbol > NT_OFFSET
            ? getNtermIndex(stateStack[stateStackTop], repair.symbol,
                repair.bufferPosition)
            : getTermIndex(stateStack, stateStackTop, repair.symbol,
                repair.bufferPosition));
        var tok = (repair.code == INSERTION_CODE ? prevtok : current_token);
        emitError(repair.code, name_index, tok, tok);
        break;
      }
    case INVALID_CODE:
      {
        var name_index = getNtermIndex(stateStack[stateStackTop],
            repair.symbol, repair.bufferPosition + 1);
        emitError(repair.code, name_index, current_token, current_token);
        break;
      }
    case SUBSTITUTION_CODE:
      {
        int name_index;
        if (repair.misspellIndex >= 6) {
          name_index = terminalIndex(repair.symbol);
        } else {
          name_index = getTermIndex(stateStack, stateStackTop, repair.symbol,
              repair.bufferPosition + 1);
          if (name_index != terminalIndex(repair.symbol)) {
            repair.code = INVALID_CODE;
          }
        }
        emitError(repair.code, name_index, current_token, current_token);
        break;
      }
    case MERGE_CODE:
      emitError(repair.code, terminalIndex(repair.symbol), current_token,
          tokStream.getNext(current_token));
      break;
    case SCOPE_CODE:
      {
        for (var i = 0; i < scopeStackTop; i++) {
          emitError(
              repair.code,
              -scopeIndex[i],
              locationStack[scopePosition[i]],
              prevtok,
              nonterminalIndex(scopeLhs(scopeIndex[i])));
        }

        repair.symbol = scopeLhs(scopeIndex[scopeStackTop]) + NT_OFFSET;
        stateStackTop = scopePosition[scopeStackTop];
        emitError(
            repair.code,
            -scopeIndex[scopeStackTop],
            locationStack[scopePosition[scopeStackTop]],
            prevtok,
            getNtermIndex(stateStack[stateStackTop], repair.symbol,
                repair.bufferPosition));
        break;
      }
    default: // deletion
      emitError(repair.code, terminalIndex(ERROR_SYMBOL), current_token,
          current_token);
  }

  //
  //  Update buffer.
  //
  var candidate = RepairCandidate();
  switch (repair.code) {
    case INSERTION_CODE:
    case BEFORE_CODE:
    case SCOPE_CODE:
      candidate.symbol = repair.symbol;
      candidate.location = buffer[repair.bufferPosition];
      tokStream.reset(buffer[repair.bufferPosition]);
      break;
    case INVALID_CODE:
    case SUBSTITUTION_CODE:
      candidate.symbol = repair.symbol;
      candidate.location = buffer[repair.bufferPosition];
      tokStream.reset(buffer[repair.bufferPosition + 1]);
      break;
    case MERGE_CODE:
      candidate.symbol = repair.symbol;
      candidate.location = buffer[repair.bufferPosition];
      tokStream.reset(buffer[repair.bufferPosition + 2]);
      break;
    default: // deletion
      candidate.location = buffer[repair.bufferPosition + 1];
      candidate.symbol = tokStream.getKind(buffer[repair.bufferPosition + 1]);
      tokStream.reset(buffer[repair.bufferPosition + 2]);
      break;
  }

  return candidate;
}