Skip to content

Commit 6f93f72

Browse files
committed
WIP Simplifications
1 parent 9ad82d0 commit 6f93f72

File tree

2 files changed

+12
-23
lines changed

2 files changed

+12
-23
lines changed

compiler/src/dotty/tools/dotc/config/Feature.scala

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ object Feature:
148148
false
149149

150150
def checkExperimentalFeature(which: String, srcPos: SrcPos, note: => String = "")(using Context) =
151-
if !isExperimentalGloballyEnabled && !isExperimentalByImportEnabled && !isExperimentalUnstableEnabled then
151+
if !isExperimentalEnabled && !isExperimentalUnstableEnabled then
152152
report.error(
153153
em"""Experimental $which may only be used under experimental mode:
154154
| 1. In a definition marked as @experimental
@@ -161,7 +161,7 @@ object Feature:
161161
ccEnabled && defn.ccExperimental.contains(sym)
162162

163163
def checkExperimentalDef(sym: Symbol, srcPos: SrcPos)(using Context) =
164-
if !isExperimentalGloballyEnabled && !isExperimentalByImportEnabled && !isExperimentalUnstableEnabled then
164+
if !isExperimentalEnabled && !isExperimentalUnstableEnabled then
165165
val experimentalSym =
166166
if sym.hasAnnotation(defn.ExperimentalAnnot) then sym
167167
else if sym.owner.hasAnnotation(defn.ExperimentalAnnot) then sym.owner
@@ -184,17 +184,14 @@ object Feature:
184184
def isExperimentalUnstableEnabled(using Context): Boolean =
185185
Properties.experimental && !ctx.settings.YnoExperimental.value
186186

187-
/** Experimental mode enabled in this compilation unit
187+
/** Experimental mode enabled in this scope if:
188188
* - Compiled with `-experimental`
189189
* - Compiled with `-language:experimental.xyz`
190+
* - A `language.experimental.xyz` import is in scope
190191
*/
191-
def isExperimentalGloballyEnabled(using Context): Boolean =
192+
def isExperimentalEnabled(using Context): Boolean =
192193
ctx.settings.experimental.value ||
193-
experimentalAutoEnableFeatures.exists(enabledBySetting)
194-
195-
/** Experimental mode enabled by a `language.experimental` import in scope */
196-
def isExperimentalByImportEnabled(using Context): Boolean =
197-
experimentalAutoEnableFeatures.exists(enabledByImport)
194+
experimentalAutoEnableFeatures.exists(enabled)
198195

199196
/** Handle language import `import language.<prefix>.<imported>` if it is one
200197
* of the global imports `pureFunctions` or `captureChecking`. In this case

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -545,22 +545,14 @@ class PostTyper extends MacroTransform with InfoTransformer { thisPhase =>
545545
report.error("`erased` definition cannot be implemented with en expression of type Null", tree.srcPos)
546546

547547
private def annotateExperimental(sym: Symbol)(using Context): Unit =
548-
def companionOfExperimental =
549-
sym.is(Module) && sym.companionClass.hasAnnotation(defn.ExperimentalAnnot)
550-
def topLevelDefinitionWithExperimentalEnabledInUnit =
551-
sym.isTopLevelDefinition && (Feature.isExperimentalGloballyEnabled || Feature.isExperimentalByImportEnabled)
552-
if !sym.hasAnnotation(defn.ExperimentalAnnot) && (companionOfExperimental || topLevelDefinitionWithExperimentalEnabledInUnit) then
548+
def companionOfErasedNeedsErased =
549+
!sym.hasAnnotation(defn.ExperimentalAnnot) && sym.is(Module) && sym.companionClass.hasAnnotation(defn.ExperimentalAnnot)
550+
def needsExperimentalByImportOrSetting =
551+
!sym.ownersIterator.exists(_.hasAnnotation(defn.ExperimentalAnnot))
552+
&& Feature.isExperimentalEnabled
553+
if companionOfErasedNeedsErased || needsExperimentalByImportOrSetting then
553554
sym.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
554555

555-
// TODO do this on import statement
556-
val topLevelDefinition = sym.topLevelDefinition
557-
if topLevelDefinition.exists &&
558-
!topLevelDefinition.hasAnnotation(defn.ExperimentalAnnot)
559-
&& Feature.isExperimentalByImportEnabled
560-
then
561-
topLevelDefinition.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
562-
if topLevelDefinition.is(Module) then topLevelDefinition.companionModule.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
563-
564556
private def scala2LibPatch(tree: TypeDef)(using Context) =
565557
val sym = tree.symbol
566558
if compilingScala2StdLib && sym.is(ModuleClass) then

0 commit comments

Comments
 (0)