2017-02-18 24 views
0

Я пытаюсь написать js-код-трансформатор. Мне нужно разобрать JS в AST, внести некоторые изменения, например добавить новую декларацию импорта и сгенерировать JS-код.Преобразователь кода AST в JS

В настоящее время у меня есть некоторые проблемы с генерацией кода JS. Декораторы появляются в неправильном месте, а генератор удаляет скобки вокруг JSX.

Я новичок в этой области, поэтому, возможно, я пропускаю некоторые варианты при преобразовании/генерации кода.

код Источник:

// Core 
import React, { Component, PropTypes } from 'react'; 
import { connect } from 'react-redux'; 
import { bindActionCreators } from 'redux'; 
import { actions } from '../../actions/navigation'; 

const mapStateToProps = ({ navigation }) => ({ // eslint-disable-line arrow-body-style 
    menuStatus: navigation.get('menuStatus') 
}); 

const mapDispatchToProps = (dispatch) => ({ // eslint-disable-line arrow-body-style 
    actions: bindActionCreators({ ...actions }, dispatch) 
}); 

@connect(mapStateToProps, mapDispatchToProps) 
export default class Home extends Component { 
    render() { 
     return (
      <section> 
       <h1>Home container!</h1> 
      </section> 
     ); 
    } 
} 

Parsed/сгенерированный код:

// Core 
import React, { Component, PropTypes } from 'react'; 
import { connect } from 'react-redux'; 
import { bindActionCreators } from 'redux'; 
import { actions } from '../../actions/navigation'; 

const mapStateToProps = ({ navigation }) => ({ // eslint-disable-line arrow-body-style 
    menuStatus: navigation.get('menuStatus') 
}); 

const mapDispatchToProps = dispatch => ({ // eslint-disable-line arrow-body-style 
    actions: bindActionCreators({ ...actions }, dispatch) 
}); 

export default @connect(mapStateToProps, mapDispatchToProps) 
class Home extends Component { 
    render() { 
    return <section> 
       <h1>Home container!</h1> 
      </section>; 
    } 
} 

Demo repository

+1

Это проблема с Вавилонкой, как я указал в исправленной вами ошибке: https://github.com/babel/babel/issues/5335#issuecomment-280829492 В настоящее время мы отслеживаем ее в https://github.com/Babel/Babel/вопросы/4585 – loganfsmyth

ответ

1

Это Бабель ошибка: https://github.com/babel/babel/issues/4585

Если ожидание состоит в том, что вы хотите сгенерировать код, который можно сохранить обратно в файловую систему, вам, вероятно, лучше смотреть на JSCodeShift, поскольку он нацелен на сохранение форматирования при манипулировании кодом, в то время как у Babel только некоторый интерес к существующему форматированию.