Refactoring CallTranslator.
This commit is contained in:
@@ -44,7 +44,7 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.getThisObject;
|
|||||||
* @author Pavel Talanov
|
* @author Pavel Talanov
|
||||||
*/
|
*/
|
||||||
//TODO: write tests on calling backing fields as functions
|
//TODO: write tests on calling backing fields as functions
|
||||||
//TODO: refactor call parameters to be used across the class
|
//TODO: think of the refactoring the class
|
||||||
public final class CallTranslator extends AbstractTranslator {
|
public final class CallTranslator extends AbstractTranslator {
|
||||||
|
|
||||||
private static class CallParameters {
|
private static class CallParameters {
|
||||||
@@ -96,13 +96,15 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
/*package*/ JsExpression translate() {
|
/*package*/ JsExpression translate() {
|
||||||
|
if (isExpressionAsFunction()) {
|
||||||
|
return expressionAsFunctionCall();
|
||||||
|
}
|
||||||
if (isIntrinsic()) {
|
if (isIntrinsic()) {
|
||||||
return intrinsicInvocation();
|
return intrinsicInvocation();
|
||||||
}
|
}
|
||||||
if (isConstructor()) {
|
if (isConstructor()) {
|
||||||
return constructorCall();
|
return constructorCall();
|
||||||
}
|
}
|
||||||
//NOTE: treat native extension function calls as usual calls
|
|
||||||
if (isNativeExtensionFunctionCall()) {
|
if (isNativeExtensionFunctionCall()) {
|
||||||
return nativeExtensionCall();
|
return nativeExtensionCall();
|
||||||
}
|
}
|
||||||
@@ -112,13 +114,17 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
if (isExtensionFunction()) {
|
if (isExtensionFunction()) {
|
||||||
return extensionFunctionCall();
|
return extensionFunctionCall();
|
||||||
}
|
}
|
||||||
return methodCall();
|
return methodCall(callParameters(resolveThisObject(/*just get qualifier if null*/ true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
private boolean isExpressionAsFunction() {
|
||||||
private JsExpression nativeExtensionCall() {
|
return callee != null;
|
||||||
receiver = getExtensionFunctionCallReceiver();
|
}
|
||||||
return methodCall();
|
|
||||||
|
private JsExpression expressionAsFunctionCall() {
|
||||||
|
assert callee != null;
|
||||||
|
CallParameters expressionAsFunctionParameters = new CallParameters(null, callee);
|
||||||
|
return methodCall(expressionAsFunctionParameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isIntrinsic() {
|
private boolean isIntrinsic() {
|
||||||
@@ -155,6 +161,12 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
return AnnotationsUtils.isNativeObject(descriptor) && isExtensionFunction();
|
return AnnotationsUtils.isNativeObject(descriptor) && isExtensionFunction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private JsExpression nativeExtensionCall() {
|
||||||
|
receiver = getExtensionFunctionCallReceiver();
|
||||||
|
return methodCall(callParameters(resolveThisObject(/*just get qualifier if null = */ true)));
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isExtensionFunctionLiteral() {
|
private boolean isExtensionFunctionLiteral() {
|
||||||
boolean isLiteral = descriptor instanceof VariableAsFunctionDescriptor
|
boolean isLiteral = descriptor instanceof VariableAsFunctionDescriptor
|
||||||
|| descriptor instanceof ExpressionAsFunctionDescriptor;
|
|| descriptor instanceof ExpressionAsFunctionDescriptor;
|
||||||
@@ -187,7 +199,7 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
JsNameRef callMethodNameRef = AstUtil.newQualifiedNameRef("call");
|
JsNameRef callMethodNameRef = AstUtil.newQualifiedNameRef("call");
|
||||||
JsInvocation callMethodInvocation = new JsInvocation();
|
JsInvocation callMethodInvocation = new JsInvocation();
|
||||||
callMethodInvocation.setQualifier(callMethodNameRef);
|
callMethodInvocation.setQualifier(callMethodNameRef);
|
||||||
setQualifier(callMethodInvocation, callParameters().functionReference);
|
setQualifier(callMethodInvocation, callParameters(resolveThisObject(/*just get qualifier if null*/ true)).functionReference);
|
||||||
return callMethodInvocation;
|
return callMethodInvocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,8 +238,9 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression constructExtensionFunctionCall(@NotNull JsExpression receiver) {
|
private JsExpression constructExtensionFunctionCall(@NotNull JsExpression receiver) {
|
||||||
List<JsExpression> argumentList = generateExtensionCallArgumentList(receiver);
|
List<JsExpression> argumentList = generateExtensionCallArgumentList(receiver);
|
||||||
JsExpression functionReference = callParameters().functionReference;
|
CallParameters callParameters = callParameters(resolveThisObject(/*just get qualifier if null*/ true));
|
||||||
setQualifier(functionReference, callParameters().receiver);
|
JsExpression functionReference = callParameters.functionReference;
|
||||||
|
setQualifier(functionReference, callParameters.receiver);
|
||||||
return newInvocation(functionReference, argumentList);
|
return newInvocation(functionReference, argumentList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,8 +254,7 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression methodCall() {
|
private JsExpression methodCall(@NotNull final CallParameters callParameters) {
|
||||||
final CallParameters callParameters = callParameters();
|
|
||||||
return callType.constructCall(callParameters.receiver, new CallType.CallConstructor() {
|
return callType.constructCall(callParameters.receiver, new CallType.CallConstructor() {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
@@ -257,14 +269,9 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private CallParameters callParameters() {
|
private CallParameters callParameters(@Nullable JsExpression receiver) {
|
||||||
// TODO: this check corresponds to expression as function, make it clearer
|
|
||||||
if (callee != null) {
|
|
||||||
return new CallParameters(null, callee);
|
|
||||||
}
|
|
||||||
JsExpression thisObject = resolveThisObject(/*just get qualifier if null*/ true);
|
|
||||||
JsExpression functionReference = functionReference();
|
JsExpression functionReference = functionReference();
|
||||||
return new CallParameters(thisObject, functionReference);
|
return new CallParameters(receiver, functionReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user