33// The discover-members mod imports member symbols from extended classes, implemented interfaces,
44// and mixed mixins.
55
6- import { addChildDoc , cloneDoc } from "@webdoc/model" ;
6+ import { addChildDoc , cloneDoc , mangled } from "@webdoc/model" ;
77import type { Doc } from "@webdoc/types" ;
88
99// The set of docs that discoverMembers has run on
@@ -48,13 +48,15 @@ function discoverMembers(doc: Doc, depsChain = new Set<Doc>()): void {
4848
4949 // This maps symbol names to the members of doc, so that the same symbol is not
5050 // inherited/overriden multiple times.
51- const memberMap : { [ id : string ] : any } = { } ;
51+ const membersByMangledName : { [ id : string ] : any } = { } ;
52+ const membersByName : { [ id : string ] : any } = { } ;
5253
5354 // Prevent overridding symbols from being replaced by adding them beforehand.
5455 for ( let i = 0 ; i < doc . members . length ; i ++ ) {
5556 const directMember = doc . members [ i ] ;
5657
57- memberMap [ directMember . name ] = directMember ;
58+ membersByMangledName [ mangled ( directMember ) ] = directMember ;
59+ membersByName [ directMember . name ] = directMember ;
5860 }
5961
6062 const parents = [ ] ;
@@ -83,6 +85,7 @@ function discoverMembers(doc: Doc, depsChain = new Set<Doc>()): void {
8385
8486 for ( let i = 0 ; i < parent . members . length ; i ++ ) {
8587 const member = parent . members [ i ] ;
88+ const memberMangled = mangled ( member ) ;
8689
8790 // Only methods/properties/events are inheritable
8891 if ( member . type !== "MethodDoc" &&
@@ -98,14 +101,23 @@ function discoverMembers(doc: Doc, depsChain = new Set<Doc>()): void {
98101 }
99102
100103 // Parent symbols are hidden by inherited/implemented symbols
101- if ( memberMap [ member . name ] ) {
102- memberMap [ member . name ] . overrides = member ;
104+ // Use mangled-map to try to find the most specific override
105+ if ( membersByMangledName [ memberMangled ] ) {
106+ membersByMangledName [ memberMangled ] . overrides = member ;
107+ continue ;
108+ }
109+ // TODO: We might want to skip setting "overrides" in this case if it already overrides a
110+ // more important / primary signature.
111+ // Otherwise find by name
112+ // If the child class has another member with a different signature but same number
113+ if ( membersByName [ member . name ] ) {
114+ membersByName [ member . name ] . overrides = member ;
103115 continue ;
104116 }
105117
106- memberMap [ member . name ] = member ;
107-
118+ // Only add an inherited member if the child has no member with the same name
108119 const temp = cloneDoc ( member ) ;
120+ membersByMangledName [ memberMangled ] = temp ;
109121
110122 temp . overrides = false ;
111123 temp . inherited = true ;
0 commit comments