Repository: eslint/eslint
File: lib/linter/linter.js (JavaScript)

Code before:
            );
        });

        return processorService.postprocessSync(file, messageLists, {
            processor: {
                preprocess,
                postprocess
            }
        });
    }

    /**
     * Verify using flat config and without any processors.
     * @param {VFile} file The file to lint.
     * @param {FlatConfig} providedConfig An ESLintConfig instance to configure everything.
     * @param {VerifyOptions} [providedOptions] The optional filename of the file being checked.
     * @throws {Error} If during rule execution.
     * @returns {(LintMessage|SuppressedLintMessage)[]} The results as an array of messages or an empty array if no messages.
     */
    #flatVerifyWithoutProcessors(file, providedConfig, providedOptions) {

        const slots = internalSlotsMap.get(this);
        const config = providedConfig || {};
        const { language, settings = {}, languageOptions: originalLanguageOptions = {} } = config;
        const options = normalizeVerifyOptions(providedOptions, config);
        const languageOptions = language.normalizeLanguageOptions?.(originalLanguageOptions) ?? originalLanguageOptions;

        if (!slots.lastSourceCode) {
            let t;

            if (options.stats) {
                t = startTime();
            }

            const parserService = new ParserService();
            const parseResult = parserService.parseSync(
                file,
                config
            );

            if (options.stats) {
                const time = endTime(t);

                storeTime(time, { type: "parse" }, slots);
            }

            if (!parseResult.ok) {
                return parseResult.errors;
            }

            slots.lastSourceCode = parseResult.sourceCode;

Review comment (suggestion):
Thoughts about calling `language.normalizeLanguageOptions()` in the `Config` constructor instead of here? That way, language options would be normalized only once per config, not for each file. 

Code after:
            );
        });

        return processorService.postprocessSync(file, messageLists, {
            processor: {
                preprocess,
                postprocess
            }
        });
    }

    /**
     * Verify using flat config and without any processors.
     * @param {VFile} file The file to lint.
     * @param {FlatConfig} providedConfig An ESLintConfig instance to configure everything.
     * @param {VerifyOptions} [providedOptions] The optional filename of the file being checked.
     * @throws {Error} If during rule execution.
     * @returns {(LintMessage|SuppressedLintMessage)[]} The results as an array of messages or an empty array if no messages.
     */
    #flatVerifyWithoutProcessors(file, providedConfig, providedOptions) {

        const slots = internalSlotsMap.get(this);
        const config = providedConfig || {};
        const { settings = {}, languageOptions } = config;
        const options = normalizeVerifyOptions(providedOptions, config);

        if (!slots.lastSourceCode) {
            let t;

            if (options.stats) {
                t = startTime();
            }

            const parserService = new ParserService();
            const parseResult = parserService.parseSync(
                file,
                config
            );

            if (options.stats) {
                const time = endTime(t);

                storeTime(time, { type: "parse" }, slots);
            }

            if (!parseResult.ok) {
                return parseResult.errors;
            }

            slots.lastSourceCode = parseResult.sourceCode;
        } else {