function getSoleUse()

in src/rules/noUnnecessaryGenericsRule.ts [69:111]


function getSoleUse(sig: ts.SignatureDeclaration, typeParameterSymbol: ts.Symbol, checker: ts.TypeChecker): Result {
    const exit = {};
    let soleUse: ts.Identifier | undefined;

    try {
        if (sig.typeParameters) {
            for (const tp of sig.typeParameters) {
                if (tp.constraint) {
                    recur(tp.constraint);
                }
            }
        }
        for (const param of sig.parameters) {
            if (param.type) {
                recur(param.type);
            }
        }
        if (sig.type) {
            recur(sig.type);
        }
    } catch (err) {
        if (err === exit) {
            return { type: "ok" };
        }
        throw err;
    }

    return soleUse ? { type: "sole", soleUse } : { type: "never" };

    function recur(node: ts.TypeNode): void {
        if (ts.isIdentifier(node)) {
            if (checker.getSymbolAtLocation(node) === typeParameterSymbol) {
                if (soleUse === undefined) {
                    soleUse = node;
                } else {
                    throw exit;
                }
            }
        } else {
            node.forEachChild(recur);
        }
    }
}