diff --git a/src/ExposeNodeParser.ts b/src/ExposeNodeParser.ts index 3d645cbff..8209d3eca 100644 --- a/src/ExposeNodeParser.ts +++ b/src/ExposeNodeParser.ts @@ -6,6 +6,7 @@ import { DefinitionType } from "./Type/DefinitionType"; import { ReferenceType } from "./Type/ReferenceType"; import { hasJsDocTag } from "./Utils/hasJsDocTag"; import { symbolAtNode } from "./Utils/symbolAtNode"; +import { setSourceFileNameIfDefinitionType } from "./Utils/setSourceFileNameIfDefinitionType"; export class ExposeNodeParser implements SubNodeParser { public constructor( @@ -21,16 +22,17 @@ export class ExposeNodeParser implements SubNodeParser { public createType(node: ts.Node, context: Context, reference?: ReferenceType): BaseType | undefined { const baseType = this.subNodeParser.createType(node, context, reference); + const sourceFileName = node.getSourceFile().fileName; if (baseType === undefined) { return undefined; } if (!this.isExportNode(node)) { - return baseType; + return setSourceFileNameIfDefinitionType(baseType, sourceFileName); } - return new DefinitionType(this.getDefinitionName(node, context), baseType); + return new DefinitionType(this.getDefinitionName(node, context), baseType, sourceFileName); } private isExportNode(node: ts.Node): boolean { diff --git a/src/TopRefNodeParser.ts b/src/TopRefNodeParser.ts index ac618d58c..967e4ef50 100644 --- a/src/TopRefNodeParser.ts +++ b/src/TopRefNodeParser.ts @@ -2,6 +2,7 @@ import ts from "typescript"; import { Context, NodeParser } from "./NodeParser"; import { BaseType } from "./Type/BaseType"; import { DefinitionType } from "./Type/DefinitionType"; +import { setSourceFileNameIfDefinitionType } from "./Utils/setSourceFileNameIfDefinitionType"; export class TopRefNodeParser implements NodeParser { public constructor( @@ -12,17 +13,18 @@ export class TopRefNodeParser implements NodeParser { public createType(node: ts.Node, context: Context): BaseType | undefined { const baseType = this.childNodeParser.createType(node, context); + const sourceFileName = node.getSourceFile().fileName; if (baseType === undefined) { return undefined; } if (this.topRef && !(baseType instanceof DefinitionType)) { - return new DefinitionType(this.fullName, baseType); + return new DefinitionType(this.fullName, baseType, sourceFileName); } else if (!this.topRef && baseType instanceof DefinitionType) { - return baseType.getType(); + return setSourceFileNameIfDefinitionType(baseType.getType(), sourceFileName); } else { - return baseType; + return setSourceFileNameIfDefinitionType(baseType, sourceFileName); } } } diff --git a/src/Type/DefinitionType.ts b/src/Type/DefinitionType.ts index 89b25940f..ddaf1ac71 100644 --- a/src/Type/DefinitionType.ts +++ b/src/Type/DefinitionType.ts @@ -1,7 +1,16 @@ import { BaseType } from "./BaseType"; export class DefinitionType extends BaseType { - public constructor(private name: string | undefined, private type: BaseType) { + public constructor( + private name: string | undefined, + private type: BaseType, + /** + * Source Code fileName for DefinitionType. Used at TopRefNodeParser + * and ExposeNodeParser. So that, You can override DefinitionFormatter + * to custome your self DefinitionType name by fileName. + */ + private sourceFileName?: string + ) { super(); } @@ -16,4 +25,12 @@ export class DefinitionType extends BaseType { public getType(): BaseType { return this.type; } + + public setSourceFileName(fileName: string) { + this.sourceFileName = fileName; + } + + public getSourceFileName() { + return this.sourceFileName; + } } diff --git a/src/Utils/setSourceFileNameIfDefinitionType.ts b/src/Utils/setSourceFileNameIfDefinitionType.ts new file mode 100644 index 000000000..5aee9f719 --- /dev/null +++ b/src/Utils/setSourceFileNameIfDefinitionType.ts @@ -0,0 +1,9 @@ +import { DefinitionType } from "../Type/DefinitionType"; +import { BaseType } from "../Type/BaseType"; + +export const setSourceFileNameIfDefinitionType = (type: BaseType, sourceFileName: string) => { + if (type instanceof DefinitionType) { + type.setSourceFileName(sourceFileName); + } + return type; +};