@@ -28,7 +28,16 @@ object Feature:
2828 val symbolLiterals = deprecated(" symbolLiterals" )
2929 val fewerBraces = experimental(" fewerBraces" )
3030
31- /** Is `feature` enabled by by a command-line setting? The enabling setting is
31+ val experimentalWarningMessage = " Experimental features may only be used with nightly or snapshot version of compiler."
32+
33+ /** Experimental features are only enabled for snapshot and nightly compiler versions
34+ */
35+ def checkExperimentalFeature (feature : TermName ): Boolean =
36+ feature match
37+ case QualifiedName (nme.experimental, _) => Properties .experimental
38+ case _ => true
39+
40+ /** Is `feature` enabled by by a command-line setting? The enabling setting is
3241 *
3342 * -language:<prefix>feature
3443 *
@@ -56,9 +65,11 @@ object Feature:
5665 * @param feature The name of the feature
5766 * @param owner The prefix symbol (nested in `scala.language`) where the
5867 * feature is defined.
68+ *
69+ * Note: Experimental features are only enabled for snapshot and nightly version of compiler.
5970 */
6071 def enabled (feature : TermName )(using Context ): Boolean =
61- enabledBySetting(feature) || enabledByImport(feature)
72+ checkExperimentalFeature(feature) && ( enabledBySetting(feature) || enabledByImport(feature) )
6273
6374 /** Is auto-tupling enabled? */
6475 def autoTuplingEnabled (using Context ): Boolean = ! enabled(nme.noAutoTupling)
@@ -71,6 +82,8 @@ object Feature:
7182
7283 def genericNumberLiteralsEnabled (using Context ) = enabled(genericNumberLiterals)
7384
85+ def erasedEnabled (using Context ) = enabled(Feature .erasedDefinitions)
86+
7487 def scala2ExperimentalMacroEnabled (using Context ) = enabled(scala2macros)
7588
7689 def sourceVersionSetting (using Context ): SourceVersion =
@@ -97,4 +110,14 @@ object Feature:
97110 else
98111 false
99112
113+ /** Check that experimental compiler options are only set for snapshot or nightly compiler versions. */
114+ def checkExperimentalFlags (using Context ): Unit =
115+ if ! Properties .experimental then
116+ val features = ctx.settings.language.value.filter(_.contains(nme.experimental.toString))
117+ if features.nonEmpty then
118+ report.error(
119+ experimentalWarningMessage +
120+ " \n The experimental language features are enabled via -language:" + features.mkString(" ," )
121+ )
122+
100123end Feature
0 commit comments