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 ;
+ }
+
+ onclick() {
+ this.setState({foo: 1, bar: 2})
+ }
+}
+
+export class AnotherComponent extends React.Component {
+ static propTypes = {
+ foo: React.PropTypes.string.isRequired,
+ };
+ render() {
+ return ;
+ }
+}
diff --git a/test/end-to-end/multiple-components/output.tsx b/test/end-to-end/multiple-components/output.tsx
new file mode 100644
index 0000000..4154dd3
--- /dev/null
+++ b/test/end-to-end/multiple-components/output.tsx
@@ -0,0 +1,34 @@
+type HelloProps = {
+ message?: string;
+};
+const Hello: React.SFC = ({ message }) => {
+ return hello {message}
;
+};
+type HeyProps = {
+ message?: string;
+};
+const Hey: React.SFC = ({ name }) => {
+ return hey, {name}
;
+};
+type MyComponentState = {
+ foo: number;
+ bar: number;
+};
+export default class MyComponent extends React.Component<{
+ }, MyComponentState> {
+ render() {
+ return