Multiple fixes of JS source maps

- elvis expression with complex RHS
- destructuring declarations
- decomposition of `var` statement (for example, in case of
  inline destructuring functions)
- `is` LHS &&/|| inline fun RHS
- argument assignment to temporary var on inline call site
- assignment of `next()` result to temporary var in `for` expression
- rethrow statement in exception handler
This commit is contained in:
Alexey Andreev
2017-06-23 18:15:47 +03:00
parent f873834529
commit ca63717124
20 changed files with 172 additions and 23 deletions
@@ -81,7 +81,7 @@ internal class ExpressionDecomposer private constructor(
for (jsVar in vars) {
if (jsVar in containsExtractable && prevVars.isNotEmpty()) {
addStatement(JsVars(prevVars, x.isMultiline))
addStatement(JsVars(prevVars, x.isMultiline).apply { source = prevVars.first().source })
prevVars = SmartList<JsVars.JsVar>()
}
@@ -89,8 +89,11 @@ internal class ExpressionDecomposer private constructor(
prevVars.add(jsVar)
}
vars.clear()
vars.addAll(prevVars)
if (vars.size != prevVars.size) {
vars.clear()
vars.addAll(prevVars)
x.source = prevVars.first().source
}
return false
}
@@ -168,7 +171,7 @@ internal class ExpressionDecomposer private constructor(
additionalStatements.toStatement()
}
addStatement(JsIf(test, arg2Eval))
addStatement(JsIf(test, arg2Eval).also { it.source = source })
ctx.replaceMe(tmp.nameRef)
}
@@ -50,7 +50,7 @@ private constructor(
val parameters = getParameters()
removeDefaultInitializers(arguments, parameters, body)
aliasArgumentsIfNeeded(namingContext, arguments, parameters)
aliasArgumentsIfNeeded(namingContext, arguments, parameters, call.source)
renameLocalNames(namingContext, invokedFunction)
processReturns()
@@ -89,7 +89,7 @@ private constructor(
val namingContext = inliningContext.newNamingContext()
val arguments = call.arguments
val parameters = outer.parameters
aliasArgumentsIfNeeded(namingContext, arguments, parameters)
aliasArgumentsIfNeeded(namingContext, arguments, parameters, call.source)
namingContext.applyRenameTo(inner)
}
@@ -100,7 +100,7 @@ private constructor(
if (thisReplacement == null || thisReplacement is JsThisRef) return
val thisName = JsScope.declareTemporaryName(getThisAlias())
namingContext.newVar(thisName, thisReplacement)
namingContext.newVar(thisName, thisReplacement, source = call.source)
thisReplacement = thisName.makeRef()
replaceThisReference(block, thisReplacement)
@@ -121,7 +121,7 @@ private constructor(
val resultName = JsScope.declareTemporaryName(getResultLabel())
this.resultName = resultName
namingContext.newVar(resultName, null)
namingContext.newVar(resultName, source = call.source)
return resultName.makeRef()
}
@@ -45,9 +45,10 @@ class NamingContext(private val statementContext: JsContext<JsStatement>) {
renamings.put(name, replacement)
}
fun newVar(name: JsName, value: JsExpression? = null) {
fun newVar(name: JsName, value: JsExpression? = null, source: Any?) {
val vars = JsAstUtils.newVar(name, value)
vars.synthetic = true
vars.source = source
declarations.add(vars)
}
}
@@ -25,7 +25,8 @@ import org.jetbrains.kotlin.js.inline.util.rewriters.LabelNameRefreshingVisitor
fun aliasArgumentsIfNeeded(
context: NamingContext,
arguments: List<JsExpression>,
parameters: List<JsParameter>
parameters: List<JsParameter>,
source: Any?
) {
require(arguments.size <= parameters.size) { "arguments.size (${arguments.size}) should be less or equal to parameters.size (${parameters.size})" }
@@ -34,9 +35,10 @@ fun aliasArgumentsIfNeeded(
val replacement = JsScope.declareTemporaryName(paramName.ident).apply {
staticRef = arg
context.newVar(this, arg.deepCopy())
context.newVar(this, arg.deepCopy(), source = source)
}.makeRef()
replacement.source = arg.source
context.replaceName(paramName, replacement)
}
@@ -45,7 +47,7 @@ fun aliasArgumentsIfNeeded(
val paramName = defaultParam.name
val freshName = JsScope.declareTemporaryName(paramName.ident)
freshName.copyMetadataFrom(paramName)
context.newVar(freshName)
context.newVar(freshName, source = source)
context.replaceName(paramName, freshName.makeRef())
}