mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: This is the second diffs that backs out the Custom Native State from the Codegen. The reason why we are backing it out are: 1. It forces users to create new types in JS that are not ctually used there. For example, the NativeState you define, and eventually exports, in JS is not used anywhere in your JS code. 2. You need to put in the JS native state some types that does not exists in JS, only to have them generated by the Codegen. ImageRequest, for example, does not exists in JS, but you need it in your (iOS) state to load images 3. There are a lot of edge cases due to how C++ handles variables. Some variables needs to be created as pointers. Some others as `const &`. It does not scale to hard code all of them and there is the risk to have the same type that needs to be a pointer in some case and something else in others. 4. It is better to instruct the users on how to properly create a component with Custom State, Shadow Node and Descriptor. ## Changelog: [General][Removed] - Back out parsing and generation of Custom Native State from Codegen Reviewed By: cortinico Differential Revision: D40426134 fbshipit-source-id: c368e122cc31ee8df056fe1bf6cecaab482140a4
112 lines
2.5 KiB
JavaScript
112 lines
2.5 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import type {SchemaType} from '../../CodegenSchema';
|
|
|
|
// File path -> contents
|
|
type FilesOutput = Map<string, string>;
|
|
|
|
const FileTemplate = ({
|
|
libraryName,
|
|
stateClasses,
|
|
}: {
|
|
libraryName: string,
|
|
stateClasses: string,
|
|
}) =>
|
|
`
|
|
/**
|
|
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
*
|
|
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
* once the code is regenerated.
|
|
*
|
|
* ${'@'}generated by codegen project: GenerateStateH.js
|
|
*/
|
|
#pragma once
|
|
|
|
#ifdef ANDROID
|
|
#include <folly/dynamic.h>
|
|
#include <react/renderer/mapbuffer/MapBuffer.h>
|
|
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
|
|
#endif
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
${stateClasses}
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|
|
`.trim();
|
|
|
|
const StateTemplate = ({stateName}: {stateName: string}) =>
|
|
`
|
|
class ${stateName}State {
|
|
public:
|
|
${stateName}State() = default;
|
|
|
|
#ifdef ANDROID
|
|
${stateName}State(${stateName}State const &previousState, folly::dynamic data){};
|
|
folly::dynamic getDynamic() const {
|
|
return {};
|
|
};
|
|
MapBuffer getMapBuffer() const {
|
|
return MapBufferBuilder::EMPTY();
|
|
};
|
|
#endif
|
|
};
|
|
`.trim();
|
|
|
|
module.exports = {
|
|
generate(
|
|
libraryName: string,
|
|
schema: SchemaType,
|
|
packageName?: string,
|
|
assumeNonnull: boolean = false,
|
|
): FilesOutput {
|
|
const fileName = 'States.h';
|
|
|
|
const stateClasses = Object.keys(schema.modules)
|
|
.map(moduleName => {
|
|
const module = schema.modules[moduleName];
|
|
if (module.type !== 'Component') {
|
|
return;
|
|
}
|
|
|
|
const {components} = module;
|
|
// No components in this module
|
|
if (components == null) {
|
|
return null;
|
|
}
|
|
|
|
return Object.keys(components)
|
|
.map(componentName => {
|
|
const component = components[componentName];
|
|
if (component.interfaceOnly === true) {
|
|
return null;
|
|
}
|
|
return StateTemplate({stateName: componentName});
|
|
})
|
|
.filter(Boolean)
|
|
.join('\n\n');
|
|
})
|
|
.filter(Boolean)
|
|
.join('\n\n');
|
|
|
|
const template = FileTemplate({
|
|
libraryName,
|
|
stateClasses,
|
|
});
|
|
return new Map([[fileName, template]]);
|
|
},
|
|
};
|