Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error with babel-plugin-transform-react-constant-elements with components declared in the same file (T7126) #4106

Closed
babel-bot opened this issue Feb 19, 2016 · 1 comment
Labels
area: react outdated A closed issue/PR that is archived due to age. Recommended to make a new issue

Comments

@babel-bot
Copy link
Collaborator

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);
@DrewML
Copy link
Member

DrewML commented Oct 23, 2016

@leoasis Thanks for the report! I'm going to close this as a duplicate of #3915. I left a comment here pointing out that (I believe) the critical issue is fixed (still a separate issue where hoisting isn't happening at all where it should).

@DrewML DrewML closed this as completed Oct 23, 2016
@lock lock bot added the outdated A closed issue/PR that is archived due to age. Recommended to make a new issue label May 6, 2018
@lock lock bot locked as resolved and limited conversation to collaborators May 6, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area: react outdated A closed issue/PR that is archived due to age. Recommended to make a new issue
Projects
None yet
Development

No branches or pull requests

3 participants