[AST Babel] Add function name into the console log 'path.findParent(t.isFunctionDeclaration)'

Continue with the previous post: https://www.cnblogs.com/Answer1215/p/12337243.html

What we want to do in this post, is adding parent function name into the console log as well:

Previous output is :

function add(a, b) {
    console.log("2:4", a, b)
      return a + b
}

function subtract(a, b) {
    console.log("7:4", a, b)
      return a - b
}

add(1, 2)
subtract(2, 1)
console.log("13:0", ‘sup dawg‘)

Now we want:

function add(a, b) {
    console.log("add 2:4", a, b)
      return a + b
}

function subtract(a, b) {
    console.log("subtract 7:4", a, b)
      return a - b
}

add(1, 2)
subtract(2, 1)
console.log("13:0", ‘sup dawg‘)

The key is using

path.findParent()

+

t.isFunctionDeclaration

To find its parent function.

Code:

export default function (babel) {
  const { types: t } = babel;

  return {
    name: "ast-transform", // not required
    visitor: {
      CallExpression(path) {
          if (!looksLike(path.node, {
            callee: {
              type: ‘MemberExpression‘,
              object: {
                  name: ‘console‘
              },
              property: {
                  name: ‘log‘
              }
            }
        })) {
          return
        }

        const parentFn = path.findParent(t.isFunctionDeclaration);
        const fnName =  parentFn?
              `${parentFn.node.id.name} `:
              ‘‘;
        // insert string into console.log(‘instread here‘, a,b)
        const {line, column} = path.node.loc.start;
        const prefix = fnName + `${line}:${column}`;
        path.node.arguments.unshift(t.stringLiteral(prefix))
      }
    }
  };
}

function looksLike(a, b) {
  return (
    a &&
    b &&
    Object.keys(b).every(bKey => {
      const bVal = b[bKey]
      const aVal = a[bKey]
      if (typeof bVal === ‘function‘) {
        return bVal(aVal)
      }
      return isPrimitive(bVal) ? bVal === aVal : looksLike(aVal, bVal)
    })
  )
}

function isPrimitive(val) {
  return val == null || /^[sbn]/.test(typeof val)
}

[AST Babel] Add function name into the console log 'path.findParent(t.isFunctionDeclaration)'

原文地址:https://www.cnblogs.com/Answer1215/p/12342540.html

时间: 2024-11-05 23:19:31

[AST Babel] Add function name into the console log 'path.findParent(t.isFunctionDeclaration)'的相关文章

[AST Babel] Create a simple babel plugin

For example, we have the source code: getVersison('3.4.5') function getVersion(versionString) { const versionRegex = /(\d)\.(\d)\.(\d+)/ const [, major, minor, patch] = versionRegex.exec(versionString) return {major, minor, patch} } We want to transf

console.log((function f(n){return ((n > 1) ? n * f(n-1) : n)})(5))调用解析

console.log((function f(n){return ((n > 1) ? n * f(n-1) : n)})(5)); 5被传入到函数,函数内部三元计算,5 > 1成立,运算结果是5*f(4),二次运算,5*4*f(3),依次类推,最终是5*4*3*2,最终返回结果是120. 如图:

JavaScript原型链中toString()方法输出alert()和console.log()得到不同的结果

<script language="javascript"> function myObj(){ var total = 0; } myObj.prototype.add = function(a,b){ this.total = a + b; } myObj.prototype.toString = function(){ return this.total; } var obj = new myObj(); obj.add(1,2); console.log(obj);

如何实现监听 console.log

var lastLog; console.oldLog = console.log; console.log = function(str) { console.oldLog(str); lastLog = str; } console.log("Hello, Neo"); document.write(lastLog); 一.什么是console.log()?除了一些很老版本的浏览器,现今大多数浏览器都自带调试功能:即使没有调试功能,也可以通过安装插件来进行补充.比如,老版本的Fir

【转】console.log 用法

转自http://www.cnblogs.com/ctriphire/p/4116207.html 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏览器有过之而无不及的地方.可能大家对console.log会有一定的了解,心里难免会想调试的时候用alert不就行了,干嘛还要用console.log这么一长串的字符串来替代alert输出信息呢,下面我就介绍一些调试的入门技巧,让你爱上co

[Javascript] Format console.log with CSS and String Template Tags

The Chrome console allows you to format messages using CSS properties. This lesson walks you through the syntax of formatting your logs with css then refactoring into a template tag function to make formatting more reusable. const debug = (label, sty

console.log的使用

一.Console API Console.assert() 判断第一个参数是否为真,false的话抛出异常并且在console输出相应信息. Console.count() 以参数为标识记录调用的次数,调用时在console打印标识以及调用次数. Console.debug() console.log方法的别称,使用方法可以参考Console.log() Console.dir() 打印一条以三角形符号开头的语句,可以点击三角展开查看对象的属性. Console.error() 打印一条错误信

关于window.console&amp;&amp;console.log(123)的思考

一.JS的且运算记得最开始看到window.console&&console.log(123),当时知道能起什么作用但是没有深入研究,最近在研究后总算弄明白了.要理解这个,首先得明白三个知识点第一:短路原则这个大家都非常清楚的了,在做且运算的时候,“同真才真,一假则假”,比如true&&true==truetrue&&false==falsefalse&&false==falsefalse&&true==false 第二:JS

js调试console.log使用总结图解

一 实例 打印字符串和对象: 可展开对象查看内部情况: 看一下console对象本身的定义情况: 输出对象情况: utag对象所在文件: 输出对象: 二 Console.log 总结 1 如果你js没到一个境界,我就算教你调试bug,破解一些插件之类的,你也根本不知道我在做什么.我的目的只是让你认识控制台,让你入门调试,之后的路还得靠你们自己走. 不论是 chrome firefox ie(8以上版本) 还是 360急速浏览器 搜狗浏览器 等等,只要按 F12 就能打开控制台. 其实对于这 F1