JS backend: first step of remove _c object from output code.
createClass -> createClassNow, createTrait -> createTraitNow, createObject -> createObjectNow First argument of new createClass() is function, which return array of parent classes.
This commit is contained in:
+5
-2
@@ -134,6 +134,9 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!vars.isEmpty() || !propertyInitializers.isEmpty()) {
|
||||
throw new IllegalStateException(); // check, that all class generate as final class
|
||||
}
|
||||
|
||||
dummyFunction.setBody(new JsBlock(new JsVars(vars, true), new JsReturn(new JsObjectLiteral(propertyInitializers))));
|
||||
classesVar.setInitExpression(new JsInvocation(dummyFunction));
|
||||
@@ -215,7 +218,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
||||
|
||||
@Nullable
|
||||
public JsNameRef getQualifiedReference(ClassDescriptor descriptor) {
|
||||
if (descriptor.getModality() != Modality.FINAL) {
|
||||
if (descriptor.getModality() != Modality.FINAL && false) {
|
||||
//noinspection ConstantConditions
|
||||
return classDescriptorToQualifiedLabel.get(descriptor, null);
|
||||
}
|
||||
@@ -226,7 +229,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
||||
public JsPropertyInitializer translate(@NotNull JetClassOrObject declaration, TranslationContext context) {
|
||||
ClassDescriptor descriptor = getClassDescriptor(context().bindingContext(), declaration);
|
||||
JsExpression value;
|
||||
if (descriptor.getModality() == Modality.FINAL) {
|
||||
if (descriptor.getModality() == Modality.FINAL || true) {
|
||||
value = new ClassTranslator(declaration, classDescriptorToQualifiedLabel, context).translate();
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -164,7 +164,7 @@ public final class ClassTranslator extends AbstractTranslator {
|
||||
});
|
||||
}
|
||||
|
||||
invocationArguments.add(getSuperclassReferences());
|
||||
invocationArguments.add(getSuperclassReferences(declarationContext));
|
||||
if (!isTrait()) {
|
||||
JsFunction initializer = new ClassInitializerTranslator(classDeclaration, declarationContext).generateInitializeMethod();
|
||||
invocationArguments.add(initializer.getBody().getStatements().isEmpty() ? JsLiteral.NULL : initializer);
|
||||
@@ -214,16 +214,12 @@ public final class ClassTranslator extends AbstractTranslator {
|
||||
}
|
||||
}
|
||||
|
||||
private JsExpression getSuperclassReferences() {
|
||||
private JsExpression getSuperclassReferences(@NotNull TranslationContext declarationContext) {
|
||||
List<JsExpression> superClassReferences = getSupertypesNameReferences();
|
||||
if (superClassReferences.isEmpty()) {
|
||||
return JsLiteral.NULL;
|
||||
}
|
||||
else if (superClassReferences.size() == 1) {
|
||||
return superClassReferences.get(0);
|
||||
}
|
||||
else {
|
||||
return new JsArrayLiteral(superClassReferences);
|
||||
} else {
|
||||
return simpleReturnFunction(declarationContext.scope(), new JsArrayLiteral(superClassReferences));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var A = Kotlin.createClass();
|
||||
var B = Kotlin.createClass(A);
|
||||
var A = Kotlin.createClassNow();
|
||||
var B = Kotlin.createClassNow(A);
|
||||
var b = new B;
|
||||
|
||||
function test() {
|
||||
|
||||
@@ -14,27 +14,27 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var A = Kotlin.createClass();
|
||||
var B = Kotlin.createClass(A);
|
||||
var A = Kotlin.createClassNow();
|
||||
var B = Kotlin.createClassNow(A);
|
||||
var b = new B;
|
||||
var C = Kotlin.createClass(B);
|
||||
var C = Kotlin.createClassNow(B);
|
||||
var c = new C;
|
||||
var E = Kotlin.createClass(A)
|
||||
var E = Kotlin.createClassNow(A);
|
||||
var e = new E;
|
||||
|
||||
var test1 = function() {
|
||||
var b2 = b
|
||||
var b2 = b;
|
||||
return (Kotlin.isType(b, A) && Kotlin.isType(b, B));
|
||||
}
|
||||
};
|
||||
|
||||
var test2 = function() {
|
||||
return (Kotlin.isType(c, C) && Kotlin.isType(c, B) && Kotlin.isType(c, A) && (!Kotlin.isType(c, E)));
|
||||
}
|
||||
};
|
||||
|
||||
var test3 = function() {
|
||||
return Kotlin.isType(e, E) && !Kotlin.isType(e, B) && !Kotlin.isType(e, C) && Kotlin.isType(e, A)
|
||||
}
|
||||
};
|
||||
|
||||
var test = function() {
|
||||
return test1() && test2() && test3()
|
||||
}
|
||||
};
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var A = Kotlin.createClass();
|
||||
var B = Kotlin.createClass(A);
|
||||
var C = Kotlin.createClass();
|
||||
var A = Kotlin.createClassNow();
|
||||
var B = Kotlin.createClassNow(A);
|
||||
var C = Kotlin.createClassNow();
|
||||
var c = new C;
|
||||
|
||||
test = function() {
|
||||
return ((!isType(c, A)) && !isType(c, B));
|
||||
}
|
||||
return ((!Kotlin.isType(c, A)) && !Kotlin.isType(c, B));
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var A = Kotlin.createClass();
|
||||
var A = Kotlin.createClassNow();
|
||||
var a = new A();
|
||||
|
||||
function test() {
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
{
|
||||
var items = function () {
|
||||
var A = Kotlin.createClass(null,
|
||||
var A = Kotlin.createClassNow(null,
|
||||
function $fun() {
|
||||
this.$order = '';
|
||||
{
|
||||
@@ -31,13 +31,13 @@
|
||||
return this.$order;
|
||||
}
|
||||
});
|
||||
var B = Kotlin.createClass(A, function $fun() {
|
||||
var B = Kotlin.createClassNow(A, function $fun() {
|
||||
$fun.baseInitializer.call(this);
|
||||
{
|
||||
this.set_order(this.get_order() + 'B');
|
||||
}
|
||||
});
|
||||
var C = Kotlin.createClass(B, function $fun() {
|
||||
var C = Kotlin.createClassNow(B, function $fun() {
|
||||
$fun.baseInitializer.call(this);
|
||||
{
|
||||
this.set_order(this.get_order() + 'C');
|
||||
|
||||
@@ -72,13 +72,13 @@ String.prototype.contains = function (s) {
|
||||
|
||||
Kotlin.modules = {};
|
||||
|
||||
Kotlin.RuntimeException = Kotlin.createClass();
|
||||
Kotlin.NullPointerException = Kotlin.createClass();
|
||||
Kotlin.NoSuchElementException = Kotlin.createClass();
|
||||
Kotlin.IllegalArgumentException = Kotlin.createClass();
|
||||
Kotlin.IllegalStateException = Kotlin.createClass();
|
||||
Kotlin.UnsupportedOperationException = Kotlin.createClass();
|
||||
Kotlin.IOException = Kotlin.createClass();
|
||||
Kotlin.RuntimeException = Kotlin.createClassNow();
|
||||
Kotlin.NullPointerException = Kotlin.createClassNow();
|
||||
Kotlin.NoSuchElementException = Kotlin.createClassNow();
|
||||
Kotlin.IllegalArgumentException = Kotlin.createClassNow();
|
||||
Kotlin.IllegalStateException = Kotlin.createClassNow();
|
||||
Kotlin.UnsupportedOperationException = Kotlin.createClassNow();
|
||||
Kotlin.IOException = Kotlin.createClassNow();
|
||||
|
||||
Kotlin.throwNPE = function () {
|
||||
throw new Kotlin.NullPointerException();
|
||||
@@ -96,12 +96,12 @@ String.prototype.contains = function (s) {
|
||||
};
|
||||
}
|
||||
|
||||
Kotlin.Iterator = Kotlin.createClass(null, null, {
|
||||
Kotlin.Iterator = Kotlin.createClassNow(null, null, {
|
||||
next: throwAbstractFunctionInvocationError("Iterator#next"),
|
||||
hasNext: throwAbstractFunctionInvocationError("Iterator#hasNext")
|
||||
});
|
||||
|
||||
var ArrayIterator = Kotlin.createClass(Kotlin.Iterator,
|
||||
var ArrayIterator = Kotlin.createClassNow(Kotlin.Iterator,
|
||||
function (array) {
|
||||
this.array = array;
|
||||
this.size = array.length;
|
||||
@@ -115,7 +115,7 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
var ListIterator = Kotlin.createClass(ArrayIterator,
|
||||
var ListIterator = Kotlin.createClassNow(ArrayIterator,
|
||||
function (list) {
|
||||
this.list = list;
|
||||
this.size = list.size();
|
||||
@@ -126,9 +126,9 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.Collection = Kotlin.createClass();
|
||||
Kotlin.Collection = Kotlin.createClassNow();
|
||||
|
||||
Kotlin.Enum = Kotlin.createClass(null,
|
||||
Kotlin.Enum = Kotlin.createClassNow(null,
|
||||
function () {
|
||||
this.name$ = undefined;
|
||||
this.ordinal$ = undefined;
|
||||
@@ -170,13 +170,13 @@ String.prototype.contains = function (s) {
|
||||
};
|
||||
})();
|
||||
|
||||
Kotlin.PropertyMetadata = Kotlin.createClass(null,
|
||||
Kotlin.PropertyMetadata = Kotlin.createClassNow(null,
|
||||
function(name) {
|
||||
this.name = name;
|
||||
}
|
||||
);
|
||||
|
||||
Kotlin.AbstractCollection = Kotlin.createClass(Kotlin.Collection, null, {
|
||||
Kotlin.AbstractCollection = Kotlin.createClassNow(Kotlin.Collection, null, {
|
||||
size: function () {
|
||||
return this.$size;
|
||||
},
|
||||
@@ -229,7 +229,7 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.AbstractList = Kotlin.createClass(Kotlin.AbstractCollection, null, {
|
||||
Kotlin.AbstractList = Kotlin.createClassNow(Kotlin.AbstractCollection, null, {
|
||||
iterator: function () {
|
||||
return new ListIterator(this);
|
||||
},
|
||||
@@ -245,7 +245,7 @@ String.prototype.contains = function (s) {
|
||||
});
|
||||
|
||||
//TODO: should be JS Array-like (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects)
|
||||
Kotlin.ArrayList = Kotlin.createClass(Kotlin.AbstractList,
|
||||
Kotlin.ArrayList = Kotlin.createClassNow(Kotlin.AbstractList,
|
||||
function () {
|
||||
this.array = [];
|
||||
this.$size = 0;
|
||||
@@ -313,19 +313,19 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.Runnable = Kotlin.createClass(null, null, {
|
||||
Kotlin.Runnable = Kotlin.createClassNow(null, null, {
|
||||
run: throwAbstractFunctionInvocationError("Runnable#run")
|
||||
});
|
||||
|
||||
Kotlin.Comparable = Kotlin.createClass(null, null, {
|
||||
Kotlin.Comparable = Kotlin.createClassNow(null, null, {
|
||||
compareTo: throwAbstractFunctionInvocationError("Comparable#compareTo")
|
||||
});
|
||||
|
||||
Kotlin.Appendable = Kotlin.createClass(null, null, {
|
||||
Kotlin.Appendable = Kotlin.createClassNow(null, null, {
|
||||
append: throwAbstractFunctionInvocationError("Appendable#append")
|
||||
});
|
||||
|
||||
Kotlin.Closeable = Kotlin.createClass(null, null, {
|
||||
Kotlin.Closeable = Kotlin.createClassNow(null, null, {
|
||||
close: throwAbstractFunctionInvocationError("Closeable#close")
|
||||
});
|
||||
|
||||
@@ -397,7 +397,7 @@ String.prototype.contains = function (s) {
|
||||
Kotlin.System.out().print(s);
|
||||
};
|
||||
|
||||
Kotlin.RangeIterator = Kotlin.createClass(Kotlin.Iterator,
|
||||
Kotlin.RangeIterator = Kotlin.createClassNow(Kotlin.Iterator,
|
||||
function (start, end, increment) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
@@ -414,7 +414,7 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.NumberRange = Kotlin.createClass(null,
|
||||
Kotlin.NumberRange = Kotlin.createClassNow(null,
|
||||
function (start, end) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
@@ -428,7 +428,7 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.Progression = Kotlin.createClass(null,
|
||||
Kotlin.Progression = Kotlin.createClassNow(null,
|
||||
function (start, end, increment) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
@@ -439,11 +439,11 @@ String.prototype.contains = function (s) {
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.Comparator = Kotlin.createClass(null, null, {
|
||||
Kotlin.Comparator = Kotlin.createClassNow(null, null, {
|
||||
compare: throwAbstractFunctionInvocationError("Comparator#compare")
|
||||
});
|
||||
|
||||
var ComparatorImpl = Kotlin.createClass(Kotlin.Comparator,
|
||||
var ComparatorImpl = Kotlin.createClassNow(Kotlin.Comparator,
|
||||
function (comparator) {
|
||||
this.compare = comparator;
|
||||
}
|
||||
@@ -504,7 +504,7 @@ String.prototype.contains = function (s) {
|
||||
};
|
||||
|
||||
|
||||
Kotlin.StringBuilder = Kotlin.createClass(null,
|
||||
Kotlin.StringBuilder = Kotlin.createClassNow(null,
|
||||
function () {
|
||||
this.string = "";
|
||||
}, {
|
||||
|
||||
@@ -117,7 +117,8 @@ var Kotlin = {};
|
||||
Kotlin.TYPE = {
|
||||
CLASS: "class",
|
||||
TRAIT: "trait",
|
||||
OBJECT: "object"
|
||||
OBJECT: "object",
|
||||
INIT_FUN: "init fun"
|
||||
};
|
||||
|
||||
Kotlin.classCount = 0;
|
||||
@@ -185,7 +186,7 @@ var Kotlin = {};
|
||||
return object;
|
||||
}
|
||||
|
||||
Kotlin.createClass = function (bases, constructor, properties, staticProperties) {
|
||||
Kotlin.createClassNow = function (bases, constructor, properties, staticProperties) {
|
||||
if (constructor == null) {
|
||||
constructor = emptyFunction();
|
||||
}
|
||||
@@ -214,8 +215,8 @@ var Kotlin = {};
|
||||
return constructor;
|
||||
};
|
||||
|
||||
Kotlin.createObject = function (bases, constructor, functions) {
|
||||
var noNameClass = Kotlin.createClass(bases, constructor, functions);
|
||||
Kotlin.createObjectNow = function (bases, constructor, functions) {
|
||||
var noNameClass = Kotlin.createClassNow(bases, constructor, functions);
|
||||
var obj = new noNameClass();
|
||||
obj.$metadata$ = {
|
||||
type: Kotlin.TYPE.OBJECT
|
||||
@@ -223,7 +224,7 @@ var Kotlin = {};
|
||||
return obj;
|
||||
};
|
||||
|
||||
Kotlin.createTrait = function (bases, properties, staticProperties) {
|
||||
Kotlin.createTraitNow = function (bases, properties, staticProperties) {
|
||||
var obj = function () {};
|
||||
copyProperties(obj, staticProperties);
|
||||
|
||||
@@ -237,6 +238,38 @@ var Kotlin = {};
|
||||
return obj;
|
||||
};
|
||||
|
||||
function getBases(basesFun) {
|
||||
if (typeof basesFun === "function") {
|
||||
return basesFun();
|
||||
} else {
|
||||
return basesFun;
|
||||
}
|
||||
}
|
||||
|
||||
Kotlin.createClass = function (basesFun, constructor, properties, staticProperties) {
|
||||
function $o() {
|
||||
var klass = Kotlin.createClassNow(getBases(basesFun), constructor, properties, staticProperties);
|
||||
Object.defineProperty(this, $o.className, {value: klass});
|
||||
return klass;
|
||||
}
|
||||
$o.type = Kotlin.TYPE.INIT_FUN;
|
||||
return $o;
|
||||
};
|
||||
|
||||
Kotlin.createTrait = function (basesFun, properties, staticProperties) {
|
||||
function $o() {
|
||||
var klass = Kotlin.createTraitNow(getBases(basesFun), properties, staticProperties);
|
||||
Object.defineProperty(this, $o.className, {value: klass});
|
||||
return klass;
|
||||
}
|
||||
$o.type = Kotlin.TYPE.INIT_FUN;
|
||||
return $o;
|
||||
};
|
||||
|
||||
Kotlin.createObject = function (basesFun, constructor, functions) {
|
||||
return Kotlin.createObjectNow(getBases(basesFun), constructor, functions);
|
||||
};
|
||||
|
||||
Kotlin.callGetter = function(thisObject, klass, propertyName) {
|
||||
return klass.$metadata$.properties[propertyName].get.call(thisObject);
|
||||
};
|
||||
@@ -303,7 +336,15 @@ var Kotlin = {};
|
||||
for (var p in members) {
|
||||
if (members.hasOwnProperty(p)) {
|
||||
if ((typeof members[p]) === "function") {
|
||||
definition[p] = members[p];
|
||||
if (members[p].type === Kotlin.TYPE.INIT_FUN) {
|
||||
members[p].className = p;
|
||||
Object.defineProperty(definition, p, {
|
||||
get: members[p],
|
||||
configurable: true
|
||||
});
|
||||
} else {
|
||||
definition[p] = members[p];
|
||||
}
|
||||
} else {
|
||||
Object.defineProperty(definition, p, members[p]);
|
||||
}
|
||||
|
||||
@@ -385,9 +385,9 @@
|
||||
Kotlin.HashTable = Hashtable;
|
||||
})();
|
||||
|
||||
Kotlin.Map = Kotlin.createClass();
|
||||
Kotlin.Map = Kotlin.createClassNow();
|
||||
|
||||
Kotlin.HashMap = Kotlin.createClass(Kotlin.Map,
|
||||
Kotlin.HashMap = Kotlin.createClassNow(Kotlin.Map,
|
||||
function () {
|
||||
Kotlin.HashTable.call(this);
|
||||
}
|
||||
@@ -396,7 +396,7 @@ Kotlin.HashMap = Kotlin.createClass(Kotlin.Map,
|
||||
Kotlin.ComplexHashMap = Kotlin.HashMap;
|
||||
|
||||
(function () {
|
||||
var PrimitiveHashMapValuesIterator = Kotlin.createClass(Kotlin.Iterator,
|
||||
var PrimitiveHashMapValuesIterator = Kotlin.createClassNow(Kotlin.Iterator,
|
||||
function (map, keys) {
|
||||
this.map = map;
|
||||
this.keys = keys;
|
||||
@@ -411,7 +411,7 @@ Kotlin.ComplexHashMap = Kotlin.HashMap;
|
||||
}
|
||||
});
|
||||
|
||||
var PrimitiveHashMapValues = Kotlin.createClass(Kotlin.Collection,
|
||||
var PrimitiveHashMapValues = Kotlin.createClassNow(Kotlin.Collection,
|
||||
function (map) {
|
||||
this.map = map;
|
||||
}, {
|
||||
@@ -426,7 +426,7 @@ Kotlin.ComplexHashMap = Kotlin.HashMap;
|
||||
}
|
||||
});
|
||||
|
||||
Kotlin.PrimitiveHashMap = Kotlin.createClass(Kotlin.Map,
|
||||
Kotlin.PrimitiveHashMap = Kotlin.createClassNow(Kotlin.Map,
|
||||
function () {
|
||||
this.$size = 0;
|
||||
this.map = {};
|
||||
@@ -502,9 +502,9 @@ Kotlin.ComplexHashMap = Kotlin.HashMap;
|
||||
});
|
||||
}());
|
||||
|
||||
Kotlin.Set = Kotlin.createClass(Kotlin.Collection);
|
||||
Kotlin.Set = Kotlin.createClassNow(Kotlin.Collection);
|
||||
|
||||
Kotlin.PrimitiveHashSet = Kotlin.createClass(Kotlin.AbstractCollection,
|
||||
Kotlin.PrimitiveHashSet = Kotlin.createClassNow(Kotlin.AbstractCollection,
|
||||
function () {
|
||||
this.$size = 0;
|
||||
this.map = {};
|
||||
@@ -662,7 +662,7 @@ Kotlin.PrimitiveHashSet = Kotlin.createClass(Kotlin.AbstractCollection,
|
||||
};
|
||||
}
|
||||
|
||||
Kotlin.HashSet = Kotlin.createClass(Kotlin.Set,
|
||||
Kotlin.HashSet = Kotlin.createClassNow(Kotlin.Set,
|
||||
function () {
|
||||
HashSet.call(this);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
(function () {
|
||||
var c = 0;
|
||||
|
||||
Kotlin.A = Kotlin.createClass(null,
|
||||
Kotlin.A = Kotlin.createClassNow(null,
|
||||
function () {
|
||||
this.f = function(i) {
|
||||
if (i === undefined && c === 0) {
|
||||
|
||||
Reference in New Issue
Block a user