JsDescriptorUtils#(isExtension, isOverride, getContainingClass) -> DescriptorUtils#(*)

This commit is contained in:
Zalim Bashorov
2014-11-25 21:47:03 +03:00
parent e9dbb97e22
commit 7073f20484
12 changed files with 47 additions and 44 deletions
@@ -129,6 +129,14 @@ public class DescriptorUtils {
return descriptor.getContainingDeclaration() instanceof PackageFragmentDescriptor; return descriptor.getContainingDeclaration() instanceof PackageFragmentDescriptor;
} }
public static boolean isExtension(@NotNull CallableDescriptor descriptor) {
return (descriptor.getExtensionReceiverParameter() != null);
}
public static boolean isOverride(@NotNull CallableMemberDescriptor descriptor) {
return !descriptor.getOverriddenDescriptors().isEmpty();
}
/** /**
* @return true iff this is a top-level declaration or a class member with no expected "this" object (e.g. static members in Java, * @return true iff this is a top-level declaration or a class member with no expected "this" object (e.g. static members in Java,
* values() and valueOf() methods of enum classes, etc.) * values() and valueOf() methods of enum classes, etc.)
@@ -185,6 +193,18 @@ public class DescriptorUtils {
return module; return module;
} }
@Nullable
public static ClassDescriptor getContainingClass(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
while (containing != null) {
if (containing instanceof ClassDescriptor && !isClassObject(containing)) {
return (ClassDescriptor) containing;
}
containing = containing.getContainingDeclaration();
}
return null;
}
public static boolean isAncestor( public static boolean isAncestor(
@Nullable DeclarationDescriptor ancestor, @Nullable DeclarationDescriptor ancestor,
@NotNull DeclarationDescriptor declarationDescriptor, @NotNull DeclarationDescriptor declarationDescriptor,
@@ -39,6 +39,7 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.Map; import java.util.Map;
import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.descriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isExtension;
import static org.jetbrains.k2js.config.LibrarySourcesConfig.BUILTINS_JS_MODULE_NAME; import static org.jetbrains.k2js.config.LibrarySourcesConfig.BUILTINS_JS_MODULE_NAME;
import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*; import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*;
import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.*;
@@ -220,6 +221,7 @@ public final class StaticContext {
return result; return result;
} }
@NotNull
public Config getConfig() { public Config getConfig() {
return config; return config;
} }
@@ -115,7 +115,7 @@ public class DelegationTranslator(
val delegateRefName = context().getScopeForDescriptor(getterDescriptor).declareName(delegateName) val delegateRefName = context().getScopeForDescriptor(getterDescriptor).declareName(delegateName)
val delegateRef = JsNameRef(delegateRefName, JsLiteral.THIS) val delegateRef = JsNameRef(delegateRefName, JsLiteral.THIS)
val returnExpression = if (JsDescriptorUtils.isExtension(descriptor)) { val returnExpression = if (DescriptorUtils.isExtension(descriptor)) {
val getterName = context().getNameForDescriptor(getterDescriptor) val getterName = context().getNameForDescriptor(getterDescriptor)
val receiver = Namer.getReceiverParameterName() val receiver = Namer.getReceiverParameterName()
JsInvocation(JsNameRef(getterName, delegateRef), JsNameRef(receiver)) JsInvocation(JsNameRef(getterName, delegateRef), JsNameRef(receiver))
@@ -125,7 +125,7 @@ public class DelegationTranslator(
} }
val jsFunction = simpleReturnFunction(context().getScopeForDescriptor(getterDescriptor.getContainingDeclaration()), returnExpression) val jsFunction = simpleReturnFunction(context().getScopeForDescriptor(getterDescriptor.getContainingDeclaration()), returnExpression)
if (JsDescriptorUtils.isExtension(descriptor)) { if (DescriptorUtils.isExtension(descriptor)) {
val receiverName = jsFunction.getScope().declareName(Namer.getReceiverParameterName()) val receiverName = jsFunction.getScope().declareName(Namer.getReceiverParameterName())
jsFunction.getParameters().add(JsParameter(receiverName)) jsFunction.getParameters().add(JsParameter(receiverName))
} }
@@ -143,7 +143,7 @@ public class DelegationTranslator(
val delegateRefName = context().getScopeForDescriptor(setterDescriptor).declareName(delegateName) val delegateRefName = context().getScopeForDescriptor(setterDescriptor).declareName(delegateName)
val delegateRef = JsNameRef(delegateRefName, JsLiteral.THIS) val delegateRef = JsNameRef(delegateRefName, JsLiteral.THIS)
val setExpression = if (JsDescriptorUtils.isExtension(descriptor)) { val setExpression = if (DescriptorUtils.isExtension(descriptor)) {
val setterName = context().getNameForDescriptor(setterDescriptor) val setterName = context().getNameForDescriptor(setterDescriptor)
val setterNameRef = JsNameRef(setterName, delegateRef) val setterNameRef = JsNameRef(setterName, delegateRef)
val extensionFunctionReceiverName = jsFunction.getScope().declareName(Namer.getReceiverParameterName()) val extensionFunctionReceiverName = jsFunction.getScope().declareName(Namer.getReceiverParameterName())
@@ -31,7 +31,7 @@ import org.jetbrains.k2js.translate.utils.JsDescriptorUtils
import org.jetbrains.k2js.translate.context.Namer.* import org.jetbrains.k2js.translate.context.Namer.*
import org.jetbrains.k2js.translate.utils.ast.* import org.jetbrains.k2js.translate.utils.ast.*
import org.jetbrains.k2js.translate.utils.TranslationUtils.* import org.jetbrains.k2js.translate.utils.TranslationUtils.*
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils.isExtension import org.jetbrains.jet.lang.resolve.DescriptorUtils.isExtension
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
/** /**
@@ -64,7 +64,7 @@ public fun MutableList<JsPropertyInitializer>.addGetterAndSetter(
generateSetter: () -> JsPropertyInitializer generateSetter: () -> JsPropertyInitializer
) { ) {
val to: MutableList<JsPropertyInitializer> val to: MutableList<JsPropertyInitializer>
if (!JsDescriptorUtils.isExtension(descriptor)) { if (!isExtension(descriptor)) {
to = SmartList<JsPropertyInitializer>() to = SmartList<JsPropertyInitializer>()
this.add(JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), JsObjectLiteral(to, true))) this.add(JsPropertyInitializer(context.getNameForDescriptor(descriptor).makeRef(), JsObjectLiteral(to, true)))
} }
@@ -17,7 +17,10 @@
package org.jetbrains.k2js.translate.expression; package org.jetbrains.k2js.translate.expression;
import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.backend.js.ast.JsFunction;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsParameter;
import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer;
import com.google.dart.compiler.backend.js.ast.metadata.MetadataPackage; import com.google.dart.compiler.backend.js.ast.metadata.MetadataPackage;
import com.intellij.util.SmartList; import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -28,11 +31,11 @@ import org.jetbrains.jet.lang.descriptors.Modality;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody; import org.jetbrains.jet.lang.psi.JetDeclarationWithBody;
import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression; import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.k2js.translate.context.AliasingContext; import org.jetbrains.k2js.translate.context.AliasingContext;
import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.Namer;
import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils;
import java.util.Collections; import java.util.Collections;
@@ -142,6 +145,6 @@ public final class FunctionTranslator extends AbstractTranslator {
} }
private boolean isExtensionFunction() { private boolean isExtensionFunction() {
return JsDescriptorUtils.isExtension(descriptor) && !(functionDeclaration instanceof JetFunctionLiteralExpression); return DescriptorUtils.isExtension(descriptor) && !(functionDeclaration instanceof JetFunctionLiteralExpression);
} }
} }
@@ -83,7 +83,7 @@ object CallableReferenceTranslator {
private fun isConstructor(descriptor: CallableDescriptor): Boolean = descriptor is ConstructorDescriptor private fun isConstructor(descriptor: CallableDescriptor): Boolean = descriptor is ConstructorDescriptor
private fun isExtension(descriptor: CallableDescriptor): Boolean = JsDescriptorUtils.isExtension(descriptor) private fun isExtension(descriptor: CallableDescriptor): Boolean = DescriptorUtils.isExtension(descriptor)
private fun isMember(descriptor: CallableDescriptor): Boolean = JsDescriptorUtils.getContainingDeclaration(descriptor) is ClassDescriptor private fun isMember(descriptor: CallableDescriptor): Boolean = JsDescriptorUtils.getContainingDeclaration(descriptor) is ClassDescriptor
@@ -23,11 +23,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.k2js.translate.callTranslator.CallTranslator; import org.jetbrains.k2js.translate.callTranslator.CallTranslator;
import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.JetTestFunctionDetector; import org.jetbrains.k2js.translate.general.JetTestFunctionDetector;
import org.jetbrains.k2js.translate.reference.ReferenceTranslator; import org.jetbrains.k2js.translate.reference.ReferenceTranslator;
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -47,7 +47,7 @@ public final class JSTestGenerator {
private static void doGenerateTestCalls(@NotNull List<FunctionDescriptor> functionDescriptors, private static void doGenerateTestCalls(@NotNull List<FunctionDescriptor> functionDescriptors,
@NotNull TranslationContext context, @NotNull JSTester jsTester) { @NotNull TranslationContext context, @NotNull JSTester jsTester) {
for (FunctionDescriptor functionDescriptor : functionDescriptors) { for (FunctionDescriptor functionDescriptor : functionDescriptors) {
ClassDescriptor classDescriptor = JsDescriptorUtils.getContainingClass(functionDescriptor); ClassDescriptor classDescriptor = DescriptorUtils.getContainingClass(functionDescriptor);
if (classDescriptor == null) { if (classDescriptor == null) {
return; return;
} }
@@ -32,9 +32,6 @@ import org.jetbrains.k2js.PredefinedAnnotation;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getContainingClass;
import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.isOverride;
public final class AnnotationsUtils { public final class AnnotationsUtils {
private AnnotationsUtils() { private AnnotationsUtils() {
@@ -49,7 +46,7 @@ public final class AnnotationsUtils {
@Nullable @Nullable
private static String getAnnotationStringParameter(@NotNull DeclarationDescriptor declarationDescriptor, private static String getAnnotationStringParameter(@NotNull DeclarationDescriptor declarationDescriptor,
@NotNull PredefinedAnnotation annotation) { @NotNull PredefinedAnnotation annotation) {
AnnotationDescriptor annotationDescriptor = getAnnotationByName(declarationDescriptor, annotation); AnnotationDescriptor annotationDescriptor = getAnnotationByName(declarationDescriptor, annotation);
assert annotationDescriptor != null; assert annotationDescriptor != null;
//TODO: this is a quick fix for unsupported default args problem //TODO: this is a quick fix for unsupported default args problem
@@ -68,7 +65,7 @@ public final class AnnotationsUtils {
@Nullable @Nullable
public static String getNameForAnnotatedObject(@NotNull DeclarationDescriptor declarationDescriptor, public static String getNameForAnnotatedObject(@NotNull DeclarationDescriptor declarationDescriptor,
@NotNull PredefinedAnnotation annotation) { @NotNull PredefinedAnnotation annotation) {
if (!hasAnnotation(declarationDescriptor, annotation)) { if (!hasAnnotation(declarationDescriptor, annotation)) {
return null; return null;
} }
@@ -80,7 +77,7 @@ public final class AnnotationsUtils {
List<DeclarationDescriptor> descriptors; List<DeclarationDescriptor> descriptors;
if (declarationDescriptor instanceof CallableMemberDescriptor && if (declarationDescriptor instanceof CallableMemberDescriptor &&
isOverride((CallableMemberDescriptor) declarationDescriptor)) { DescriptorUtils.isOverride((CallableMemberDescriptor) declarationDescriptor)) {
Set<CallableMemberDescriptor> overriddenDeclarations = Set<CallableMemberDescriptor> overriddenDeclarations =
DescriptorUtils.getAllOverriddenDeclarations((CallableMemberDescriptor) declarationDescriptor); DescriptorUtils.getAllOverriddenDeclarations((CallableMemberDescriptor) declarationDescriptor);
@@ -88,7 +85,7 @@ public final class AnnotationsUtils {
descriptors = ContainerUtil.mapNotNull(overriddenDeclarations, new Function<CallableMemberDescriptor, DeclarationDescriptor>() { descriptors = ContainerUtil.mapNotNull(overriddenDeclarations, new Function<CallableMemberDescriptor, DeclarationDescriptor>() {
@Override @Override
public DeclarationDescriptor fun(CallableMemberDescriptor descriptor) { public DeclarationDescriptor fun(CallableMemberDescriptor descriptor) {
return isOverride(descriptor) ? null : descriptor; return DescriptorUtils.isOverride(descriptor) ? null : descriptor;
} }
}); });
} }
@@ -145,7 +142,7 @@ public final class AnnotationsUtils {
if (getAnnotationByName(descriptor, fqn) != null) { if (getAnnotationByName(descriptor, fqn) != null) {
return true; return true;
} }
ClassDescriptor containingClass = getContainingClass(descriptor); ClassDescriptor containingClass = DescriptorUtils.getContainingClass(descriptor);
return containingClass != null && hasAnnotationOrInsideAnnotatedClass(containingClass, fqn); return containingClass != null && hasAnnotationOrInsideAnnotatedClass(containingClass, fqn);
} }
} }
@@ -96,14 +96,6 @@ public final class JsDescriptorUtils {
return containing; return containing;
} }
public static boolean isExtension(@NotNull CallableDescriptor descriptor) {
return (descriptor.getExtensionReceiverParameter() != null);
}
public static boolean isOverride(@NotNull CallableMemberDescriptor descriptor) {
return !descriptor.getOverriddenDescriptors().isEmpty();
}
@NotNull @NotNull
public static ReceiverParameterDescriptor getReceiverParameterForReceiver(@NotNull ReceiverValue receiverParameter) { public static ReceiverParameterDescriptor getReceiverParameterForReceiver(@NotNull ReceiverValue receiverParameter) {
DeclarationDescriptor declarationDescriptor = getDeclarationDescriptorForReceiver(receiverParameter); DeclarationDescriptor declarationDescriptor = getDeclarationDescriptorForReceiver(receiverParameter);
@@ -135,19 +127,6 @@ public final class JsDescriptorUtils {
", declarationDescriptor = " + declarationDescriptor); ", declarationDescriptor = " + declarationDescriptor);
} }
//TODO: maybe we have similar routine
@Nullable
public static ClassDescriptor getContainingClass(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
while (containing != null) {
if (containing instanceof ClassDescriptor && !isClassObject(containing)) {
return (ClassDescriptor) containing;
}
containing = containing.getContainingDeclaration();
}
return null;
}
@Nullable @Nullable
public static FunctionDescriptor getOverriddenDescriptor(@NotNull FunctionDescriptor functionDescriptor) { public static FunctionDescriptor getOverriddenDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
Set<? extends FunctionDescriptor> overriddenDescriptors = functionDescriptor.getOverriddenDescriptors(); Set<? extends FunctionDescriptor> overriddenDescriptors = functionDescriptor.getOverriddenDescriptors();
@@ -48,7 +48,7 @@ public class ManglingUtils {
String suggestedName = descriptor.getName().asString(); String suggestedName = descriptor.getName().asString();
if (descriptor instanceof FunctionDescriptor || if (descriptor instanceof FunctionDescriptor ||
descriptor instanceof PropertyDescriptor && JsDescriptorUtils.isExtension((PropertyDescriptor) descriptor) descriptor instanceof PropertyDescriptor && DescriptorUtils.isExtension((PropertyDescriptor) descriptor)
) { ) {
suggestedName = getMangledName((CallableMemberDescriptor) descriptor); suggestedName = getMangledName((CallableMemberDescriptor) descriptor);
} }
@@ -69,7 +69,7 @@ public class ManglingUtils {
private static boolean needsStableMangling(CallableMemberDescriptor descriptor) { private static boolean needsStableMangling(CallableMemberDescriptor descriptor) {
// Use stable mangling for overrides because we use stable mangling when any function inside a overridable declaration // Use stable mangling for overrides because we use stable mangling when any function inside a overridable declaration
// for avoid clashing names when inheritance. // for avoid clashing names when inheritance.
if (JsDescriptorUtils.isOverride(descriptor)) { if (DescriptorUtils.isOverride(descriptor)) {
return true; return true;
} }
@@ -24,6 +24,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.TypeProjection;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -53,7 +54,7 @@ public final class TranslationUtils {
public static JsPropertyInitializer translateFunctionAsEcma5PropertyDescriptor(@NotNull JsFunction function, public static JsPropertyInitializer translateFunctionAsEcma5PropertyDescriptor(@NotNull JsFunction function,
@NotNull FunctionDescriptor descriptor, @NotNull FunctionDescriptor descriptor,
@NotNull TranslationContext context) { @NotNull TranslationContext context) {
if (JsDescriptorUtils.isExtension(descriptor)) { if (DescriptorUtils.isExtension(descriptor)) {
return translateExtensionFunctionAsEcma5DataDescriptor(function, descriptor, context); return translateExtensionFunctionAsEcma5DataDescriptor(function, descriptor, context);
} }
else { else {
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.k2js.translate.context.Namer import org.jetbrains.k2js.translate.context.Namer
import org.jetbrains.k2js.translate.context.TranslationContext import org.jetbrains.k2js.translate.context.TranslationContext
import org.jetbrains.k2js.translate.utils.TranslationUtils.simpleReturnFunction import org.jetbrains.k2js.translate.utils.TranslationUtils.simpleReturnFunction
import org.jetbrains.jet.lang.resolve.DescriptorUtils
public val <T> ID: (T) -> T = { it } public val <T> ID: (T) -> T = { it }
@@ -43,7 +44,7 @@ public fun generateDelegateCall(
val args = SmartList<JsExpression>() val args = SmartList<JsExpression>()
val functionScope = context.getScopeForDescriptor(fromDescriptor); val functionScope = context.getScopeForDescriptor(fromDescriptor);
if (JsDescriptorUtils.isExtension(fromDescriptor)) { if (DescriptorUtils.isExtension(fromDescriptor)) {
val extensionFunctionReceiverName = functionScope.declareName(Namer.getReceiverParameterName()) val extensionFunctionReceiverName = functionScope.declareName(Namer.getReceiverParameterName())
parameters.add(JsParameter(extensionFunctionReceiverName)) parameters.add(JsParameter(extensionFunctionReceiverName))
args.add(JsNameRef(extensionFunctionReceiverName)) args.add(JsNameRef(extensionFunctionReceiverName))