GithubHelp home page GithubHelp logo

Comments (4)

xinglie avatar xinglie commented on May 18, 2024 2

代码中多余的分号分被解析成EmptyStatement,但并不是所有EmptyStatement都是多余的,比如if(cond);这个空语句就是有用的,再比如for(;;);,我想来想去这种有作用的空语句其实也就这几种情况,排除这些情况,删除其余的空语句可解分号多余的问题。

从ast转文本代码理论上generator可决定要不要添加分号,或者在什么情况下必须添加分号。不过recast没有提供这个选项,即使有这个功能,估计也不能应用,我猜是为了尽可能的保持原有格式,使用了recast.print来生成文本代码。

为了保持原格式,会引入新的问题,比如对start.js中的测试代码稍做调整

const from = `
import a from 'a';
console.log('get A');
var b = console.log();
console.log.bind();
var c = console.log;console.log = func;
`;

我把倒数第1行和倒数第2行人工合并到一行上,有分号,代码正常。经过gogocode处理后的结果是

import a from 'a';
;
var b = void 0
console.log.bind();
var c = function(){}console.log = func;

按前面人的测试,这就不对了。

如果改成recast.prettyPrint,可得结果如下

import a from "a";
;
var b = void 0;
console.log.bind();
var c = function() {};
console.log = func;

recast就会格式化并插入分号。但用recast.prettyPrint又好像不符合作者的意图。

如果按最大格式的保持原有格式输出,那就需要对用户传入的replacement语句做识别,因为限制了用户传入的是合法的、能被解析的代码,因此根据情况来插入一个分号语句,或对替换前的语句识别最后有没有分号,如果有则保留也可以。

先插入替换,最后删除多余分号。

from gogocode.

shuerguo999 avatar shuerguo999 commented on May 18, 2024 1

感谢 @kiinlam @zzh3319 提出问题,也感谢 @xinglie 行老师的点拨~

  • 多余分号问题已经修复了,我在remove节点的时候增加了一个判断:如果待删除的语句父节点是ExpressionStatement并且只有一个子语句,就删除父节点,同时generate增加了isPretty入参,为true时可以格式化输出
  • 压缩代码无分号问题只要将replace语句改为:.replace(var $_$ = console.log(), var $_$ = void 0;)即可

from gogocode.

zzh3319 avatar zzh3319 commented on May 18, 2024

疑惑+1
const from = console.log('get A');;

const output = $(from)
  .replace(`console.log($_$);`, ``)
  .generate();
console.log(output);

log输出了;分号 和预期不一样。

from gogocode.

shuerguo999 avatar shuerguo999 commented on May 18, 2024

分号问题 正在寻求解决方案,由于ast中没有分号相关的属性设置,所以不太好解决,请耐心等待~

from gogocode.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.