Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add EventEmitter code-gen support for C++ Turbo Modules (#44809)
Summary: Adding react-native-codegen parser support for a new `EventEmitter` property type on C++ Turbo Modules. It is possible to later expand this feature to other languages (Java, ObjC). ## Characteristics An `EventEmitter` must: - be non null: `EventEmitter<string>` works, `?EventEmitter<string>` does NOT - have a non null eventType: `EventEmitter<number>` works, `EventEmitter<?number>` does NOT - have at most 1 eventType, `void` is possible as well: `EventEmitter<>` or `EventEmitter<MyObject>` work - `EventEmitter<number, string>` do NOT - have a concrete eventType, `{}` is not allowed `EventEmitter<{}>` does NOT work - be used in `Cxx` Turbo Modules only at this time ## Example For these 4 eventEmitters in on an RN JS TM spec ``` +onPress: EventEmitter<void>; +onClick: EventEmitter<string>; +onChange: EventEmitter<ObjectStruct>; +onSubmit: EventEmitter<ObjectStruct[]>; ``` We now generate this code: 1.) in the spec based header `{MyModuleName}CxxSpec` in the constructor: ``` ... // existing code eventEmitterMap_["onPress"] = std::make_shared<AsyncEventEmitter<>>(); eventEmitterMap_["onClick"] = std::make_shared<AsyncEventEmitter<OnClickType>>(); eventEmitterMap_["onChange"] = std::make_shared<AsyncEventEmitter<OnChangeType>>(); eventEmitterMap_["onSubmit"] = std::make_shared<AsyncEventEmitter<OnSubmitType>>(); ``` 2.) as `protected` functions ``` void emitOnPress() { std::static_pointer_cast<AsyncEventEmitter<>>(delegate_.eventEmitterMap_["onPress"])->emit(); } void emitOnClick(const OnClickType& value) { std::static_pointer_cast<AsyncEventEmitter<OnClickType>>(delegate_.eventEmitterMap_["onClick"])->emit(value); } void emitOnChange(const OnChangeType& value) { std::static_pointer_cast<AsyncEventEmitter<OnChangeType>>(delegate_.eventEmitterMap_["onChange"])->emit(value); } void emitOnSubmit(const OnSubmitType& value) { std::static_pointer_cast<AsyncEventEmitter<OnSubmitType>>(delegate_.eventEmitterMap_["onSubmit"])->emit(value); } ``` ## Changelog: [General] [Added] - Add EventEmitter code-gen support for C++ Turbo Modules Differential Revision: D57407871
- Loading branch information