JS: equals, hashCode, toString support in inline classes

This commit is contained in:
Anton Bannykh
2018-08-16 13:34:38 +03:00
committed by Ilya Gorbunov
parent a8596a9cd6
commit a11c4871ea
4 changed files with 13 additions and 5 deletions
@@ -1,5 +1,5 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR, JS_IR, JS
// IGNORE_BACKEND: JVM_IR, JS_IR
inline class InlineFloat(val data: Float)
@@ -1,5 +1,5 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR, JS
// IGNORE_BACKEND: JVM_IR
inline class Z(val value: Int)
@@ -126,8 +126,9 @@ class ClassTranslator private constructor(
addSuperclassReferences()
classDeclaration.secondaryConstructors.forEach { generateSecondaryConstructor(context, it) }
if (descriptor.isData && classDeclaration is KtClassOrObject) {
JsDataClassGenerator(classDeclaration, context).generate()
if ((descriptor.isData || descriptor.isInline) && classDeclaration is KtClassOrObject) {
// TODO is `inline data class` a bug or a feature?
JsDataClassGenerator(classDeclaration, context, !descriptor.isData).generate()
}
emitConstructors(nonConstructorContext, nonConstructorContext.endDeclaration())
@@ -41,13 +41,18 @@ import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.or;
class JsDataClassGenerator extends DataClassMethodGenerator {
private final TranslationContext context;
JsDataClassGenerator(KtClassOrObject klass, TranslationContext context) {
private final boolean isInline;
JsDataClassGenerator(KtClassOrObject klass, TranslationContext context, boolean isInline) {
super(klass, context.bindingContext());
this.context = context;
this.isInline = isInline;
}
@Override
public void generateComponentFunction(@NotNull FunctionDescriptor function, @NotNull ValueParameterDescriptor parameter) {
if (isInline) return;
PropertyDescriptor propertyDescriptor = context.bindingContext().get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameter);
assert propertyDescriptor != null : "Property descriptor is expected to be non-null";
@@ -60,6 +65,8 @@ class JsDataClassGenerator extends DataClassMethodGenerator {
@Override
public void generateCopyFunction(@NotNull FunctionDescriptor function, @NotNull List<? extends KtParameter> constructorParameters) {
if (isInline) return;
JsFunction functionObj = generateJsMethod(function);
assert function.getValueParameters().size() == constructorParameters.size();