From 0f65ca0854cf5cf9beb5c71decf4b900b0f438c1 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Wed, 15 Feb 2012 16:56:56 +0400 Subject: [PATCH] Added some new name and scope generation rules. --- .../k2js/translate/context/StaticContext.java | 53 ++++++++++++++++++- .../declaration/ClassTranslator.java | 4 +- .../k2js/translate/utils/BindingUtils.java | 28 +--------- .../k2js/translate/utils/ClassSorter.java | 3 +- .../k2js/translate/utils/DescriptorUtils.java | 50 ++++++++++------- 5 files changed, 88 insertions(+), 50 deletions(-) diff --git a/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index b98e5fd932e..1d3aee00496 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -15,6 +15,8 @@ import org.jetbrains.k2js.translate.context.generator.Rule; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.AnnotationsUtils; +import java.util.Set; + import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; @@ -23,7 +25,7 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; *

* Aggregates all the static parts of the context. */ -public class StaticContext { +public final class StaticContext { public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library, @NotNull BindingContext bindingContext) { @@ -272,6 +274,25 @@ public class StaticContext { } }; + Rule overridingDescriptorsReferToOriginalName = new Rule() { + @Override + public JsName apply(@NotNull DeclarationDescriptor descriptor) { + //TODO: refactor + if (descriptor instanceof FunctionDescriptor) { + Set overriddenDescriptors = ((FunctionDescriptor) descriptor).getOverriddenDescriptors(); + if (overriddenDescriptors.isEmpty()) { + return null; + } else { + //assert overriddenDescriptors.size() == 1; + //TODO: for now translator can't deal with multiple inheritance good enough + for (FunctionDescriptor overriddenDescriptor : overriddenDescriptors) { + return getNameForDescriptor(overriddenDescriptor); + } + } + } + return null; + } + }; addRule(namesForStandardClasses); addRule(aliasOverridesNames); addRule(constructorHasTheSameNameAsTheClass); @@ -281,6 +302,7 @@ public class StaticContext { addRule(propertiesCorrespondToSpeciallyTreatedBackingFieldNames); addRule(namespacesShouldBeDefinedInRootScope); addRule(accessorsHasNamesWithSpecialPrefixes); + addRule(overridingDescriptorsReferToOriginalName); addRule(memberDeclarationsInsideParentsScope); } } @@ -294,6 +316,31 @@ public class StaticContext { private final class ScopeGenerator extends Generator { public ScopeGenerator() { + Rule generateNewScopesForClassesWithNoAncestors = new Rule() { + @Override + public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { + if (!(descriptor instanceof ClassDescriptor)) { + return null; + } + if (getSuperclass((ClassDescriptor) descriptor) == null) { + return getRootScope().innerScope("Scope for class " + descriptor.getName()); + } + return null; + } + }; + Rule generateInnerScopesForDerivedClasses = new Rule() { + @Override + public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { + if (!(descriptor instanceof ClassDescriptor)) { + return null; + } + ClassDescriptor superclass = getSuperclass((ClassDescriptor) descriptor); + if (superclass == null) { + return null; + } + return getScopeForDescriptor(superclass).innerScope("Scope for class " + descriptor.getName()); + } + }; Rule generateNewScopesForNamespaceDescriptors = new Rule() { @Override public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { @@ -307,9 +354,11 @@ public class StaticContext { @Override public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { NamingScope enclosingScope = getEnclosingScope(descriptor); - return enclosingScope.innerScope("scope for member " + descriptor.getName()); + return enclosingScope.innerScope("Scope for member " + descriptor.getName()); } }; + addRule(generateNewScopesForClassesWithNoAncestors); + addRule(generateInnerScopesForDerivedClasses); addRule(generateNewScopesForNamespaceDescriptors); addRule(generateInnerScopesForMembers); } diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index 65fad9a0dd4..6013b969b3a 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -16,8 +16,10 @@ import org.jetbrains.k2js.translate.general.Translation; import java.util.ArrayList; import java.util.List; -import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForConstructorParameter; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.findAncestorClass; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getSuperclassDescriptors; import static org.jetbrains.k2js.translate.utils.PsiUtils.getPrimaryConstructorParameters; /** diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java index ee083e053e3..96eac0c255f 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java @@ -12,11 +12,9 @@ import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getVariableDescriptorForVariableAsFunction; -import static org.jetbrains.k2js.translate.utils.DescriptorUtils.isVariableAsFunction; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; /** * @author Pavel Talanov @@ -118,28 +116,6 @@ public final class BindingUtils { return (JetParameter) result; } - @NotNull - public static List getSuperclassDescriptors(@NotNull ClassDescriptor classDescriptor) { - Collection superclassTypes = classDescriptor.getTypeConstructor().getSupertypes(); - List superClassDescriptors = new ArrayList(); - for (JetType type : superclassTypes) { - ClassDescriptor result = getClassDescriptorForType(type); - if (isNotAny(result)) { - superClassDescriptors.add(result); - } - } - return superClassDescriptors; - } - - @NotNull - private static ClassDescriptor getClassDescriptorForType(@NotNull JetType type) { - DeclarationDescriptor superClassDescriptor = - type.getConstructor().getDeclarationDescriptor(); - assert superClassDescriptor instanceof ClassDescriptor - : "Superclass descriptor of a type should be of type ClassDescriptor"; - return (ClassDescriptor) superClassDescriptor; - } - public static boolean hasAncestorClass(@NotNull BindingContext context, @NotNull JetClassOrObject classDeclaration) { ClassDescriptor classDescriptor = getClassDescriptor(context, classDeclaration); List superclassDescriptors = getSuperclassDescriptors(classDescriptor); @@ -202,7 +178,7 @@ public final class BindingUtils { return referencedDescriptor; } - private static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) { + public static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) { return !superClassDescriptor.equals(JetStandardClasses.getAny()); } diff --git a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java index 645959c04bb..9bd80bf97c0 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/ClassSorter.java @@ -10,7 +10,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getSuperclassDescriptors; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getSuperclassDescriptors; + //TODO: can optimise using less dumb implementation diff --git a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java index 5f34dd18cae..a055c6a38c1 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.k2js.translate.context.Namer; @@ -13,6 +14,8 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import static org.jetbrains.k2js.translate.utils.BindingUtils.isNotAny; + /** * @author Pavel Talanov */ @@ -41,26 +44,6 @@ public final class DescriptorUtils { return (descriptor instanceof ConstructorDescriptor); } - @NotNull - public static List getOwnDeclarations(@NotNull ClassDescriptor classDescriptor) { - Collection allDescriptors = - classDescriptor.getDefaultType().getMemberScope().getAllDescriptors(); - - return filterByOwner(classDescriptor, allDescriptors); - } - - @NotNull - private static List filterByOwner(@NotNull DeclarationDescriptor ownerDescriptor, - @NotNull Collection allDescriptors) { - List resultingList = new ArrayList(); - for (DeclarationDescriptor memberDescriptor : allDescriptors) { - if (memberDescriptor.getContainingDeclaration() == ownerDescriptor) { - resultingList.add(memberDescriptor); - } - } - return resultingList; - } - @NotNull public static FunctionDescriptor getFunctionByName(@NotNull JetScope scope, @NotNull String name) { @@ -102,6 +85,33 @@ public final class DescriptorUtils { return null; } + @NotNull + public static List getSuperclassDescriptors(@NotNull ClassDescriptor classDescriptor) { + Collection superclassTypes = classDescriptor.getTypeConstructor().getSupertypes(); + List superClassDescriptors = new ArrayList(); + for (JetType type : superclassTypes) { + ClassDescriptor result = getClassDescriptorForType(type); + if (isNotAny(result)) { + superClassDescriptors.add(result); + } + } + return superClassDescriptors; + } + + @Nullable + public static ClassDescriptor getSuperclass(@NotNull ClassDescriptor classDescriptor) { + return findAncestorClass(getSuperclassDescriptors(classDescriptor)); + } + + @NotNull + public static ClassDescriptor getClassDescriptorForType(@NotNull JetType type) { + DeclarationDescriptor superClassDescriptor = + type.getConstructor().getDeclarationDescriptor(); + assert superClassDescriptor instanceof ClassDescriptor + : "Superclass descriptor of a type should be of type ClassDescriptor"; + return (ClassDescriptor) superClassDescriptor; + } + @NotNull public static VariableDescriptor getVariableDescriptorForVariableAsFunction (@NotNull VariableAsFunctionDescriptor descriptor) {