Skip to content

Commit d0d9ba6

Browse files
committed
Introduce miniphase that normalizes names of type definitions in packages for error reporting
1 parent b58799e commit d0d9ba6

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class Compiler {
113113
List(new Flatten, // Lift all inner classes to package scope
114114
new RestoreScopes, // Repair scopes rendered invalid by moving definitions in prior phases of the group
115115
new RenameLifted, // Renames lifted classes to local numbering scheme
116+
new NormalizePackageDefs, // Normalizes names of type definitions in packages to avoid OS-dependent name clashes/shadowing
116117
new TransformWildcards, // Replace wildcards with default values
117118
new MoveStatics, // Move static methods to companion classes
118119
new ExpandPrivate, // Widen private definitions accessed from nested classes
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dotty.tools.dotc.transform
2+
3+
import dotty.tools.dotc.ast.tpd
4+
import dotty.tools.dotc.core.Contexts.Context
5+
import dotty.tools.dotc.core.Decorators._
6+
import dotty.tools.dotc.transform.MegaPhase.MiniPhase
7+
8+
/** Normalizes names of type definitions to avoid OS-dependent name clashes/shadowing */
9+
10+
class NormalizePackageDefs extends MiniPhase {
11+
import tpd._
12+
13+
override def phaseName = "normalizePackageDefs"
14+
15+
override def transformPackageDef(tree: PackageDef)(implicit ctx: Context) : Tree = {
16+
17+
val typeList = tree.stats.filter(s => s.denot.isType)
18+
val normalizedDefinitionList = typeList.map(s => s.denot.toString.toLowerCase())
19+
if (normalizedDefinitionList.distinct.size < typeList.size) ctx.error(i"package ${tree.denot.name} contains definitions with duplicate names, in a case-insensitive manner", tree.pos)
20+
21+
tree
22+
}
23+
}

tests/neg/i2673.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package Foos //error
2+
3+
class Foo
4+
class foo

0 commit comments

Comments
 (0)