-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinlinedOperators.lsc
More file actions
27 lines (24 loc) · 1.35 KB
/
inlinedOperators.lsc
File metadata and controls
27 lines (24 loc) · 1.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import t from '../types'
import { placeAtNode as atNode } from 'ast-loc-utils'
normalizeArg(arg) ->
if arg:
arg
else:
t.unaryExpression("void", t.numericLiteral(0))
inlinedOperator = {
looseEq: (args) => t.binaryExpression("==", normalizeArg(args[0]), normalizeArg(args[1]))
looseNotEq: (args) => t.binaryExpression("!=", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseNot: (args) => t.unaryExpression("~", normalizeArg(args[0]))
bitwiseAnd: (args) => t.binaryExpression("&", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseOr: (args) => t.binaryExpression("|", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseXor: (args) => t.binaryExpression("^", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseLeftShift: (args) => t.binaryExpression("<<", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseRightShift: (args) => t.binaryExpression(">>", normalizeArg(args[0]), normalizeArg(args[1]))
bitwiseZeroFillRightShift: (args) => t.binaryExpression(">>>", normalizeArg(args[0]), normalizeArg(args[1]))
}
export maybeReplaceWithInlinedOperator(state, path) ->
{ node } = path
if state.options.inlinedOperatorsEnabled() and node.callee.type == "Identifier":
name = node.callee.name
if inlinedOperator[name] and (not path.scope.hasBinding(name)):
path.replaceWith(inlinedOperator[name](node.arguments)~atNode(node))