Skip to content

Commit fc927d1

Browse files
siddarthkayfacebook-github-bot
authored andcommitted
Add getProps to Parsers and fix up usages (#37504)
Summary: [Codegen 87] This PR introduces `getProps` to the Parser class and implements this function in Typescript and Flow Parsers. We also get rid of the following files from : - `packages/react-native-codegen/src/parsers/typescript/components/props.js` - `packages/react-native-codegen/src/parsers/flow/components/props.js` as requested on #34872 bypass-github-export-checks ## Changelog: [Internal] [Changed] - Add `getProps ` to Parsers and update usages. Pull Request resolved: #37504 Test Plan: Run yarn jest react-native-codegen and ensure CI is green Reviewed By: cortinico Differential Revision: D46074152 Pulled By: cipolleschi fbshipit-source-id: aa6a1a556c9b4a4a6209221f70c8add46ed2d08b
1 parent 992c45c commit fc927d1

File tree

8 files changed

+240
-202
lines changed

8 files changed

+240
-202
lines changed

packages/react-native-codegen/src/parsers/flow/components/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import type {ComponentSchemaBuilderConfig} from '../../schema.js';
1414

1515
const {getCommands} = require('./commands');
1616
const {getEvents} = require('./events');
17-
const {getProps} = require('./props');
1817
const {getProperties} = require('./componentsUtils.js');
1918
const {throwIfMoreThanOneCodegenNativecommands} = require('../../error-utils');
2019
const {
@@ -126,7 +125,7 @@ function buildComponentSchema(
126125

127126
const propProperties = getProperties(propsTypeName, types);
128127
const commandProperties = getCommandProperties(ast, parser);
129-
const {extendsProps, props} = getProps(propProperties, types, parser);
128+
const {extendsProps, props} = parser.getProps(propProperties, types);
130129

131130
const options = getOptions(optionsExpression);
132131
const events = getEvents(propProperties, types, parser);

packages/react-native-codegen/src/parsers/flow/components/props.js

Lines changed: 0 additions & 104 deletions
This file was deleted.

packages/react-native-codegen/src/parsers/flow/parser.js

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import type {
2020
NativeModuleEnumMembers,
2121
NativeModuleAliasMap,
2222
NativeModuleEnumMap,
23+
PropTypeAnnotation,
24+
ExtendsPropsShape,
2325
} from '../../CodegenSchema';
2426
import type {ParserType} from '../errors';
2527
import type {
@@ -35,19 +37,25 @@ import type {
3537
TypeResolutionStatus,
3638
} from '../utils';
3739

40+
type ExtendsForProp = null | {
41+
type: 'ReactNativeBuiltInType',
42+
knownTypeName: 'ReactNativeCoreViewProps',
43+
};
44+
3845
const invariant = require('invariant');
3946

4047
const {
4148
getSchemaInfo,
4249
getTypeAnnotation,
50+
flattenProperties,
4351
} = require('./components/componentsUtils');
4452

4553
const {flowTranslateTypeAnnotation} = require('./modules');
4654

4755
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
4856
const flowParser = require('flow-parser');
4957

50-
const {buildSchema} = require('../parsers-commons');
58+
const {buildSchema, buildPropSchema} = require('../parsers-commons');
5159
const {Visitor} = require('../parsers-primitives');
5260
const {buildComponentSchema} = require('./components');
5361
const {wrapComponentSchema} = require('../schema.js');
@@ -445,6 +453,72 @@ class FlowParser implements Parser {
445453
return (typeAnnotation, types, parser) =>
446454
this.getResolvedTypeAnnotation(typeAnnotation, types, parser);
447455
}
456+
extendsForProp(
457+
prop: PropAST,
458+
types: TypeDeclarationMap,
459+
parser: Parser,
460+
): ExtendsForProp {
461+
const argument = this.argumentForProp(prop);
462+
if (!argument) {
463+
console.log('null', prop);
464+
}
465+
const name = parser.nameForArgument(prop);
466+
467+
if (types[name] != null) {
468+
// This type is locally defined in the file
469+
return null;
470+
}
471+
472+
switch (name) {
473+
case 'ViewProps':
474+
return {
475+
type: 'ReactNativeBuiltInType',
476+
knownTypeName: 'ReactNativeCoreViewProps',
477+
};
478+
default: {
479+
throw new Error(`Unable to handle prop spread: ${name}`);
480+
}
481+
}
482+
}
483+
484+
removeKnownExtends(
485+
typeDefinition: $ReadOnlyArray<PropAST>,
486+
types: TypeDeclarationMap,
487+
): $ReadOnlyArray<PropAST> {
488+
return typeDefinition.filter(
489+
prop =>
490+
prop.type !== 'ObjectTypeSpreadProperty' ||
491+
this.extendsForProp(prop, types, this) === null,
492+
);
493+
}
494+
495+
getExtendsProps(
496+
typeDefinition: $ReadOnlyArray<PropAST>,
497+
types: TypeDeclarationMap,
498+
): $ReadOnlyArray<ExtendsPropsShape> {
499+
return typeDefinition
500+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
501+
.map(prop => this.extendsForProp(prop, types, this))
502+
.filter(Boolean);
503+
}
504+
505+
getProps(
506+
typeDefinition: $ReadOnlyArray<PropAST>,
507+
types: TypeDeclarationMap,
508+
): {
509+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
510+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
511+
} {
512+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
513+
const props = flattenProperties(nonExtendsProps, types)
514+
.map(property => buildPropSchema(property, types, this))
515+
.filter(Boolean);
516+
517+
return {
518+
props,
519+
extendsProps: this.getExtendsProps(typeDefinition, types),
520+
};
521+
}
448522
}
449523

450524
module.exports = {

packages/react-native-codegen/src/parsers/parser.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import type {
2020
NativeModuleEnumMembers,
2121
NativeModuleAliasMap,
2222
NativeModuleEnumMap,
23+
PropTypeAnnotation,
24+
ExtendsPropsShape,
2325
} from '../CodegenSchema';
2426
import type {ParserType} from './errors';
2527
import type {
@@ -361,4 +363,12 @@ export interface Parser {
361363
};
362364

363365
getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN;
366+
367+
getProps(
368+
typeDefinition: $ReadOnlyArray<PropAST>,
369+
types: TypeDeclarationMap,
370+
): {
371+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
372+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
373+
};
364374
}

packages/react-native-codegen/src/parsers/parserMock.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import type {
1717
ResolveTypeAnnotationFN,
1818
} from './parser';
1919
import type {ParserType} from './errors';
20+
type ExtendsForProp = null | {
21+
type: 'ReactNativeBuiltInType',
22+
knownTypeName: 'ReactNativeCoreViewProps',
23+
};
2024
import type {
2125
UnionTypeAnnotationMemberType,
2226
SchemaType,
@@ -27,6 +31,8 @@ import type {
2731
NativeModuleEnumMembers,
2832
NativeModuleAliasMap,
2933
NativeModuleEnumMap,
34+
PropTypeAnnotation,
35+
ExtendsPropsShape,
3036
} from '../CodegenSchema';
3137
import type {
3238
ParserErrorCapturer,
@@ -36,6 +42,10 @@ import type {
3642
} from './utils';
3743
import invariant from 'invariant';
3844

45+
const {flattenProperties} = require('./typescript/components/componentsUtils');
46+
47+
const {buildPropSchema} = require('./parsers-commons');
48+
3949
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
4050
const flowParser = require('flow-parser');
4151
const {
@@ -368,4 +378,71 @@ export class MockedParser implements Parser {
368378
typeResolutionStatus,
369379
};
370380
}
381+
382+
getExtendsProps(
383+
typeDefinition: $ReadOnlyArray<PropAST>,
384+
types: TypeDeclarationMap,
385+
): $ReadOnlyArray<ExtendsPropsShape> {
386+
return typeDefinition
387+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
388+
.map(prop => this.extendsForProp(prop, types, this))
389+
.filter(Boolean);
390+
}
391+
392+
extendsForProp(
393+
prop: PropAST,
394+
types: TypeDeclarationMap,
395+
parser: Parser,
396+
): ExtendsForProp {
397+
const argument = this.argumentForProp(prop);
398+
if (!argument) {
399+
console.log('null', prop);
400+
}
401+
const name = parser.nameForArgument(prop);
402+
403+
if (types[name] != null) {
404+
// This type is locally defined in the file
405+
return null;
406+
}
407+
408+
switch (name) {
409+
case 'ViewProps':
410+
return {
411+
type: 'ReactNativeBuiltInType',
412+
knownTypeName: 'ReactNativeCoreViewProps',
413+
};
414+
default: {
415+
throw new Error(`Unable to handle prop spread: ${name}`);
416+
}
417+
}
418+
}
419+
420+
removeKnownExtends(
421+
typeDefinition: $ReadOnlyArray<PropAST>,
422+
types: TypeDeclarationMap,
423+
): $ReadOnlyArray<PropAST> {
424+
return typeDefinition.filter(
425+
prop =>
426+
prop.type !== 'ObjectTypeSpreadProperty' ||
427+
this.extendsForProp(prop, types, this) === null,
428+
);
429+
}
430+
431+
getProps(
432+
typeDefinition: $ReadOnlyArray<PropAST>,
433+
types: TypeDeclarationMap,
434+
): {
435+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
436+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
437+
} {
438+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
439+
const props = flattenProperties(nonExtendsProps, types)
440+
.map(property => buildPropSchema(property, types, this))
441+
.filter(Boolean);
442+
443+
return {
444+
props,
445+
extendsProps: this.getExtendsProps(typeDefinition, types),
446+
};
447+
}
371448
}

packages/react-native-codegen/src/parsers/typescript/components/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type {ComponentSchemaBuilderConfig} from '../../schema.js';
1515
const {getCommands} = require('./commands');
1616
const {getEvents} = require('./events');
1717
const {categorizeProps} = require('./extends');
18-
const {getProps} = require('./props');
1918
const {getProperties} = require('./componentsUtils.js');
2019
const {throwIfMoreThanOneCodegenNativecommands} = require('../../error-utils');
2120
const {
@@ -135,7 +134,7 @@ function buildComponentSchema(
135134

136135
const componentEventAsts: Array<PropsAST> = [];
137136
categorizeProps(propProperties, types, componentEventAsts);
138-
const {props, extendsProps} = getProps(propProperties, types, parser);
137+
const {props, extendsProps} = parser.getProps(propProperties, types);
139138
const events = getEvents(componentEventAsts, types, parser);
140139
const commands = getCommands(commandProperties, types);
141140

0 commit comments

Comments
 (0)