@@ -8,7 +8,7 @@ import Symbols._, StdNames._, Trees._, ContextOps._
8
8
import Decorators ._ , transform .SymUtils ._
9
9
import NameKinds .{UniqueName , EvidenceParamName , DefaultGetterName }
10
10
import typer .{Namer , Checking }
11
- import util .{Property , SourceFile , SourcePosition }
11
+ import util .{Property , SourceFile , SourcePosition , Chars }
12
12
import config .Feature .{sourceVersion , migrateTo3 , enabled }
13
13
import config .SourceVersion ._
14
14
import collection .mutable .ListBuffer
@@ -834,7 +834,8 @@ object desugar {
834
834
val impl = mdef.impl
835
835
val mods = mdef.mods
836
836
val moduleName = normalizeName(mdef, impl).asTermName
837
- if (mods.is(Package ))
837
+ if mods.is(Package ) then
838
+ checkPackageName(mdef)
838
839
PackageDef (Ident (moduleName),
839
840
cpy.ModuleDef (mdef)(nme.PACKAGE , impl).withMods(mods &~ Package ) :: Nil )
840
841
else
@@ -950,6 +951,26 @@ object desugar {
950
951
else tree
951
952
}
952
953
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
+
953
974
/** The normalized name of `mdef`. This means
954
975
* 1. Check that the name does not redefine a Scala core class.
955
976
* If it does redefine, issue an error and return a mangled name instead
@@ -1321,6 +1342,7 @@ object desugar {
1321
1342
* (i.e. objects having the same name as a wrapped type)
1322
1343
*/
1323
1344
def packageDef (pdef : PackageDef )(using Context ): PackageDef = {
1345
+ checkPackageName(pdef)
1324
1346
val wrappedTypeNames = pdef.stats.collect {
1325
1347
case stat : TypeDef if isTopLevelDef(stat) => stat.name
1326
1348
}
0 commit comments