Implement access to members of super class

This commit is contained in:
Roman Artemev
2018-04-23 21:08:09 +03:00
committed by Roman Artemev
parent cf31e544eb
commit 8721990a7f
2 changed files with 19 additions and 10 deletions
@@ -128,6 +128,14 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
return JsInvocation(jsDispatchReceiver!!, arguments)
}
expression.superQualifierSymbol?.let {
val qualifierName = context.getNameForSymbol(it).makeRef()
val targetName = context.getNameForSymbol(symbol)
val qPrototype = JsNameRef(targetName, prototypeOf(qualifierName))
val callRef = JsNameRef(Namer.CALL_FUNCTION, qPrototype)
return JsInvocation(callRef, jsDispatchReceiver?. let { listOf(it) + arguments } ?: arguments)
}
return if (symbol is IrConstructorSymbol) {
JsNew(context.getNameForSymbol(symbol).makeRef(), arguments)
} else {
@@ -34,22 +34,19 @@ class SimpleNameGenerator : NameGenerator {
}
}
is ValueParameterDescriptor -> {
if (descriptor.name.isSpecial) {
// TODO: consider this case more carefully
nameBuilder.append(Namer.IMPLICIT_RECEIVER_NAME)
val declaredName = descriptor.name.asString()
nameBuilder.append(declaredName)
if (declaredName.startsWith("\$")) {
nameBuilder.append('_')
nameBuilder.append(descriptor.index)
} else {
val declaredName = descriptor.name.identifier
nameBuilder.append(declaredName)
if (declaredName.startsWith("\$")) {
nameBuilder.append('_')
nameBuilder.append(descriptor.index)
}
}
}
is PropertyDescriptor -> {
nameBuilder.append(descriptor.name.identifier)
if (descriptor.visibility == Visibilities.PRIVATE || descriptor.modality != Modality.FINAL) {
nameBuilder.append('$')
nameBuilder.append(getNameForDescriptor(descriptor.containingDeclaration, context))
}
}
is PropertyAccessorDescriptor -> {
when (descriptor) {
@@ -57,6 +54,10 @@ class SimpleNameGenerator : NameGenerator {
is PropertySetterDescriptor -> nameBuilder.append(Namer.SETTER_PREFIX)
}
nameBuilder.append(descriptor.correspondingProperty.name.asString())
if (descriptor.visibility == Visibilities.PRIVATE) {
nameBuilder.append('$')
nameBuilder.append(getNameForDescriptor(descriptor.containingDeclaration, context))
}
}
is ClassDescriptor -> {
if (descriptor.name.isSpecial) {