JS backend refactor: refactored LiteralFunctionTranslator after code review
This commit is contained in:
committed by
Zalim Bashorov
parent
c47732e7eb
commit
7a8ba9c733
+19
-13
@@ -128,8 +128,7 @@ private fun moveCapturedLocalInside(capturingFunction: JsFunction, capturedName:
|
|||||||
when (localFunAlias) {
|
when (localFunAlias) {
|
||||||
is JsNameRef -> {
|
is JsNameRef -> {
|
||||||
/** Local inline function does not capture anything, so just move alias inside */
|
/** Local inline function does not capture anything, so just move alias inside */
|
||||||
capturedName.setStaticRef(localFunAlias)
|
declareAliasInsideFunction(capturingFunction, capturedName, localFunAlias)
|
||||||
capturingFunction.getInnerFunction()?.addDeclaration(capturedName, localFunAlias)
|
|
||||||
CapturedArgsParams()
|
CapturedArgsParams()
|
||||||
}
|
}
|
||||||
is JsInvocation ->
|
is JsInvocation ->
|
||||||
@@ -157,28 +156,35 @@ private fun moveCapturedLocalInside(capturingFunction: JsFunction, capturedName:
|
|||||||
val capturedArgs = localFunAlias.getArguments()
|
val capturedArgs = localFunAlias.getArguments()
|
||||||
|
|
||||||
val scope = capturingFunction.getInnerFunction()?.getScope()!!
|
val scope = capturingFunction.getInnerFunction()?.getScope()!!
|
||||||
val names = capturedArgs.map {(it as JsNameRef).getName()}
|
val freshNames = getFreshNamesInScope(scope, capturedArgs)
|
||||||
val freshNames = getFreshNamesInScope(scope, names)
|
|
||||||
|
|
||||||
val aliasCallArguments = freshNames.map { it.makeRef() }
|
val aliasCallArguments = freshNames.map { it.makeRef() }
|
||||||
val alias = JsInvocation(localFunAlias.getQualifier(), aliasCallArguments)
|
val alias = JsInvocation(localFunAlias.getQualifier(), aliasCallArguments)
|
||||||
|
declareAliasInsideFunction(capturingFunction, capturedName, alias)
|
||||||
capturedName.setStaticRef(alias)
|
|
||||||
capturingFunction.getInnerFunction()?.addDeclaration(capturedName, alias)
|
|
||||||
|
|
||||||
val capturedParameters = freshNames.map {JsParameter(it)}
|
val capturedParameters = freshNames.map {JsParameter(it)}
|
||||||
return CapturedArgsParams(capturedArgs, capturedParameters)
|
return CapturedArgsParams(capturedArgs, capturedParameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFreshNamesInScope(scope: JsScope, suggested: List<JsName?>): List<JsName> {
|
private fun declareAliasInsideFunction(function: JsFunction, name: JsName, alias: JsExpression) {
|
||||||
val suggestedNames = suggested.stream().filterNotNull()
|
name.setStaticRef(alias)
|
||||||
val suggestedIdents = suggestedNames.map { it.getIdent() }
|
function.getInnerFunction()?.addDeclaration(name, alias)
|
||||||
val freshNames = suggestedIdents.map { scope.declareFreshName(it) }
|
|
||||||
|
|
||||||
return freshNames.toList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getFreshNamesInScope(scope: JsScope, suggested: List<JsExpression>): List<JsName> {
|
||||||
|
val freshNames = arrayListOf<JsName>()
|
||||||
|
|
||||||
|
for (suggestion in suggested) {
|
||||||
|
if (suggestion !is JsNameRef) {
|
||||||
|
throw AssertionError("Expected suggestion to be JsNameRef")
|
||||||
|
}
|
||||||
|
|
||||||
|
val ident = suggestion.getIdent()
|
||||||
|
val name = scope.declareFreshName(ident)
|
||||||
|
freshNames.add(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return freshNames
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun JsFunction.addDeclaration(name: JsName, value: JsExpression?) {
|
private fun JsFunction.addDeclaration(name: JsName, value: JsExpression?) {
|
||||||
|
|||||||
Reference in New Issue
Block a user