feat: Add Swift inheritance extraction for class, struct, enum, and protocol relationships
Addresses Swift's inheritance_specifier syntax where type relationships are specified after colons (e.g. `class UploadRequest: DataRequest, Sendable`). Extracts user_type > type_identifier children from inheritance_specifier nodes as 'extends' references to properly model Swift's inheritance, protocol conformance, and struct conformance patterns in the code graph.
This commit is contained in:
@@ -818,6 +818,47 @@ public protocol Repository {
|
||||
expect(protocolNode).toBeDefined();
|
||||
expect(protocolNode?.name).toBe('Repository');
|
||||
});
|
||||
|
||||
it('should extract class inheritance and protocol conformance', () => {
|
||||
const code = `
|
||||
class DataRequest: Request {
|
||||
func validate() {}
|
||||
}
|
||||
|
||||
class UploadRequest: DataRequest, Sendable {
|
||||
func upload() {}
|
||||
}
|
||||
|
||||
enum AFError: Error {
|
||||
case invalidURL
|
||||
}
|
||||
|
||||
struct HTTPMethod: RawRepresentable {
|
||||
let rawValue: String
|
||||
}
|
||||
|
||||
protocol UploadConvertible: URLRequestConvertible {
|
||||
func asURLRequest() throws -> URLRequest
|
||||
}
|
||||
`;
|
||||
const result = extractFromSource('Inheritance.swift', code);
|
||||
|
||||
const extendsRefs = result.unresolvedReferences.filter(
|
||||
(r) => r.referenceKind === 'extends'
|
||||
);
|
||||
|
||||
// DataRequest extends Request
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'Request')).toBeDefined();
|
||||
// UploadRequest extends DataRequest and Sendable
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'DataRequest')).toBeDefined();
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'Sendable')).toBeDefined();
|
||||
// AFError extends Error
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'Error')).toBeDefined();
|
||||
// HTTPMethod extends RawRepresentable
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'RawRepresentable')).toBeDefined();
|
||||
// UploadConvertible extends URLRequestConvertible
|
||||
expect(extendsRefs.find((r) => r.referenceName === 'URLRequestConvertible')).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Kotlin Extraction', () => {
|
||||
|
||||
Reference in New Issue
Block a user