From 115d7a2eaeb289ba04299fd47e3ccdbfa66ecf25 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 19 Oct 2015 13:21:21 +0300 Subject: [PATCH] Code style setting for importing Java statics and enums with '*' #KT-9592 Fixed --- .../core/formatter/JetCodeStyleSettings.java | 1 + .../idea/formatter/ImportSettingsPanel.kt | 120 ++++++++++-------- .../idea/imports/KotlinImportOptimizer.kt | 39 ++++-- .../idea/util/ImportInsertHelperImpl.kt | 24 ++-- .../addImport/ImportEnumMember1.dependency.kt | 5 + idea/testData/addImport/ImportEnumMember1.kt | 1 + .../addImport/ImportEnumMember1.kt.after | 3 + .../addImport/ImportEnumMember2.dependency.kt | 5 + idea/testData/addImport/ImportEnumMember2.kt | 3 + .../addImport/ImportEnumMember2.kt.after | 2 + idea/testData/addImport/ImportFromObject.kt | 1 + .../addImport/ImportFromObject.kt.after | 1 + .../addImport/ImportNestedClass.kt.after | 2 +- .../MemberImports.dependency.kt | 18 +++ .../allUnderImports/MemberImports.kt | 18 +++ .../allUnderImports/MemberImports.kt.after | 17 +++ .../jetbrains/kotlin/AbstractImportsTest.kt | 4 + .../addImport/AddImportTestGenerated.java | 12 ++ .../imports/OptimizeImportsTestGenerated.java | 6 + 19 files changed, 206 insertions(+), 76 deletions(-) create mode 100644 idea/testData/addImport/ImportEnumMember1.dependency.kt create mode 100644 idea/testData/addImport/ImportEnumMember1.kt create mode 100644 idea/testData/addImport/ImportEnumMember1.kt.after create mode 100644 idea/testData/addImport/ImportEnumMember2.dependency.kt create mode 100644 idea/testData/addImport/ImportEnumMember2.kt create mode 100644 idea/testData/addImport/ImportEnumMember2.kt.after create mode 100644 idea/testData/editor/optimizeImports/allUnderImports/MemberImports.dependency.kt create mode 100644 idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt create mode 100644 idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt.after diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/formatter/JetCodeStyleSettings.java b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/formatter/JetCodeStyleSettings.java index a4853e1e1ac..9474a547207 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/formatter/JetCodeStyleSettings.java +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/formatter/JetCodeStyleSettings.java @@ -43,6 +43,7 @@ public class JetCodeStyleSettings extends CustomCodeStyleSettings { public boolean LBRACE_ON_NEXT_LINE = false; public int NAME_COUNT_TO_USE_STAR_IMPORT = ApplicationManager.getApplication().isUnitTestMode() ? Integer.MAX_VALUE : 5; + public int NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS = ApplicationManager.getApplication().isUnitTestMode() ? Integer.MAX_VALUE : 3; public boolean IMPORT_NESTED_CLASSES = false; public final PackageEntryTable PACKAGES_TO_USE_STAR_IMPORTS = new PackageEntryTable(); diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/ImportSettingsPanel.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/ImportSettingsPanel.kt index 526ee87e95b..688701121c3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/ImportSettingsPanel.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/ImportSettingsPanel.kt @@ -37,7 +37,7 @@ import javax.swing.table.AbstractTableModel class ImportSettingsPanelWrapper(settings: CodeStyleSettings) : CodeStyleAbstractPanel(settings) { private val importsPanel = ImportSettingsPanel(settings) - private fun CodeStyleSettings.kotlinSettings() = getCustomSettings(javaClass()) + private fun CodeStyleSettings.kotlinSettings() = getCustomSettings(JetCodeStyleSettings::class.java) override fun getRightMargin() = throw UnsupportedOperationException() @@ -61,11 +61,6 @@ class ImportSettingsPanelWrapper(settings: CodeStyleSettings) : CodeStyleAbstrac } class ImportSettingsPanel(private val commonSettings: CodeStyleSettings) : JPanel() { - private val rbUseSingleImports = JRadioButton("With single name") - private val rbUseStarImports = JRadioButton("With '*'") - private val rbUseStarImportsIfMore = JRadioButton("With '*' if more than ") - private val starImportLimitModel = SpinnerNumberModel(4, 1, 100, 1) - private val starImportLimitField = JSpinner(starImportLimitModel) private val cbImportNestedClasses = JCheckBox("Insert imports for nested classes") private val starImportPackageEntryTable = PackageEntryTable() @@ -75,18 +70,21 @@ class ImportSettingsPanel(private val commonSettings: CodeStyleSettings) : JPane } private val starImportPackageTable = ImportLayoutPanel.createTableForPackageEntries(starImportPackageEntryTable, dummyImportLayoutPanel) + private val nameCountToUseStarImportSelector = NameCountToUseStarImportSelector("Use imports:") + private val nameCountToUseStarImportForMembersSelector = NameCountToUseStarImportSelector("Use imports for Java statics and enums:") + init { setLayout(BorderLayout()) - add(JBScrollPane(JPanel(GridBagLayout()).init { - val constraints = GridBagConstraints().init { + add(JBScrollPane(JPanel(GridBagLayout()).apply { + val constraints = GridBagConstraints().apply { weightx = 1.0 insets = Insets(0, 10, 10, 10) } - add(createGeneralOptionsPanel(), constraints.init { + add(createGeneralOptionsPanel(), constraints.apply { fill = GridBagConstraints.HORIZONTAL gridy = 0 }) - add(PackagePanel.createPackagesPanel(starImportPackageTable, starImportPackageEntryTable), constraints.init { + add(PackagePanel.createPackagesPanel(starImportPackageTable, starImportPackageEntryTable), constraints.apply { gridy = 1 fill = GridBagConstraints.BOTH weighty = 1.0 @@ -95,44 +93,16 @@ class ImportSettingsPanel(private val commonSettings: CodeStyleSettings) : JPane } private fun createGeneralOptionsPanel(): JPanel { - ButtonGroup().init { - add(rbUseSingleImports) - add(rbUseStarImports) - add(rbUseStarImportsIfMore) - } - - fun updateEnabled() { - starImportLimitField.setEnabled(rbUseStarImportsIfMore.isSelected()) - } - rbUseStarImportsIfMore.addChangeListener { updateEnabled() } - updateEnabled() - - return OptionGroup(ApplicationBundle.message("title.general")).init { - add(JLabel("Use imports:")) - add(rbUseSingleImports, true) - add(rbUseStarImports, true) - add(JPanel(GridBagLayout()).init { - val constraints = GridBagConstraints().init { gridx = GridBagConstraints.RELATIVE } - add(rbUseStarImportsIfMore, constraints) - add(starImportLimitField, constraints) - add(JLabel(" names used"), constraints.init { fill = GridBagConstraints.HORIZONTAL; weightx = 1.0 }) - }, true) + return OptionGroup(ApplicationBundle.message("title.general")).apply { + add(nameCountToUseStarImportSelector.createPanel(), nameCountToUseStarImportForMembersSelector.createPanel()) add(cbImportNestedClasses) }.createPanel() } fun reset(settings: JetCodeStyleSettings) { - when (settings.NAME_COUNT_TO_USE_STAR_IMPORT) { - Int.MAX_VALUE -> rbUseSingleImports.setSelected(true) - - 1 -> rbUseStarImports.setSelected(true) - - else -> { - rbUseStarImportsIfMore.setSelected(true) - starImportLimitField.setValue(settings.NAME_COUNT_TO_USE_STAR_IMPORT - 1) - } - } + nameCountToUseStarImportSelector.value = settings.NAME_COUNT_TO_USE_STAR_IMPORT + nameCountToUseStarImportForMembersSelector.value = settings.NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS cbImportNestedClasses.setSelected(settings.IMPORT_NESTED_CLASSES) @@ -144,11 +114,8 @@ class ImportSettingsPanel(private val commonSettings: CodeStyleSettings) : JPane } fun apply(settings: JetCodeStyleSettings, dropEmptyPackages: Boolean = true) { - settings.NAME_COUNT_TO_USE_STAR_IMPORT = when { - rbUseSingleImports.isSelected() -> Int.MAX_VALUE - rbUseStarImports.isSelected() -> 1 - else -> (starImportLimitModel.getNumber() as Int) + 1 - } + settings.NAME_COUNT_TO_USE_STAR_IMPORT = nameCountToUseStarImportSelector.value + settings.NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS = nameCountToUseStarImportForMembersSelector.value settings.IMPORT_NESTED_CLASSES = cbImportNestedClasses.isSelected() if (dropEmptyPackages) { @@ -164,9 +131,58 @@ class ImportSettingsPanel(private val commonSettings: CodeStyleSettings) : JPane tempSettings.writeExternal(root, settings) return root.getChildren().isNotEmpty() } -} -fun T.init(initializer: T.() -> Unit): T { - initializer() - return this -} \ No newline at end of file + private class NameCountToUseStarImportSelector(label: String) : OptionGroup() { + private val rbUseSingleImports = JRadioButton("With single name") + private val rbUseStarImports = JRadioButton("With '*'") + private val rbUseStarImportsIfMore = JRadioButton("With '*' if more than ") + private val starImportLimitModel = SpinnerNumberModel(4, 1, 100, 1) + private val starImportLimitField = JSpinner(starImportLimitModel) + + init { + ButtonGroup().apply { + add(rbUseSingleImports) + add(rbUseStarImports) + add(rbUseStarImportsIfMore) + } + + add(JLabel(label)) + add(rbUseSingleImports, true) + add(rbUseStarImports, true) + val jPanel: JPanel = JPanel(GridBagLayout()) + add(jPanel.apply { + val constraints = GridBagConstraints().apply { gridx = GridBagConstraints.RELATIVE } + this.add(rbUseStarImportsIfMore, constraints) + this.add(starImportLimitField, constraints) + this.add(JLabel(" names used"), constraints.apply { fill = GridBagConstraints.HORIZONTAL; weightx = 1.0 }) + }, true) + + fun updateEnabled() { + starImportLimitField.setEnabled(rbUseStarImportsIfMore.isSelected()) + } + rbUseStarImportsIfMore.addChangeListener { updateEnabled() } + updateEnabled() + } + + var value: Int + get() { + return when { + rbUseSingleImports.isSelected -> Int.MAX_VALUE + rbUseStarImports.isSelected -> 1 + else -> (starImportLimitModel.number as Int) + 1 + } + } + set(value) { + when (value) { + Int.MAX_VALUE -> rbUseSingleImports.isSelected = true + + 1 -> rbUseStarImports.isSelected = true + + else -> { + rbUseStarImportsIfMore.isSelected = true + starImportLimitField.value = value - 1 + } + } + } + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index ab865669974..b91c9753b78 100644 --- a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -164,15 +164,21 @@ public class KotlinImportOptimizer() : ImportOptimizer { val importsToGenerate = HashSet() - val descriptorsByPackages = HashMultimap.create() + val descriptorsByParentFqName = HashMultimap.create() for (descriptor in descriptorsToImport) { val fqName = descriptor.importableFqName!! + val container = descriptor.containingDeclaration val parentFqName = fqName.parent() - if (descriptor is PackageViewDescriptor || parentFqName.isRoot()) { - importsToGenerate.add(ImportPath(fqName, false)) + val canUseStarImport = when { + parentFqName.isRoot -> false + (container as? ClassDescriptor)?.kind == ClassKind.OBJECT -> false + else -> true + } + if (canUseStarImport) { + descriptorsByParentFqName.put(parentFqName, descriptor) } else { - descriptorsByPackages.put(parentFqName, descriptor) + importsToGenerate.add(ImportPath(fqName, false)) } } @@ -180,11 +186,16 @@ public class KotlinImportOptimizer() : ImportOptimizer { fun isImportedByDefault(fqName: FqName) = importInsertHelper.isImportedWithDefault(ImportPath(fqName, false), file) - for (packageName in descriptorsByPackages.keys()) { - val descriptors = descriptorsByPackages[packageName] + for (parentFqName in descriptorsByParentFqName.keys()) { + val descriptors = descriptorsByParentFqName[parentFqName] val fqNames = descriptors.map { it.importableFqName!! }.toSet() - val explicitImports = fqNames.size() < codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT - && packageName.asString() !in codeStyleSettings.PACKAGES_TO_USE_STAR_IMPORTS + val isMember = descriptors.first().containingDeclaration is ClassDescriptor + val nameCountToUseStar = if (isMember) + codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS + else + codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT + val explicitImports = fqNames.size < nameCountToUseStar + && parentFqName.asString() !in codeStyleSettings.PACKAGES_TO_USE_STAR_IMPORTS if (explicitImports) { for (fqName in fqNames) { if (!isImportedByDefault(fqName)) { @@ -200,7 +211,7 @@ public class KotlinImportOptimizer() : ImportOptimizer { } if (!fqNames.all(::isImportedByDefault)) { - importsToGenerate.add(ImportPath(packageName, true)) + importsToGenerate.add(ImportPath(parentFqName, true)) } } } @@ -218,14 +229,14 @@ public class KotlinImportOptimizer() : ImportOptimizer { // add explicit import if failed to import with * (or from current package) importsToGenerate.add(ImportPath(fqName, false)) - val packageName = fqName.parent() + val parentFqName = fqName.parent() - for (descriptor in descriptorsByPackages[packageName].filter { it.importableFqName == fqName }) { - descriptorsByPackages.remove(packageName, descriptor) + for (descriptor in descriptorsByParentFqName[parentFqName].filter { it.importableFqName == fqName }) { + descriptorsByParentFqName.remove(parentFqName, descriptor) } - if (descriptorsByPackages[packageName].isEmpty()) { // star import is not really needed - importsToGenerate.remove(ImportPath(packageName, true)) + if (descriptorsByParentFqName[parentFqName].isEmpty()) { // star import is not really needed + importsToGenerate.remove(ImportPath(parentFqName, true)) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt index 8f46df288d4..e269feab529 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt @@ -158,14 +158,13 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert val fqName = target.importableFqName!! val packageFqName = fqName.parent() - val tryStarImport = shouldTryStarImport(packageFqName, imports) + val tryStarImport = shouldTryStarImport(packageFqName, target, imports) && when (target) { // this check does not give a guarantee that import with * will import the class - for example, // there can be classes with conflicting name in more than one import with * is ClassDescriptor -> topLevelScope.getClassifier(name, NoLookupLocation.FROM_IDE) == null - is PackageViewDescriptor -> false is FunctionDescriptor, is PropertyDescriptor -> true - else -> throw Exception() + else -> error("Unknown kind of descriptor to import:$target") } if (tryStarImport) { @@ -176,19 +175,26 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert return addExplicitImport(target) } - private fun shouldTryStarImport(packageFqName: FqName, imports: Collection): Boolean { - if (packageFqName.isRoot()) return false + private fun shouldTryStarImport(containerFqName: FqName, target: DeclarationDescriptor, imports: Collection): Boolean { + if (containerFqName.isRoot) return false - val starImportPath = ImportPath(packageFqName, true) + val container = target.containingDeclaration + if (container is ClassDescriptor && container.kind == ClassKind.OBJECT) return false // cannot import with '*' from object + + val starImportPath = ImportPath(containerFqName, true) if (imports.any { it.getImportPath() == starImportPath }) return false - if (packageFqName.asString() in codeStyleSettings.PACKAGES_TO_USE_STAR_IMPORTS) return true + if (containerFqName.asString() in codeStyleSettings.PACKAGES_TO_USE_STAR_IMPORTS) return true val importsFromPackage = imports.count { val path = it.getImportPath() - path != null && !path.isAllUnder() && !path.hasAlias() && path.fqnPart().parent() == packageFqName + path != null && !path.isAllUnder() && !path.hasAlias() && path.fqnPart().parent() == containerFqName } - return importsFromPackage + 1 >= codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT + val nameCountToUseStar = if (container is ClassDescriptor) + codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS + else + codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT + return importsFromPackage + 1 >= nameCountToUseStar } private fun addStarImport(target: DeclarationDescriptor): ImportDescriptorResult { diff --git a/idea/testData/addImport/ImportEnumMember1.dependency.kt b/idea/testData/addImport/ImportEnumMember1.dependency.kt new file mode 100644 index 00000000000..47a268edc6f --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember1.dependency.kt @@ -0,0 +1,5 @@ +package ppp + +enum class E { + A, B, C +} \ No newline at end of file diff --git a/idea/testData/addImport/ImportEnumMember1.kt b/idea/testData/addImport/ImportEnumMember1.kt new file mode 100644 index 00000000000..ae551bae3cf --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember1.kt @@ -0,0 +1 @@ +// IMPORT: ppp.E.A diff --git a/idea/testData/addImport/ImportEnumMember1.kt.after b/idea/testData/addImport/ImportEnumMember1.kt.after new file mode 100644 index 00000000000..546d406e8fb --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember1.kt.after @@ -0,0 +1,3 @@ +import ppp.E.A + +// IMPORT: ppp.E.A diff --git a/idea/testData/addImport/ImportEnumMember2.dependency.kt b/idea/testData/addImport/ImportEnumMember2.dependency.kt new file mode 100644 index 00000000000..47a268edc6f --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember2.dependency.kt @@ -0,0 +1,5 @@ +package ppp + +enum class E { + A, B, C +} \ No newline at end of file diff --git a/idea/testData/addImport/ImportEnumMember2.kt b/idea/testData/addImport/ImportEnumMember2.kt new file mode 100644 index 00000000000..abd2f70041b --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember2.kt @@ -0,0 +1,3 @@ +// IMPORT: ppp.E.C +import ppp.E.A +import ppp.E.B diff --git a/idea/testData/addImport/ImportEnumMember2.kt.after b/idea/testData/addImport/ImportEnumMember2.kt.after new file mode 100644 index 00000000000..3859c835932 --- /dev/null +++ b/idea/testData/addImport/ImportEnumMember2.kt.after @@ -0,0 +1,2 @@ +// IMPORT: ppp.E.C +import ppp.E.* diff --git a/idea/testData/addImport/ImportFromObject.kt b/idea/testData/addImport/ImportFromObject.kt index 952d5039b18..8621a8ce36d 100644 --- a/idea/testData/addImport/ImportFromObject.kt +++ b/idea/testData/addImport/ImportFromObject.kt @@ -1,4 +1,5 @@ // IMPORT: dependency.MyObject.someFun +// NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS: 1 fun foo() { someFun() } \ No newline at end of file diff --git a/idea/testData/addImport/ImportFromObject.kt.after b/idea/testData/addImport/ImportFromObject.kt.after index 3fc5a91140f..f6ac91474c6 100644 --- a/idea/testData/addImport/ImportFromObject.kt.after +++ b/idea/testData/addImport/ImportFromObject.kt.after @@ -1,6 +1,7 @@ import dependency.MyObject.someFun // IMPORT: dependency.MyObject.someFun +// NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS: 1 fun foo() { someFun() } \ No newline at end of file diff --git a/idea/testData/addImport/ImportNestedClass.kt.after b/idea/testData/addImport/ImportNestedClass.kt.after index c0eee01156e..817fce99a69 100644 --- a/idea/testData/addImport/ImportNestedClass.kt.after +++ b/idea/testData/addImport/ImportNestedClass.kt.after @@ -1,3 +1,3 @@ -import kotlin.Map.* +import kotlin.Map.Entry // IMPORT: kotlin.Map.Entry diff --git a/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.dependency.kt b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.dependency.kt new file mode 100644 index 00000000000..9b1a0976695 --- /dev/null +++ b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.dependency.kt @@ -0,0 +1,18 @@ +package dependency + +object O { + fun foo(){} + fun bar(){} +} + +enum class E1 { + A1, B1, C1 +} + +enum class E2 { + A2, B2, C2 +} + +enum class E3 { + A3, B3, C3 +} diff --git a/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt new file mode 100644 index 00000000000..859a2f0498f --- /dev/null +++ b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt @@ -0,0 +1,18 @@ +// NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS: 2 +package test + +import dependency.O.foo +import dependency.O.bar +import dependency.E1.A1 +import dependency.E1.B1 +import dependency.E2.A2 +import dependency.E3.* + +fun f() { + foo() + bar() + val v1 = A1 + val v2 = B1 + val v3 = A2 + val v4 = A3 +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt.after b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt.after new file mode 100644 index 00000000000..f64e16d5a3f --- /dev/null +++ b/idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt.after @@ -0,0 +1,17 @@ +// NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS: 2 +package test + +import dependency.E1.* +import dependency.E2.A2 +import dependency.E3.A3 +import dependency.O.bar +import dependency.O.foo + +fun f() { + foo() + bar() + val v1 = A1 + val v2 = B1 + val v3 = A2 + val v4 = A3 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/AbstractImportsTest.kt b/idea/tests/org/jetbrains/kotlin/AbstractImportsTest.kt index 56321a35db5..25b4869c975 100644 --- a/idea/tests/org/jetbrains/kotlin/AbstractImportsTest.kt +++ b/idea/tests/org/jetbrains/kotlin/AbstractImportsTest.kt @@ -56,6 +56,7 @@ public abstract class AbstractImportsTest : JetLightCodeInsightFixtureTestCase() val fileText = file.getText() codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT = InTextDirectivesUtils.getPrefixedInt(fileText, "// NAME_COUNT_TO_USE_STAR_IMPORT:") ?: nameCountToUseStarImportDefault + codeStyleSettings.NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS = InTextDirectivesUtils.getPrefixedInt(fileText, "// NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS:") ?: nameCountToUseStarImportForMembersDefault codeStyleSettings.IMPORT_NESTED_CLASSES = InTextDirectivesUtils.getPrefixedBoolean(fileText, "// IMPORT_NESTED_CLASSES:") ?: false InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PACKAGE_TO_USE_STAR_IMPORTS:").forEach { @@ -80,4 +81,7 @@ public abstract class AbstractImportsTest : JetLightCodeInsightFixtureTestCase() protected open val nameCountToUseStarImportDefault: Int get() = 1 + + protected open val nameCountToUseStarImportForMembersDefault: Int + get() = 3 } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java b/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java index a1e08751358..718c884514c 100644 --- a/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/addImport/AddImportTestGenerated.java @@ -191,6 +191,18 @@ public class AddImportTestGenerated extends AbstractAddImportTest { doTest(fileName); } + @TestMetadata("ImportEnumMember1.kt") + public void testImportEnumMember1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/addImport/ImportEnumMember1.kt"); + doTest(fileName); + } + + @TestMetadata("ImportEnumMember2.kt") + public void testImportEnumMember2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/addImport/ImportEnumMember2.kt"); + doTest(fileName); + } + @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/addImport/ImportFromObject.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java index 3a018d1e6a2..3ad0cc73a87 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/imports/OptimizeImportsTestGenerated.java @@ -259,6 +259,12 @@ public class OptimizeImportsTestGenerated extends AbstractOptimizeImportsTest { doTest(fileName); } + @TestMetadata("MemberImports.kt") + public void testMemberImports() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/allUnderImports/MemberImports.kt"); + doTest(fileName); + } + @TestMetadata("NameCountSetting.kt") public void testNameCountSetting() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/allUnderImports/NameCountSetting.kt");