code-auditor-mcp 1.20.0 → 2.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/dist/adapters/GoAdapter.d.ts +53 -0
- package/dist/adapters/GoAdapter.d.ts.map +1 -0
- package/dist/adapters/GoAdapter.js +602 -0
- package/dist/adapters/GoAdapter.js.map +1 -0
- package/dist/adapters/GoConfig.d.ts +35 -0
- package/dist/adapters/GoConfig.d.ts.map +1 -0
- package/dist/adapters/GoConfig.js +155 -0
- package/dist/adapters/GoConfig.js.map +1 -0
- package/dist/adapters/LanguageAdapter.d.ts +135 -0
- package/dist/adapters/LanguageAdapter.d.ts.map +1 -0
- package/dist/adapters/LanguageAdapter.js +47 -0
- package/dist/adapters/LanguageAdapter.js.map +1 -0
- package/dist/adapters/TypeScriptAdapter.d.ts +43 -0
- package/dist/adapters/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/adapters/TypeScriptAdapter.js +386 -0
- package/dist/adapters/TypeScriptAdapter.js.map +1 -0
- package/dist/adapters/UniversalAnalyzer.d.ts +42 -0
- package/dist/adapters/UniversalAnalyzer.d.ts.map +1 -0
- package/dist/adapters/UniversalAnalyzer.js +103 -0
- package/dist/adapters/UniversalAnalyzer.js.map +1 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts +48 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.js +178 -0
- package/dist/adapters/UniversalSOLIDAnalyzer.js.map +1 -0
- package/dist/adapters/solidAnalyzerCompat.d.ts +21 -0
- package/dist/adapters/solidAnalyzerCompat.d.ts.map +1 -0
- package/dist/adapters/solidAnalyzerCompat.js +78 -0
- package/dist/adapters/solidAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +103 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +425 -0
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +117 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +618 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +129 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +473 -0
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +126 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -0
- package/dist/analyzers/cross-language/SchemaValidator.js +522 -0
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.js +59 -0
- package/dist/analyzers/dataAccessAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/documentationAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/documentationAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/documentationAnalyzerCompat.js +52 -0
- package/dist/analyzers/documentationAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/dryAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/dryAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/dryAnalyzerCompat.js +44 -0
- package/dist/analyzers/dryAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/schemaAnalyzer.d.ts +21 -0
- package/dist/analyzers/schemaAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/schemaAnalyzer.js +405 -0
- package/dist/analyzers/schemaAnalyzer.js.map +1 -0
- package/dist/analyzers/schemaAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/schemaAnalyzerCompat.js +69 -0
- package/dist/analyzers/schemaAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/solidAnalyzerCompat.d.ts +20 -0
- package/dist/analyzers/solidAnalyzerCompat.d.ts.map +1 -0
- package/dist/analyzers/solidAnalyzerCompat.js +78 -0
- package/dist/analyzers/solidAnalyzerCompat.js.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +71 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +276 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +82 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +489 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +48 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +175 -0
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +64 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +286 -0
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +119 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +812 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +23 -7
- package/dist/auditRunner.js.map +1 -1
- package/dist/codeIndexDB-enhanced.d.ts +80 -0
- package/dist/codeIndexDB-enhanced.d.ts.map +1 -0
- package/dist/codeIndexDB-enhanced.js +488 -0
- package/dist/codeIndexDB-enhanced.js.map +1 -0
- package/dist/codeIndexDb.d.ts +70 -1
- package/dist/codeIndexDb.d.ts.map +1 -1
- package/dist/codeIndexDb.js +199 -2
- package/dist/codeIndexDb.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +181 -0
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -0
- package/dist/languages/LanguageOrchestrator.js +365 -0
- package/dist/languages/LanguageOrchestrator.js.map +1 -0
- package/dist/languages/LanguageRegistry.d.ts +43 -0
- package/dist/languages/LanguageRegistry.d.ts.map +1 -0
- package/dist/languages/LanguageRegistry.js +86 -0
- package/dist/languages/LanguageRegistry.js.map +1 -0
- package/dist/languages/RuntimeManager.d.ts +181 -0
- package/dist/languages/RuntimeManager.d.ts.map +1 -0
- package/dist/languages/RuntimeManager.js +841 -0
- package/dist/languages/RuntimeManager.js.map +1 -0
- package/dist/languages/UniversalAnalyzer.d.ts +37 -0
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -0
- package/dist/languages/UniversalAnalyzer.js +101 -0
- package/dist/languages/UniversalAnalyzer.js.map +1 -0
- package/dist/languages/go/GoAdapter.d.ts +57 -0
- package/dist/languages/go/GoAdapter.d.ts.map +1 -0
- package/dist/languages/go/GoAdapter.js +360 -0
- package/dist/languages/go/GoAdapter.js.map +1 -0
- package/dist/languages/index.d.ts +13 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +23 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/types.d.ts +182 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +5 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript/TypeScriptAdapter.d.ts +108 -0
- package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +1 -0
- package/dist/languages/typescript/TypeScriptAdapter.js +567 -0
- package/dist/languages/typescript/TypeScriptAdapter.js.map +1 -0
- package/dist/languages/typescript/test-extraction.d.ts +2 -0
- package/dist/languages/typescript/test-extraction.d.ts.map +1 -0
- package/dist/languages/typescript/test-extraction.js +36 -0
- package/dist/languages/typescript/test-extraction.js.map +1 -0
- package/dist/mcp-hybrid.d.ts +10 -0
- package/dist/mcp-hybrid.d.ts.map +1 -0
- package/dist/mcp-hybrid.js +41 -0
- package/dist/mcp-hybrid.js.map +1 -0
- package/dist/mcp-index.d.ts +11 -0
- package/dist/mcp-index.d.ts.map +1 -0
- package/dist/mcp-index.js +101 -0
- package/dist/mcp-index.js.map +1 -0
- package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +67 -10
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts +49 -0
- package/dist/mcp-tools-shared.d.ts.map +1 -0
- package/dist/mcp-tools-shared.js +1282 -0
- package/dist/mcp-tools-shared.js.map +1 -0
- package/dist/mcp-ui-server.d.ts +27 -0
- package/dist/mcp-ui-server.d.ts.map +1 -0
- package/dist/mcp-ui-server.js +484 -0
- package/dist/mcp-ui-server.js.map +1 -0
- package/dist/mcp-ui-simple.d.ts +27 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -0
- package/dist/mcp-ui-simple.js +425 -0
- package/dist/mcp-ui-simple.js.map +1 -0
- package/dist/mcp.js +7 -4
- package/dist/mcp.js.map +1 -1
- package/dist/services/SchemaParser.d.ts +89 -0
- package/dist/services/SchemaParser.d.ts.map +1 -0
- package/dist/services/SchemaParser.js +434 -0
- package/dist/services/SchemaParser.js.map +1 -0
- package/dist/types/crossLanguage.d.ts +267 -0
- package/dist/types/crossLanguage.d.ts.map +1 -0
- package/dist/types/crossLanguage.js +6 -0
- package/dist/types/crossLanguage.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +6 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +12 -1
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/examples/schema-example.json +364 -0
- package/examples/schema-example.yaml +137 -0
- package/package.json +10 -3
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Language SOLID Analyzer
|
|
3
|
+
* Enhanced SOLID principle analysis that works across multiple languages
|
|
4
|
+
* using the cross-language entity model
|
|
5
|
+
*/
|
|
6
|
+
export class CrossLanguageSOLIDAnalyzer {
|
|
7
|
+
config;
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
this.config = {
|
|
10
|
+
maxResponsibilities: 3,
|
|
11
|
+
maxDependencies: 5,
|
|
12
|
+
maxInterfaceMembers: 7,
|
|
13
|
+
maxComplexity: 10,
|
|
14
|
+
maxParameters: 5,
|
|
15
|
+
checkAbstractions: true,
|
|
16
|
+
checkPolymorphism: true,
|
|
17
|
+
enableCrossLanguageAnalysis: true,
|
|
18
|
+
minCrossLanguageViolationConfidence: 0.7,
|
|
19
|
+
...config
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Analyze SOLID principles across multiple languages
|
|
24
|
+
*/
|
|
25
|
+
async analyze(entities, references) {
|
|
26
|
+
console.log(`[CrossLanguageSOLIDAnalyzer] Analyzing ${entities.length} entities across languages`);
|
|
27
|
+
const violations = [];
|
|
28
|
+
// Standard SOLID analysis per entity
|
|
29
|
+
violations.push(...await this.analyzeSingleResponsibility(entities, references));
|
|
30
|
+
violations.push(...await this.analyzeOpenClosed(entities, references));
|
|
31
|
+
violations.push(...await this.analyzeLiskovSubstitution(entities, references));
|
|
32
|
+
violations.push(...await this.analyzeInterfaceSegregation(entities, references));
|
|
33
|
+
violations.push(...await this.analyzeDependencyInversion(entities, references));
|
|
34
|
+
// Cross-language specific SOLID violations
|
|
35
|
+
if (this.config.enableCrossLanguageAnalysis) {
|
|
36
|
+
violations.push(...await this.analyzeCrossLanguageSOLID(entities, references));
|
|
37
|
+
}
|
|
38
|
+
console.log(`[CrossLanguageSOLIDAnalyzer] Found ${violations.length} SOLID violations`);
|
|
39
|
+
return violations;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Single Responsibility Principle - Enhanced for cross-language
|
|
43
|
+
*/
|
|
44
|
+
async analyzeSingleResponsibility(entities, references) {
|
|
45
|
+
const violations = [];
|
|
46
|
+
for (const entity of entities) {
|
|
47
|
+
const responsibilities = this.countResponsibilities(entity, references, entities);
|
|
48
|
+
if (responsibilities.count > this.config.maxResponsibilities) {
|
|
49
|
+
violations.push({
|
|
50
|
+
file: entity.file,
|
|
51
|
+
line: entity.startLine || 0,
|
|
52
|
+
severity: responsibilities.count > this.config.maxResponsibilities * 2 ? 'critical' : 'warning',
|
|
53
|
+
message: `${entity.type} '${entity.name}' has too many responsibilities (${responsibilities.count}) across ${responsibilities.languages.size} languages`,
|
|
54
|
+
principle: 'SRP',
|
|
55
|
+
entityId: entity.id,
|
|
56
|
+
entityName: entity.name,
|
|
57
|
+
entityType: entity.type,
|
|
58
|
+
language: entity.language,
|
|
59
|
+
crossLanguageIssue: responsibilities.languages.size > 1,
|
|
60
|
+
responsibilityCount: responsibilities.count,
|
|
61
|
+
confidence: responsibilities.confidence,
|
|
62
|
+
relatedEntities: responsibilities.relatedEntities,
|
|
63
|
+
details: {
|
|
64
|
+
responsibilities: responsibilities.count,
|
|
65
|
+
maxAllowed: this.config.maxResponsibilities,
|
|
66
|
+
languagesInvolved: Array.from(responsibilities.languages),
|
|
67
|
+
crossLanguageFactors: responsibilities.crossLanguageFactors
|
|
68
|
+
},
|
|
69
|
+
suggestion: this.generateSRPSuggestion(entity, responsibilities),
|
|
70
|
+
analyzer: 'cross-language-solid',
|
|
71
|
+
category: 'single-responsibility'
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return violations;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Open/Closed Principle - Cross-language switch detection
|
|
79
|
+
*/
|
|
80
|
+
async analyzeOpenClosed(entities, references) {
|
|
81
|
+
const violations = [];
|
|
82
|
+
if (!this.config.checkPolymorphism)
|
|
83
|
+
return violations;
|
|
84
|
+
for (const entity of entities) {
|
|
85
|
+
const polymorphismOpportunities = this.detectPolymorphismOpportunities(entity, references, entities);
|
|
86
|
+
if (polymorphismOpportunities.confidence > 0.6) {
|
|
87
|
+
violations.push({
|
|
88
|
+
file: entity.file,
|
|
89
|
+
line: entity.startLine || 0,
|
|
90
|
+
severity: 'suggestion',
|
|
91
|
+
message: `${entity.type} '${entity.name}' shows patterns that could benefit from polymorphism across ${polymorphismOpportunities.languages.size} languages`,
|
|
92
|
+
principle: 'OCP',
|
|
93
|
+
entityId: entity.id,
|
|
94
|
+
entityName: entity.name,
|
|
95
|
+
entityType: entity.type,
|
|
96
|
+
language: entity.language,
|
|
97
|
+
crossLanguageIssue: polymorphismOpportunities.languages.size > 1,
|
|
98
|
+
confidence: polymorphismOpportunities.confidence,
|
|
99
|
+
relatedEntities: polymorphismOpportunities.relatedEntities,
|
|
100
|
+
details: {
|
|
101
|
+
patterns: polymorphismOpportunities.patterns,
|
|
102
|
+
languagesInvolved: Array.from(polymorphismOpportunities.languages),
|
|
103
|
+
complexityScore: polymorphismOpportunities.complexityScore
|
|
104
|
+
},
|
|
105
|
+
suggestion: this.generateOCPSuggestion(entity, polymorphismOpportunities),
|
|
106
|
+
analyzer: 'cross-language-solid',
|
|
107
|
+
category: 'open-closed'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return violations;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Liskov Substitution Principle - Cross-language inheritance analysis
|
|
115
|
+
*/
|
|
116
|
+
async analyzeLiskovSubstitution(entities, references) {
|
|
117
|
+
const violations = [];
|
|
118
|
+
const hierarchies = this.findCrossLanguageHierarchies(entities, references);
|
|
119
|
+
for (const hierarchy of hierarchies) {
|
|
120
|
+
const lspViolations = this.analyzeHierarchyForLSP(hierarchy, entities);
|
|
121
|
+
violations.push(...lspViolations);
|
|
122
|
+
}
|
|
123
|
+
return violations;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Interface Segregation Principle - Cross-language interface analysis
|
|
127
|
+
*/
|
|
128
|
+
async analyzeInterfaceSegregation(entities, references) {
|
|
129
|
+
const violations = [];
|
|
130
|
+
const interfaces = entities.filter(e => e.type === 'interface');
|
|
131
|
+
for (const interfaceEntity of interfaces) {
|
|
132
|
+
const usage = this.analyzeInterfaceUsage(interfaceEntity, references, entities);
|
|
133
|
+
if (usage.memberCount > this.config.maxInterfaceMembers) {
|
|
134
|
+
violations.push({
|
|
135
|
+
file: interfaceEntity.file,
|
|
136
|
+
line: interfaceEntity.startLine || 0,
|
|
137
|
+
severity: 'warning',
|
|
138
|
+
message: `Interface '${interfaceEntity.name}' has ${usage.memberCount} members used across ${usage.languages.size} languages`,
|
|
139
|
+
principle: 'ISP',
|
|
140
|
+
entityId: interfaceEntity.id,
|
|
141
|
+
entityName: interfaceEntity.name,
|
|
142
|
+
entityType: interfaceEntity.type,
|
|
143
|
+
language: interfaceEntity.language,
|
|
144
|
+
crossLanguageIssue: usage.languages.size > 1,
|
|
145
|
+
memberCount: usage.memberCount,
|
|
146
|
+
confidence: usage.confidence,
|
|
147
|
+
relatedEntities: usage.implementers,
|
|
148
|
+
details: {
|
|
149
|
+
memberCount: usage.memberCount,
|
|
150
|
+
maxAllowed: this.config.maxInterfaceMembers,
|
|
151
|
+
implementerLanguages: Array.from(usage.languages),
|
|
152
|
+
unusedMembers: usage.unusedMembers
|
|
153
|
+
},
|
|
154
|
+
suggestion: this.generateISPSuggestion(interfaceEntity, usage),
|
|
155
|
+
analyzer: 'cross-language-solid',
|
|
156
|
+
category: 'interface-segregation'
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return violations;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Dependency Inversion Principle - Cross-language abstraction analysis
|
|
164
|
+
*/
|
|
165
|
+
async analyzeDependencyInversion(entities, references) {
|
|
166
|
+
const violations = [];
|
|
167
|
+
if (!this.config.checkAbstractions)
|
|
168
|
+
return violations;
|
|
169
|
+
for (const entity of entities) {
|
|
170
|
+
if (entity.type === 'class' || entity.type === 'struct' || entity.type === 'service') {
|
|
171
|
+
const dependencies = this.analyzeDependencies(entity, references, entities);
|
|
172
|
+
if (dependencies.concreteCount > this.config.maxDependencies) {
|
|
173
|
+
violations.push({
|
|
174
|
+
file: entity.file,
|
|
175
|
+
line: entity.startLine || 0,
|
|
176
|
+
severity: 'suggestion',
|
|
177
|
+
message: `${entity.type} '${entity.name}' depends on ${dependencies.concreteCount} concrete types across ${dependencies.languages.size} languages`,
|
|
178
|
+
principle: 'DIP',
|
|
179
|
+
entityId: entity.id,
|
|
180
|
+
entityName: entity.name,
|
|
181
|
+
entityType: entity.type,
|
|
182
|
+
language: entity.language,
|
|
183
|
+
crossLanguageIssue: dependencies.languages.size > 1,
|
|
184
|
+
dependencyCount: dependencies.concreteCount,
|
|
185
|
+
confidence: dependencies.confidence,
|
|
186
|
+
relatedEntities: dependencies.concreteDependencies,
|
|
187
|
+
details: {
|
|
188
|
+
concreteCount: dependencies.concreteCount,
|
|
189
|
+
abstractCount: dependencies.abstractCount,
|
|
190
|
+
maxAllowed: this.config.maxDependencies,
|
|
191
|
+
languagesInvolved: Array.from(dependencies.languages)
|
|
192
|
+
},
|
|
193
|
+
suggestion: this.generateDIPSuggestion(entity, dependencies),
|
|
194
|
+
analyzer: 'cross-language-solid',
|
|
195
|
+
category: 'dependency-inversion'
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return violations;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Cross-Language specific SOLID violations
|
|
204
|
+
*/
|
|
205
|
+
async analyzeCrossLanguageSOLID(entities, references) {
|
|
206
|
+
const violations = [];
|
|
207
|
+
// Detect API boundary violations
|
|
208
|
+
violations.push(...this.detectAPIBoundaryViolations(entities, references));
|
|
209
|
+
// Detect cross-language responsibility leakage
|
|
210
|
+
violations.push(...this.detectResponsibilityLeakage(entities, references));
|
|
211
|
+
// Detect distributed interface violations
|
|
212
|
+
violations.push(...this.detectDistributedInterfaceViolations(entities, references));
|
|
213
|
+
return violations;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Count responsibilities considering cross-language factors
|
|
217
|
+
*/
|
|
218
|
+
countResponsibilities(entity, references, allEntities) {
|
|
219
|
+
let count = 1; // Base responsibility
|
|
220
|
+
const languages = new Set([entity.language]);
|
|
221
|
+
const relatedEntities = [];
|
|
222
|
+
const crossLanguageFactors = [];
|
|
223
|
+
// Parameter complexity
|
|
224
|
+
if (entity.parameters && entity.parameters.length > this.config.maxParameters) {
|
|
225
|
+
count++;
|
|
226
|
+
crossLanguageFactors.push('excessive-parameters');
|
|
227
|
+
}
|
|
228
|
+
// Complexity factor
|
|
229
|
+
if (entity.complexity && entity.complexity > this.config.maxComplexity) {
|
|
230
|
+
count += Math.floor(entity.complexity / this.config.maxComplexity);
|
|
231
|
+
crossLanguageFactors.push('high-complexity');
|
|
232
|
+
}
|
|
233
|
+
// Cross-language calls
|
|
234
|
+
const outgoingRefs = references.filter(ref => ref.sourceId === entity.id);
|
|
235
|
+
const targetLanguages = new Set(outgoingRefs.map(ref => ref.targetLanguage));
|
|
236
|
+
for (const targetLang of targetLanguages) {
|
|
237
|
+
if (targetLang !== entity.language) {
|
|
238
|
+
languages.add(targetLang);
|
|
239
|
+
count++;
|
|
240
|
+
crossLanguageFactors.push('cross-language-dependency');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// API responsibilities
|
|
244
|
+
if (entity.apiEndpoint) {
|
|
245
|
+
count++;
|
|
246
|
+
crossLanguageFactors.push('api-endpoint');
|
|
247
|
+
}
|
|
248
|
+
// Service boundaries
|
|
249
|
+
if (entity.type === 'service' && outgoingRefs.length > 3) {
|
|
250
|
+
count++;
|
|
251
|
+
crossLanguageFactors.push('service-orchestration');
|
|
252
|
+
}
|
|
253
|
+
// Collect related entities
|
|
254
|
+
for (const ref of outgoingRefs) {
|
|
255
|
+
const target = allEntities.find(e => e.id === ref.targetId);
|
|
256
|
+
if (target && target.language !== entity.language) {
|
|
257
|
+
relatedEntities.push({
|
|
258
|
+
id: target.id,
|
|
259
|
+
name: target.name,
|
|
260
|
+
language: target.language,
|
|
261
|
+
relationship: ref.type
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const confidence = Math.min(1.0, 0.5 + (crossLanguageFactors.length * 0.1));
|
|
266
|
+
return { count, confidence, languages, relatedEntities, crossLanguageFactors };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Detect polymorphism opportunities across languages
|
|
270
|
+
*/
|
|
271
|
+
detectPolymorphismOpportunities(entity, references, allEntities) {
|
|
272
|
+
const languages = new Set([entity.language]);
|
|
273
|
+
const patterns = [];
|
|
274
|
+
let complexityScore = 0;
|
|
275
|
+
const relatedEntities = [];
|
|
276
|
+
// High complexity suggests switch-like patterns
|
|
277
|
+
if (entity.complexity && entity.complexity > 15) {
|
|
278
|
+
complexityScore += entity.complexity;
|
|
279
|
+
patterns.push('high-complexity');
|
|
280
|
+
}
|
|
281
|
+
// Multiple dependencies to similar types across languages
|
|
282
|
+
const outgoingRefs = references.filter(ref => ref.sourceId === entity.id);
|
|
283
|
+
const targetsByLanguage = new Map();
|
|
284
|
+
for (const ref of outgoingRefs) {
|
|
285
|
+
const target = allEntities.find(e => e.id === ref.targetId);
|
|
286
|
+
if (target) {
|
|
287
|
+
languages.add(target.language);
|
|
288
|
+
targetsByLanguage.set(target.language, (targetsByLanguage.get(target.language) || 0) + 1);
|
|
289
|
+
if (target.language !== entity.language) {
|
|
290
|
+
relatedEntities.push({
|
|
291
|
+
id: target.id,
|
|
292
|
+
name: target.name,
|
|
293
|
+
language: target.language,
|
|
294
|
+
relationship: ref.type
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Multiple targets per language suggests type-based branching
|
|
300
|
+
if (targetsByLanguage.size > 2) {
|
|
301
|
+
patterns.push('multi-language-dispatch');
|
|
302
|
+
complexityScore += targetsByLanguage.size * 5;
|
|
303
|
+
}
|
|
304
|
+
// Function name patterns
|
|
305
|
+
const switchLikeNames = ['handle', 'process', 'convert', 'transform', 'dispatch', 'route'];
|
|
306
|
+
if (switchLikeNames.some(pattern => entity.name.toLowerCase().includes(pattern))) {
|
|
307
|
+
patterns.push('switch-like-naming');
|
|
308
|
+
complexityScore += 10;
|
|
309
|
+
}
|
|
310
|
+
const confidence = Math.min(1.0, complexityScore / 50);
|
|
311
|
+
return { confidence, languages, patterns, complexityScore, relatedEntities };
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Find cross-language inheritance hierarchies
|
|
315
|
+
*/
|
|
316
|
+
findCrossLanguageHierarchies(entities, references) {
|
|
317
|
+
const hierarchies = [];
|
|
318
|
+
const processed = new Set();
|
|
319
|
+
for (const entity of entities) {
|
|
320
|
+
if (processed.has(entity.id))
|
|
321
|
+
continue;
|
|
322
|
+
const inheritance = references.filter(ref => (ref.sourceId === entity.id || ref.targetId === entity.id) &&
|
|
323
|
+
(ref.type === 'extends' || ref.type === 'implements'));
|
|
324
|
+
if (inheritance.length > 0) {
|
|
325
|
+
const hierarchyEntities = this.buildHierarchy(entity, inheritance, entities);
|
|
326
|
+
const languages = new Set(hierarchyEntities.map(e => e.language));
|
|
327
|
+
if (languages.size > 1) { // Cross-language hierarchy
|
|
328
|
+
hierarchies.push({
|
|
329
|
+
entities: hierarchyEntities,
|
|
330
|
+
languages,
|
|
331
|
+
relationships: inheritance
|
|
332
|
+
});
|
|
333
|
+
hierarchyEntities.forEach(e => processed.add(e.id));
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return hierarchies;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Build hierarchy from inheritance relationships
|
|
341
|
+
*/
|
|
342
|
+
buildHierarchy(startEntity, inheritanceRefs, allEntities) {
|
|
343
|
+
const entities = new Set();
|
|
344
|
+
const visited = new Set();
|
|
345
|
+
const traverse = (entityId) => {
|
|
346
|
+
if (visited.has(entityId))
|
|
347
|
+
return;
|
|
348
|
+
visited.add(entityId);
|
|
349
|
+
const entity = allEntities.find(e => e.id === entityId);
|
|
350
|
+
if (!entity)
|
|
351
|
+
return;
|
|
352
|
+
entities.add(entity);
|
|
353
|
+
// Find related inheritance relationships
|
|
354
|
+
const related = inheritanceRefs.filter(ref => ref.sourceId === entityId || ref.targetId === entityId);
|
|
355
|
+
for (const ref of related) {
|
|
356
|
+
const relatedId = ref.sourceId === entityId ? ref.targetId : ref.sourceId;
|
|
357
|
+
traverse(relatedId);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
traverse(startEntity.id);
|
|
361
|
+
return Array.from(entities);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Analyze hierarchy for LSP violations
|
|
365
|
+
*/
|
|
366
|
+
analyzeHierarchyForLSP(hierarchy, allEntities) {
|
|
367
|
+
const violations = [];
|
|
368
|
+
// Cross-language LSP is particularly challenging
|
|
369
|
+
for (const entity of hierarchy.entities) {
|
|
370
|
+
const parentRefs = hierarchy.relationships.filter(ref => ref.sourceId === entity.id && (ref.type === 'extends' || ref.type === 'implements'));
|
|
371
|
+
for (const ref of parentRefs) {
|
|
372
|
+
const parent = allEntities.find(e => e.id === ref.targetId);
|
|
373
|
+
if (parent && parent.language !== entity.language) {
|
|
374
|
+
// Cross-language inheritance is risky for LSP
|
|
375
|
+
violations.push({
|
|
376
|
+
file: entity.file,
|
|
377
|
+
line: entity.startLine || 0,
|
|
378
|
+
severity: 'warning',
|
|
379
|
+
message: `${entity.type} '${entity.name}' (${entity.language}) inherits from ${parent.name} (${parent.language}), creating cross-language LSP risks`,
|
|
380
|
+
principle: 'LSP',
|
|
381
|
+
entityId: entity.id,
|
|
382
|
+
entityName: entity.name,
|
|
383
|
+
entityType: entity.type,
|
|
384
|
+
language: entity.language,
|
|
385
|
+
crossLanguageIssue: true,
|
|
386
|
+
confidence: 0.8,
|
|
387
|
+
relatedEntities: [{
|
|
388
|
+
id: parent.id,
|
|
389
|
+
name: parent.name,
|
|
390
|
+
language: parent.language,
|
|
391
|
+
relationship: ref.type
|
|
392
|
+
}],
|
|
393
|
+
details: {
|
|
394
|
+
parentLanguage: parent.language,
|
|
395
|
+
childLanguage: entity.language,
|
|
396
|
+
relationshipType: ref.type
|
|
397
|
+
},
|
|
398
|
+
suggestion: 'Consider using composition or adapter patterns instead of cross-language inheritance',
|
|
399
|
+
analyzer: 'cross-language-solid',
|
|
400
|
+
category: 'liskov-substitution'
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return violations;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Analyze interface usage across languages
|
|
409
|
+
*/
|
|
410
|
+
analyzeInterfaceUsage(interfaceEntity, references, allEntities) {
|
|
411
|
+
const languages = new Set([interfaceEntity.language]);
|
|
412
|
+
const implementers = [];
|
|
413
|
+
// Find implementers
|
|
414
|
+
const implementationRefs = references.filter(ref => ref.targetId === interfaceEntity.id && ref.type === 'implements');
|
|
415
|
+
for (const ref of implementationRefs) {
|
|
416
|
+
const implementer = allEntities.find(e => e.id === ref.sourceId);
|
|
417
|
+
if (implementer) {
|
|
418
|
+
languages.add(implementer.language);
|
|
419
|
+
implementers.push({
|
|
420
|
+
id: implementer.id,
|
|
421
|
+
name: implementer.name,
|
|
422
|
+
language: implementer.language,
|
|
423
|
+
relationship: 'implements'
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Count members (simplified)
|
|
428
|
+
const memberCount = interfaceEntity.parameters?.length ||
|
|
429
|
+
interfaceEntity.metadata?.methodCount ||
|
|
430
|
+
interfaceEntity.metadata?.memberCount || 0;
|
|
431
|
+
// TODO: Analyze actual usage to find unused members
|
|
432
|
+
const unusedMembers = [];
|
|
433
|
+
const confidence = languages.size > 1 ? 0.9 : 0.7;
|
|
434
|
+
return { memberCount, confidence, languages, implementers, unusedMembers };
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Analyze dependencies for DIP violations
|
|
438
|
+
*/
|
|
439
|
+
analyzeDependencies(entity, references, allEntities) {
|
|
440
|
+
const languages = new Set([entity.language]);
|
|
441
|
+
const concreteDependencies = [];
|
|
442
|
+
let concreteCount = 0;
|
|
443
|
+
let abstractCount = 0;
|
|
444
|
+
const outgoingRefs = references.filter(ref => ref.sourceId === entity.id);
|
|
445
|
+
for (const ref of outgoingRefs) {
|
|
446
|
+
const target = allEntities.find(e => e.id === ref.targetId);
|
|
447
|
+
if (!target)
|
|
448
|
+
continue;
|
|
449
|
+
languages.add(target.language);
|
|
450
|
+
if (this.isConcreteType(target)) {
|
|
451
|
+
concreteCount++;
|
|
452
|
+
concreteDependencies.push({
|
|
453
|
+
id: target.id,
|
|
454
|
+
name: target.name,
|
|
455
|
+
language: target.language,
|
|
456
|
+
relationship: ref.type
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
abstractCount++;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
const confidence = languages.size > 1 ? 0.9 : 0.7;
|
|
464
|
+
return { concreteCount, abstractCount, confidence, languages, concreteDependencies };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Check if entity is concrete type
|
|
468
|
+
*/
|
|
469
|
+
isConcreteType(entity) {
|
|
470
|
+
if (entity.type === 'interface')
|
|
471
|
+
return false;
|
|
472
|
+
switch (entity.language) {
|
|
473
|
+
case 'typescript':
|
|
474
|
+
return !entity.metadata?.isAbstract;
|
|
475
|
+
case 'go':
|
|
476
|
+
return entity.type === 'struct';
|
|
477
|
+
case 'java':
|
|
478
|
+
case 'csharp':
|
|
479
|
+
return !entity.metadata?.isAbstract && entity.type === 'class';
|
|
480
|
+
default:
|
|
481
|
+
return entity.type === 'class' || entity.type === 'struct';
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Detect API boundary violations
|
|
486
|
+
*/
|
|
487
|
+
detectAPIBoundaryViolations(entities, references) {
|
|
488
|
+
const violations = [];
|
|
489
|
+
const apiEntities = entities.filter(e => e.apiEndpoint);
|
|
490
|
+
for (const apiEntity of apiEntities) {
|
|
491
|
+
const callers = references.filter(ref => ref.targetId === apiEntity.id && ref.type === 'api-call');
|
|
492
|
+
const callerLanguages = new Set(callers.map(ref => ref.sourceLanguage));
|
|
493
|
+
if (callerLanguages.size > 2) {
|
|
494
|
+
// API called from many languages - potential SRP violation
|
|
495
|
+
violations.push({
|
|
496
|
+
file: apiEntity.file,
|
|
497
|
+
line: apiEntity.startLine || 0,
|
|
498
|
+
severity: 'suggestion',
|
|
499
|
+
message: `API endpoint '${apiEntity.name}' is called from ${callerLanguages.size} different languages, suggesting multiple responsibilities`,
|
|
500
|
+
principle: 'SRP',
|
|
501
|
+
entityId: apiEntity.id,
|
|
502
|
+
entityName: apiEntity.name,
|
|
503
|
+
entityType: apiEntity.type,
|
|
504
|
+
language: apiEntity.language,
|
|
505
|
+
crossLanguageIssue: true,
|
|
506
|
+
confidence: 0.8,
|
|
507
|
+
details: {
|
|
508
|
+
callerLanguages: Array.from(callerLanguages),
|
|
509
|
+
callCount: callers.length
|
|
510
|
+
},
|
|
511
|
+
suggestion: 'Consider splitting this API into more focused, single-purpose endpoints',
|
|
512
|
+
analyzer: 'cross-language-solid',
|
|
513
|
+
category: 'single-responsibility'
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return violations;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Detect responsibility leakage across languages
|
|
521
|
+
*/
|
|
522
|
+
detectResponsibilityLeakage(entities, references) {
|
|
523
|
+
const violations = [];
|
|
524
|
+
// Look for entities that have too many cross-language dependencies
|
|
525
|
+
for (const entity of entities) {
|
|
526
|
+
const outgoingRefs = references.filter(ref => ref.sourceId === entity.id);
|
|
527
|
+
const crossLangRefs = outgoingRefs.filter(ref => ref.targetLanguage !== entity.language);
|
|
528
|
+
if (crossLangRefs.length > 3) {
|
|
529
|
+
violations.push({
|
|
530
|
+
file: entity.file,
|
|
531
|
+
line: entity.startLine || 0,
|
|
532
|
+
severity: 'warning',
|
|
533
|
+
message: `${entity.type} '${entity.name}' has dependencies across ${new Set(crossLangRefs.map(r => r.targetLanguage)).size} different languages`,
|
|
534
|
+
principle: 'SRP',
|
|
535
|
+
entityId: entity.id,
|
|
536
|
+
entityName: entity.name,
|
|
537
|
+
entityType: entity.type,
|
|
538
|
+
language: entity.language,
|
|
539
|
+
crossLanguageIssue: true,
|
|
540
|
+
confidence: 0.8,
|
|
541
|
+
details: {
|
|
542
|
+
crossLanguageDependencies: crossLangRefs.length,
|
|
543
|
+
targetLanguages: Array.from(new Set(crossLangRefs.map(r => r.targetLanguage)))
|
|
544
|
+
},
|
|
545
|
+
suggestion: 'Consider using a service layer or adapter pattern to reduce cross-language coupling',
|
|
546
|
+
analyzer: 'cross-language-solid',
|
|
547
|
+
category: 'single-responsibility'
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return violations;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Detect distributed interface violations
|
|
555
|
+
*/
|
|
556
|
+
detectDistributedInterfaceViolations(entities, references) {
|
|
557
|
+
const violations = [];
|
|
558
|
+
// Look for interfaces implemented across multiple languages
|
|
559
|
+
const interfaces = entities.filter(e => e.type === 'interface');
|
|
560
|
+
for (const iface of interfaces) {
|
|
561
|
+
const implementations = references.filter(ref => ref.targetId === iface.id && ref.type === 'implements');
|
|
562
|
+
const implLanguages = new Set(implementations.map(ref => ref.sourceLanguage));
|
|
563
|
+
if (implLanguages.size > 1) {
|
|
564
|
+
violations.push({
|
|
565
|
+
file: iface.file,
|
|
566
|
+
line: iface.startLine || 0,
|
|
567
|
+
severity: 'suggestion',
|
|
568
|
+
message: `Interface '${iface.name}' is implemented across ${implLanguages.size} different languages`,
|
|
569
|
+
principle: 'ISP',
|
|
570
|
+
entityId: iface.id,
|
|
571
|
+
entityName: iface.name,
|
|
572
|
+
entityType: iface.type,
|
|
573
|
+
language: iface.language,
|
|
574
|
+
crossLanguageIssue: true,
|
|
575
|
+
confidence: 0.7,
|
|
576
|
+
details: {
|
|
577
|
+
implementationLanguages: Array.from(implLanguages),
|
|
578
|
+
implementationCount: implementations.length
|
|
579
|
+
},
|
|
580
|
+
suggestion: 'Consider language-specific interface definitions or use protocol-based contracts',
|
|
581
|
+
analyzer: 'cross-language-solid',
|
|
582
|
+
category: 'interface-segregation'
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
return violations;
|
|
587
|
+
}
|
|
588
|
+
// Suggestion generators (enhanced for cross-language)
|
|
589
|
+
generateSRPSuggestion(entity, responsibilities) {
|
|
590
|
+
const baseSuggestion = `Consider breaking ${entity.name} into smaller, more focused components`;
|
|
591
|
+
if (responsibilities.crossLanguageFactors.includes('cross-language-dependency')) {
|
|
592
|
+
return `${baseSuggestion}. Use service layers or adapters to isolate cross-language concerns.`;
|
|
593
|
+
}
|
|
594
|
+
if (responsibilities.crossLanguageFactors.includes('api-endpoint')) {
|
|
595
|
+
return `${baseSuggestion}. Split API endpoints by business domain or operation type.`;
|
|
596
|
+
}
|
|
597
|
+
return `${baseSuggestion}. Apply the Single Responsibility Principle within and across language boundaries.`;
|
|
598
|
+
}
|
|
599
|
+
generateOCPSuggestion(entity, opportunities) {
|
|
600
|
+
if (opportunities.languages.size > 1) {
|
|
601
|
+
return `Consider using cross-language polymorphism through well-defined interfaces or protocol contracts. Use dependency injection across service boundaries.`;
|
|
602
|
+
}
|
|
603
|
+
return `Consider using polymorphism (interfaces/inheritance) instead of conditional logic. Use the Strategy or Command patterns.`;
|
|
604
|
+
}
|
|
605
|
+
generateISPSuggestion(entity, usage) {
|
|
606
|
+
if (usage.languages.size > 1) {
|
|
607
|
+
return `Split this interface into language-specific or role-specific contracts. Consider using protocol buffers or OpenAPI specifications for cross-language interfaces.`;
|
|
608
|
+
}
|
|
609
|
+
return `Split this interface into smaller, more focused interfaces that serve specific client needs.`;
|
|
610
|
+
}
|
|
611
|
+
generateDIPSuggestion(entity, dependencies) {
|
|
612
|
+
if (dependencies.languages.size > 1) {
|
|
613
|
+
return `Use dependency injection and abstraction layers to reduce coupling across language boundaries. Consider service meshes or API gateways for cross-language dependencies.`;
|
|
614
|
+
}
|
|
615
|
+
return `Depend on abstractions (interfaces) rather than concrete implementations. Use dependency injection containers.`;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=CrossLanguageSOLIDAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossLanguageSOLIDAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.ts"],"names":[],"mappings":"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"}
|