diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java index 46b4411edeb..4cfe801f943 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.SpecialNames; +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; import org.jetbrains.kotlin.resolve.scopes.FilteringScope; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.types.ErrorUtils; @@ -500,4 +501,28 @@ public class DescriptorUtils { public static boolean canHaveSecondaryConstructors(@NotNull ClassDescriptor classDescriptor) { return !isSingletonOrAnonymousObject(classDescriptor) && !isTrait(classDescriptor); } + + public static Set getPackagesFqNames(ModuleDescriptor module) { + return getSubPackagesFqNames(module.getPackage(FqName.ROOT)); + } + + public static Set getSubPackagesFqNames(PackageViewDescriptor packageView) { + Set result = new HashSet(); + getSubPackagesFqNames(packageView, result); + + return result; + } + + private static void getSubPackagesFqNames(PackageViewDescriptor packageView, Set result) { + FqName fqName = packageView.getFqName(); + if (!fqName.isRoot()) { + result.add(fqName); + } + + for (DeclarationDescriptor descriptor : packageView.getMemberScope().getDescriptors(DescriptorKindFilter.PACKAGES, JetScope.ALL_NAME_FILTER)) { + if (descriptor instanceof PackageViewDescriptor) { + getSubPackagesFqNames((PackageViewDescriptor) descriptor, result); + } + } + } }