@@ -2820,7 +2820,85 @@ class PathHierarchyTests: XCTestCase {
28202820 XCTAssertEqual ( paths [ containerID] , " /ModuleName/ContainerName " )
28212821 XCTAssertEqual ( paths [ memberID] , " /ModuleName/ContainerName/memberName " ) // The Swift spelling is preferred
28222822 }
2823-
2823+
2824+ func testLanguageRepresentationsWithDifferentParentKinds( ) throws {
2825+ enableFeatureFlag ( \. isExperimentalLinkHierarchySerializationEnabled)
2826+
2827+ let containerID = " some-container-symbol-id "
2828+ let memberID = " some-member-symbol-id "
2829+
2830+ let catalog = Folder ( name: " unit-test.docc " , content: [
2831+ Folder ( name: " clang " , content: [
2832+ JSONFile ( name: " ModuleName.symbols.json " , content: makeSymbolGraph (
2833+ moduleName: " ModuleName " ,
2834+ symbols: [
2835+ makeSymbol ( id: containerID, language: . objectiveC, kind: . union, pathComponents: [ " ContainerName " ] ) ,
2836+ makeSymbol ( id: memberID, language: . objectiveC, kind: . property, pathComponents: [ " ContainerName " , " MemberName " ] ) ,
2837+ ] ,
2838+ relationships: [
2839+ . init( source: memberID, target: containerID, kind: . memberOf, targetFallback: nil )
2840+ ]
2841+ ) ) ,
2842+ ] ) ,
2843+
2844+ Folder ( name: " swift " , content: [
2845+ JSONFile ( name: " ModuleName.symbols.json " , content: makeSymbolGraph (
2846+ moduleName: " ModuleName " ,
2847+ symbols: [
2848+ makeSymbol ( id: containerID, kind: . struct, pathComponents: [ " ContainerName " ] ) ,
2849+ makeSymbol ( id: memberID, kind: . property, pathComponents: [ " ContainerName " , " MemberName " ] ) ,
2850+ ] ,
2851+ relationships: [
2852+ . init( source: memberID, target: containerID, kind: . memberOf, targetFallback: nil )
2853+ ]
2854+ ) ) ,
2855+ ] )
2856+ ] )
2857+
2858+ let ( _, context) = try loadBundle ( catalog: catalog)
2859+ let tree = context. linkResolver. localResolver. pathHierarchy
2860+
2861+ let resolvedSwiftContainerID = try tree. find ( path: " /ModuleName/ContainerName-struct " , onlyFindSymbols: true )
2862+ let resolvedSwiftContainer = try XCTUnwrap ( tree. lookup [ resolvedSwiftContainerID] )
2863+ XCTAssertEqual ( resolvedSwiftContainer. name, " ContainerName " )
2864+ XCTAssertEqual ( resolvedSwiftContainer. symbol? . identifier. precise, containerID)
2865+ XCTAssertEqual ( resolvedSwiftContainer. symbol? . kind. identifier, . struct)
2866+ XCTAssertEqual ( resolvedSwiftContainer. languages, [ . swift] )
2867+
2868+ let resolvedObjcContainerID = try tree. find ( path: " /ModuleName/ContainerName-union " , onlyFindSymbols: true )
2869+ let resolvedObjcContainer = try XCTUnwrap ( tree. lookup [ resolvedObjcContainerID] )
2870+ XCTAssertEqual ( resolvedObjcContainer. name, " ContainerName " )
2871+ XCTAssertEqual ( resolvedObjcContainer. symbol? . identifier. precise, containerID)
2872+ XCTAssertEqual ( resolvedObjcContainer. symbol? . kind. identifier, . union)
2873+ XCTAssertEqual ( resolvedObjcContainer. languages, [ . objectiveC] )
2874+
2875+ let resolvedContainerID = try tree. find ( path: " /ModuleName/ContainerName " , onlyFindSymbols: true )
2876+ XCTAssertEqual ( resolvedContainerID, resolvedSwiftContainerID)
2877+
2878+ let resolvedSwiftMemberID = try tree. find ( path: " /ModuleName/ContainerName-struct/MemberName " , onlyFindSymbols: true )
2879+ let resolvedSwiftMember = try XCTUnwrap ( tree. lookup [ resolvedSwiftMemberID] )
2880+ XCTAssertEqual ( resolvedSwiftMember. name, " MemberName " )
2881+ XCTAssertEqual ( resolvedSwiftMember. parent? . identifier, resolvedSwiftContainerID)
2882+ XCTAssertEqual ( resolvedSwiftMember. symbol? . identifier. precise, memberID)
2883+ XCTAssertEqual ( resolvedSwiftMember. symbol? . kind. identifier, . property)
2884+ XCTAssertEqual ( resolvedSwiftMember. languages, [ . swift] )
2885+
2886+ let resolvedObjcMemberID = try tree. find ( path: " /ModuleName/ContainerName-union/MemberName " , onlyFindSymbols: true )
2887+ let resolvedObjcMember = try XCTUnwrap ( tree. lookup [ resolvedObjcMemberID] )
2888+ XCTAssertEqual ( resolvedObjcMember. name, " MemberName " )
2889+ XCTAssertEqual ( resolvedObjcMember. parent? . identifier, resolvedObjcContainerID)
2890+ XCTAssertEqual ( resolvedObjcMember. symbol? . identifier. precise, memberID)
2891+ XCTAssertEqual ( resolvedObjcMember. symbol? . kind. identifier, . property)
2892+ XCTAssertEqual ( resolvedObjcMember. languages, [ . objectiveC] )
2893+
2894+ let resolvedMemberID = try tree. find ( path: " /ModuleName/ContainerName/MemberName " , onlyFindSymbols: true )
2895+ XCTAssertEqual ( resolvedMemberID, resolvedSwiftMemberID)
2896+
2897+ let paths = tree. caseInsensitiveDisambiguatedPaths ( )
2898+ XCTAssertEqual ( paths [ containerID] , " /ModuleName/ContainerName " )
2899+ XCTAssertEqual ( paths [ memberID] , " /ModuleName/ContainerName/MemberName " )
2900+ }
2901+
28242902 func testMixedLanguageSymbolAndItsExtendingModuleWithDifferentContainerNames( ) throws {
28252903 let containerID = " some-container-symbol-id "
28262904 let memberID = " some-member-symbol-id "
0 commit comments