in packages/jsii-reflect/lib/assembly.ts [252:296]
private _analyzeTypes() {
if (!this._typeCache || !this._submoduleCache) {
this._typeCache = new Map();
const submoduleBuilders = this.discoverSubmodules();
const ts = this.spec.types ?? {};
for (const [fqn, typeSpec] of Object.entries(ts)) {
let type: Type;
switch (typeSpec.kind) {
case jsii.TypeKind.Class:
type = new ClassType(this.system, this, typeSpec);
break;
case jsii.TypeKind.Interface:
type = new InterfaceType(this.system, this, typeSpec);
break;
case jsii.TypeKind.Enum:
type = new EnumType(this.system, this, typeSpec);
break;
default:
throw new Error('Unknown type kind');
}
// Find containing submodule (potentially through containing nested classes,
// which DO count as namespaces but don't count as modules)
let submodule = typeSpec.namespace;
while (submodule != null && `${this.spec.name}.${submodule}` in ts) {
submodule = ts[`${this.spec.name}.${submodule}`].namespace;
}
if (submodule != null) {
const moduleName = `${this.spec.name}.${submodule}`;
submoduleBuilders.get(moduleName)!.addType(type);
} else {
this._typeCache.set(fqn, type);
}
}
this._submoduleCache = mapValues(submoduleBuilders, (b) => b.build());
}
return { types: this._typeCache, submodules: this._submoduleCache };
}