/*1*/Math.pow(/*2*/a/*3*/, /*4*/b/*5*/)/*6*/;
(Math).pow(a, b);

// able to catch some workarounds
Math[`pow`](a, b);
(Math)['pow'](a, b);
(Math)["pow"](a, b);
(Math)[`pow`](a, b);

// non-expression parents that don't require parens
var x = Math.pow(a, b);
if(Math.pow(a, b)){}
for(;Math.pow(a, b);){}
switch(foo){ case Math.pow(a, b): break; }
{ foo: Math.pow(a, b) }
function foo(bar, baz = Math.pow(a, b), quux){}
`${Math.pow(a, b)}`

// non-expression parents that do require parens
class C extends Math.pow(a, b) {}

// already parenthesised, shouldn't insert extra parens
+(Math.pow(a, b))
(Math.pow(a, b)).toString()
(class extends (Math.pow(a, b)) {})
class C extends (Math.pow(a, b)) {}

// '**' is right-associative, that applies to both parent and child nodes
a ** Math.pow(b, c);
Math.pow(a, b) ** c;
Math.pow(a, b ** c);
Math.pow(a ** b, c);
a ** Math.pow(b ** c, d ** e) ** f;

// doesn't remove already existing unnecessary parens around the whole expression
(Math.pow(a, b));
foo + (Math.pow(a, b));
(Math.pow(a, b)) + foo;
`${(Math.pow(a, b))}`;

// Optional chaining
Math.pow?.(a, b)
Math?.pow(a, b)
Math?.pow?.(a, b)
;(Math?.pow)(a, b)
;(Math?.pow)?.(a, b)

// doesn't put extra parens
Math.pow((a + b), (c + d))

// tokens that can be adjacent
a+Math.pow(b, c)+d
