From 6650b641ea47f78c3809838aceaecb5e09ec2d0a Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Mon, 17 Mar 2014 19:22:59 +0400 Subject: [PATCH] Teach JetTestFunctionDetector to understand subclasses --- .../general/JetTestFunctionDetector.java | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/JetTestFunctionDetector.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/JetTestFunctionDetector.java index 8c879d1bdec..80ce2565079 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/JetTestFunctionDetector.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/JetTestFunctionDetector.java @@ -17,23 +17,26 @@ package org.jetbrains.k2js.translate.general; import com.google.common.collect.Lists; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; 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.Modality; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.k2js.translate.utils.BindingUtils; import java.util.Collection; import java.util.List; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getNullableDescriptorForFunction; - /** * Helps find functions which are annotated with a @Test annotation from junit */ @@ -41,11 +44,7 @@ public class JetTestFunctionDetector { private JetTestFunctionDetector() { } - private static boolean isTest(@NotNull BindingContext bindingContext, @NotNull JetNamedFunction function) { - FunctionDescriptor functionDescriptor = getNullableDescriptorForFunction(bindingContext, function); - if (functionDescriptor == null) { - return false; - } + private static boolean isTest(@NotNull FunctionDescriptor functionDescriptor) { Annotations annotations = functionDescriptor.getAnnotations(); for (AnnotationDescriptor annotation : annotations) { // TODO ideally we should find the fully qualified name here... @@ -66,8 +65,11 @@ public class JetTestFunctionDetector { } @NotNull - private static List findTestFunctions(@NotNull BindingContext bindingContext, @NotNull Collection files) { - List answer = Lists.newArrayList(); + public static List getTestFunctionDescriptors( + @NotNull BindingContext bindingContext, + @NotNull Collection files + ) { + List answer = Lists.newArrayList(); for (JetFile file : files) { answer.addAll(getTestFunctions(bindingContext, file.getDeclarations())); } @@ -75,29 +77,41 @@ public class JetTestFunctionDetector { } @NotNull - public static List getTestFunctionDescriptors(@NotNull BindingContext bindingContext, @NotNull Collection files) { + private static List getTestFunctions( + @NotNull BindingContext bindingContext, + @NotNull List declarations + ) { List answer = Lists.newArrayList(); - for (JetNamedFunction function : findTestFunctions(bindingContext, files)) { - answer.add(getFunctionDescriptor(bindingContext, function)); - } - return answer; - } - - @NotNull - private static List getTestFunctions(@NotNull BindingContext bindingContext, - @NotNull List declarations) { - List answer = Lists.newArrayList(); for (JetDeclaration declaration : declarations) { + JetScope scope = null; + if (declaration instanceof JetClass) { JetClass klass = (JetClass) declaration; - answer.addAll(getTestFunctions(bindingContext, klass.getDeclarations())); - } - else if (declaration instanceof JetNamedFunction) { - JetNamedFunction candidateFunction = (JetNamedFunction) declaration; - if (isTest(bindingContext, candidateFunction)) { - answer.add(candidateFunction); + ClassDescriptor classDescriptor = BindingUtils.getClassDescriptor(bindingContext, klass); + + if (classDescriptor.getModality() != Modality.ABSTRACT) { + scope = classDescriptor.getDefaultType().getMemberScope(); } } + + if (scope != null) { + Collection allDescriptors = scope.getAllDescriptors(); + List testFunctions = ContainerUtil.mapNotNull( + allDescriptors, + new Function() { + @Override + public FunctionDescriptor fun(DeclarationDescriptor descriptor) { + if (descriptor instanceof FunctionDescriptor) { + FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor; + if (isTest(functionDescriptor)) return functionDescriptor; + } + + return null; + } + }); + + answer.addAll(testFunctions); + } } return answer; }