Skip to content

Commit d577412

Browse files
committed
Transform more console use.
1 parent f367cd6 commit d577412

2 files changed

Lines changed: 96 additions & 35 deletions

File tree

src/visitor/globals.js

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,7 @@ function init() {
4949

5050
const args = node.arguments
5151

52-
if (args.length === 0) {
53-
return
54-
}
55-
56-
const parent = path.getParentNode()
57-
58-
if (! isIdentifer(object, parent) ||
52+
if (args.length === 0 ||
5953
isShadowed(path, name, shadowedMap)) {
6054
return
6155
}
@@ -84,6 +78,42 @@ function init() {
8478

8579
path.call(this, "visitWithoutReset", "arguments")
8680
}
81+
82+
visitIdentifier(path) {
83+
const node = path.getValue()
84+
const { name } = node
85+
86+
if (! this.globals.has(name)) {
87+
return
88+
}
89+
90+
const parent = path.getParentNode()
91+
const { type } = parent
92+
93+
if ((type === "UnaryExpression" &&
94+
parent.operator === "typeof") ||
95+
! isIdentifer(node, parent) ||
96+
isShadowed(path, name, shadowedMap)) {
97+
return
98+
}
99+
100+
if (name === "console") {
101+
this.transforms |= TRANSFORMS_CONSOLE
102+
} else if (name === "Reflect") {
103+
this.transforms |= TRANSFORMS_REFLECT
104+
}
105+
106+
let code = this.runtimeName + ".g."
107+
let pos = node.start
108+
109+
if (type === "Property" &&
110+
parent.shorthand) {
111+
code = ":" + code + name
112+
pos = node.end
113+
}
114+
115+
this.magicString.prependLeft(pos, code)
116+
}
87117
}
88118

89119
return new GlobalsVisitor

test/compiler-tests.mjs

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -448,20 +448,36 @@ describe("compiler tests", () => {
448448
}
449449
})
450450

451-
it("should transform `console` calls with identifier arguments", () => {
451+
it("should transform `console` references and calls with identifier arguments", () => {
452452
const lines = [
453+
"console",
453454
"console.a(b)",
454-
'console["a"](b)'
455+
'console.a("b", c)',
456+
'console["a"](b)',
457+
"new console.Console(a)",
458+
"class C extends console.Console {}",
459+
"const a = { console }",
460+
"const a = { [console]: console }",
461+
"const a = { console() { console } }",
462+
"const a = () => console"
455463
]
456464

457465
const compiled = [
466+
"_.g.console",
458467
"_.g.console.a(b)",
459-
'_.g.console["a"](b)'
468+
'_.g.console.a("b", c)',
469+
'_.g.console["a"](b)',
470+
"new _.g.console.Console(a)",
471+
"class C extends _.g.console.Console {}",
472+
"const a = { console:_.g.console }",
473+
"const a = { [_.g.console]: _.g.console }",
474+
"const a = { console() { _.g.console } }",
475+
"const a = () => _.g.console"
460476
]
461477

462478
lines.forEach((line, index) => {
463479
const code = [
464-
'import * as ns from "a"',
480+
'import a from "a"',
465481
line
466482
].join("\n")
467483

@@ -476,49 +492,64 @@ describe("compiler tests", () => {
476492

477493
it("should not transform other `console` use", () => {
478494
const lines = [
479-
"console",
480-
"console.log('a', 'b')",
481-
'console.log("a", "b")',
482-
"console.log(`a`, `b`)",
483-
"new console.Console(a)",
484-
"class C extends console.Console {}",
485495
"typeof console",
486-
"const a = { console }",
487-
"const a = { [console]: console }",
488-
"const a = { console() { console } }",
489-
"const a = () => console"
496+
"console.a('b')",
497+
'console.a("b", \'c\')',
498+
'console.a("b", `c`)'
490499
]
491500

492501
lines.forEach((line) => {
493-
for (const sourceType of sourceTypes) {
494-
const result = Compiler.compile(line, { sourceType })
502+
const code = [
503+
'import a from "a"',
504+
line
505+
].join("\n")
506+
507+
for (const sourceType of modernTypes) {
508+
const result = Compiler.compile(code, { sourceType })
509+
const actual = result.code.split("\n").pop()
495510

496-
assert.strictEqual(result.code, line)
511+
assert.strictEqual(actual, line)
497512
}
498513
})
499514
})
500515

501-
it("should not transform shadowed `console` identifiers", () => {
516+
it("should not transform `console` identifiers shadowed by arguments or variables", () => {
502517
const lines = [
503-
'import console from "a"',
504-
'import * as console from "a"',
505-
"export let console = {}",
506-
"let console = {}",
518+
"let console = { a() {} }",
507519
"let a = (console) =>"
508520
]
509521

510522
lines.forEach((line) => {
511523
const code = [
524+
'import a from "a"',
525+
"{",
512526
line,
513-
"console"
527+
"console.a(b)",
528+
"}"
514529
].join("\n")
515530

516-
for (const sourceType of sourceTypes) {
517-
if (sourceType === SCRIPT &&
518-
/(im|ex)port/.test(code)) {
519-
continue
520-
}
531+
for (const sourceType of modernTypes) {
532+
const result = Compiler.compile(code, { sourceType })
521533

534+
assert.strictEqual(result.code.includes("_.g"), false)
535+
}
536+
})
537+
})
538+
539+
it("should not transform `console` identifiers shadowed by `import` or `export` specifiers", () => {
540+
const lines = [
541+
'import console from "a"',
542+
'import * as console from "a"',
543+
"export let console = { a() {} }"
544+
]
545+
546+
lines.forEach((line) => {
547+
const code = [
548+
line,
549+
"console.a(b)"
550+
].join("\n")
551+
552+
for (const sourceType of modernTypes) {
522553
const result = Compiler.compile(code, { sourceType })
523554

524555
assert.strictEqual(result.code.includes("_.g"), false)

0 commit comments

Comments
 (0)