diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 17a8af73b69..aefa13e9d4b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,15 +5,11 @@
-
-
-
-
+
+
-
-
-
+
@@ -163,7 +159,7 @@
-
+
@@ -236,19 +232,19 @@
-
-
+
+
-
+
-
-
+
+
-
+
@@ -257,7 +253,7 @@
-
+
@@ -266,21 +262,57 @@
-
+
-
-
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -289,43 +321,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -401,7 +397,7 @@
-
+
@@ -446,9 +442,6 @@
@@ -768,106 +764,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -966,6 +862,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1114,6 +1036,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1235,62 +1183,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1382,6 +1274,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1509,11 +1469,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1576,20 +1536,20 @@
-
+
-
+
-
+
-
+
@@ -1632,7 +1592,7 @@
-
+
@@ -1645,7 +1605,6 @@
-
@@ -1670,6 +1629,7 @@
+
@@ -1679,9 +1639,9 @@
-
+
-
+
@@ -1693,9 +1653,9 @@
-
+
-
+
@@ -1707,13 +1667,20 @@
-
+
+
+
+
+
+
+
+
@@ -1721,77 +1688,70 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
index 816d674bbe8..825b119b903 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
@@ -4,47 +4,21 @@ import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
-import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
-import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import java.util.HashMap;
import java.util.Map;
-import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getFunctionByName;
-import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getPropertyByName;
-
//TODO: implement aliases stack for this
public class Aliaser {
public static Aliaser aliasesForStandardClasses(@NotNull JetStandardLibrary standardLibrary,
@NotNull Namer namer) {
Aliaser aliaser = new Aliaser();
- setAliasesForArray(standardLibrary, namer, aliaser);
- ClassDescriptor iteratorClass = (ClassDescriptor)
- standardLibrary.getLibraryScope().getClassifier("Iterator");
- setAliasesForIterator(namer, aliaser, iteratorClass);
return aliaser;
}
- private static void setAliasesForIterator(Namer namer, Aliaser aliaser, ClassDescriptor iteratorClass) {
- FunctionDescriptor nextFunction = getFunctionByName(iteratorClass.getDefaultType().getMemberScope(), "next");
- PropertyDescriptor hasNextProperty = getPropertyByName(iteratorClass.getDefaultType().getMemberScope(), "hasNext");
- aliaser.setAliasForDescriptor(nextFunction, namer.libraryMethod("next"));
- aliaser.setAliasForDescriptor(hasNextProperty, namer.libraryMethod("hasNext"));
- }
-
- private static void setAliasesForArray(JetStandardLibrary standardLibrary, Namer namer, Aliaser aliaser) {
- aliaser.setAliasForDescriptor(standardLibrary.getArray(), namer.libraryObject("Array"));
- FunctionDescriptor nullConstructorFunction = getFunctionByName(standardLibrary.getLibraryScope(), "Array");
- aliaser.setAliasForDescriptor(nullConstructorFunction, namer.libraryObject("array"));
- PropertyDescriptor sizeProperty =
- getPropertyByName(standardLibrary.getArray().getDefaultType().getMemberScope(), "size");
- aliaser.setAliasForDescriptor(sizeProperty, namer.libraryMethod("size"));
- }
-
@NotNull
private final Map aliases = new HashMap();
@Nullable
diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
index c9d3e7bccce..bef555a5437 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java
@@ -6,12 +6,15 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
+import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import java.util.HashMap;
import java.util.Map;
import static org.jetbrains.jet.resolve.DescriptorRenderer.getFQName;
+import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getFunctionByName;
+import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getPropertyByName;
/**
* @author Talanov Pavel
@@ -20,12 +23,40 @@ public final class StandardClasses {
@NotNull
public static StandardClasses bindImplementations(@NotNull JetStandardLibrary standardLibrary,
- @NotNull JsScope kotlinScope) {
- StandardClasses standardClasses = new StandardClasses(kotlinScope);
+ @NotNull JsScope kotlinObjectScope) {
+ StandardClasses standardClasses = new StandardClasses(kotlinObjectScope);
+ bindArray(standardClasses, standardLibrary);
+ ClassDescriptor iteratorClass = (ClassDescriptor)
+ standardLibrary.getLibraryScope().getClassifier("Iterator");
+ bindIterator(standardClasses, iteratorClass);
return standardClasses;
}
+
+ private static void bindIterator(StandardClasses standardClasses,
+ ClassDescriptor iteratorClass) {
+ standardClasses.declareStandardTopLevelObject(iteratorClass, "ArrayIterator");
+ FunctionDescriptor nextFunction =
+ getFunctionByName(iteratorClass.getDefaultType().getMemberScope(), "next");
+ standardClasses.declareStandardMethodOrProperty(iteratorClass, nextFunction, "next");
+ PropertyDescriptor hasNextProperty =
+ getPropertyByName(iteratorClass.getDefaultType().getMemberScope(), "hasNext");
+ standardClasses.declareStandardMethodOrProperty(iteratorClass, hasNextProperty, "hasNext");
+ }
+
+ private static void bindArray(@NotNull StandardClasses standardClasses,
+ @NotNull JetStandardLibrary standardLibrary) {
+ ClassDescriptor arrayClass = standardLibrary.getArray();
+ standardClasses.declareStandardTopLevelObject(arrayClass, "Array");
+ FunctionDescriptor nullConstructorFunction = getFunctionByName(standardLibrary.getLibraryScope(), "Array");
+ standardClasses.declareStandardTopLevelObject(nullConstructorFunction, "array");
+ PropertyDescriptor sizeProperty =
+ getPropertyByName(arrayClass.getDefaultType().getMemberScope(), "size");
+ standardClasses.declareStandardMethodOrProperty(arrayClass, sizeProperty, "size");
+ }
+
+
@NotNull
private final JsScope kotlinScope;
@@ -43,50 +74,62 @@ public final class StandardClasses {
this.kotlinScope = kotlinScope;
}
+ private void declareStandardTopLevelObject(@NotNull DeclarationDescriptor descriptor,
+ @NotNull String kotlinLibName) {
+ declareStandardTopLevelObject(getFQName(descriptor), kotlinLibName);
+ }
+
private void declareStandardTopLevelObject(@NotNull String fullQualifiedName, @NotNull String kotlinLibName) {
topLevelNameMap.put(fullQualifiedName, kotlinScope.declareName(kotlinLibName));
scopeMap.put(fullQualifiedName, new JsScope(kotlinScope, "class " + kotlinLibName));
methodNameMap.put(fullQualifiedName, new HashMap());
}
- private void declareStandardMethod(@NotNull String fullQualifiedClassName, @NotNull String methodName,
- @NotNull String kotlinLibName) {
+ private void declareStandardMethodOrProperty(@NotNull DeclarationDescriptor topLevelDescriptor,
+ @NotNull DeclarationDescriptor innerDescriptor,
+ @NotNull String kotlinLibName) {
+ declareStandardMethodOrProperty(getFQName(topLevelDescriptor), innerDescriptor.getName(), kotlinLibName);
+ }
+
+ private void declareStandardMethodOrProperty(@NotNull String fullQualifiedClassName, @NotNull String methodOrPropertyName,
+ @NotNull String kotlinLibName) {
JsScope classScope = scopeMap.get(fullQualifiedClassName);
Map classMethodsMap = methodNameMap.get(fullQualifiedClassName);
- classMethodsMap.put(methodName, classScope.declareName(kotlinLibName));
+ classMethodsMap.put(methodOrPropertyName, classScope.declareName(kotlinLibName));
}
//TODO: refactor
public boolean isStandardObject(@NotNull DeclarationDescriptor descriptor) {
- if (descriptor instanceof ClassDescriptor) {
- ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
- return topLevelNameMap.containsKey(getFQName(classDescriptor));
+ if ((descriptor instanceof ClassDescriptor) || (descriptor instanceof FunctionDescriptor)) {
+ if (topLevelNameMap.containsKey(getFQName(descriptor))) {
+ return true;
+ }
}
- if (descriptor instanceof FunctionDescriptor) {
- FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
+ if ((descriptor instanceof FunctionDescriptor) || (descriptor instanceof PropertyDescriptor)) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
- assert containing != null : "Cannot have top level functions.";
+ assert containing != null : "Cannot be on top level.";
if (!isStandardObject(containing)) {
return false;
}
Map methodMapForClass = methodNameMap.get(getFQName(containing));
- return methodMapForClass.containsKey(functionDescriptor.getName());
+ return methodMapForClass.containsKey(descriptor.getName());
}
return false;
}
@NotNull
public JsName getStandardObjectName(@NotNull DeclarationDescriptor descriptor) {
- if (descriptor instanceof ClassDescriptor) {
- ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
- return topLevelNameMap.get(getFQName(classDescriptor));
+ if ((descriptor instanceof ClassDescriptor) || (descriptor instanceof FunctionDescriptor)) {
+ JsName result = topLevelNameMap.get(getFQName(descriptor));
+ if (result != null) {
+ return result;
+ }
}
- if (descriptor instanceof FunctionDescriptor) {
- FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
+ if ((descriptor instanceof FunctionDescriptor) || (descriptor instanceof PropertyDescriptor)) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
assert containing != null : "Cannot have top level functions.";
Map methodMapForClass = methodNameMap.get(getFQName(containing));
- return methodMapForClass.get(functionDescriptor.getName());
+ return methodMapForClass.get(descriptor.getName());
}
throw new AssertionError("Only classes and functions can be standard objects.");
}
diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
index ca62e634a73..c1c403b4c1c 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
@@ -118,6 +118,15 @@ public final class TranslationContext {
}
}
+ public boolean isStandardObject(@NotNull DeclarationDescriptor descriptor) {
+ return staticContext.getStandardClasses().isStandardObject(descriptor);
+ }
+
+ @NotNull
+ public JsName getNameForStandardObject(@NotNull DeclarationDescriptor descriptor) {
+ return staticContext.getStandardClasses().getStandardObjectName(descriptor);
+ }
+
@NotNull
public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) {
return dynamicContext.declareTemporary(initExpression);
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
index a469e03dcb6..d964a7625f6 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
@@ -212,8 +212,9 @@ public final class PropertyAccessTranslator extends AccessTranslator {
@NotNull
private JsName getGetterName() {
- if (context().aliaser().hasAliasForDeclaration(propertyDescriptor)) {
- return context().aliaser().getAliasForDeclaration(propertyDescriptor);
+ //TODO: hack alert. properties for standard objects that do not have their implementation do not have getters
+ if (context().isStandardObject(propertyDescriptor)) {
+ return context().getNameForStandardObject(propertyDescriptor);
}
PropertyGetterDescriptor getter = getGetterDescriptor();
return context().getNameForDescriptor(getter);