diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NamingConventionInspections.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NamingConventionInspections.kt index 88e423cdccd..800bf8d8abc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NamingConventionInspections.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NamingConventionInspections.kt @@ -16,6 +16,7 @@ import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.ui.EditorTextField import com.siyeh.ig.psiutils.TestUtils +import org.intellij.lang.annotations.Language import org.intellij.lang.regexp.RegExpFileType import org.jetbrains.kotlin.idea.quickfix.RenameIdentifierFix import org.jetbrains.kotlin.lexer.KtTokens @@ -56,9 +57,13 @@ private val NO_BAD_CHARACTERS_OR_UNDERSCORE = NamingRule("may contain only lette it.any { c -> c !in 'a'..'z' && c !in 'A'..'Z' && c !in '0'..'9' && c != '_' } } +private val ONLY_LOWER_DIGITS_OR_UNDERSCORE = NamingRule("may contain only lowercase letters, digits or underscores") { + it.any { c -> c !in 'a'..'z' && c !in '0'..'9' && c != '_' } +} + abstract class NamingConventionInspection( private val entityName: String, - private val defaultNamePattern: String, + @Language("RegExp") private val defaultNamePattern: String, private vararg val rules: NamingRule ) : AbstractKotlinInspection() { protected var nameRegex: Regex? = defaultNamePattern.toRegex() @@ -228,7 +233,7 @@ class LocalVariableNameInspection : ) class PackageNameInspection : - NamingConventionInspection("Package", "[a-z][A-Za-z\\d]*(\\.[a-z][A-Za-z\\d]*)*", NO_UNDERSCORES) { + NamingConventionInspection("Package", "[a-z_][a-z\\d_]*(\\.[a-z_][a-z\\d_]*)*", ONLY_LOWER_DIGITS_OR_UNDERSCORE) { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { return packageDirectiveVisitor { directive -> val qualifiedName = directive.qualifiedName diff --git a/idea/testData/inspections/naming/package/allLowerCase.kt b/idea/testData/inspections/naming/package/allLowerCase.kt new file mode 100644 index 00000000000..8520c78c3ff --- /dev/null +++ b/idea/testData/inspections/naming/package/allLowerCase.kt @@ -0,0 +1 @@ +package one.two.three \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/hasUpperCase.kt b/idea/testData/inspections/naming/package/hasUpperCase.kt new file mode 100644 index 00000000000..297ccce9602 --- /dev/null +++ b/idea/testData/inspections/naming/package/hasUpperCase.kt @@ -0,0 +1 @@ +package one.two.Three \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/inspectionData/expected.xml b/idea/testData/inspections/naming/package/inspectionData/expected.xml new file mode 100644 index 00000000000..e68027e913d --- /dev/null +++ b/idea/testData/inspections/naming/package/inspectionData/expected.xml @@ -0,0 +1,7 @@ + + + hasUpperCase.kt + 1 + Package name <code>one.two.Three</code> doesn't match regex '[a-z][A-Za-z\d]*_?(\.[a-z][A-Za-z\d]*_?)*' #loc + + \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/inspectionData/inspections.test b/idea/testData/inspections/naming/package/inspectionData/inspections.test new file mode 100644 index 00000000000..587393a9dcc --- /dev/null +++ b/idea/testData/inspections/naming/package/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.PackageNameInspection \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/keywordUnderscore.kt b/idea/testData/inspections/naming/package/keywordUnderscore.kt new file mode 100644 index 00000000000..2c004012819 --- /dev/null +++ b/idea/testData/inspections/naming/package/keywordUnderscore.kt @@ -0,0 +1 @@ +package com.fun_.test \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/midleUnderscore.kt b/idea/testData/inspections/naming/package/midleUnderscore.kt new file mode 100644 index 00000000000..2c20418b8f0 --- /dev/null +++ b/idea/testData/inspections/naming/package/midleUnderscore.kt @@ -0,0 +1 @@ +package org.so_so.example \ No newline at end of file diff --git a/idea/testData/inspections/naming/package/startWithUnderscoreAndDigits.kt b/idea/testData/inspections/naming/package/startWithUnderscoreAndDigits.kt new file mode 100644 index 00000000000..93dd6856b6e --- /dev/null +++ b/idea/testData/inspections/naming/package/startWithUnderscoreAndDigits.kt @@ -0,0 +1 @@ +package com.example._123name \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java index e031aa1562f..4a5754251e5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java @@ -239,6 +239,11 @@ public class InspectionTestGenerated extends AbstractInspectionTest { runTest("idea/testData/inspections/naming/objectProperty/inspectionData/inspections.test"); } + @TestMetadata("naming/package/inspectionData/inspections.test") + public void testNaming_package_inspectionData_Inspections_test() throws Exception { + runTest("idea/testData/inspections/naming/package/inspectionData/inspections.test"); + } + @TestMetadata("naming/privateProperty/inspectionData/inspections.test") public void testNaming_privateProperty_inspectionData_Inspections_test() throws Exception { runTest("idea/testData/inspections/naming/privateProperty/inspectionData/inspections.test");