11import type { SyntaxNode } from "tree-sitter" ;
22import type { Code } from "../types" ;
33import { context } from "./context" ;
4- import { escapeCtorName } from "./escaping" ;
4+ import { escapeCtorImplName , escapeCtorName } from "./escaping" ;
55import { FunctionKind , generateFunction } from "./function" ;
66import { generateTypeParameters , getTypeParamPlaceholders } from "./type" ;
77
8+ function * generateInterfaceExtends ( exporting : string , importedModule : string | undefined , name : string , extendsClause : string ) : Generator < Code > {
9+ if ( importedModule ) {
10+ yield `declare module "${ importedModule } " {\n interface ${ name } extends ${ extendsClause } {}\n}\n` ;
11+ }
12+ else {
13+ yield `${ exporting } interface ${ name } extends ${ extendsClause } {}\n` ;
14+ }
15+ }
16+
817export function * generateImpl ( node : SyntaxNode ) : Generator <
918 Code
1019> {
@@ -28,8 +37,21 @@ export function* generateImpl(node: SyntaxNode): Generator<
2837 }
2938 }
3039
40+ const importedModule = context . importedFrom . get ( name ) ;
41+ const uid = node . startIndex ;
42+
43+ if ( trait ) {
44+ const traitName = trait . text ;
45+ const traitModule = context . importedFrom . get ( traitName ) ;
46+ if ( traitModule ) {
47+ yield `type ${ escapeCtorImplName ( traitName ) } _${ uid } = import("${ traitModule } ").${ escapeCtorImplName ( traitName ) } ;\n` ;
48+ yield `type ${ escapeCtorName ( traitName ) } _${ uid } = import("${ traitModule } ").${ escapeCtorName ( traitName ) } ;\n` ;
49+ yield `type ${ traitName } _${ uid } = import("${ traitModule } ").${ traitName } ;\n` ;
50+ }
51+ }
52+
3153 if ( staticMethods . length > 0 ) {
32- const implName = `__JSRS_impl_${ node . startIndex } _static` ;
54+ const implName = `__JSRS_impl_${ uid } _static` ;
3355 yield `function ${ implName } ` ;
3456 yield * generateTypeParameters ( typeParams ) ;
3557 yield `() { return {\n` ;
@@ -41,20 +63,22 @@ export function* generateImpl(node: SyntaxNode): Generator<
4163
4264 if ( trait ) {
4365 const traitName = trait . text ;
44- yield `satisfies ${ escapeCtorName ( traitName ) } ; }\n` ;
45- // TODO: declare module "..." {
46- yield `${ exporting } interface ${ escapeCtorName ( name ) } extends ${ escapeCtorName ( traitName ) } {}\n` ;
66+ const traitModule = context . importedFrom . get ( traitName ) ;
67+ const ctorImplAlias = traitModule ? `${ escapeCtorImplName ( traitName ) } _${ uid } ` : escapeCtorImplName ( traitName ) ;
68+ const ctorAlias = traitModule ? `${ escapeCtorName ( traitName ) } _${ uid } ` : escapeCtorName ( traitName ) ;
69+ yield `satisfies ${ ctorImplAlias } ; }\n` ;
70+ yield * generateInterfaceExtends ( exporting , importedModule , escapeCtorName ( name ) , ctorAlias ) ;
4771 }
4872 else {
4973 yield "}\n" ;
5074 const typeParamPlaceholders = getTypeParamPlaceholders ( typeParams ) ;
5175 yield `type ${ implName } _T${ typeParamPlaceholders } = ReturnType<typeof ${ implName } ${ typeParamPlaceholders } >;\n` ;
52- yield ` ${ exporting } interface ${ escapeCtorName ( name ) } extends ${ implName } _T${ typeParamPlaceholders } {}\n` ;
76+ yield * generateInterfaceExtends ( exporting , importedModule , escapeCtorName ( name ) , ` ${ implName } _T${ typeParamPlaceholders } ` ) ;
5377 }
5478 }
5579
5680 if ( instanceMethods . length > 0 ) {
57- const implName = `__JSRS_impl_${ node . startIndex } ` ;
81+ const implName = `__JSRS_impl_${ uid } ` ;
5882 yield `function ${ implName } ` ;
5983 yield * generateTypeParameters ( typeParams ) ;
6084 yield `() { return {\n` ;
@@ -66,15 +90,16 @@ export function* generateImpl(node: SyntaxNode): Generator<
6690
6791 if ( trait ) {
6892 const traitName = trait . text ;
69- yield `satisfies ${ traitName } ; }\n` ;
70- // TODO: declare module "..." {
71- yield `${ exporting } interface ${ name } extends ${ traitName } {}\n` ;
93+ const traitModule = context . importedFrom . get ( traitName ) ;
94+ const instanceAlias = traitModule ? `${ traitName } _${ uid } ` : traitName ;
95+ yield `satisfies ${ instanceAlias } ; }\n` ;
96+ yield * generateInterfaceExtends ( exporting , importedModule , name , instanceAlias ) ;
7297 }
7398 else {
7499 yield "}\n" ;
75100 const typeParamPlaceholders = getTypeParamPlaceholders ( typeParams ) ;
76101 yield `type ${ implName } _T${ typeParamPlaceholders } = ReturnType<typeof ${ implName } ${ typeParamPlaceholders } >;\n` ;
77- yield ` ${ exporting } interface ${ name } extends ${ implName } _T${ typeParamPlaceholders } {}\n` ;
102+ yield * generateInterfaceExtends ( exporting , importedModule , name , ` ${ implName } _T${ typeParamPlaceholders } ` ) ;
78103 }
79104 }
80105}
0 commit comments