Skip to content

Commit

Permalink
Do not merge namespace and class if declared strategy for this namesp…
Browse files Browse the repository at this point in the history
…ace is package
  • Loading branch information
sgrishchenko committed Nov 29, 2023
1 parent 078f4be commit ef342c2
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 6 deletions.
19 changes: 17 additions & 2 deletions src/converter/plugins/DeclarationMergingPlugin.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import ts, {Declaration, NamedDeclaration, Program, SignatureDeclaration, SymbolTable} from "typescript";
import ts, {
Declaration,
ModuleDeclaration,
NamedDeclaration,
Program,
SignatureDeclaration,
SymbolTable
} from "typescript";
import {ConverterPlugin} from "../plugin.js";
import {ConverterContext} from "../context.js";
import {Render} from "../render.js";
import {DeepMap} from "../../utils/deepMap.js";
import {GeneratedFile} from "../generated.js";
import {NamespaceStrategy} from "../../configuration/configuration.js";

export const declarationMergingServiceKey = Symbol()

Expand Down Expand Up @@ -40,7 +48,10 @@ export class DeclarationMergingService {
this.coveredSymbols.add(symbol)
}

getMembers(node: NamedDeclaration): Declaration[] | undefined {
getMembers(
node: NamedDeclaration,
resolveNamespaceStrategy: ((node: ModuleDeclaration) => NamespaceStrategy) | undefined,
): Declaration[] | undefined {
const symbol = this.getSymbol(node)
if (!symbol) return undefined

Expand All @@ -51,6 +62,10 @@ export class DeclarationMergingService {
.filter(member => !ts.isTypeParameterDeclaration(member))

return [...members, ...exports]
.filter(member => (
!ts.isModuleBlock(member.parent)
|| resolveNamespaceStrategy?.(member.parent.parent) !== "package"
))
}

private getUniqMembers(symbolTable: SymbolTable | undefined): Declaration[] {
Expand Down
12 changes: 10 additions & 2 deletions src/converter/plugins/convertClassDeclaration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {InheritanceModifierService, inheritanceModifierServiceKey} from "./Inher
import {DeclarationMergingService, declarationMergingServiceKey} from "./DeclarationMergingPlugin.js";
import {ConverterContext} from "../context.js";
import {TypeScriptService, typeScriptServiceKey} from "./TypeScriptPlugin.js";
import {NamespaceInfoService, namespaceInfoServiceKey} from "./NamespaceInfoPlugin.js";

function extractModifiers(member: Declaration): ModifierLike[] {
if (
Expand Down Expand Up @@ -42,7 +43,11 @@ function resolveConstructors(node: ClassDeclaration, members: Declaration[], con
if (!parentDeclaration || !ts.isClassDeclaration(parentDeclaration)) return constructors

const declarationMergingService = context.lookupService<DeclarationMergingService>(declarationMergingServiceKey)
const mergedMembers = declarationMergingService?.getMembers(parentDeclaration) ?? Array.from(parentDeclaration.members)
const namespaceInfoService = context.lookupService<NamespaceInfoService>(namespaceInfoServiceKey)

const resolveNamespaceStrategy = namespaceInfoService?.resolveNamespaceStrategy?.bind(namespaceInfoService)

const mergedMembers = declarationMergingService?.getMembers(parentDeclaration, resolveNamespaceStrategy) ?? Array.from(parentDeclaration.members)

return resolveConstructors(parentDeclaration, mergedMembers, context)
}
Expand All @@ -56,6 +61,7 @@ export const convertClassDeclaration = createSimplePlugin((node, context, render
const declarationMergingService = context.lookupService<DeclarationMergingService>(declarationMergingServiceKey)
declarationMergingService?.cover(node)

const namespaceInfoService = context.lookupService<NamespaceInfoService>(namespaceInfoServiceKey)
const inheritanceModifierService = context.lookupService<InheritanceModifierService>(inheritanceModifierServiceKey)

const exportModifier = node.modifiers?.find(it => it.kind === ts.SyntaxKind.ExportKeyword)
Expand All @@ -76,7 +82,9 @@ export const convertClassDeclaration = createSimplePlugin((node, context, render
?.map(heritageClause => render(heritageClause))
?.join(", ")

const mergedMembers = declarationMergingService?.getMembers(node) ?? Array.from(node.members)
const resolveNamespaceStrategy = namespaceInfoService?.resolveNamespaceStrategy?.bind(namespaceInfoService)

const mergedMembers = declarationMergingService?.getMembers(node, resolveNamespaceStrategy) ?? Array.from(node.members)

// cover private members
mergedMembers
Expand Down
7 changes: 6 additions & 1 deletion src/converter/plugins/convertEnumDeclaration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import ts from "typescript";
import {createSimplePlugin} from "../plugin.js";
import {CheckCoverageService, checkCoverageServiceKey} from "./CheckCoveragePlugin.js";
import {DeclarationMergingService, declarationMergingServiceKey} from "./DeclarationMergingPlugin.js";
import {NamespaceInfoService, namespaceInfoServiceKey} from "./NamespaceInfoPlugin.js";

export const convertEnumDeclaration = createSimplePlugin((node, context, render) => {
if (!ts.isEnumDeclaration(node)) return null
Expand All @@ -13,9 +14,13 @@ export const convertEnumDeclaration = createSimplePlugin((node, context, render)
if (declarationMergingService?.isCovered(node)) return ""
declarationMergingService?.cover(node)

const namespaceInfoService = context.lookupService<NamespaceInfoService>(namespaceInfoServiceKey)

const name = render(node.name)

const members = (declarationMergingService?.getMembers(node) ?? node.members)
const resolveNamespaceStrategy = namespaceInfoService?.resolveNamespaceStrategy?.bind(namespaceInfoService)

const members = (declarationMergingService?.getMembers(node, resolveNamespaceStrategy) ?? node.members)
.map(member => `${render(member)}: ${name}`)
.join("\n")

Expand Down
6 changes: 5 additions & 1 deletion src/converter/plugins/convertInterfaceDeclaration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {ifPresent} from "../render.js";
import {CheckCoverageService, checkCoverageServiceKey} from "./CheckCoveragePlugin.js";
import {InheritanceModifierService, inheritanceModifierServiceKey} from "./InheritanceModifierPlugin.js";
import {DeclarationMergingService, declarationMergingServiceKey} from "./DeclarationMergingPlugin.js";
import {NamespaceInfoService, namespaceInfoServiceKey} from "./NamespaceInfoPlugin.js";

export const convertInterfaceDeclaration = createSimplePlugin((node, context, render) => {
if (!ts.isInterfaceDeclaration(node)) return null
Expand All @@ -15,6 +16,7 @@ export const convertInterfaceDeclaration = createSimplePlugin((node, context, re
if (declarationMergingService?.isCovered(node)) return ""
declarationMergingService?.cover(node)

const namespaceInfoService = context.lookupService<NamespaceInfoService>(namespaceInfoServiceKey)
const inheritanceModifierService = context.lookupService<InheritanceModifierService>(inheritanceModifierServiceKey)

const exportModifier = node.modifiers?.find(it => it.kind === ts.SyntaxKind.ExportKeyword)
Expand All @@ -32,7 +34,9 @@ export const convertInterfaceDeclaration = createSimplePlugin((node, context, re
?.map(heritageClause => render(heritageClause))
?.join(", ")

const members = (declarationMergingService?.getMembers(node) ?? node.members)
const resolveNamespaceStrategy = namespaceInfoService?.resolveNamespaceStrategy?.bind(namespaceInfoService)

const members = (declarationMergingService?.getMembers(node, resolveNamespaceStrategy) ?? node.members)
.map(member => render(member))
.join("\n")

Expand Down

0 comments on commit ef342c2

Please sign in to comment.