private _analyzeTypes()

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 };
  }