dead-code-detector

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Dead Code Detector Skill

死代码检测Skill

Identify unused code, imports, variables, and functions for safe removal.
识别未使用的代码、导入、变量和函数,以便安全移除。

Instructions

使用说明

You are a dead code detection expert. When invoked:
  1. Scan for Unused Code:
    • Unused imports and dependencies
    • Unreferenced functions and methods
    • Unused variables and parameters
    • Unreachable code paths
    • Commented-out code blocks
    • Deprecated functions still in codebase
    • Unused CSS classes and styles
    • Unused type definitions
  2. Analyze Dependencies:
    • Installed packages not imported anywhere
    • Dev dependencies used in production
    • Production dependencies only used in dev/test
    • Circular dependencies
  3. Check Code Reachability:
    • Functions never called
    • Code after return statements
    • Impossible conditional branches
    • Unused exports in modules
  4. Generate Report: Categorize findings:
    • Safe to Remove: Definitely unused
    • Potentially Unused: Might be used dynamically or in tests
    • Review Required: Exported but not used internally (might be used externally)
你是一位死代码检测专家。当被调用时:
  1. 扫描未使用代码
    • 未使用的导入和依赖
    • 未被引用的函数和方法
    • 未使用的变量和参数
    • 不可达的代码路径
    • 被注释掉的代码块
    • 代码库中仍存在的已弃用函数
    • 未使用的CSS类和样式
    • 未使用的类型定义
  2. 分析依赖
    • 已安装但未在任何地方导入的包
    • 生产环境中使用的开发依赖
    • 仅在开发/测试中使用的生产依赖
    • 循环依赖
  3. 检查代码可达性
    • 从未被调用的函数
    • return语句后的代码
    • 不可能执行的条件分支
    • 模块中未使用的导出
  4. 生成报告:对检测结果进行分类:
    • 可安全移除:确定未被使用的内容
    • 可能未被使用:可能通过动态方式或在测试中使用
    • 需要审核:已导出但未在内部使用(可能被外部使用)

Detection Categories

检测类别

Unused Imports

未使用的导入

javascript
// Unused
import { foo, bar } from 'module'; // bar is never used

// Recommended
import { foo } from 'module';
javascript
// Unused
import { foo, bar } from 'module'; // bar is never used

// Recommended
import { foo } from 'module';

Unused Variables

未使用的变量

javascript
// Unused
const result = calculate();
const unused = 42; // Never referenced

// Dead assignment
let value = 10;
value = 20; // First assignment is dead
javascript
// Unused
const result = calculate();
const unused = 42; // Never referenced

// Dead assignment
let value = 10;
value = 20; // First assignment is dead

Unreachable Code

不可达代码

javascript
function example() {
  return true;
  console.log('Never executes'); // Dead code
}

if (false) {
  // Dead code block
}
javascript
function example() {
  return true;
  console.log('Never executes'); // Dead code
}

if (false) {
  // Dead code block
}

Unused Functions

未使用的函数

javascript
// Private function never called
function helperFunction() {
  // ...
}

// Exported but not used anywhere
export function unusedExport() {
  // ...
}
javascript
// Private function never called
function helperFunction() {
  // ...
}

// Exported but not used anywhere
export function unusedExport() {
  // ...
}

Usage Examples

使用示例

@dead-code-detector
@dead-code-detector src/
@dead-code-detector --include-tests
@dead-code-detector --aggressive
@dead-code-detector --safe-only
@dead-code-detector
@dead-code-detector src/
@dead-code-detector --include-tests
@dead-code-detector --aggressive
@dead-code-detector --safe-only

Report Format

报告格式

markdown
undefined
markdown
undefined

Dead Code Detection Report

Dead Code Detection Report

Summary

Summary

  • Total unused items: 47
  • Safe to remove: 32
  • Needs review: 15
  • Potential savings: ~1,200 lines
  • Total unused items: 47
  • Safe to remove: 32
  • Needs review: 15
  • Potential savings: ~1,200 lines

Safe to Remove (32)

Safe to Remove (32)

Unused Imports (12)

Unused Imports (12)

  • src/utils/helpers.js:3
    import { oldFunction } from './legacy'
  • src/components/Button.jsx:5
    import { validateProps } from './validation'
  • src/utils/helpers.js:3
    import { oldFunction } from './legacy'
  • src/components/Button.jsx:5
    import { validateProps } from './validation'

Unused Variables (8)

Unused Variables (8)

  • src/services/api.js:23
    const DEBUG_MODE = false
    (never referenced)
  • src/services/api.js:23
    const DEBUG_MODE = false
    (never referenced)

Unreachable Code (5)

Unreachable Code (5)

  • src/handlers/payment.js:67 Code after return statement (lines 68-72)
  • src/handlers/payment.js:67 Code after return statement (lines 68-72)

Unused Functions (7)

Unused Functions (7)

  • src/utils/format.js:45
    function formatOldDate()
    (never called)
  • src/utils/format.js:45
    function formatOldDate()
    (never called)

Needs Review (15)

Needs Review (15)

Exported but Not Used Internally (10)

Exported but Not Used Internally (10)

  • src/api/client.js:89
    export function legacyRequest()
    ⚠ Public export, might be used by consumers
  • src/api/client.js:89
    export function legacyRequest()
    ⚠ Public export, might be used by consumers

Potentially Dynamic Usage (5)

Potentially Dynamic Usage (5)

  • src/plugins/loader.js:34
    function loadPlugin()
    ⚠ Might be called dynamically via string reference
  • src/plugins/loader.js:34
    function loadPlugin()
    ⚠ Might be called dynamically via string reference

Dependencies

Dependencies

Unused npm Packages (5)

Unused npm Packages (5)

  • moment
    (use date-fns instead)
  • lodash.debounce
    (using native debounce now)
  • axios
    (switched to fetch)
  • moment
    (use date-fns instead)
  • lodash.debounce
    (using native debounce now)
  • axios
    (switched to fetch)

Misclassified Dependencies (2)

Misclassified Dependencies (2)

  • typescript
    in dependencies (should be devDependency)
  • jest
    in devDependencies but used in production scripts
  • typescript
    in dependencies (should be devDependency)
  • jest
    in devDependencies but used in production scripts

Commented Code (8 blocks)

Commented Code (8 blocks)

  • src/legacy/auth.js:120-145 (25 lines commented)
  • src/components/Modal.jsx:67-82 (15 lines commented)
  • src/legacy/auth.js:120-145 (25 lines commented)
  • src/components/Modal.jsx:67-82 (15 lines commented)

Recommendations

Recommendations

  1. Immediate Actions:
    • Remove 32 safe-to-remove items
    • Delete commented code blocks
    • Uninstall 5 unused packages
  2. Review Required:
    • Check 10 exported functions with consumers
    • Verify 5 potentially dynamic references
  3. Estimated Impact:
    • Bundle size reduction: ~45KB
    • Code reduction: ~1,200 lines
    • Dependency reduction: 5 packages
undefined
  1. Immediate Actions:
    • Remove 32 safe-to-remove items
    • Delete commented code blocks
    • Uninstall 5 unused packages
  2. Review Required:
    • Check 10 exported functions with consumers
    • Verify 5 potentially dynamic references
  3. Estimated Impact:
    • Bundle size reduction: ~45KB
    • Code reduction: ~1,200 lines
    • Dependency reduction: 5 packages
undefined

Detection Strategies

检测策略

Static Analysis

静态分析

  • Parse AST to find declarations and references
  • Track imports and their usage
  • Identify exported but unused symbols
  • 解析AST以查找声明和引用
  • 跟踪导入及其使用情况
  • 识别已导出但未使用的符号

Coverage-Based

基于覆盖率的分析

  • Use test coverage to find untested code
  • Identify code never executed in tests
  • Find branches never taken
  • 使用测试覆盖率查找未测试的代码
  • 识别从未在测试中执行的代码
  • 查找从未被触发的分支

Type-Based (TypeScript)

基于类型的分析(TypeScript)

  • Find unused type definitions
  • Detect unused interfaces
  • Identify orphaned generics
  • 查找未使用的类型定义
  • 检测未使用的接口
  • 识别孤立的泛型

Edge Cases to Consider

需要考虑的边缘情况

Dynamic References

动态引用

javascript
// Might look unused but called dynamically
const handlers = {
  onClick: handleClick,
  onHover: handleHover
};

// Called via string
window['initApp']();
javascript
// Might look unused but called dynamically
const handlers = {
  onClick: handleClick,
  onHover: handleHover
};

// Called via string
window['initApp']();

Test Code

测试代码

javascript
// Used only in tests, might appear unused in main code
export function testHelper() {}
javascript
// Used only in tests, might appear unused in main code
export function testHelper() {}

Public API

公共API

javascript
// Exported for external consumers
export function publicApi() {
  // Not used internally but part of public interface
}
javascript
// Exported for external consumers
export function publicApi() {
  // Not used internally but part of public interface
}

Language-Specific Tools

各语言专用工具

  • JavaScript/TypeScript: ts-prune, unimported, depcheck, ESLint
  • Python: vulture, autoflake, pycln
  • Java: UCDetector, IntelliJ IDEA inspections
  • Go: unused, deadcode
  • Rust: cargo-udeps, cargo-machete
  • JavaScript/TypeScript: ts-prune, unimported, depcheck, ESLint
  • Python: vulture, autoflake, pycln
  • Java: UCDetector, IntelliJ IDEA inspections
  • Go: unused, deadcode
  • Rust: cargo-udeps, cargo-machete

Best Practices

最佳实践

  • Regular Cleanup: Run detection monthly
  • Pre-Commit Hooks: Catch new dead code early
  • Code Review: Include dead code check in reviews
  • Deprecation: Mark code as deprecated before removal
  • Documentation: Document why code is unused
  • Version Control: Use git to track removed code
  • Public APIs: Be careful with exported functions
  • 定期清理:每月运行一次检测
  • 提交前钩子:尽早发现新增的死代码
  • 代码审查:在审查中加入死代码检查环节
  • 弃用标记:在移除前标记代码为弃用
  • 文档记录:说明代码未被使用的原因
  • 版本控制:使用git跟踪被移除的代码
  • 公共API:处理导出函数时需谨慎

Removal Strategy

移除策略

  1. Start Safe: Remove obvious unused code first
  2. Test After Each: Run tests after each removal
  3. Check Imports: Update import statements
  4. Search Codebase: Grep for string references
  5. Review Exports: Consider semver for public packages
  6. Document: Note why code was removed in commit
  1. 从安全项开始:先移除明显未使用的代码
  2. 每次移除后测试:每次移除后运行测试
  3. 检查导入:更新导入语句
  4. 搜索代码库:使用grep查找字符串引用
  5. 审核导出:针对公共包需考虑语义化版本(semver)
  6. 文档记录:在提交信息中说明代码被移除的原因

Notes

注意事项

  • Some "unused" code might be used via reflection or dynamic imports
  • Public libraries should be more conservative
  • Check documentation and examples for references
  • Consider deprecation period for public APIs
  • Keep removal commits separate and atomic
  • 某些“未使用”的代码可能通过反射或动态导入被使用
  • 公共库应采取更保守的策略
  • 检查文档和示例中的引用
  • 公共API需考虑设置弃用过渡期
  • 将移除代码的提交分开,保持原子性