Issue 1:
Issue originally made by @leoasis

Bug information

Babel version: 6.5.1

Node version: 4.2.0

npm version: 3.7.2

Options

babelrc:

{
"presets": [
"babel-preset-es2015",
"babel-preset-stage-0",
"babel-preset-react"
],
"plugins": [
"babel-plugin-transform-react-constant-elements"
]
}

Input code

import React, { Component } from 'react';

export default class Test extends Component {
render() {
return (
<div>
<Static />
</div>
);
}
}

class Static extends Component {
render() {
return (
<div>static</div>
);
}
}

Description

When running babel with the input code with the babel-plugin-transform-react-constant-elements, the hoisted element is incorrectly placed before the component is actually declared, see output and check where Static is declared and where the element is hoisted:

'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var _ref = _react2.default.createElement(Static, null);

var Test = function (_Component) {
_inherits(Test, _Component);

function Test() {
_classCallCheck(this, Test);

return _possibleConstructorReturn(this, Object.getPrototypeOf(Test).apply(this, arguments));
}

_createClass(Test, [{
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
null,
_ref
);
}
}]);

return Test;
}(_react.Component);

exports.default = Test;

var Static = function (_Component2) {
_inherits(Static, _Component2);

function Static() {
_classCallCheck(this, Static);

return _possibleConstructorReturn(this, Object.getPrototypeOf(Static).apply(this, arguments));
}

_createClass(Static, [{
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
null,
'static'
);
}
}]);

return Static;
}(_react.Component);

Issue 2:
Issue originally made by @jesenko

Bug information

Babel version: 6.3.13

Node version: v4.1.2

npm version: 3.3.8

Options

{
"presets": [
"react",
"es2015",
"stage-2"
],
"plugins": [
"transform-react-constant-elements"
]
}

Input code

import React from 'react';
const Component = () => (<PrivateComponent />);

export default Component;
const PrivateComponent = () => (<div />);

Description

Ordering of constantized elements is such that PrivateComponent is not yet defined when referenced by Component, e.g.:

// ...
// PrivateComponent not yet defined!!!
var _ref = _react2.default.createElement(PrivateComponent, null);
// ...
var PrivateComponent = function PrivateComponent() {
return _ref2;
};

I guess that moving all constantized elements (i.e. var _ref, var _ref2...) AFTER all component definitions might already fix the issue