Skip to content

Commit d8a6f1c

Browse files
committed
Parsing and pickling of opaque types
1 parent 30569eb commit d8a6f1c

File tree

8 files changed

+43
-27
lines changed

8 files changed

+43
-27
lines changed

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

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

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

125+
case class Opaque() extends Mod(Flags.Opaque)
126+
125127
case class Override() extends Mod(Flags.Override)
126128

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

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,14 @@ object Flags {
250250

251251
final val AccessorOrSealed: FlagSet = Accessor.toCommonFlags
252252

253-
/** A mutable var */
253+
/** A mutable var */
254254
final val Mutable: FlagSet = termFlag(12, "mutable")
255255

256+
/** An opqaue type */
257+
final val Opaque: FlagSet = typeFlag(12, "opaque")
258+
259+
final val MutableOrOpaque: FlagSet = Mutable.toCommonFlags
260+
256261
/** Symbol is local to current class (i.e. private[this] or protected[this]
257262
* pre: Private or Protected are also set
258263
*/
@@ -263,7 +268,7 @@ object Flags {
263268
*/
264269
final val ParamAccessor: FlagSet = termFlag(14, "<paramaccessor>")
265270

266-
/** A value or class implementing a module */
271+
/** A value or class implementing a module */
267272
final val Module: FlagSet = commonFlag(15, "module")
268273
final val ModuleVal: FlagSet = Module.toTermFlags
269274
final val ModuleClass: FlagSet = Module.toTypeFlags
@@ -439,7 +444,7 @@ object Flags {
439444
commonFlags(Private, Protected, Final, Case, Implicit, Override, JavaStatic)
440445

441446
final val TypeSourceModifierFlags: FlagSet =
442-
CommonSourceModifierFlags.toTypeFlags | Abstract | Sealed
447+
CommonSourceModifierFlags.toTypeFlags | Abstract | Sealed | Opaque
443448

444449
final val TermSourceModifierFlags: FlagSet =
445450
CommonSourceModifierFlags.toTermFlags | Inline | AbsOverride | Lazy | Erased
@@ -459,7 +464,7 @@ object Flags {
459464
final val FromStartFlags: FlagSet =
460465
Module | Package | Deferred | Method.toCommonFlags |
461466
HigherKinded.toCommonFlags | Param | ParamAccessor.toCommonFlags |
462-
Scala2ExistentialCommon | Mutable.toCommonFlags | Touched | JavaStatic |
467+
Scala2ExistentialCommon | MutableOrOpaque | Touched | JavaStatic |
463468
CovariantOrOuter | ContravariantOrLabel | CaseAccessor.toCommonFlags |
464469
NonMember | ImplicitCommon | Permanent | Synthetic |
465470
SuperAccessorOrScala2x | Inline

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
ERASED
184184
LAZY
185185
OVERRIDE
186+
OPAQUE
186187
INLINE
187188
MACRO // inline method containing toplevel splices
188189
INLINEPROXY // symbol of binding representing an inline parameter
@@ -309,7 +310,8 @@ object TastyFormat {
309310
final val STABLE = 33
310311
final val MACRO = 34
311312
final val ERASED = 35
312-
final val PARAMsetter = 36
313+
final val OPAQUE = 36
314+
final val PARAMsetter = 37
313315

314316
// Cat. 2: tag Nat
315317

@@ -464,6 +466,7 @@ object TastyFormat {
464466
| INLINE
465467
| INLINEPROXY
466468
| MACRO
469+
| OPAQUE
467470
| STATIC
468471
| OBJECT
469472
| TRAIT
@@ -522,6 +525,7 @@ object TastyFormat {
522525
case INLINE => "INLINE"
523526
case INLINEPROXY => "INLINEPROXY"
524527
case MACRO => "MACRO"
528+
case OPAQUE => "OPAQUE"
525529
case STATIC => "STATIC"
526530
case OBJECT => "OBJECT"
527531
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
@@ -646,6 +646,7 @@ class TreePickler(pickler: TastyPickler) {
646646
if (flags is Trait) writeByte(TRAIT)
647647
if (flags is Covariant) writeByte(COVARIANT)
648648
if (flags is Contravariant) writeByte(CONTRAVARIANT)
649+
if (flags is Opaque) writeByte(OPAQUE)
649650
}
650651
}
651652

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ class TreeUnpickler(reader: TastyReader,
598598
case INLINE => addFlag(Inline)
599599
case INLINEPROXY => addFlag(InlineProxy)
600600
case MACRO => addFlag(Macro)
601+
case OPAQUE => addFlag(Opaque)
601602
case STATIC => addFlag(JavaStatic)
602603
case OBJECT => addFlag(Module)
603604
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
@@ -1744,6 +1744,7 @@ object Parsers {
17441744
case PRIVATE => Mod.Private()
17451745
case PROTECTED => Mod.Protected()
17461746
case SEALED => Mod.Sealed()
1747+
case OPAQUE => Mod.Opaque()
17471748
case IDENTIFIER if name == nme.INLINEkw => Mod.Inline()
17481749
}
17491750

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

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ abstract class TokensCommon {
9393
//final val FORSOME = 61; enter(FORSOME, "forSome") // TODO: deprecate
9494
//final val ENUM = 62; enter(ENUM, "enum")
9595
//final val ERASED = 63; enter(ERASED, "erased")
96+
//final val OPAQUE = 64; enter(OPAQUE, "opaque")
9697

9798
/** special symbols */
9899
final val COMMA = 70; enter(COMMA, "','")
@@ -152,7 +153,7 @@ object Tokens extends TokensCommon {
152153

153154
final val BACKQUOTED_IDENT = 13; enter(BACKQUOTED_IDENT, "identifier", "backquoted ident")
154155

155-
final val identifierTokens: BitSet = BitSet(IDENTIFIER, BACKQUOTED_IDENT)
156+
final val identifierTokens: TokenSet = BitSet(IDENTIFIER, BACKQUOTED_IDENT)
156157

157158
def isIdentifier(token : Int): Boolean =
158159
token >= IDENTIFIER && token <= BACKQUOTED_IDENT
@@ -177,6 +178,7 @@ object Tokens extends TokensCommon {
177178
final val FORSOME = 61; enter(FORSOME, "forSome") // TODO: deprecate
178179
final val ENUM = 62; enter(ENUM, "enum")
179180
final val ERASED = 63; enter(ERASED, "erased")
181+
final val OPAQUE = 64; enter(OPAQUE, "opaque")
180182

181183
/** special symbols */
182184
final val NEWLINE = 78; enter(NEWLINE, "end of statement", "new line")
@@ -197,52 +199,52 @@ object Tokens extends TokensCommon {
197199
/** XML mode */
198200
final val XMLSTART = 96; enter(XMLSTART, "$XMLSTART$<") // TODO: deprecate
199201

200-
final val alphaKeywords: TokenSet = tokenRange(IF, ERASED)
202+
final val alphaKeywords: TokenSet = tokenRange(IF, OPAQUE)
201203
final val symbolicKeywords: TokenSet = tokenRange(USCORE, VIEWBOUND)
202204
final val symbolicTokens: TokenSet = tokenRange(COMMA, VIEWBOUND)
203-
final val keywords: BitSet = alphaKeywords | symbolicKeywords
205+
final val keywords: TokenSet = alphaKeywords | symbolicKeywords
204206

205207
final val allTokens: TokenSet = tokenRange(minToken, maxToken)
206208

207-
final val simpleLiteralTokens: BitSet = tokenRange(CHARLIT, STRINGLIT) | BitSet(TRUE, FALSE, SYMBOLLIT)
208-
final val literalTokens: BitSet = simpleLiteralTokens | BitSet(INTERPOLATIONID, NULL)
209+
final val simpleLiteralTokens: TokenSet = tokenRange(CHARLIT, STRINGLIT) | BitSet(TRUE, FALSE, SYMBOLLIT)
210+
final val literalTokens: TokenSet = simpleLiteralTokens | BitSet(INTERPOLATIONID, NULL)
209211

210-
final val atomicExprTokens: BitSet = literalTokens | identifierTokens | BitSet(
212+
final val atomicExprTokens: TokenSet = literalTokens | identifierTokens | BitSet(
211213
USCORE, NULL, THIS, SUPER, TRUE, FALSE, RETURN, XMLSTART)
212214

213-
final val canStartExpressionTokens: BitSet = atomicExprTokens | BitSet(
215+
final val canStartExpressionTokens: TokenSet = atomicExprTokens | BitSet(
214216
LBRACE, LPAREN, QBRACE, QPAREN, IF, DO, WHILE, FOR, NEW, TRY, THROW)
215217

216-
final val canStartTypeTokens: BitSet = literalTokens | identifierTokens | BitSet(
218+
final val canStartTypeTokens: TokenSet = literalTokens | identifierTokens | BitSet(
217219
THIS, SUPER, USCORE, LPAREN, AT)
218220

219-
final val canStartBindingTokens: BitSet = identifierTokens | BitSet(USCORE, LPAREN)
221+
final val canStartBindingTokens: TokenSet = identifierTokens | BitSet(USCORE, LPAREN)
220222

221-
final val templateIntroTokens: BitSet = BitSet(CLASS, TRAIT, OBJECT, ENUM, CASECLASS, CASEOBJECT)
223+
final val templateIntroTokens: TokenSet = BitSet(CLASS, TRAIT, OBJECT, ENUM, CASECLASS, CASEOBJECT)
222224

223-
final val dclIntroTokens: BitSet = BitSet(DEF, VAL, VAR, TYPE)
225+
final val dclIntroTokens: TokenSet = BitSet(DEF, VAL, VAR, TYPE)
224226

225-
final val defIntroTokens: BitSet = templateIntroTokens | dclIntroTokens
227+
final val defIntroTokens: TokenSet = templateIntroTokens | dclIntroTokens
226228

227-
final val localModifierTokens: BitSet = BitSet(
228-
ABSTRACT, FINAL, SEALED, IMPLICIT, LAZY, ERASED)
229+
final val localModifierTokens: TokenSet = BitSet(
230+
ABSTRACT, FINAL, SEALED, IMPLICIT, LAZY, ERASED, OPAQUE)
229231

230-
final val accessModifierTokens: BitSet = BitSet(
232+
final val accessModifierTokens: TokenSet = BitSet(
231233
PRIVATE, PROTECTED)
232234

233-
final val modifierTokens: BitSet = localModifierTokens | accessModifierTokens | BitSet(
235+
final val modifierTokens: TokenSet = localModifierTokens | accessModifierTokens | BitSet(
234236
OVERRIDE)
235237

236-
final val modifierTokensOrCase: BitSet = modifierTokens | BitSet(CASE)
238+
final val modifierTokensOrCase: TokenSet = modifierTokens | BitSet(CASE)
237239

238240
/** Is token only legal as start of statement (eof also included)? */
239-
final val mustStartStatTokens: BitSet = defIntroTokens | modifierTokens | BitSet(IMPORT, PACKAGE)
241+
final val mustStartStatTokens: TokenSet = defIntroTokens | modifierTokens | BitSet(IMPORT, PACKAGE)
240242

241-
final val canStartStatTokens: BitSet = canStartExpressionTokens | mustStartStatTokens | BitSet(
243+
final val canStartStatTokens: TokenSet = canStartExpressionTokens | mustStartStatTokens | BitSet(
242244
AT, CASE)
243245

244-
final val canEndStatTokens: BitSet = atomicExprTokens | BitSet(
246+
final val canEndStatTokens: TokenSet = atomicExprTokens | BitSet(
245247
TYPE, RPAREN, RBRACE, RBRACKET)
246248

247-
final val numericLitTokens: BitSet = BitSet(INTLIT, LONGLIT, FLOATLIT, DOUBLELIT)
249+
final val numericLitTokens: TokenSet = BitSet(INTLIT, LONGLIT, FLOATLIT, DOUBLELIT)
248250
}

docs/docs/internals/syntax.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ LocalModifier ::= ‘abstract’
291291
| ‘sealed’
292292
| ‘implicit’
293293
| ‘lazy’
294-
| ‘transparent
294+
| ‘opaque
295295
| ‘inline’
296296
| ‘erased’
297297
AccessModifier ::= (‘private’ | ‘protected’) [AccessQualifier]

0 commit comments

Comments
 (0)