@@ -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
@@ -521,9 +521,9 @@ object desugar {
521521 val enumCompanionRef = TermRefTree ()
522522 val enumImport =
523523 Import (enumCompanionRef, enumCases.flatMap(caseIds).map(
524- enumCase =>
524+ enumCase =>
525525 ImportSelector (enumCase.withSpan(enumCase.span.startPos))
526- )
526+ )
527527 )
528528 (enumImport :: enumStats, enumCases, enumCompanionRef)
529529 }
@@ -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
@@ -1134,7 +1155,7 @@ object desugar {
11341155 val matchExpr =
11351156 if (tupleOptimizable) rhs
11361157 else
1137- val caseDef = CaseDef (pat, EmptyTree , makeTuple(ids))
1158+ val caseDef = CaseDef (pat, EmptyTree , makeTuple(ids))
11381159 Match (makeSelector(rhs, MatchCheck .IrrefutablePatDef ), caseDef :: Nil )
11391160 vars match {
11401161 case Nil if ! mods.is(Lazy ) =>
@@ -1155,11 +1176,11 @@ object desugar {
11551176 val restDefs =
11561177 for (((named, tpt), n) <- vars.zipWithIndex if named.name != nme.WILDCARD )
11571178 yield
1158- if mods.is(Lazy ) then
1179+ if mods.is(Lazy ) then
11591180 DefDef (named.name.asTermName, Nil , tpt, selector(n))
11601181 .withMods(mods &~ Lazy )
11611182 .withSpan(named.span)
1162- else
1183+ else
11631184 valDef(
11641185 ValDef (named.name.asTermName, tpt, selector(n))
11651186 .withMods(mods)
@@ -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