func Create()

in runtime/runtime.go [128:208]


func Create(fqn FQN, args []interface{}, inst interface{}) {
	client := kernel.GetClient()

	instVal := reflect.ValueOf(inst)
	structVal := instVal.Elem()
	instType := structVal.Type()
	numField := instType.NumField()
	for i := 0; i < numField; i++ {
		field := instType.Field(i)
		if !field.Anonymous {
			continue
		}
		switch field.Type.Kind() {
		case reflect.Interface:
			fieldVal := structVal.Field(i)
			if !fieldVal.IsNil() {
				continue
			}
			if err := client.Types().InitJsiiProxy(fieldVal, fieldVal.Type()); err != nil {
				panic(err)
			}

		case reflect.Struct:
			fieldVal := structVal.Field(i)
			if !fieldVal.IsZero() {
				continue
			}
			if err := client.Types().InitJsiiProxy(fieldVal, fieldVal.Type()); err != nil {
				panic(err)
			}
		}
	}

	// Find method overrides thru reflection
	mOverrides := getMethodOverrides(inst, "jsiiProxy_")
	// If overriding struct has no overriding methods, could happen if
	// overriding methods are not defined with pointer receiver.
	if len(mOverrides) == 0 && !strings.HasPrefix(instType.Name(), "jsiiProxy_") {
		panic(fmt.Errorf("%v has no overriding methods. Overriding methods must be defined with a pointer receiver", instType.Name()))
	}
	var overrides []api.Override
	registry := client.Types()
	added := make(map[string]bool)
	for _, name := range mOverrides {
		// Use getter's name even if setter is overriden
		if strings.HasPrefix(name, "Set") {
			propName := name[3:]
			if override, ok := registry.GetOverride(api.FQN(fqn), propName); ok {
				if !added[propName] {
					added[propName] = true
					overrides = append(overrides, override)
				}
				continue
			}
		}
		if override, ok := registry.GetOverride(api.FQN(fqn), name); ok {
			if !added[name] {
				added[name] = true
				overrides = append(overrides, override)
			}
		}
	}

	interfaces, newOverrides := client.Types().DiscoverImplementation(instType)
	overrides = append(overrides, newOverrides...)

	res, err := client.Create(kernel.CreateProps{
		FQN:        api.FQN(fqn),
		Arguments:  convertArguments(args),
		Interfaces: interfaces,
		Overrides:  overrides,
	})

	if err != nil {
		panic(err)
	}

	if err = client.RegisterInstance(instVal, api.ObjectRef{InstanceID: res.InstanceID, Interfaces: interfaces}); err != nil {
		panic(err)
	}
}