codeguardian-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/agent/agentTools.d.ts +26 -0
- package/dist/agent/agentTools.d.ts.map +1 -0
- package/dist/agent/agentTools.js +699 -0
- package/dist/agent/agentTools.js.map +1 -0
- package/dist/agent/autoValidator.d.ts +110 -0
- package/dist/agent/autoValidator.d.ts.map +1 -0
- package/dist/agent/autoValidator.js +964 -0
- package/dist/agent/autoValidator.js.map +1 -0
- package/dist/agent/fileWatcher.d.ts +28 -0
- package/dist/agent/fileWatcher.d.ts.map +1 -0
- package/dist/agent/fileWatcher.js +88 -0
- package/dist/agent/fileWatcher.js.map +1 -0
- package/dist/agent/guardianPersistence.d.ts +98 -0
- package/dist/agent/guardianPersistence.d.ts.map +1 -0
- package/dist/agent/guardianPersistence.js +296 -0
- package/dist/agent/guardianPersistence.js.map +1 -0
- package/dist/agent/mcpNotifications.d.ts +38 -0
- package/dist/agent/mcpNotifications.d.ts.map +1 -0
- package/dist/agent/mcpNotifications.js +81 -0
- package/dist/agent/mcpNotifications.js.map +1 -0
- package/dist/analyzers/aiPatterns.d.ts +16 -0
- package/dist/analyzers/aiPatterns.d.ts.map +1 -0
- package/dist/analyzers/aiPatterns.js +103 -0
- package/dist/analyzers/aiPatterns.js.map +1 -0
- package/dist/analyzers/antiPatterns.d.ts +60 -0
- package/dist/analyzers/antiPatterns.d.ts.map +1 -0
- package/dist/analyzers/antiPatterns.js +198 -0
- package/dist/analyzers/antiPatterns.js.map +1 -0
- package/dist/analyzers/builtinTypes.d.ts +18 -0
- package/dist/analyzers/builtinTypes.d.ts.map +1 -0
- package/dist/analyzers/builtinTypes.js +1275 -0
- package/dist/analyzers/builtinTypes.js.map +1 -0
- package/dist/analyzers/complexity.d.ts +14 -0
- package/dist/analyzers/complexity.d.ts.map +1 -0
- package/dist/analyzers/complexity.js +610 -0
- package/dist/analyzers/complexity.js.map +1 -0
- package/dist/analyzers/findingVerifier.d.ts +59 -0
- package/dist/analyzers/findingVerifier.d.ts.map +1 -0
- package/dist/analyzers/findingVerifier.js +1169 -0
- package/dist/analyzers/findingVerifier.js.map +1 -0
- package/dist/analyzers/impactAnalyzer.d.ts +53 -0
- package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/impactAnalyzer.js +152 -0
- package/dist/analyzers/impactAnalyzer.js.map +1 -0
- package/dist/analyzers/languageDetector.d.ts +48 -0
- package/dist/analyzers/languageDetector.d.ts.map +1 -0
- package/dist/analyzers/languageDetector.js +404 -0
- package/dist/analyzers/languageDetector.js.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.js +193 -0
- package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.js +324 -0
- package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.js +429 -0
- package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.js +709 -0
- package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
- package/dist/analyzers/relevanceScorer.d.ts +43 -0
- package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
- package/dist/analyzers/relevanceScorer.js +200 -0
- package/dist/analyzers/relevanceScorer.js.map +1 -0
- package/dist/analyzers/standardLibrary.d.ts +22 -0
- package/dist/analyzers/standardLibrary.d.ts.map +1 -0
- package/dist/analyzers/standardLibrary.js +211 -0
- package/dist/analyzers/standardLibrary.js.map +1 -0
- package/dist/analyzers/symbolGraph.d.ts +30 -0
- package/dist/analyzers/symbolGraph.d.ts.map +1 -0
- package/dist/analyzers/symbolGraph.js +380 -0
- package/dist/analyzers/symbolGraph.js.map +1 -0
- package/dist/analyzers/symbolTable.d.ts +18 -0
- package/dist/analyzers/symbolTable.d.ts.map +1 -0
- package/dist/analyzers/symbolTable.js +176 -0
- package/dist/analyzers/symbolTable.js.map +1 -0
- package/dist/analyzers/typeChecker.d.ts +13 -0
- package/dist/analyzers/typeChecker.d.ts.map +1 -0
- package/dist/analyzers/typeChecker.js +580 -0
- package/dist/analyzers/typeChecker.js.map +1 -0
- package/dist/analyzers/usagePatterns.d.ts +42 -0
- package/dist/analyzers/usagePatterns.d.ts.map +1 -0
- package/dist/analyzers/usagePatterns.js +75 -0
- package/dist/analyzers/usagePatterns.js.map +1 -0
- package/dist/api-contract/context/backend.d.ts +19 -0
- package/dist/api-contract/context/backend.d.ts.map +1 -0
- package/dist/api-contract/context/backend.js +64 -0
- package/dist/api-contract/context/backend.js.map +1 -0
- package/dist/api-contract/context/contract.d.ts +34 -0
- package/dist/api-contract/context/contract.d.ts.map +1 -0
- package/dist/api-contract/context/contract.js +306 -0
- package/dist/api-contract/context/contract.js.map +1 -0
- package/dist/api-contract/context/frontend.d.ts +19 -0
- package/dist/api-contract/context/frontend.d.ts.map +1 -0
- package/dist/api-contract/context/frontend.js +64 -0
- package/dist/api-contract/context/frontend.js.map +1 -0
- package/dist/api-contract/detector.d.ts +28 -0
- package/dist/api-contract/detector.d.ts.map +1 -0
- package/dist/api-contract/detector.js +393 -0
- package/dist/api-contract/detector.js.map +1 -0
- package/dist/api-contract/extractors/python.d.ts +32 -0
- package/dist/api-contract/extractors/python.d.ts.map +1 -0
- package/dist/api-contract/extractors/python.js +521 -0
- package/dist/api-contract/extractors/python.js.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
- package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.js +173 -0
- package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/typescript.d.ts +32 -0
- package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
- package/dist/api-contract/extractors/typescript.js +666 -0
- package/dist/api-contract/extractors/typescript.js.map +1 -0
- package/dist/api-contract/index.d.ts +104 -0
- package/dist/api-contract/index.d.ts.map +1 -0
- package/dist/api-contract/index.js +232 -0
- package/dist/api-contract/index.js.map +1 -0
- package/dist/api-contract/types.d.ts +151 -0
- package/dist/api-contract/types.d.ts.map +1 -0
- package/dist/api-contract/types.js +19 -0
- package/dist/api-contract/types.js.map +1 -0
- package/dist/api-contract/validators/endpoint.d.ts +21 -0
- package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
- package/dist/api-contract/validators/endpoint.js +224 -0
- package/dist/api-contract/validators/endpoint.js.map +1 -0
- package/dist/api-contract/validators/index.d.ts +40 -0
- package/dist/api-contract/validators/index.d.ts.map +1 -0
- package/dist/api-contract/validators/index.js +875 -0
- package/dist/api-contract/validators/index.js.map +1 -0
- package/dist/api-contract/validators/parameter.d.ts +17 -0
- package/dist/api-contract/validators/parameter.d.ts.map +1 -0
- package/dist/api-contract/validators/parameter.js +250 -0
- package/dist/api-contract/validators/parameter.js.map +1 -0
- package/dist/api-contract/validators/type.d.ts +38 -0
- package/dist/api-contract/validators/type.d.ts.map +1 -0
- package/dist/api-contract/validators/type.js +244 -0
- package/dist/api-contract/validators/type.js.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.js +665 -0
- package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
- package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
- package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
- package/dist/context/apiContract/graphqlSupport.js +671 -0
- package/dist/context/apiContract/graphqlSupport.js.map +1 -0
- package/dist/context/apiContract/index.d.ts +14 -0
- package/dist/context/apiContract/index.d.ts.map +1 -0
- package/dist/context/apiContract/index.js +17 -0
- package/dist/context/apiContract/index.js.map +1 -0
- package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
- package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
- package/dist/context/apiContract/webSocketSupport.js +465 -0
- package/dist/context/apiContract/webSocketSupport.js.map +1 -0
- package/dist/context/apiContractContext.d.ts +15 -0
- package/dist/context/apiContractContext.d.ts.map +1 -0
- package/dist/context/apiContractContext.js +979 -0
- package/dist/context/apiContractContext.js.map +1 -0
- package/dist/context/apiContractExtraction.d.ts +52 -0
- package/dist/context/apiContractExtraction.d.ts.map +1 -0
- package/dist/context/apiContractExtraction.js +438 -0
- package/dist/context/apiContractExtraction.js.map +1 -0
- package/dist/context/contextLineage.d.ts +79 -0
- package/dist/context/contextLineage.d.ts.map +1 -0
- package/dist/context/contextLineage.js +259 -0
- package/dist/context/contextLineage.js.map +1 -0
- package/dist/context/contextOrchestrator.d.ts +57 -0
- package/dist/context/contextOrchestrator.d.ts.map +1 -0
- package/dist/context/contextOrchestrator.js +162 -0
- package/dist/context/contextOrchestrator.js.map +1 -0
- package/dist/context/intentTracker.d.ts +73 -0
- package/dist/context/intentTracker.d.ts.map +1 -0
- package/dist/context/intentTracker.js +168 -0
- package/dist/context/intentTracker.js.map +1 -0
- package/dist/context/projectContext.d.ts +219 -0
- package/dist/context/projectContext.d.ts.map +1 -0
- package/dist/context/projectContext.js +1984 -0
- package/dist/context/projectContext.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +260 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library.d.ts +51 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +65 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/prompts/templates.d.ts +44 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +97 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/queue/jobPersistence.d.ts +46 -0
- package/dist/queue/jobPersistence.d.ts.map +1 -0
- package/dist/queue/jobPersistence.js +158 -0
- package/dist/queue/jobPersistence.js.map +1 -0
- package/dist/queue/jobQueue.d.ts +116 -0
- package/dist/queue/jobQueue.d.ts.map +1 -0
- package/dist/queue/jobQueue.js +275 -0
- package/dist/queue/jobQueue.js.map +1 -0
- package/dist/queue/validationJob.d.ts +69 -0
- package/dist/queue/validationJob.d.ts.map +1 -0
- package/dist/queue/validationJob.js +435 -0
- package/dist/queue/validationJob.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +328 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/validationReportStore.d.ts +170 -0
- package/dist/resources/validationReportStore.d.ts.map +1 -0
- package/dist/resources/validationReportStore.js +515 -0
- package/dist/resources/validationReportStore.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +102 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/asyncValidation.d.ts +19 -0
- package/dist/tools/asyncValidation.d.ts.map +1 -0
- package/dist/tools/asyncValidation.js +346 -0
- package/dist/tools/asyncValidation.js.map +1 -0
- package/dist/tools/buildContext.d.ts +17 -0
- package/dist/tools/buildContext.d.ts.map +1 -0
- package/dist/tools/buildContext.js +188 -0
- package/dist/tools/buildContext.js.map +1 -0
- package/dist/tools/getDependencyGraph.d.ts +16 -0
- package/dist/tools/getDependencyGraph.d.ts.map +1 -0
- package/dist/tools/getDependencyGraph.js +436 -0
- package/dist/tools/getDependencyGraph.js.map +1 -0
- package/dist/tools/incrementalValidation.d.ts +71 -0
- package/dist/tools/incrementalValidation.d.ts.map +1 -0
- package/dist/tools/incrementalValidation.js +203 -0
- package/dist/tools/incrementalValidation.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/validateCode.d.ts +17 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +368 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateCodeLite.d.ts +2 -0
- package/dist/tools/validateCodeLite.d.ts.map +1 -0
- package/dist/tools/validateCodeLite.js +2 -0
- package/dist/tools/validateCodeLite.js.map +1 -0
- package/dist/tools/validation/builtins.d.ts +92 -0
- package/dist/tools/validation/builtins.d.ts.map +1 -0
- package/dist/tools/validation/builtins.js +2184 -0
- package/dist/tools/validation/builtins.js.map +1 -0
- package/dist/tools/validation/contextualNaming.d.ts +99 -0
- package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
- package/dist/tools/validation/contextualNaming.js +959 -0
- package/dist/tools/validation/contextualNaming.js.map +1 -0
- package/dist/tools/validation/deadCode.d.ts +115 -0
- package/dist/tools/validation/deadCode.d.ts.map +1 -0
- package/dist/tools/validation/deadCode.js +861 -0
- package/dist/tools/validation/deadCode.js.map +1 -0
- package/dist/tools/validation/extractors/index.d.ts +131 -0
- package/dist/tools/validation/extractors/index.d.ts.map +1 -0
- package/dist/tools/validation/extractors/index.js +233 -0
- package/dist/tools/validation/extractors/index.js.map +1 -0
- package/dist/tools/validation/extractors/javascript.d.ts +73 -0
- package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
- package/dist/tools/validation/extractors/javascript.js +1841 -0
- package/dist/tools/validation/extractors/javascript.js.map +1 -0
- package/dist/tools/validation/extractors/python.d.ts +93 -0
- package/dist/tools/validation/extractors/python.d.ts.map +1 -0
- package/dist/tools/validation/extractors/python.js +799 -0
- package/dist/tools/validation/extractors/python.js.map +1 -0
- package/dist/tools/validation/manifest.d.ts +45 -0
- package/dist/tools/validation/manifest.d.ts.map +1 -0
- package/dist/tools/validation/manifest.js +719 -0
- package/dist/tools/validation/manifest.js.map +1 -0
- package/dist/tools/validation/parser.d.ts +58 -0
- package/dist/tools/validation/parser.d.ts.map +1 -0
- package/dist/tools/validation/parser.js +232 -0
- package/dist/tools/validation/parser.js.map +1 -0
- package/dist/tools/validation/registry.d.ts +15 -0
- package/dist/tools/validation/registry.d.ts.map +1 -0
- package/dist/tools/validation/registry.js +169 -0
- package/dist/tools/validation/registry.js.map +1 -0
- package/dist/tools/validation/scoring.d.ts +54 -0
- package/dist/tools/validation/scoring.d.ts.map +1 -0
- package/dist/tools/validation/scoring.js +242 -0
- package/dist/tools/validation/scoring.js.map +1 -0
- package/dist/tools/validation/types.d.ts +120 -0
- package/dist/tools/validation/types.d.ts.map +1 -0
- package/dist/tools/validation/types.js +11 -0
- package/dist/tools/validation/types.js.map +1 -0
- package/dist/tools/validation/unusedLocals.d.ts +36 -0
- package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
- package/dist/tools/validation/unusedLocals.js +333 -0
- package/dist/tools/validation/unusedLocals.js.map +1 -0
- package/dist/tools/validation/validation.d.ts +98 -0
- package/dist/tools/validation/validation.d.ts.map +1 -0
- package/dist/tools/validation/validation.js +1837 -0
- package/dist/tools/validation/validation.js.map +1 -0
- package/dist/types/codeGraph.d.ts +163 -0
- package/dist/types/codeGraph.d.ts.map +1 -0
- package/dist/types/codeGraph.js +9 -0
- package/dist/types/codeGraph.js.map +1 -0
- package/dist/types/symbolGraph.d.ts +68 -0
- package/dist/types/symbolGraph.d.ts.map +1 -0
- package/dist/types/symbolGraph.js +10 -0
- package/dist/types/symbolGraph.js.map +1 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +7 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/fileFilter.d.ts +37 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +91 -0
- package/dist/utils/fileFilter.js.map +1 -0
- package/dist/utils/gitUtils.d.ts +28 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +81 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/serialization.d.ts +25 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +53 -0
- package/dist/utils/serialization.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtinTypes.js","sourceRoot":"","sources":["../../src/analyzers/builtinTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Complexity Analyzer (AST-based)
|
|
3
|
+
*
|
|
4
|
+
* Calculates cyclomatic complexity and identifies complex code patterns
|
|
5
|
+
* using proper AST parsing instead of regex-based indentation counting
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
*/
|
|
9
|
+
import { Issue } from "../types/tools.js";
|
|
10
|
+
/**
|
|
11
|
+
* Analyze code complexity using AST
|
|
12
|
+
*/
|
|
13
|
+
export declare function analyzeComplexity(code: string, language: string): Promise<Issue[]>;
|
|
14
|
+
//# sourceMappingURL=complexity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.d.ts","sourceRoot":"","sources":["../../src/analyzers/complexity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI1C;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,EAAE,CAAC,CAsBlB"}
|
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Complexity Analyzer (AST-based)
|
|
3
|
+
*
|
|
4
|
+
* Calculates cyclomatic complexity and identifies complex code patterns
|
|
5
|
+
* using proper AST parsing instead of regex-based indentation counting
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
*/
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
import { getParser } from "../tools/validation/parser.js";
|
|
11
|
+
/**
|
|
12
|
+
* Analyze code complexity using AST
|
|
13
|
+
*/
|
|
14
|
+
export async function analyzeComplexity(code, language) {
|
|
15
|
+
logger.debug("Analyzing complexity with AST...");
|
|
16
|
+
try {
|
|
17
|
+
if (language === "javascript" || language === "typescript") {
|
|
18
|
+
return await analyzeJavaScriptComplexityAST(code, language);
|
|
19
|
+
}
|
|
20
|
+
else if (language === "python") {
|
|
21
|
+
return await analyzePythonComplexity(code);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Fallback to simple analysis for unsupported languages
|
|
25
|
+
return await analyzeComplexityFallback(code, language);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.error("Error in AST-based complexity analysis, falling back:", error);
|
|
30
|
+
return await analyzeComplexityFallback(code, language);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Analyze JavaScript/TypeScript complexity using Tree-sitter AST.
|
|
35
|
+
*/
|
|
36
|
+
async function analyzeJavaScriptComplexityAST(code, language) {
|
|
37
|
+
const issues = [];
|
|
38
|
+
try {
|
|
39
|
+
const parser = getParser(language);
|
|
40
|
+
const tree = parser.parse(code);
|
|
41
|
+
const root = tree.rootNode;
|
|
42
|
+
// Track functions and their complexity
|
|
43
|
+
const functions = [];
|
|
44
|
+
const getText = (node) => code.substring(node.startIndex, node.endIndex);
|
|
45
|
+
const isFunctionLikeNode = (type) => type === "function_declaration" ||
|
|
46
|
+
type === "function" ||
|
|
47
|
+
type === "function_expression" ||
|
|
48
|
+
type === "arrow_function" ||
|
|
49
|
+
type === "method_definition";
|
|
50
|
+
const isNestedDefNode = (type) => isFunctionLikeNode(type) ||
|
|
51
|
+
type === "class_declaration" ||
|
|
52
|
+
type === "class";
|
|
53
|
+
const isBlockNestingNode = (type) => type === "if_statement" ||
|
|
54
|
+
type === "for_statement" ||
|
|
55
|
+
type === "for_in_statement" ||
|
|
56
|
+
type === "for_of_statement" ||
|
|
57
|
+
type === "while_statement" ||
|
|
58
|
+
type === "do_statement" ||
|
|
59
|
+
type === "switch_statement" ||
|
|
60
|
+
type === "try_statement" ||
|
|
61
|
+
type === "catch_clause";
|
|
62
|
+
const resolveFunctionName = (node) => {
|
|
63
|
+
const nameNode = node.childForFieldName?.("name");
|
|
64
|
+
if (nameNode)
|
|
65
|
+
return getText(nameNode);
|
|
66
|
+
if (node.type === "arrow_function") {
|
|
67
|
+
const parent = node.parent;
|
|
68
|
+
if (parent?.type === "variable_declarator") {
|
|
69
|
+
const n = parent.childForFieldName?.("name");
|
|
70
|
+
if (n)
|
|
71
|
+
return getText(n);
|
|
72
|
+
}
|
|
73
|
+
if (parent?.type === "pair") {
|
|
74
|
+
const key = parent.childForFieldName?.("key");
|
|
75
|
+
if (key)
|
|
76
|
+
return getText(key);
|
|
77
|
+
}
|
|
78
|
+
if (parent?.type === "assignment_expression") {
|
|
79
|
+
const left = parent.childForFieldName?.("left");
|
|
80
|
+
if (left?.type === "identifier")
|
|
81
|
+
return getText(left);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return "anonymous";
|
|
85
|
+
};
|
|
86
|
+
const computeFunctionComplexity = (bodyNode, functionNodeId) => {
|
|
87
|
+
let complexity = 1;
|
|
88
|
+
let maxNesting = 0;
|
|
89
|
+
const traverse = (node, nesting) => {
|
|
90
|
+
if (!node)
|
|
91
|
+
return;
|
|
92
|
+
// Do not include nested defs in the parent function's complexity.
|
|
93
|
+
if (node.id !== functionNodeId && isNestedDefNode(node.type)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
switch (node.type) {
|
|
97
|
+
case "if_statement":
|
|
98
|
+
complexity++;
|
|
99
|
+
break;
|
|
100
|
+
case "for_statement":
|
|
101
|
+
case "for_in_statement":
|
|
102
|
+
case "for_of_statement":
|
|
103
|
+
case "while_statement":
|
|
104
|
+
case "do_statement":
|
|
105
|
+
complexity++;
|
|
106
|
+
break;
|
|
107
|
+
case "catch_clause":
|
|
108
|
+
complexity++;
|
|
109
|
+
break;
|
|
110
|
+
case "conditional_expression":
|
|
111
|
+
case "ternary_expression":
|
|
112
|
+
complexity++;
|
|
113
|
+
break;
|
|
114
|
+
case "switch_case":
|
|
115
|
+
complexity++;
|
|
116
|
+
break;
|
|
117
|
+
case "binary_expression":
|
|
118
|
+
case "logical_expression": {
|
|
119
|
+
for (const child of node.children || []) {
|
|
120
|
+
const t = child?.type;
|
|
121
|
+
if (t === "&&" || t === "||")
|
|
122
|
+
complexity++;
|
|
123
|
+
}
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const nextNesting = isBlockNestingNode(node.type) ? nesting + 1 : nesting;
|
|
128
|
+
maxNesting = Math.max(maxNesting, nextNesting);
|
|
129
|
+
for (const child of node.children || []) {
|
|
130
|
+
traverse(child, nextNesting);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
traverse(bodyNode, 0);
|
|
134
|
+
return { complexity, nestingLevel: maxNesting };
|
|
135
|
+
};
|
|
136
|
+
const collectFunctions = (node) => {
|
|
137
|
+
if (!node)
|
|
138
|
+
return;
|
|
139
|
+
if (isFunctionLikeNode(node.type)) {
|
|
140
|
+
const bodyNode = node.childForFieldName?.("body");
|
|
141
|
+
const name = resolveFunctionName(node);
|
|
142
|
+
const line = node.startPosition?.row + 1 || 0;
|
|
143
|
+
const lineCount = node.endPosition && node.startPosition
|
|
144
|
+
? node.endPosition.row - node.startPosition.row + 1
|
|
145
|
+
: 0;
|
|
146
|
+
const { complexity, nestingLevel } = bodyNode
|
|
147
|
+
? computeFunctionComplexity(bodyNode, node.id)
|
|
148
|
+
: { complexity: 1, nestingLevel: 0 };
|
|
149
|
+
functions.push({ name, line, complexity, nestingLevel, lineCount });
|
|
150
|
+
}
|
|
151
|
+
for (const child of node.children || []) {
|
|
152
|
+
collectFunctions(child);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
collectFunctions(root);
|
|
156
|
+
// Generate issues from function analysis
|
|
157
|
+
for (const func of functions) {
|
|
158
|
+
// High cyclomatic complexity
|
|
159
|
+
if (func.complexity > 10) {
|
|
160
|
+
issues.push({
|
|
161
|
+
type: "highComplexity",
|
|
162
|
+
severity: func.complexity > 20 ? "high" : "medium",
|
|
163
|
+
message: `Function '${func.name}' has high cyclomatic complexity (${func.complexity})`,
|
|
164
|
+
line: func.line,
|
|
165
|
+
column: 0,
|
|
166
|
+
code: `function ${func.name}`,
|
|
167
|
+
suggestion: "Consider breaking this function into smaller functions",
|
|
168
|
+
autoFixable: false,
|
|
169
|
+
confidence: 95,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Long functions
|
|
173
|
+
if (func.lineCount > 50) {
|
|
174
|
+
issues.push({
|
|
175
|
+
type: "longFunction",
|
|
176
|
+
severity: "medium",
|
|
177
|
+
message: `Function '${func.name}' is too long (${func.lineCount} lines)`,
|
|
178
|
+
line: func.line,
|
|
179
|
+
column: 0,
|
|
180
|
+
code: `function ${func.name}`,
|
|
181
|
+
suggestion: "Functions should typically be under 50 lines",
|
|
182
|
+
autoFixable: false,
|
|
183
|
+
confidence: 90,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Deep nesting (only flag if > 4 levels, which is reasonable)
|
|
187
|
+
if (func.nestingLevel > 4) {
|
|
188
|
+
issues.push({
|
|
189
|
+
type: "deepNesting",
|
|
190
|
+
severity: "medium",
|
|
191
|
+
message: `Function '${func.name}' has deep nesting (level ${func.nestingLevel})`,
|
|
192
|
+
line: func.line,
|
|
193
|
+
column: 0,
|
|
194
|
+
code: `function ${func.name}`,
|
|
195
|
+
suggestion: "Consider extracting nested logic into separate functions or using early returns",
|
|
196
|
+
autoFixable: false,
|
|
197
|
+
confidence: 85,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
logger.debug(`Found ${issues.length} complexity issues (JS/TS AST-based)`);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
logger.error("Error parsing JavaScript/TypeScript Tree-sitter AST:", error);
|
|
205
|
+
}
|
|
206
|
+
return issues;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Analyze Python complexity using Tree-sitter AST.
|
|
210
|
+
*/
|
|
211
|
+
async function analyzePythonComplexity(code) {
|
|
212
|
+
try {
|
|
213
|
+
return analyzePythonComplexityAST(code);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
logger.error("Error analyzing Python complexity with Tree-sitter AST; falling back to heuristics:", error);
|
|
217
|
+
return analyzePythonComplexityHeuristic(code);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function analyzePythonComplexityAST(code) {
|
|
221
|
+
const issues = [];
|
|
222
|
+
const parser = getParser("python");
|
|
223
|
+
const tree = parser.parse(code);
|
|
224
|
+
const functions = [];
|
|
225
|
+
const root = tree.rootNode;
|
|
226
|
+
const getText = (node) => code.substring(node.startIndex, node.endIndex);
|
|
227
|
+
const isBlockNestingNode = (type) => type === "if_statement" ||
|
|
228
|
+
type === "for_statement" ||
|
|
229
|
+
type === "while_statement" ||
|
|
230
|
+
type === "try_statement" ||
|
|
231
|
+
type === "with_statement" ||
|
|
232
|
+
type === "match_statement";
|
|
233
|
+
const computeFunctionComplexity = (bodyNode, functionNodeId) => {
|
|
234
|
+
let complexity = 1;
|
|
235
|
+
let maxNesting = 0;
|
|
236
|
+
const traverse = (node, nesting) => {
|
|
237
|
+
if (!node)
|
|
238
|
+
return;
|
|
239
|
+
// Do not include nested defs in the parent function's complexity.
|
|
240
|
+
if (node.id !== functionNodeId &&
|
|
241
|
+
(node.type === "function_definition" || node.type === "class_definition")) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// Decision points
|
|
245
|
+
switch (node.type) {
|
|
246
|
+
case "if_statement":
|
|
247
|
+
complexity++;
|
|
248
|
+
break;
|
|
249
|
+
case "elif_clause":
|
|
250
|
+
complexity++;
|
|
251
|
+
break;
|
|
252
|
+
case "for_statement":
|
|
253
|
+
case "while_statement":
|
|
254
|
+
complexity++;
|
|
255
|
+
break;
|
|
256
|
+
case "except_clause":
|
|
257
|
+
complexity++;
|
|
258
|
+
break;
|
|
259
|
+
case "conditional_expression":
|
|
260
|
+
complexity++;
|
|
261
|
+
break;
|
|
262
|
+
case "case_clause":
|
|
263
|
+
// Count each case as a decision point (similar to switch cases)
|
|
264
|
+
complexity++;
|
|
265
|
+
break;
|
|
266
|
+
case "boolean_operator": {
|
|
267
|
+
// Count boolean operator occurrences (and/or). Tree-sitter represents these as nodes.
|
|
268
|
+
// The operator itself is usually a child token.
|
|
269
|
+
for (const child of node.children || []) {
|
|
270
|
+
const t = child.type;
|
|
271
|
+
if (t === "and" || t === "or")
|
|
272
|
+
complexity++;
|
|
273
|
+
}
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const nextNesting = isBlockNestingNode(node.type) ? nesting + 1 : nesting;
|
|
278
|
+
maxNesting = Math.max(maxNesting, nextNesting);
|
|
279
|
+
for (const child of node.children || []) {
|
|
280
|
+
traverse(child, nextNesting);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
traverse(bodyNode, 0);
|
|
284
|
+
return { complexity, nestingLevel: maxNesting };
|
|
285
|
+
};
|
|
286
|
+
const collectFunctions = (node) => {
|
|
287
|
+
if (!node)
|
|
288
|
+
return;
|
|
289
|
+
if (node.type === "function_definition") {
|
|
290
|
+
const nameNode = node.childForFieldName?.("name");
|
|
291
|
+
const bodyNode = node.childForFieldName?.("body");
|
|
292
|
+
const name = nameNode ? getText(nameNode) : "anonymous";
|
|
293
|
+
const line = node.startPosition?.row + 1 || 0;
|
|
294
|
+
const lineCount = node.endPosition && node.startPosition
|
|
295
|
+
? node.endPosition.row - node.startPosition.row + 1
|
|
296
|
+
: 0;
|
|
297
|
+
const { complexity, nestingLevel } = bodyNode
|
|
298
|
+
? computeFunctionComplexity(bodyNode, node.id)
|
|
299
|
+
: { complexity: 1, nestingLevel: 0 };
|
|
300
|
+
functions.push({ name, line, complexity, nestingLevel, lineCount });
|
|
301
|
+
// Still recurse to find nested functions (each will be analyzed independently)
|
|
302
|
+
for (const child of node.children || []) {
|
|
303
|
+
collectFunctions(child);
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
for (const child of node.children || []) {
|
|
308
|
+
collectFunctions(child);
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
collectFunctions(root);
|
|
312
|
+
for (const func of functions) {
|
|
313
|
+
if (func.complexity > 10) {
|
|
314
|
+
issues.push({
|
|
315
|
+
type: "highComplexity",
|
|
316
|
+
severity: func.complexity > 20 ? "high" : "medium",
|
|
317
|
+
message: `Function '${func.name}' has high cyclomatic complexity (${func.complexity})`,
|
|
318
|
+
line: func.line,
|
|
319
|
+
column: 0,
|
|
320
|
+
code: `def ${func.name}(...)`,
|
|
321
|
+
suggestion: "Consider breaking this function into smaller functions",
|
|
322
|
+
autoFixable: false,
|
|
323
|
+
confidence: 90,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
if (func.lineCount > 50) {
|
|
327
|
+
issues.push({
|
|
328
|
+
type: "longFunction",
|
|
329
|
+
severity: "medium",
|
|
330
|
+
message: `Function '${func.name}' is too long (${func.lineCount} lines)`,
|
|
331
|
+
line: func.line,
|
|
332
|
+
column: 0,
|
|
333
|
+
code: `def ${func.name}(...)`,
|
|
334
|
+
suggestion: "Functions should typically be under 50 lines",
|
|
335
|
+
autoFixable: false,
|
|
336
|
+
confidence: 90,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
if (func.nestingLevel > 4) {
|
|
340
|
+
issues.push({
|
|
341
|
+
type: "deepNesting",
|
|
342
|
+
severity: "medium",
|
|
343
|
+
message: `Function '${func.name}' has deep nesting (level ${func.nestingLevel})`,
|
|
344
|
+
line: func.line,
|
|
345
|
+
column: 0,
|
|
346
|
+
code: `def ${func.name}(...)`,
|
|
347
|
+
suggestion: "Consider extracting nested logic into separate functions or using early returns",
|
|
348
|
+
autoFixable: false,
|
|
349
|
+
confidence: 85,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
logger.debug(`Found ${issues.length} complexity issues (Python AST-based)`);
|
|
354
|
+
return issues;
|
|
355
|
+
}
|
|
356
|
+
function analyzePythonComplexityHeuristic(code) {
|
|
357
|
+
const issues = [];
|
|
358
|
+
const functions = extractPythonFunctions(code);
|
|
359
|
+
for (const func of functions) {
|
|
360
|
+
const complexity = calculatePythonComplexity(func.body);
|
|
361
|
+
if (complexity > 10) {
|
|
362
|
+
issues.push({
|
|
363
|
+
type: "highComplexity",
|
|
364
|
+
severity: complexity > 20 ? "high" : "medium",
|
|
365
|
+
message: `Function '${func.name}' has high cyclomatic complexity (${complexity})`,
|
|
366
|
+
line: func.line,
|
|
367
|
+
column: 0,
|
|
368
|
+
code: func.signature,
|
|
369
|
+
suggestion: "Consider breaking this function into smaller functions",
|
|
370
|
+
autoFixable: false,
|
|
371
|
+
confidence: 75,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
const lineCount = func.body.split("\n").length;
|
|
375
|
+
if (lineCount > 50) {
|
|
376
|
+
issues.push({
|
|
377
|
+
type: "longFunction",
|
|
378
|
+
severity: "medium",
|
|
379
|
+
message: `Function '${func.name}' is too long (${lineCount} lines)`,
|
|
380
|
+
line: func.line,
|
|
381
|
+
column: 0,
|
|
382
|
+
code: func.signature,
|
|
383
|
+
suggestion: "Functions should typically be under 50 lines",
|
|
384
|
+
autoFixable: false,
|
|
385
|
+
confidence: 80,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
const maxNesting = calculatePythonNesting(func.body);
|
|
389
|
+
if (maxNesting > 4) {
|
|
390
|
+
issues.push({
|
|
391
|
+
type: "deepNesting",
|
|
392
|
+
severity: "medium",
|
|
393
|
+
message: `Function '${func.name}' has deep nesting (level ${maxNesting})`,
|
|
394
|
+
line: func.line,
|
|
395
|
+
column: 0,
|
|
396
|
+
code: func.signature,
|
|
397
|
+
suggestion: "Consider extracting nested logic into separate functions or using early returns",
|
|
398
|
+
autoFixable: false,
|
|
399
|
+
confidence: 75,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
logger.debug(`Found ${issues.length} complexity issues (Python heuristic)`);
|
|
404
|
+
return issues;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Extract Python functions from code
|
|
408
|
+
*/
|
|
409
|
+
function extractPythonFunctions(code) {
|
|
410
|
+
const functions = [];
|
|
411
|
+
const lines = code.split("\n");
|
|
412
|
+
let currentFunction = null;
|
|
413
|
+
let functionIndent = 0;
|
|
414
|
+
for (let i = 0; i < lines.length; i++) {
|
|
415
|
+
const line = lines[i];
|
|
416
|
+
const trimmed = line.trim();
|
|
417
|
+
// Skip empty lines and comments
|
|
418
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
419
|
+
continue;
|
|
420
|
+
// Detect function definition
|
|
421
|
+
const funcMatch = trimmed.match(/^(?:async\s+)?def\s+(\w+)\s*\(/);
|
|
422
|
+
if (funcMatch) {
|
|
423
|
+
// Save previous function if exists
|
|
424
|
+
if (currentFunction) {
|
|
425
|
+
functions.push(currentFunction);
|
|
426
|
+
}
|
|
427
|
+
// Start new function
|
|
428
|
+
const indent = line.match(/^(\s*)/)?.[1].length || 0;
|
|
429
|
+
currentFunction = {
|
|
430
|
+
name: funcMatch[1],
|
|
431
|
+
signature: trimmed,
|
|
432
|
+
body: "",
|
|
433
|
+
line: i + 1,
|
|
434
|
+
};
|
|
435
|
+
functionIndent = indent;
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
// Add to current function body
|
|
439
|
+
if (currentFunction) {
|
|
440
|
+
const indent = line.match(/^(\s*)/)?.[1].length || 0;
|
|
441
|
+
// If we're back to the same or less indentation, function ended
|
|
442
|
+
if (trimmed && indent <= functionIndent) {
|
|
443
|
+
functions.push(currentFunction);
|
|
444
|
+
currentFunction = null;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
currentFunction.body += line + "\n";
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Don't forget the last function
|
|
452
|
+
if (currentFunction) {
|
|
453
|
+
functions.push(currentFunction);
|
|
454
|
+
}
|
|
455
|
+
return functions;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Calculate Python complexity heuristically
|
|
459
|
+
*/
|
|
460
|
+
function calculatePythonComplexity(code) {
|
|
461
|
+
let complexity = 1; // Base complexity
|
|
462
|
+
// Count decision points
|
|
463
|
+
const patterns = [
|
|
464
|
+
/\bif\b/g,
|
|
465
|
+
/\belif\b/g,
|
|
466
|
+
/\bfor\b/g,
|
|
467
|
+
/\bwhile\b/g,
|
|
468
|
+
/\band\b/g,
|
|
469
|
+
/\bor\b/g,
|
|
470
|
+
/\bexcept\b/g,
|
|
471
|
+
];
|
|
472
|
+
for (const pattern of patterns) {
|
|
473
|
+
const matches = code.match(pattern);
|
|
474
|
+
if (matches) {
|
|
475
|
+
complexity += matches.length;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return complexity;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Calculate Python nesting level (relative to function body)
|
|
482
|
+
*/
|
|
483
|
+
function calculatePythonNesting(code) {
|
|
484
|
+
const lines = code.split("\n");
|
|
485
|
+
let maxNesting = 0;
|
|
486
|
+
let baseIndent = -1;
|
|
487
|
+
for (const line of lines) {
|
|
488
|
+
const trimmed = line.trim();
|
|
489
|
+
// Skip empty lines, comments, and docstrings
|
|
490
|
+
if (!trimmed ||
|
|
491
|
+
trimmed.startsWith("#") ||
|
|
492
|
+
trimmed.startsWith('"""') ||
|
|
493
|
+
trimmed.startsWith("'''")) {
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
496
|
+
const indent = line.match(/^(\s*)/)?.[1].length || 0;
|
|
497
|
+
// Set base indent from first non-empty line
|
|
498
|
+
if (baseIndent === -1 && trimmed) {
|
|
499
|
+
baseIndent = indent;
|
|
500
|
+
}
|
|
501
|
+
// Calculate nesting relative to base
|
|
502
|
+
if (baseIndent >= 0) {
|
|
503
|
+
const relativeIndent = indent - baseIndent;
|
|
504
|
+
const nestingLevel = Math.floor(relativeIndent / 4); // Python uses 4-space indent
|
|
505
|
+
maxNesting = Math.max(maxNesting, nestingLevel);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return maxNesting;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Fallback complexity analysis for unsupported languages
|
|
512
|
+
*/
|
|
513
|
+
async function analyzeComplexityFallback(code, language) {
|
|
514
|
+
const issues = [];
|
|
515
|
+
// Simple line-based analysis as fallback
|
|
516
|
+
const functions = extractFunctions(code, language);
|
|
517
|
+
for (const func of functions) {
|
|
518
|
+
const complexity = calculateCyclomaticComplexity(func.body);
|
|
519
|
+
if (complexity > 10) {
|
|
520
|
+
issues.push({
|
|
521
|
+
type: "highComplexity",
|
|
522
|
+
severity: complexity > 20 ? "high" : "medium",
|
|
523
|
+
message: `Function '${func.name}' has high cyclomatic complexity (${complexity})`,
|
|
524
|
+
line: func.line,
|
|
525
|
+
column: 0,
|
|
526
|
+
code: func.signature,
|
|
527
|
+
suggestion: "Consider breaking this function into smaller functions",
|
|
528
|
+
autoFixable: false,
|
|
529
|
+
confidence: 75,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
const lineCount = func.body.split("\n").length;
|
|
533
|
+
if (lineCount > 50) {
|
|
534
|
+
issues.push({
|
|
535
|
+
type: "longFunction",
|
|
536
|
+
severity: "medium",
|
|
537
|
+
message: `Function '${func.name}' is too long (${lineCount} lines)`,
|
|
538
|
+
line: func.line,
|
|
539
|
+
column: 0,
|
|
540
|
+
code: func.signature,
|
|
541
|
+
suggestion: "Functions should typically be under 50 lines",
|
|
542
|
+
autoFixable: false,
|
|
543
|
+
confidence: 80,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return issues;
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Extract functions from code (fallback method)
|
|
551
|
+
*/
|
|
552
|
+
function extractFunctions(code, language) {
|
|
553
|
+
const functions = [];
|
|
554
|
+
const lines = code.split("\n");
|
|
555
|
+
let currentFunction = null;
|
|
556
|
+
let braceCount = 0;
|
|
557
|
+
lines.forEach((line, index) => {
|
|
558
|
+
if (language === "javascript" || language === "typescript") {
|
|
559
|
+
const funcMatch = line.match(/function\s+(\w+)\s*\(|const\s+(\w+)\s*=.*=>/);
|
|
560
|
+
if (funcMatch) {
|
|
561
|
+
currentFunction = {
|
|
562
|
+
name: funcMatch[1] || funcMatch[2],
|
|
563
|
+
signature: line.trim(),
|
|
564
|
+
body: "",
|
|
565
|
+
line: index + 1,
|
|
566
|
+
};
|
|
567
|
+
braceCount = 0;
|
|
568
|
+
}
|
|
569
|
+
if (currentFunction) {
|
|
570
|
+
currentFunction.body += line + "\n";
|
|
571
|
+
braceCount += (line.match(/{/g) || []).length;
|
|
572
|
+
braceCount -= (line.match(/}/g) || []).length;
|
|
573
|
+
if (braceCount === 0 && currentFunction.body.includes("{")) {
|
|
574
|
+
functions.push(currentFunction);
|
|
575
|
+
currentFunction = null;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
return functions;
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Calculate cyclomatic complexity (fallback method)
|
|
584
|
+
*/
|
|
585
|
+
function calculateCyclomaticComplexity(code) {
|
|
586
|
+
let complexity = 1;
|
|
587
|
+
const decisionKeywords = [
|
|
588
|
+
"if",
|
|
589
|
+
"else if",
|
|
590
|
+
"for",
|
|
591
|
+
"while",
|
|
592
|
+
"case",
|
|
593
|
+
"&&",
|
|
594
|
+
"||",
|
|
595
|
+
];
|
|
596
|
+
for (const keyword of decisionKeywords) {
|
|
597
|
+
const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
598
|
+
const regex = new RegExp(`\\b${escapedKeyword}\\b`, "g");
|
|
599
|
+
const matches = code.match(regex);
|
|
600
|
+
if (matches) {
|
|
601
|
+
complexity += matches.length;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
const ternaryMatches = code.match(/\?/g);
|
|
605
|
+
if (ternaryMatches) {
|
|
606
|
+
complexity += ternaryMatches.length;
|
|
607
|
+
}
|
|
608
|
+
return complexity;
|
|
609
|
+
}
|
|
610
|
+
//# sourceMappingURL=complexity.js.map
|