Repository: eslint/eslint
File: lib/languages/js/index.js (JavaScript)

Code before:
 * @param {LanguageOptions} languageOptions The parser options.
 * @param {Record<string, string[]>} visitorKeys The visitor keys.
 * @returns {ScopeManager} The analysis result.
 */
function analyzeScope(ast, languageOptions, visitorKeys) {
    const parserOptions = languageOptions.parserOptions;
    const ecmaFeatures = parserOptions.ecmaFeatures || {};
    const ecmaVersion = languageOptions.ecmaVersion || DEFAULT_ECMA_VERSION;

    return eslintScope.analyze(ast, {
        ignoreEval: true,
        nodejsScope: ecmaFeatures.globalReturn,
        impliedStrict: ecmaFeatures.impliedStrict,
        ecmaVersion: typeof ecmaVersion === "number" ? ecmaVersion : 6,
        sourceType: languageOptions.sourceType || "script",
        childVisitorKeys: visitorKeys || evk.KEYS,
        fallback: evk.getKeys
    });
}

//-----------------------------------------------------------------------------
// Exports
//-----------------------------------------------------------------------------

/**
 * @implements {Language}
 */
module.exports = {

    fileType: "text",
    lineStart: 1,
    columnStart: 0,
    nodeTypeKey: "type",
    visitorKeys: evk.KEYS,

    validateLanguageOptions,

    /**
     * Determines if a given node matches a given selector class.
     * @param {string} className The class name to check.
     * @param {ASTNode} node The node to check.
     * @param {Array<ASTNode>} ancestry The ancestry of the node.
     * @returns {boolean} True if there's a match, false if not.
     * @throws {Error} When an unknown class name is passed.
     */
    matchesSelectorClass(className, node, ancestry) {

        /*
         * Copyright (c) 2013, Joel Feenstra
         * All rights reserved.
         *

Review comment (suggestion):
```suggestion
 * @type {Language}
```

I believe `@implements` is for classes. And intellisense seems to be working well when this is changed to `@type`.

Code after:
 * @param {LanguageOptions} languageOptions The parser options.
 * @param {Record<string, string[]>} visitorKeys The visitor keys.
 * @returns {ScopeManager} The analysis result.
 */
function analyzeScope(ast, languageOptions, visitorKeys) {
    const parserOptions = languageOptions.parserOptions;
    const ecmaFeatures = parserOptions.ecmaFeatures || {};
    const ecmaVersion = languageOptions.ecmaVersion || DEFAULT_ECMA_VERSION;

    return eslintScope.analyze(ast, {
        ignoreEval: true,
        nodejsScope: ecmaFeatures.globalReturn,
        impliedStrict: ecmaFeatures.impliedStrict,
        ecmaVersion: typeof ecmaVersion === "number" ? ecmaVersion : 6,
        sourceType: languageOptions.sourceType || "script",
        childVisitorKeys: visitorKeys || evk.KEYS,
        fallback: evk.getKeys
    });
}

//-----------------------------------------------------------------------------
// Exports
//-----------------------------------------------------------------------------

/**
 * @type {Language}
 */
module.exports = {

    fileType: "text",
    lineStart: 1,
    columnStart: 0,
    nodeTypeKey: "type",
    visitorKeys: evk.KEYS,

    validateLanguageOptions,

    /**
     * Determines if a given node matches a given selector class.
     * @param {string} className The class name to check.
     * @param {ASTNode} node The node to check.
     * @param {Array<ASTNode>} ancestry The ancestry of the node.
     * @returns {boolean} True if there's a match, false if not.
     * @throws {Error} When an unknown class name is passed.
     */
    matchesSelectorClass(className, node, ancestry) {

        /*
         * Copyright (c) 2013, Joel Feenstra
         * All rights reserved.
         *