diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index 3daf13aeffa..4a9a10ef29b 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -36,10 +36,10 @@ public final class StandardClasses { } private static void declareJavaArrayList(@NotNull StandardClasses standardClasses) { - String arrayListFQName = "java.util.ArrayList"; + String arrayListFQName = ".java.util.ArrayList"; standardClasses.declareStandardTopLevelObject(arrayListFQName, "ArrayList"); - standardClasses.declareStandardMethodOrProperty(arrayListFQName, "size", "size"); - standardClasses.declareStandardMethodOrProperty(arrayListFQName, "", "ArrayList"); + standardClasses.declareStandardInnerDeclaration(arrayListFQName, "size", "size"); + standardClasses.declareStandardInnerDeclaration(arrayListFQName, "", "ArrayList"); } //TODO: more generic ways to declare standard classes @@ -48,10 +48,10 @@ public final class StandardClasses { standardClasses.declareStandardTopLevelObject(iteratorClass, "ArrayIterator"); FunctionDescriptor nextFunction = getFunctionByName(iteratorClass.getDefaultType().getMemberScope(), "next"); - standardClasses.declareStandardMethodOrProperty(iteratorClass, nextFunction, "next"); + standardClasses.declareStandardMethodOrProperty(nextFunction, "next"); PropertyDescriptor hasNextProperty = getPropertyByName(iteratorClass.getDefaultType().getMemberScope(), "hasNext"); - standardClasses.declareStandardMethodOrProperty(iteratorClass, hasNextProperty, "hasNext"); + standardClasses.declareStandardMethodOrProperty(hasNextProperty, "hasNext"); } private static void bindArray(@NotNull StandardClasses standardClasses, @@ -62,7 +62,7 @@ public final class StandardClasses { standardClasses.declareStandardTopLevelObject(nullConstructorFunction, "array"); PropertyDescriptor sizeProperty = getPropertyByName(arrayClass.getDefaultType().getMemberScope(), "size"); - standardClasses.declareStandardMethodOrProperty(arrayClass, sizeProperty, "size"); + standardClasses.declareStandardMethodOrProperty(sizeProperty, "size"); } @@ -70,15 +70,11 @@ public final class StandardClasses { private final JsScope kotlinScope; @NotNull - private final Map topLevelNameMap = new HashMap(); + private final Map nameMap = new HashMap(); @NotNull private final Map scopeMap = new HashMap(); - @NotNull - private final Map> methodNameMap = new HashMap>(); - - private StandardClasses(@NotNull JsScope kotlinScope) { this.kotlinScope = kotlinScope; } @@ -89,67 +85,29 @@ public final class StandardClasses { } 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()); + nameMap.put(fullQualifiedName, kotlinScope.declareName(kotlinLibName)); + scopeMap.put(fullQualifiedName, new JsScope(kotlinScope, "standard object " + kotlinLibName)); } - private void declareStandardMethodOrProperty(@NotNull DeclarationDescriptor topLevelDescriptor, - @NotNull DeclarationDescriptor innerDescriptor, + private void declareStandardMethodOrProperty(@NotNull DeclarationDescriptor descriptor, @NotNull String kotlinLibName) { - declareStandardMethodOrProperty(getFQName(topLevelDescriptor), innerDescriptor.getName(), kotlinLibName); + String containingFQName = getFQName(getContainingDeclaration(descriptor)); + declareStandardInnerDeclaration(containingFQName, getFQName(descriptor), kotlinLibName); } - private void declareStandardMethodOrProperty(@NotNull String fullQualifiedClassName, @NotNull String methodOrPropertyName, + private void declareStandardInnerDeclaration(@NotNull String fullQualifiedClassName, + @NotNull String fullQualifiedMethodName, @NotNull String kotlinLibName) { JsScope classScope = scopeMap.get(fullQualifiedClassName); - Map classMethodsMap = methodNameMap.get(fullQualifiedClassName); - classMethodsMap.put(methodOrPropertyName, classScope.declareName(kotlinLibName)); + nameMap.put(fullQualifiedMethodName, classScope.declareName(kotlinLibName)); } - //TODO: refactor public boolean isStandardObject(@NotNull DeclarationDescriptor descriptor) { - if (canBeTopLevelObject(descriptor)) { - if (topLevelNameMap.containsKey(getFQName(descriptor))) { - return true; - } - } - if (canBeInnerObject(descriptor)) { - DeclarationDescriptor containing = getContainingDeclaration(descriptor); - if (!isStandardObject(containing)) { - return false; - } - Map methodMapForClass = methodMapForDescriptor(containing); - return methodMapForClass.containsKey(descriptor.getName()); - } - return false; - } - - private Map methodMapForDescriptor(DeclarationDescriptor containing) { - return methodNameMap.get(getFQName(containing)); - } - - private boolean canBeInnerObject(DeclarationDescriptor descriptor) { - return (descriptor instanceof FunctionDescriptor) || (descriptor instanceof PropertyDescriptor); - } - - private boolean canBeTopLevelObject(DeclarationDescriptor descriptor) { - return (descriptor instanceof ClassDescriptor) || (descriptor instanceof FunctionDescriptor); + return nameMap.containsKey(getFQName(descriptor)); } @NotNull public JsName getStandardObjectName(@NotNull DeclarationDescriptor descriptor) { - if (canBeTopLevelObject(descriptor)) { - JsName result = topLevelNameMap.get(getFQName(descriptor)); - if (result != null) { - return result; - } - } - if (canBeInnerObject(descriptor)) { - DeclarationDescriptor containing = getContainingDeclaration(descriptor); - Map methodMapForClass = methodMapForDescriptor(containing); - return methodMapForClass.get(descriptor.getName()); - } - throw new AssertionError("Only classes and functions can be standard objects."); + return nameMap.get(getFQName(descriptor)); } } diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 3a139a703af..be42019b695 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -6,6 +6,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.resolve.DescriptorRenderer; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.BindingUtils; @@ -104,7 +105,7 @@ public final class TranslationContext { if (staticContext.isDeclared(descriptor)) { return staticContext.getGlobalName(descriptor); } - throw new AssertionError("Undefined name in this scope: " + descriptor.getName()); + throw new AssertionError("Undefined descriptor: " + DescriptorRenderer.getFQName(descriptor)); } @NotNull