@@ -27,7 +27,16 @@ object Feature:
2727 val erasedDefinitions = experimental(" erasedDefinitions" )
2828 val symbolLiterals : TermName = deprecated(" symbolLiterals" )
2929
30- /** Is `feature` enabled by by a command-line setting? The enabling setting is
30+ val experimentalWarningMessage = " Experimental features may only be used with nightly or snapshot version of compiler."
31+
32+ /** Experimental features are only enabled for snapshot and nightly version of compiler
33+ */
34+ def checkExperimentalFeature (feature : TermName ): Boolean =
35+ feature match
36+ case QualifiedName (nme.experimental, _) => Properties .experimental
37+ case _ => true
38+
39+ /** Is `feature` enabled by by a command-line setting? The enabling setting is
3140 *
3241 * -language:<prefix>feature
3342 *
@@ -55,9 +64,11 @@ object Feature:
5564 * @param feature The name of the feature
5665 * @param owner The prefix symbol (nested in `scala.language`) where the
5766 * feature is defined.
67+ *
68+ * Note: Experimental features are only enabled for snapshot and nightly version of compiler.
5869 */
5970 def enabled (feature : TermName )(using Context ): Boolean =
60- enabledBySetting(feature) || enabledByImport(feature)
71+ checkExperimentalFeature(feature) && ( enabledBySetting(feature) || enabledByImport(feature) )
6172
6273 /** Is auto-tupling enabled? */
6374 def autoTuplingEnabled (using Context ): Boolean = ! enabled(nme.noAutoTupling)
@@ -70,6 +81,8 @@ object Feature:
7081
7182 def genericNumberLiteralsEnabled (using Context ) = enabled(genericNumberLiterals)
7283
84+ def erasedEnabled (using Context ) = enabled(Feature .erasedDefinitions)
85+
7386 def scala2ExperimentalMacroEnabled (using Context ) = enabled(scala2macros)
7487
7588 def sourceVersionSetting (using Context ): SourceVersion =
@@ -96,4 +109,14 @@ object Feature:
96109 else
97110 false
98111
112+ /** Check that experimental compiler options are only set with snapshot or nightly compiler version. */
113+ def checkExperimentalFlags (using Context ): Unit =
114+ if ! Properties .experimental then
115+ val features = ctx.settings.language.value.filter(_.contains(nme.experimental.toString))
116+ if features.nonEmpty then
117+ report.error(
118+ experimentalWarningMessage +
119+ " \n The experimental language features are enabled via -language " + features.mkString(" ," )
120+ )
121+
99122end Feature
0 commit comments