Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Regression - private subclasses showing #131

Merged
merged 3 commits into from
Jul 27, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Sources/SwiftDoc/Interface.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ public final class Interface {
self.topLevelSymbols = symbols.filter { $0.api is Type || $0.id.pathComponents.isEmpty }

self.relationships = {
let symbols = symbols.filter { $0.isPublic }
let extensionsByExtendedType: [String: [Extension]] = Dictionary(grouping: symbols.flatMap { $0.context.compactMap { $0 as? Extension } }, by: { $0.extendedType })

var relationships: Set<Relationship> = []
for symbol in symbols {

let lastDeclarationScope = symbol.context.last(where: { $0 is Extension || $0 is Symbol })

if let container = lastDeclarationScope as? Symbol {
Expand Down
41 changes: 41 additions & 0 deletions Tests/SwiftDocTests/InterfaceTypeTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import XCTest

import SwiftDoc
import SwiftSemantics
import struct SwiftSemantics.Protocol
import SwiftSyntax

final class InterfaceTypeTests: XCTestCase {

func testPrivateInheritance() throws {
let source = #"""
public class A { }

class B : A { }

public class C : A { }
"""#

let url = try temporaryFile(contents: source)
let sourceFile = try SourceFile(file: url, relativeTo: url.deletingLastPathComponent())
let module = Module(name: "Module", sourceFiles: [sourceFile])

// `class A`
let classA = sourceFile.symbols[0]
XCTAssert(classA.api is Class)

// `class B`
let classB = sourceFile.symbols[1]
XCTAssert(classB.api is Class)

// `class C`
let classC = sourceFile.symbols[2]
XCTAssert(classC.api is Class)

// Class B does not exist in subclasses because it's not public
// Class C exists in subclasses because it's public
let subclasses = module.interface.typesInheriting(from: classA)
XCTAssertEqual(subclasses.count, 1)
XCTAssertEqual(subclasses[0].id, classC.id)
}
}