{"version":3,"file":"schemaCoordinateLexer.js","sourceRoot":"","sources":["../../src/language/schemaCoordinateLexer.ts"],"names":[],"mappings":"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","sourcesContent":["import { syntaxError } from '../error/syntaxError.ts';\n\nimport { Token } from './ast.ts';\nimport { isNameStart } from './characterClasses.ts';\nimport type { LexerInterface } from './lexer.ts';\nimport { createToken, printCodePointAt, readName } from './lexer.ts';\nimport type { Source } from './source.ts';\nimport { TokenKind } from './tokenKind.ts';\n\n/**\n * Given a Source schema coordinate, creates a Lexer for that source.\n * A SchemaCoordinateLexer is a stateful stream generator in that every time\n * it is advanced, it returns the next token in the Source. Assuming the\n * source lexes, the final Token emitted by the lexer will be of kind\n * EOF, after which the lexer will repeatedly return the same EOF token\n * whenever called.\n *\n * @internal\n */\nexport class SchemaCoordinateLexer implements LexerInterface {\n  source: Source;\n\n  /**\n   * The previously focused non-ignored token.\n   *\n   * @internal\n   */\n  lastToken: Token;\n\n  /**\n   * The currently focused non-ignored token.\n   *\n   * @internal\n   */\n  token: Token;\n\n  /**\n   * The (1-indexed) line containing the current token.\n   * Since a schema coordinate may not contain newline, this value is always 1.\n   *\n   * @internal\n   */\n  line: 1 = 1 as const;\n\n  /**\n   * The character offset at which the current line begins.\n   * Since a schema coordinate may not contain newline, this value is always 0.\n   *\n   * @internal\n   */\n  lineStart: 0 = 0 as const;\n\n  constructor(source: Source) {\n    const startOfFileToken = new Token(TokenKind.SOF, 0, 0, 0, 0);\n\n    this.source = source;\n    this.lastToken = startOfFileToken;\n    this.token = startOfFileToken;\n  }\n\n  get [Symbol.toStringTag](): string {\n    return 'SchemaCoordinateLexer';\n  }\n\n  /**\n   * Advances the token stream to the next non-ignored token.\n   *\n   * @internal\n   */\n  advance(): Token {\n    this.lastToken = this.token;\n    const token = (this.token = this.lookahead());\n    return token;\n  }\n\n  /**\n   * Looks ahead and returns the next non-ignored token, but does not change\n   * the current Lexer token.\n   *\n   * @internal\n   */\n  lookahead(): Token {\n    let token = this.token;\n    if (token.kind !== TokenKind.EOF) {\n      // Read the next token and form a link in the token linked-list.\n      const nextToken = readNextToken(this, token.end);\n      // @ts-expect-error next is only mutable during parsing.\n      token.next = nextToken;\n      // @ts-expect-error prev is only mutable during parsing.\n      nextToken.prev = token;\n      token = nextToken;\n    }\n    return token;\n  }\n}\n\n/**\n * Gets the next token from the source starting at the given position.\n *\n * @internal\n */\nfunction readNextToken(lexer: SchemaCoordinateLexer, start: number): Token {\n  const body = lexer.source.body;\n  const bodyLength = body.length;\n  const position = start;\n\n  if (position < bodyLength) {\n    const code = body.charCodeAt(position);\n\n    switch (code) {\n      case 0x002e: // .\n        return createToken(lexer, TokenKind.DOT, position, position + 1);\n      case 0x0028: // (\n        return createToken(lexer, TokenKind.PAREN_L, position, position + 1);\n      case 0x0029: // )\n        return createToken(lexer, TokenKind.PAREN_R, position, position + 1);\n      case 0x003a: // :\n        return createToken(lexer, TokenKind.COLON, position, position + 1);\n      case 0x0040: // @\n        return createToken(lexer, TokenKind.AT, position, position + 1);\n    }\n\n    // Name\n    if (isNameStart(code)) {\n      return readName(lexer, position);\n    }\n\n    throw syntaxError(\n      lexer.source,\n      position,\n      `Invalid character: ${printCodePointAt(lexer, position)}.`,\n    );\n  }\n\n  return createToken(lexer, TokenKind.EOF, bodyLength, bodyLength);\n}\n"]}