@@ -28,7 +28,16 @@ object Feature:
28
28
val symbolLiterals = deprecated(" symbolLiterals" )
29
29
val fewerBraces = experimental(" fewerBraces" )
30
30
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
32
41
*
33
42
* -language:<prefix>feature
34
43
*
@@ -56,9 +65,11 @@ object Feature:
56
65
* @param feature The name of the feature
57
66
* @param owner The prefix symbol (nested in `scala.language`) where the
58
67
* feature is defined.
68
+ *
69
+ * Note: Experimental features are only enabled for snapshot and nightly version of compiler.
59
70
*/
60
71
def enabled (feature : TermName )(using Context ): Boolean =
61
- enabledBySetting(feature) || enabledByImport(feature)
72
+ checkExperimentalFeature(feature) && ( enabledBySetting(feature) || enabledByImport(feature) )
62
73
63
74
/** Is auto-tupling enabled? */
64
75
def autoTuplingEnabled (using Context ): Boolean = ! enabled(nme.noAutoTupling)
@@ -71,6 +82,8 @@ object Feature:
71
82
72
83
def genericNumberLiteralsEnabled (using Context ) = enabled(genericNumberLiterals)
73
84
85
+ def erasedEnabled (using Context ) = enabled(Feature .erasedDefinitions)
86
+
74
87
def scala2ExperimentalMacroEnabled (using Context ) = enabled(scala2macros)
75
88
76
89
def sourceVersionSetting (using Context ): SourceVersion =
@@ -97,4 +110,14 @@ object Feature:
97
110
else
98
111
false
99
112
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
+
100
123
end Feature
0 commit comments