private static checkTokenIsExpected()

in src/language/semantics/xsltTokenDiagnostics.ts [1434:1516]


  private static checkTokenIsExpected(
    prevToken: BaseToken | null,
    token: BaseToken,
    problemTokens: BaseToken[],
    overridType?: TokenLevelState
  ) {
    if (token.error) {
      return
    }
    let tokenType = overridType ? overridType : token.tokenType
    let errorSingleSeparators: string[]
    if (tokenType === TokenLevelState.number) {
      errorSingleSeparators = ['|']
    } else if (tokenType === TokenLevelState.string) {
      errorSingleSeparators = ['|', '+', '-', '*']
    } else {
      errorSingleSeparators = []
    }
    let errDoubleSeparators
    if (tokenType === TokenLevelState.nodeNameTest) {
      errDoubleSeparators = ['{}', '[]', '()']
    } else if (
      tokenType === TokenLevelState.number ||
      tokenType === TokenLevelState.string
    ) {
      errDoubleSeparators = ['{}', '[]', '()', '*:', '::', '//']
    } else {
      errDoubleSeparators = ['{}', '[]', '()', '*:', '::']
    }
    if (prevToken) {
      let isXPathError = false
      if (
        prevToken.tokenType === TokenLevelState.complexExpression ||
        prevToken.tokenType === TokenLevelState.entityRef
      ) {
        // no error
      } else if (
        prevToken.tokenType === TokenLevelState.uriLiteral &&
        tokenType !== TokenLevelState.nodeNameTest
      ) {
        isXPathError = true
      } else if (prevToken.tokenType === TokenLevelState.operator) {
        if (
          prevToken.charType === CharLevelState.rB ||
          prevToken.charType === CharLevelState.rPr ||
          prevToken.charType === CharLevelState.rPr
        ) {
          isXPathError = true
        } else if (prevToken.charType === CharLevelState.dSep) {
          if (errDoubleSeparators.indexOf(prevToken.value) !== -1) {
            isXPathError = true
          }
        } else if (prevToken.charType === CharLevelState.sep) {
          if (errorSingleSeparators.indexOf(prevToken.value) !== -1) {
            isXPathError = true
          }
        }
      } else if (
        tokenType === TokenLevelState.nodeNameTest &&
        prevToken.tokenType === TokenLevelState.uriLiteral
      ) {
        // no error
      } else if (
        tokenType === TokenLevelState.string &&
        prevToken.tokenType === TokenLevelState.string
      ) {
        const currentTokenFirstChar = token.value.charAt(0)
        if (currentTokenFirstChar === '"' || currentTokenFirstChar === "'") {
          isXPathError = true
        }
      } else {
        isXPathError = true
      }
      if (isXPathError) {
        let errType: ErrorType =
          tokenType === TokenLevelState.function
            ? ErrorType.XPathFunctionUnexpected
            : ErrorType.XPathUnexpected
        token.error = errType
        problemTokens.push(token)
      }
    }
  }