Skip to content

Commit

Permalink
WIP Simplifications
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasstucki committed Feb 23, 2024
1 parent 14dae56 commit 5d1624b
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 23 deletions.
15 changes: 6 additions & 9 deletions compiler/src/dotty/tools/dotc/config/Feature.scala
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ object Feature:
false

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

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

/** Experimental mode enabled in this compilation unit
/** Experimental mode enabled in this scope if:
* - Compiled with `-experimental`
* - Compiled with `-language:experimental.xyz`
* - A `language.experimental.xyz` import is in scope
*/
def isExperimentalGloballyEnabled(using Context): Boolean =
def isExperimentalEnabled(using Context): Boolean =
ctx.settings.experimental.value ||
experimentalAutoEnableFeatures.exists(enabledBySetting)

/** Experimental mode enabled by a `language.experimental` import in scope */
def isExperimentalByImportEnabled(using Context): Boolean =
experimentalAutoEnableFeatures.exists(enabledByImport)
experimentalAutoEnableFeatures.exists(enabled)

/** Handle language import `import language.<prefix>.<imported>` if it is one
* of the global imports `pureFunctions` or `captureChecking`. In this case
Expand Down
20 changes: 6 additions & 14 deletions compiler/src/dotty/tools/dotc/transform/PostTyper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -545,22 +545,14 @@ class PostTyper extends MacroTransform with InfoTransformer { thisPhase =>
report.error("`erased` definition cannot be implemented with en expression of type Null", tree.srcPos)

private def annotateExperimental(sym: Symbol)(using Context): Unit =
def companionOfExperimental =
sym.is(Module) && sym.companionClass.hasAnnotation(defn.ExperimentalAnnot)
def topLevelDefinitionWithExperimentalEnabledInUnit =
sym.isTopLevelDefinition && (Feature.isExperimentalGloballyEnabled || Feature.isExperimentalByImportEnabled)
if !sym.hasAnnotation(defn.ExperimentalAnnot) && (companionOfExperimental || topLevelDefinitionWithExperimentalEnabledInUnit) then
def companionOfErasedNeedsErased =
!sym.hasAnnotation(defn.ExperimentalAnnot) && sym.is(Module) && sym.companionClass.hasAnnotation(defn.ExperimentalAnnot)
def needsExperimentalByImportOrSetting =
!sym.ownersIterator.exists(_.hasAnnotation(defn.ExperimentalAnnot))
&& Feature.isExperimentalEnabled
if companionOfErasedNeedsErased || needsExperimentalByImportOrSetting then
sym.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))

// TODO do this on import statement
val topLevelDefinition = sym.topLevelDefinition
if topLevelDefinition.exists &&
!topLevelDefinition.hasAnnotation(defn.ExperimentalAnnot)
&& Feature.isExperimentalByImportEnabled
then
topLevelDefinition.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))
if topLevelDefinition.is(Module) then topLevelDefinition.companionModule.addAnnotation(Annotation(defn.ExperimentalAnnot, sym.span))

private def scala2LibPatch(tree: TypeDef)(using Context) =
val sym = tree.symbol
if compilingScala2StdLib && sym.is(ModuleClass) then
Expand Down

0 comments on commit 5d1624b

Please sign in to comment.