@@ -8,7 +8,7 @@ import Symbols._, StdNames._, Trees._, ContextOps._
88import Decorators ._ , transform .SymUtils ._
99import NameKinds .{UniqueName , EvidenceParamName , DefaultGetterName }
1010import typer .{Namer , Checking }
11- import util .{Property , SourceFile , SourcePosition }
11+ import util .{Property , SourceFile , SourcePosition , Chars }
1212import config .Feature .{sourceVersion , migrateTo3 , enabled }
1313import config .SourceVersion ._
1414import collection .mutable .ListBuffer
@@ -834,7 +834,8 @@ object desugar {
834834 val impl = mdef.impl
835835 val mods = mdef.mods
836836 val moduleName = normalizeName(mdef, impl).asTermName
837- if (mods.is(Package ))
837+ if mods.is(Package ) then
838+ checkPackageName(mdef)
838839 PackageDef (Ident (moduleName),
839840 cpy.ModuleDef (mdef)(nme.PACKAGE , impl).withMods(mods &~ Package ) :: Nil )
840841 else
@@ -950,6 +951,26 @@ object desugar {
950951 else tree
951952 }
952953
954+ def checkPackageName (mdef : ModuleDef | PackageDef )(using Context ): Unit =
955+
956+ def check (name : Name , errSpan : Span ): Unit = name match
957+ case name : SimpleName if ! errSpan.isSynthetic && name.exists(Chars .willBeEncoded) =>
958+ report.warning(em " The package name ` $name` will be encoded on the classpath, and can lead to undefined behaviour. " , mdef.source.atSpan(errSpan))
959+ case _ =>
960+
961+ def loop (part : RefTree ): Unit = part match
962+ case part @ Ident (name) => check(name, part.span)
963+ case part @ Select (qual : RefTree , name) =>
964+ check(name, part.nameSpan)
965+ loop(qual)
966+ case _ =>
967+
968+ mdef match
969+ case pdef : PackageDef => loop(pdef.pid)
970+ case mdef : ModuleDef if mdef.mods.is(Package ) => check(mdef.name, mdef.nameSpan)
971+ case _ =>
972+ end checkPackageName
973+
953974 /** The normalized name of `mdef`. This means
954975 * 1. Check that the name does not redefine a Scala core class.
955976 * If it does redefine, issue an error and return a mangled name instead
@@ -1321,6 +1342,7 @@ object desugar {
13211342 * (i.e. objects having the same name as a wrapped type)
13221343 */
13231344 def packageDef (pdef : PackageDef )(using Context ): PackageDef = {
1345+ checkPackageName(pdef)
13241346 val wrappedTypeNames = pdef.stats.collect {
13251347 case stat : TypeDef if isTopLevelDef(stat) => stat.name
13261348 }
0 commit comments