|
| 1 | +import { oneOf } from '@zardoy/utils' |
| 2 | +import { cleanupEntryName } from '../utils' |
| 3 | + |
| 4 | +// implementation not even ideal, but it just works for string & enums, which are used in 99% cases |
| 5 | +export default (entries: ts.CompletionEntry[], position: number, sourceFile: ts.SourceFile, leftNode: ts.Node) => { |
| 6 | + let nodeComp = leftNode |
| 7 | + let enumAccessExpr: string | null | undefined |
| 8 | + if (ts.isStringLiteral(leftNode)) enumAccessExpr = null |
| 9 | + else { |
| 10 | + enumAccessExpr = getPropAccessExprRestText(leftNode) |
| 11 | + if (!ts.isCaseClause(nodeComp.parent)) nodeComp = leftNode.parent |
| 12 | + } |
| 13 | + if (enumAccessExpr === undefined) return |
| 14 | + let currentClause: ts.CaseClause |
| 15 | + // just for type inferrence |
| 16 | + const clauses = ts.isCaseClause(nodeComp.parent) && ts.isCaseBlock(nodeComp.parent.parent) ? nodeComp.parent.parent?.clauses : undefined |
| 17 | + if (!clauses) return |
| 18 | + currentClause = nodeComp.parent as ts.CaseClause |
| 19 | + const coveredValues: string[] = [] |
| 20 | + for (const clause of clauses) { |
| 21 | + if (ts.isDefaultClause(clause) || clause === currentClause) continue |
| 22 | + const { expression } = clause |
| 23 | + if (enumAccessExpr === null) { |
| 24 | + if (ts.isStringLiteralLike(expression)) coveredValues.push(expression.text) |
| 25 | + } else { |
| 26 | + if (getPropAccessExprRestText(expression) === enumAccessExpr) { |
| 27 | + coveredValues.push((expression as ts.PropertyAccessExpression).name.text) |
| 28 | + } |
| 29 | + } |
| 30 | + } |
| 31 | + return entries.filter( |
| 32 | + ({ name, kind }) => |
| 33 | + !oneOf(kind, ts.ScriptElementKind.memberVariableElement, ts.ScriptElementKind.enumMemberElement, ts.ScriptElementKind.string) || |
| 34 | + !coveredValues.includes(cleanupEntryName({ name })), |
| 35 | + ) |
| 36 | +} |
| 37 | + |
| 38 | +const getPropAccessExprRestText = (node: ts.Node) => { |
| 39 | + let propNode = node |
| 40 | + if (ts.isPropertyAccessExpression(node.parent)) { |
| 41 | + propNode = node.parent |
| 42 | + } |
| 43 | + if (!ts.isPropertyAccessExpression(propNode)) return |
| 44 | + return propNode.getText().slice(0, propNode.name.getStart() - propNode.getStart() - 1 /* -1 for dot */) |
| 45 | +} |
0 commit comments