function validateTypeRef()

in compiler/src/steps/validate-model.ts [281:320]


  function validateTypeRef (name: model.TypeName, generics: (model.ValueOf[] | undefined), openGenerics: Set<string>, kind: TypeDefKind = TypeDefKind.type): void {
    const fqName = fqn(name)

    if (openGenerics.has(fqName)) {
      // This is an open generic parameter coming from the enclosing scope
      return
    }

    const typeDef = kind === TypeDefKind.behavior ? behaviorByName.get(fqName) : getTypeDef(name)
    if (typeDef == null) {
      modelError(`No type definition for '${fqName}'`)
      return
    }

    if (typeDef.kind === 'request') {
      modelError(`'${fqName}' is a request and must only be used in endpoints`)
    }

    validateTypeDef(typeDef)

    // Validate generic parameters
    const genericsCount = generics?.length ?? 0

    if (typeDef.kind !== 'enum') {
      const typeGenericsCount = typeDef.generics?.length ?? 0
      if (genericsCount !== typeGenericsCount) {
        modelError(`Expected ${typeGenericsCount} generic parameters but got ${genericsCount}`)
      }
    } else {
      if (genericsCount !== 0) {
        modelError(`Type kind '${typeDef.kind}' doesn't accept generic parameters`)
      }
    }

    context.push('Generics')
    for (const v of generics ?? []) {
      validateValueOf(v, openGenerics)
    }
    context.pop()
  }