public moveNext()

in src/language/json/JSON.ts [406:559]


    public moveNext(): boolean {
        if (!this.hasStarted()) {
            this.moveNextBasicToken();
        } else if (this.current) {
            this._currentTokenStartIndex += this.current.length();
        }

        this._current = undefined;
        if (this.currentBasicToken()) {
            switch (this.currentBasicTokenType()) {
                case basic.TokenType.LeftCurlyBracket:
                    assert.deepStrictEqual(this.currentBasicTokenType(), basic.TokenType.LeftCurlyBracket);
                    this._current = LeftCurlyBracket(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.RightCurlyBracket:
                    this._current = RightCurlyBracket(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.LeftSquareBracket:
                    this._current = LeftSquareBracket(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.RightSquareBracket:
                    this._current = RightSquareBracket(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.Comma:
                    this._current = Comma(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.Colon:
                    this._current = Colon(this._currentTokenStartIndex);
                    this.moveNextBasicToken();
                    break;

                case basic.TokenType.Dash:
                case basic.TokenType.Digits:
                    this._current = Number(this._currentTokenStartIndex, readNumber(this.asBasicTokenIterator()));
                    break;

                case basic.TokenType.ForwardSlash:
                    this.moveNextBasicToken();
                    if (!this.currentBasicToken()) {
                        this._current = Literal(this._currentTokenStartIndex, [basic.ForwardSlash]);
                    } else {
                        switch (this.currentBasicTokenType()) {
                            case basic.TokenType.ForwardSlash:
                                const lineCommentBasicTokens: basic.Token[] = [basic.ForwardSlash, basic.ForwardSlash];
                                while (this.moveNextBasicToken()
                                    && this.currentBasicTokenType() !== basic.TokenType.NewLine
                                    && this.currentBasicTokenType() !== basic.TokenType.CarriageReturnNewLine
                                ) {
                                    // tslint:disable-next-line: no-non-null-assertion // guaranteed by this.moveNextBasicToken() return value in while
                                    lineCommentBasicTokens.push(this.currentBasicToken()!);
                                }
                                this._current = Comment(this._currentTokenStartIndex, lineCommentBasicTokens);
                                this._commentsCount++;
                                break;

                            case basic.TokenType.Asterisk:
                                const blockCommentBasicTokens: basic.Token[] = [basic.ForwardSlash, basic.Asterisk];
                                this.moveNextBasicToken();

                                while (this.currentBasicToken()) {
                                    // tslint:disable-next-line: no-non-null-assertion // Validated by while
                                    blockCommentBasicTokens.push(this.currentBasicToken()!);

                                    if (this.currentBasicTokenType() === basic.TokenType.Asterisk) {
                                        this.moveNextBasicToken();

                                        if (this.currentBasicTokenType() === basic.TokenType.ForwardSlash) {
                                            // tslint:disable-next-line: no-non-null-assertion // Guaranteed by if
                                            blockCommentBasicTokens.push(this.currentBasicToken()!);
                                            this.moveNextBasicToken();
                                            break;
                                        }
                                    } else {
                                        this.moveNextBasicToken();
                                    }
                                }

                                this._current = Comment(this._currentTokenStartIndex, blockCommentBasicTokens);
                                this._commentsCount++;
                                break;

                            default:
                                this._current = Literal(this._currentTokenStartIndex, [basic.ForwardSlash]);
                                break;
                        }
                    }
                    break;

                case basic.TokenType.Space:
                case basic.TokenType.Tab:
                case basic.TokenType.CarriageReturn:
                case basic.TokenType.NewLine:
                case basic.TokenType.CarriageReturnNewLine:
                    this._current = Whitespace(this._currentTokenStartIndex, readWhitespace(this.asBasicTokenIterator()));
                    break;

                case basic.TokenType.SingleQuote:
                case basic.TokenType.DoubleQuote:
                    this._current = QuotedString(this._currentTokenStartIndex, readQuotedString(this.asBasicTokenIterator()));
                    break;

                case basic.TokenType.Letters:
                    // tslint:disable-next-line: no-non-null-assertion // Validated by if
                    switch (this.currentBasicToken()!.toString()) {
                        case "true":
                        case "false":
                            // tslint:disable-next-line: no-non-null-assertion // Validated by if
                            this._current = Boolean(this._currentTokenStartIndex, this.currentBasicToken()!);
                            this.moveNextBasicToken();
                            break;

                        case "null":
                            this._current = Null(this._currentTokenStartIndex);
                            this.moveNextBasicToken();
                            break;

                        default:
                            // tslint:disable-next-line: no-non-null-assertion // Validated by if
                            const literalTokens: basic.Token[] = [this.currentBasicToken()!];
                            this.moveNextBasicToken();

                            while (this.currentBasicToken() &&
                                (this.currentBasicTokenType() === basic.TokenType.Letters ||
                                    this.currentBasicTokenType() === basic.TokenType.Underscore)) {
                                // tslint:disable-next-line: no-non-null-assertion // Validated by if
                                literalTokens.push(this.currentBasicToken()!);
                                this.moveNextBasicToken();
                            }

                            this._current = Literal(this._currentTokenStartIndex, literalTokens);
                            break;
                    }
                    break;

                default:
                    // tslint:disable-next-line: no-non-null-assertion // Validated by if
                    this._current = Unrecognized(this._currentTokenStartIndex, this.currentBasicToken()!);
                    this.moveNextBasicToken();
                    break;
            }
        }

        return !!this.current;
    }