diff --git a/src/transforms/react-js-make-props-and-state-transform.ts b/src/transforms/react-js-make-props-and-state-transform.ts index 3bb3169..c896d35 100644 --- a/src/transforms/react-js-make-props-and-state-transform.ts +++ b/src/transforms/react-js-make-props-and-state-transform.ts @@ -21,13 +21,14 @@ export function reactJSMakePropsAndStateInterfaceTransformFactoryFactory(typeChe } function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) { + let newSourceFile = sourceFile; for (const statement of sourceFile.statements) { if (ts.isClassDeclaration(statement) && helpers.isReactComponent(statement, typeChecker)) { - return visitReactClassDeclaration(statement, sourceFile, typeChecker); + newSourceFile = visitReactClassDeclaration(statement, newSourceFile, typeChecker); } } - return sourceFile; + return newSourceFile; } function visitReactClassDeclaration( diff --git a/src/transforms/react-move-prop-types-to-class-transform.ts b/src/transforms/react-move-prop-types-to-class-transform.ts index 5a7f7b2..7b6d9a8 100644 --- a/src/transforms/react-move-prop-types-to-class-transform.ts +++ b/src/transforms/react-move-prop-types-to-class-transform.ts @@ -70,9 +70,7 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) 'propTypes', propTypeAssignment.expression.right, ); - statements = ts.createNodeArray( - helpers.replaceItem(sourceFile.statements, classStatement, newClassStatement), - ); + statements = ts.createNodeArray(helpers.replaceItem(statements, classStatement, newClassStatement)); } } diff --git a/src/transforms/react-stateless-function-make-props-transform.ts b/src/transforms/react-stateless-function-make-props-transform.ts index 5be555a..76bd40f 100644 --- a/src/transforms/react-stateless-function-make-props-transform.ts +++ b/src/transforms/react-stateless-function-make-props-transform.ts @@ -42,17 +42,16 @@ export function reactStatelessFunctionMakePropsTransformFactoryFactory(typeCheck } function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) { - let statements = sourceFile.statements; - // Look for propType assignment statements - const propTypeAssignments = statements.filter(statement => + const propTypeAssignments = sourceFile.statements.filter(statement => helpers.isReactPropTypeAssignmentStatement(statement), ) as ts.ExpressionStatement[]; + let newSourceFile = sourceFile; for (const propTypeAssignment of propTypeAssignments) { - const componentName = helpers.getComponentName(propTypeAssignment, sourceFile); + const componentName = helpers.getComponentName(propTypeAssignment, newSourceFile); - const funcComponent = (_.find(statements, s => { + const funcComponent = (_.find(newSourceFile.statements, s => { return ( (ts.isFunctionDeclaration(s) && s.name !== undefined && s.name.getText() === componentName) || (ts.isVariableStatement(s) && s.declarationList.declarations[0].name.getText() === componentName) @@ -60,11 +59,11 @@ function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) }) as {}) as ts.FunctionDeclaration | ts.VariableStatement; // Type weirdness if (funcComponent) { - return visitReactStatelessComponent(funcComponent, propTypeAssignment, sourceFile); + newSourceFile = visitReactStatelessComponent(funcComponent, propTypeAssignment, newSourceFile); } } - return sourceFile; + return newSourceFile; } function visitReactStatelessComponent( diff --git a/test/collapse-intersection-interfaces-transform/multiple/input.tsx b/test/collapse-intersection-interfaces-transform/multiple/input.tsx new file mode 100644 index 0000000..1854a03 --- /dev/null +++ b/test/collapse-intersection-interfaces-transform/multiple/input.tsx @@ -0,0 +1,3 @@ +type Foo = {foo: string} & {bar: number}; + +type Bar = {foo: number} & {bar: string}; diff --git a/test/collapse-intersection-interfaces-transform/multiple/output.tsx b/test/collapse-intersection-interfaces-transform/multiple/output.tsx new file mode 100644 index 0000000..cd722f1 --- /dev/null +++ b/test/collapse-intersection-interfaces-transform/multiple/output.tsx @@ -0,0 +1,8 @@ +type Foo = { + foo: string; + bar: number; +}; +type Bar = { + foo: number; + bar: string; +}; diff --git a/test/end-to-end/multiple-components/input.tsx b/test/end-to-end/multiple-components/input.tsx new file mode 100644 index 0000000..9cb8345 --- /dev/null +++ b/test/end-to-end/multiple-components/input.tsx @@ -0,0 +1,34 @@ +const Hello = ({ message }) => { + return
hello {message}
+}; + +const Hey = ({ name }) => { + return
hey, {name}
+} + +Hey.propTypes = { + message: React.PropTypes.string, +} + +Hello.propTypes = { + message: React.PropTypes.string, +} + +export default class MyComponent extends React.Component { + render() { + return