@@ -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
@@ -521,9 +521,9 @@ object desugar {
521
521
val enumCompanionRef = TermRefTree ()
522
522
val enumImport =
523
523
Import (enumCompanionRef, enumCases.flatMap(caseIds).map(
524
- enumCase =>
524
+ enumCase =>
525
525
ImportSelector (enumCase.withSpan(enumCase.span.startPos))
526
- )
526
+ )
527
527
)
528
528
(enumImport :: enumStats, enumCases, enumCompanionRef)
529
529
}
@@ -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
@@ -1134,7 +1155,7 @@ object desugar {
1134
1155
val matchExpr =
1135
1156
if (tupleOptimizable) rhs
1136
1157
else
1137
- val caseDef = CaseDef (pat, EmptyTree , makeTuple(ids))
1158
+ val caseDef = CaseDef (pat, EmptyTree , makeTuple(ids))
1138
1159
Match (makeSelector(rhs, MatchCheck .IrrefutablePatDef ), caseDef :: Nil )
1139
1160
vars match {
1140
1161
case Nil if ! mods.is(Lazy ) =>
@@ -1155,11 +1176,11 @@ object desugar {
1155
1176
val restDefs =
1156
1177
for (((named, tpt), n) <- vars.zipWithIndex if named.name != nme.WILDCARD )
1157
1178
yield
1158
- if mods.is(Lazy ) then
1179
+ if mods.is(Lazy ) then
1159
1180
DefDef (named.name.asTermName, Nil , tpt, selector(n))
1160
1181
.withMods(mods &~ Lazy )
1161
1182
.withSpan(named.span)
1162
- else
1183
+ else
1163
1184
valDef(
1164
1185
ValDef (named.name.asTermName, tpt, selector(n))
1165
1186
.withMods(mods)
@@ -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