@@ -11,6 +11,7 @@ import SourceVersion.*
1111import reporting .Message
1212import NameKinds .QualifiedName
1313import Annotations .ExperimentalAnnotation
14+ import Annotations .PreviewAnnotation
1415import Settings .Setting .ChoiceWithHelp
1516
1617object Feature :
@@ -28,9 +29,7 @@ object Feature:
2829 val dependent = experimental(" dependent" )
2930 val erasedDefinitions = experimental(" erasedDefinitions" )
3031 val symbolLiterals = deprecated(" symbolLiterals" )
31- val fewerBraces = experimental(" fewerBraces" )
3232 val saferExceptions = experimental(" saferExceptions" )
33- val clauseInterleaving = experimental(" clauseInterleaving" )
3433 val pureFunctions = experimental(" pureFunctions" )
3534 val captureChecking = experimental(" captureChecking" )
3635 val into = experimental(" into" )
@@ -39,6 +38,7 @@ object Feature:
3938 val betterMatchTypeExtractors = experimental(" betterMatchTypeExtractors" )
4039 val quotedPatternsWithPolymorphicFunctions = experimental(" quotedPatternsWithPolymorphicFunctions" )
4140 val betterFors = experimental(" betterFors" )
41+ val packageObjectValues = experimental(" packageObjectValues" )
4242
4343 def experimentalAutoEnableFeatures (using Context ): List [TermName ] =
4444 defn.languageExperimentalFeatures
@@ -60,9 +60,7 @@ object Feature:
6060 (dependent, " Allow dependent method types" ),
6161 (erasedDefinitions, " Allow erased definitions" ),
6262 (symbolLiterals, " Allow symbol literals" ),
63- (fewerBraces, " Enable support for using indentation for arguments" ),
6463 (saferExceptions, " Enable safer exceptions" ),
65- (clauseInterleaving, " Enable clause interleaving" ),
6664 (pureFunctions, " Enable pure functions for capture checking" ),
6765 (captureChecking, " Enable experimental capture checking" ),
6866 (into, " Allow into modifier on parameter types" ),
@@ -124,9 +122,6 @@ object Feature:
124122
125123 def namedTypeArgsEnabled (using Context ) = enabled(namedTypeArguments)
126124
127- def clauseInterleavingEnabled (using Context ) =
128- sourceVersion.isAtLeast(`3.6`) || enabled(clauseInterleaving)
129-
130125 def betterForsEnabled (using Context ) = enabled(betterFors)
131126
132127 def genericNumberLiteralsEnabled (using Context ) = enabled(genericNumberLiterals)
@@ -169,9 +164,6 @@ object Feature:
169164 def migrateTo3 (using Context ): Boolean =
170165 sourceVersion == `3.0-migration`
171166
172- def fewerBracesEnabled (using Context ) =
173- sourceVersion.isAtLeast(`3.3`) || enabled(fewerBraces)
174-
175167 /** If current source migrates to `version`, issue given warning message
176168 * and return `true`, otherwise return `false`.
177169 */
@@ -242,4 +234,29 @@ object Feature:
242234 true
243235 else
244236 false
237+
238+ def isPreviewEnabled (using Context ): Boolean =
239+ ctx.settings.preview.value
240+
241+ def checkPreviewFeature (which : String , srcPos : SrcPos , note : => String = " " )(using Context ) =
242+ if ! isPreviewEnabled then
243+ report.error(previewUseSite(which) + note, srcPos)
244+
245+ def checkPreviewDef (sym : Symbol , srcPos : SrcPos )(using Context ) = if ! isPreviewEnabled then
246+ val previewSym =
247+ if sym.hasAnnotation(defn.PreviewAnnot ) then sym
248+ else if sym.owner.hasAnnotation(defn.PreviewAnnot ) then sym.owner
249+ else NoSymbol
250+ val msg =
251+ previewSym.getAnnotation(defn.PreviewAnnot ).collectFirst {
252+ case PreviewAnnotation (msg) if msg.nonEmpty => s " : $msg"
253+ }.getOrElse(" " )
254+ val markedPreview =
255+ if previewSym.exists
256+ then i " $previewSym is marked @preview $msg"
257+ else i " $sym inherits @preview $msg"
258+ report.error(i " ${markedPreview}\n\n ${previewUseSite(" definition" )}" , srcPos)
259+
260+ private def previewUseSite (which : String ): String =
261+ s " Preview $which may only be used when compiling with the `-preview` compiler flag "
245262end Feature
0 commit comments