Skip to content

Commit 9eb6aa1

Browse files
committed
Add opaque types: parsing & pickling
Add `opaque` to syntax. Let it be parsed and stored/pickled as a flag.
1 parent b24f80d commit 9eb6aa1

File tree

8 files changed

+22
-8
lines changed

8 files changed

+22
-8
lines changed

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
123123

124124
case class Sealed() extends Mod(Flags.Sealed)
125125

126+
case class Opaque() extends Mod(Flags.Opaque)
127+
126128
case class Override() extends Mod(Flags.Override)
127129

128130
case class Abstract() extends Mod(Flags.Abstract)

compiler/src/dotty/tools/dotc/core/Flags.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,12 @@ object Flags {
251251

252252
final val AccessorOrSealed = Accessor.toCommonFlags
253253

254-
/** A mutable var */
254+
/** A mutable var */
255255
final val Mutable = termFlag(12, "mutable")
256256

257+
/** An opqaue type */
258+
final val Opaque = typeFlag(12, "opaque")
259+
257260
/** Symbol is local to current class (i.e. private[this] or protected[this]
258261
* pre: Private or Protected are also set
259262
*/
@@ -264,7 +267,7 @@ object Flags {
264267
*/
265268
final val ParamAccessor = termFlag(14, "<paramaccessor>")
266269

267-
/** A value or class implementing a module */
270+
/** A value or class implementing a module */
268271
final val Module = commonFlag(15, "module")
269272
final val ModuleVal = Module.toTermFlags
270273
final val ModuleClass = Module.toTypeFlags
@@ -438,12 +441,12 @@ object Flags {
438441
/** Flags representing source modifiers */
439442
final val SourceModifierFlags =
440443
commonFlags(Private, Protected, Abstract, Final, Inline,
441-
Sealed, Case, Implicit, Override, AbsOverride, Lazy, JavaStatic)
444+
Sealed, Case, Implicit, Override, Opaque, AbsOverride, Lazy, JavaStatic)
442445

443446
/** Flags representing modifiers that can appear in trees */
444447
final val ModifierFlags =
445-
SourceModifierFlags | Module | Param | Synthetic | Package | Local |
446-
commonFlags(Mutable)
448+
SourceModifierFlags | Module | Param | Synthetic | Package | Local
449+
// | Mutable is subsumed by commonFlags(Opaque) from SourceModifierFlags
447450
// | Trait is subsumed by commonFlags(Lazy) from SourceModifierFlags
448451

449452
assert(ModifierFlags.isTermFlags && ModifierFlags.isTypeFlags)

compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ Standard-Section: "ASTs" TopLevelStat*
183183
OVERRIDE
184184
INLINE // inline method
185185
MACRO // inline method containing toplevel splices
186+
OPAQUE // opaque type
186187
STATIC // mapped to static Java member
187188
OBJECT // an object or its class
188189
TRAIT // a trait
@@ -299,6 +300,7 @@ object TastyFormat {
299300
final val DEFAULTparameterized = 30
300301
final val STABLE = 31
301302
final val MACRO = 32
303+
final val OPAQUE = 33
302304

303305
// Cat. 2: tag Nat
304306

@@ -410,7 +412,7 @@ object TastyFormat {
410412

411413
/** Useful for debugging */
412414
def isLegalTag(tag: Int) =
413-
firstSimpleTreeTag <= tag && tag <= MACRO ||
415+
firstSimpleTreeTag <= tag && tag <= OPAQUE ||
414416
firstNatTreeTag <= tag && tag <= SYMBOLconst ||
415417
firstASTTreeTag <= tag && tag <= SINGLETONtpt ||
416418
firstNatASTTreeTag <= tag && tag <= NAMEDARG ||
@@ -432,6 +434,7 @@ object TastyFormat {
432434
| OVERRIDE
433435
| INLINE
434436
| MACRO
437+
| OPAQUE
435438
| STATIC
436439
| OBJECT
437440
| TRAIT
@@ -486,6 +489,7 @@ object TastyFormat {
486489
case OVERRIDE => "OVERRIDE"
487490
case INLINE => "INLINE"
488491
case MACRO => "MACRO"
492+
case OPAQUE => "OPAQUE"
489493
case STATIC => "STATIC"
490494
case OBJECT => "OBJECT"
491495
case TRAIT => "TRAIT"

compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ class TreePickler(pickler: TastyPickler) {
603603
if (flags is Trait) writeByte(TRAIT)
604604
if (flags is Covariant) writeByte(COVARIANT)
605605
if (flags is Contravariant) writeByte(CONTRAVARIANT)
606+
if (flags is Opaque) writeByte(OPAQUE)
606607
}
607608
sym.annotations.foreach(pickleAnnotation(sym, _))
608609
}

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ class TreeUnpickler(reader: TastyReader,
562562
case OVERRIDE => addFlag(Override)
563563
case INLINE => addFlag(Inline)
564564
case MACRO => addFlag(Macro)
565+
case OPAQUE => addFlag(Opaque)
565566
case STATIC => addFlag(JavaStatic)
566567
case OBJECT => addFlag(Module)
567568
case TRAIT => addFlag(Trait)

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,7 @@ object Parsers {
16401640
case PRIVATE => Mod.Private()
16411641
case PROTECTED => Mod.Protected()
16421642
case SEALED => Mod.Sealed()
1643+
case OPAQUE => Mod.Opaque()
16431644
}
16441645

16451646
/** Drop `private' modifier when followed by a qualifier.

compiler/src/dotty/tools/dotc/parsing/Tokens.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ object Tokens extends TokensCommon {
177177
final val FORSOME = 61; enter(FORSOME, "forSome") // TODO: deprecate
178178
final val INLINE = 62; enter(INLINE, "inline")
179179
final val ENUM = 63; enter(ENUM, "enum")
180+
final val OPAQUE = 64; enter(OPAQUE, "opaque")
180181

181182
/** special symbols */
182183
final val NEWLINE = 78; enter(NEWLINE, "end of statement", "new line")
@@ -197,7 +198,7 @@ object Tokens extends TokensCommon {
197198
/** XML mode */
198199
final val XMLSTART = 96; enter(XMLSTART, "$XMLSTART$<") // TODO: deprecate
199200

200-
final val alphaKeywords = tokenRange(IF, ENUM)
201+
final val alphaKeywords = tokenRange(IF, OPAQUE)
201202
final val symbolicKeywords = tokenRange(USCORE, VIEWBOUND)
202203
final val symbolicTokens = tokenRange(COMMA, VIEWBOUND)
203204
final val keywords = alphaKeywords | symbolicKeywords
@@ -225,7 +226,7 @@ object Tokens extends TokensCommon {
225226
final val defIntroTokens = templateIntroTokens | dclIntroTokens
226227

227228
final val localModifierTokens = BitSet(
228-
ABSTRACT, FINAL, SEALED, IMPLICIT, INLINE, LAZY)
229+
ABSTRACT, FINAL, SEALED, IMPLICIT, INLINE, LAZY, OPAQUE)
229230

230231
final val accessModifierTokens = BitSet(
231232
PRIVATE, PROTECTED)

docs/docs/internals/syntax.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ LocalModifier ::= ‘abstract’
285285
| ‘sealed’
286286
| ‘implicit’
287287
| ‘lazy’
288+
| ‘opaque’
288289
AccessModifier ::= (‘private’ | ‘protected’) [AccessQualifier]
289290
AccessQualifier ::= ‘[’ (id | ‘this’) ‘]’
290291

0 commit comments

Comments
 (0)