Skip to content

Commit 4bb7ba4

Browse files
committed
Parsing and pickling of opaque types
1 parent f4add4a commit 4bb7ba4

File tree

8 files changed

+63
-46
lines changed

8 files changed

+63
-46
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: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ Standard-Section: "ASTs" TopLevelStat*
182182
ERASED
183183
LAZY
184184
OVERRIDE
185+
OPAQUE
185186
INLINE
186187
MACRO // inline method containing toplevel splices
187188
STATIC // mapped to static Java member
@@ -233,7 +234,7 @@ Standard Section: "Comments" Comment*
233234
object TastyFormat {
234235

235236
final val header: Array[Int] = Array(0x5C, 0xA1, 0xAB, 0x1F)
236-
val MajorVersion: Int = 13
237+
val MajorVersion: Int = 11
237238
val MinorVersion: Int = 0
238239

239240
/** Tags used to serialize names */
@@ -286,25 +287,27 @@ object TastyFormat {
286287
final val IMPLICIT = 13
287288
final val LAZY = 14
288289
final val OVERRIDE = 15
289-
final val INLINE = 16
290-
final val STATIC = 17
291-
final val OBJECT = 18
292-
final val TRAIT = 19
293-
final val ENUM = 20
294-
final val LOCAL = 21
295-
final val SYNTHETIC = 22
296-
final val ARTIFACT = 23
297-
final val MUTABLE = 24
298-
final val FIELDaccessor = 25
299-
final val CASEaccessor = 26
300-
final val COVARIANT = 27
301-
final val CONTRAVARIANT = 28
302-
final val SCALA2X = 29
303-
final val DEFAULTparameterized = 30
304-
final val STABLE = 31
305-
final val MACRO = 32
306-
final val ERASED = 33
307-
final val PARAMsetter = 34
290+
final val INLINEPROXY = 16
291+
final val INLINE = 17
292+
final val STATIC = 18
293+
final val OBJECT = 19
294+
final val TRAIT = 20
295+
final val ENUM = 21
296+
final val LOCAL = 22
297+
final val SYNTHETIC = 23
298+
final val ARTIFACT = 24
299+
final val MUTABLE = 25
300+
final val FIELDaccessor = 26
301+
final val CASEaccessor = 27
302+
final val COVARIANT = 28
303+
final val CONTRAVARIANT = 29
304+
final val SCALA2X = 30
305+
final val DEFAULTparameterized = 31
306+
final val STABLE = 32
307+
final val MACRO = 33
308+
final val ERASED = 34
309+
final val OPAQUE = 35
310+
final val PARAMsetter = 36
308311

309312
// Cat. 2: tag Nat
310313

@@ -457,6 +460,7 @@ object TastyFormat {
457460
| OVERRIDE
458461
| INLINE
459462
| MACRO
463+
| OPAQUE
460464
| STATIC
461465
| OBJECT
462466
| TRAIT
@@ -513,6 +517,7 @@ object TastyFormat {
513517
case OVERRIDE => "OVERRIDE"
514518
case INLINE => "INLINE"
515519
case MACRO => "MACRO"
520+
case OPAQUE => "OPAQUE"
516521
case STATIC => "STATIC"
517522
case OBJECT => "OBJECT"
518523
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
@@ -634,6 +634,7 @@ class TreePickler(pickler: TastyPickler) {
634634
if (flags is Trait) writeByte(TRAIT)
635635
if (flags is Covariant) writeByte(COVARIANT)
636636
if (flags is Contravariant) writeByte(CONTRAVARIANT)
637+
if (flags is Opaque) writeByte(OPAQUE)
637638
}
638639
}
639640

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ class TreeUnpickler(reader: TastyReader,
605605
case OVERRIDE => addFlag(Override)
606606
case INLINE => addFlag(Inline)
607607
case MACRO => addFlag(Macro)
608+
case OPAQUE => addFlag(Opaque)
608609
case STATIC => addFlag(JavaStatic)
609610
case OBJECT => addFlag(Module)
610611
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)