Skip to content

Commit d8ac6cd

Browse files
authored
Merge pull request #6562 from dotty-staging/refactor-flags
Refactor FlagSet
2 parents a225cb2 + 1cf91d1 commit d8ac6cd

File tree

96 files changed

+937
-1062
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+937
-1062
lines changed

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package dotty.tools.backend.jvm
33
import dotty.tools.dotc.ast.tpd
44
import dotty.tools.dotc.ast.Trees
55
import dotty.tools.dotc
6-
import dotty.tools.dotc.core.Flags.{termFlagSet, termFlagConjunction}
6+
import dotty.tools.dotc.core.Flags.{termFlagSet}
77
import dotty.tools.dotc.transform.{Erasure, GenericSignatures}
88
import dotty.tools.dotc.transform.SymUtils._
99
import java.io.{File => _}
@@ -256,12 +256,12 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
256256
case t: TypeApply if (t.fun.symbol == Predef_classOf) =>
257257
av.visit(name, t.args.head.tpe.classSymbol.denot.info.toTypeKind(bcodeStore)(innerClasesStore).toASMType)
258258
case t: tpd.RefTree =>
259-
if (t.symbol.denot.owner.is(Flags.JavaEnum)) {
259+
if (t.symbol.denot.owner.isAllOf(Flags.JavaEnumTrait)) {
260260
val edesc = innerClasesStore.typeDescriptor(t.tpe.asInstanceOf[bcodeStore.int.Type]) // the class descriptor of the enumeration class.
261261
val evalue = t.symbol.name.mangledString // value the actual enumeration value.
262262
av.visitEnum(name, edesc, evalue)
263263
} else {
264-
// println(i"not an enum: ${t.symbol} / ${t.symbol.denot.owner} / ${t.symbol.denot.owner.isTerm} / ${t.symbol.denot.owner.flags}")
264+
// println(i"not an enum: ${t.symbol} / ${t.symbol.denot.owner} / ${t.symbol.denot.owner.isTerm} / ${t.symbol.denot.owner.flagsString}")
265265
assert(toDenot(t.symbol).name.is(DefaultGetterName),
266266
s"${toDenot(t.symbol).name.debugString}") // this should be default getter. do not emit.
267267
}
@@ -477,7 +477,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
477477
// unrelated change.
478478
ctx.base.settings.YnoGenericSig.value
479479
|| sym.is(Flags.Artifact)
480-
|| sym.is(Flags.LiftedMethod)
480+
|| sym.isAllOf(Flags.LiftedMethod)
481481
|| sym.is(Flags.Bridge)
482482
)
483483

@@ -658,50 +658,49 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
658658
def isConstructor: Boolean = toDenot(sym).isConstructor
659659
def isExpanded: Boolean = sym.name.is(ExpandedName)
660660
def isAnonymousFunction: Boolean = toDenot(sym).isAnonymousFunction
661-
def isMethod: Boolean = sym is Flags.Method
662-
def isPublic: Boolean = sym.flags.is(Flags.EmptyFlags, Flags.Private | Flags.Protected)
663-
def isSynthetic: Boolean = sym is Flags.Synthetic
664-
def isPackageClass: Boolean = sym is Flags.PackageClass
665-
def isModuleClass: Boolean = sym is Flags.ModuleClass
666-
def isModule: Boolean = sym is Flags.Module
661+
def isMethod: Boolean = sym.is(Flags.Method)
662+
def isPublic: Boolean = !sym.flags.isOneOf(Flags.Private | Flags.Protected)
663+
def isSynthetic: Boolean = sym.is(Flags.Synthetic)
664+
def isPackageClass: Boolean = sym.is(Flags.PackageClass)
665+
def isModuleClass: Boolean = sym.is(Flags.ModuleClass)
666+
def isModule: Boolean = sym.is(Flags.Module)
667667
def isStrictFP: Boolean = false // todo: implement
668-
def isLabel: Boolean = sym is Flags.Label
669-
def hasPackageFlag: Boolean = sym is Flags.Package
670-
def isInterface: Boolean = (sym is Flags.PureInterface) || (sym is Flags.Trait)
668+
def isLabel: Boolean = sym.is(Flags.Label)
669+
def hasPackageFlag: Boolean = sym.is(Flags.Package)
670+
def isInterface: Boolean = (sym.is(Flags.PureInterface)) || (sym.is(Flags.Trait))
671671
def isGetter: Boolean = toDenot(sym).isGetter
672672
def isSetter: Boolean = toDenot(sym).isSetter
673673
def isGetClass: Boolean = sym eq defn.Any_getClass
674-
def isJavaDefined: Boolean = sym is Flags.JavaDefined
675-
def isJavaDefaultMethod: Boolean = !((sym is Flags.Deferred) || toDenot(sym).isClassConstructor)
676-
def isDeferred: Boolean = sym is Flags.Deferred
677-
def isPrivate: Boolean = sym is Flags.Private
674+
def isJavaDefined: Boolean = sym.is(Flags.JavaDefined)
675+
def isJavaDefaultMethod: Boolean = !((sym.is(Flags.Deferred)) || toDenot(sym).isClassConstructor)
676+
def isDeferred: Boolean = sym.is(Flags.Deferred)
677+
def isPrivate: Boolean = sym.is(Flags.Private)
678678
def getsJavaFinalFlag: Boolean =
679-
isFinal && !toDenot(sym).isClassConstructor && !(sym is Flags.Mutable) && !(sym.enclosingClass is Flags.Trait)
679+
isFinal && !toDenot(sym).isClassConstructor && !(sym.is(Flags.Mutable)) && !(sym.enclosingClass.is(Flags.Trait))
680680

681681
def getsJavaPrivateFlag: Boolean =
682682
isPrivate //|| (sym.isPrimaryConstructor && sym.owner.isTopLevelModuleClass)
683683

684-
def isFinal: Boolean = sym is Flags.Final
684+
def isFinal: Boolean = sym.is(Flags.Final)
685685
def isStaticMember: Boolean = (sym ne NoSymbol) &&
686-
((sym is Flags.JavaStatic) || toDenot(sym).hasAnnotation(ctx.definitions.ScalaStaticAnnot))
686+
(sym.is(Flags.JavaStatic) || toDenot(sym).hasAnnotation(ctx.definitions.ScalaStaticAnnot))
687687
// guard against no sumbol cause this code is executed to select which call type(static\dynamic) to use to call array.clone
688688

689689
def isBottomClass: Boolean = (sym ne defn.NullClass) && (sym ne defn.NothingClass)
690-
def isBridge: Boolean = sym is Flags.Bridge
691-
def isArtifact: Boolean = sym is Flags.Artifact
692-
def hasEnumFlag: Boolean = sym is Flags.JavaEnum
690+
def isBridge: Boolean = sym.is(Flags.Bridge)
691+
def isArtifact: Boolean = sym.is(Flags.Artifact)
692+
def hasEnumFlag: Boolean = sym.isAllOf(Flags.JavaEnumTrait)
693693
def hasAccessBoundary: Boolean = sym.accessBoundary(defn.RootClass) ne defn.RootClass
694-
def isVarargsMethod: Boolean = sym is Flags.JavaVarargs
694+
def isVarargsMethod: Boolean = sym.is(Flags.JavaVarargs)
695695
def isDeprecated: Boolean = false
696-
def isMutable: Boolean = sym is Flags.Mutable
697-
def hasAbstractFlag: Boolean =
698-
(sym is Flags.Abstract) || (sym is Flags.JavaInterface) || (sym is Flags.Trait)
699-
def hasModuleFlag: Boolean = sym is Flags.Module
700-
def isSynchronized: Boolean = sym is Flags.Synchronized
696+
def isMutable: Boolean = sym.is(Flags.Mutable)
697+
def hasAbstractFlag: Boolean = sym.isOneOf(Flags.AbstractOrTrait)
698+
def hasModuleFlag: Boolean = sym.is(Flags.Module)
699+
def isSynchronized: Boolean = sym.is(Flags.Synchronized)
701700
def isNonBottomSubClass(other: Symbol): Boolean = sym.derivesFrom(other)
702701
def hasAnnotation(ann: Symbol): Boolean = toDenot(sym).hasAnnotation(ann)
703702
def shouldEmitForwarders: Boolean =
704-
(sym is Flags.Module) && sym.isStatic
703+
(sym.is(Flags.Module)) && sym.isStatic
705704
def isJavaEntryPoint: Boolean = CollectEntryPoints.isJavaEntryPoint(sym)
706705
def isEnum = sym.is(Flags.Enum)
707706

@@ -713,7 +712,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
713712
* for such objects will get a MODULE$ flag and a corresponding static initializer.
714713
*/
715714
def isStaticModuleClass: Boolean =
716-
(sym is Flags.Module) && {
715+
(sym.is(Flags.Module)) && {
717716
// scalac uses atPickling here
718717
// this would not work if modules are created after pickling
719718
// for example by specialization
@@ -736,7 +735,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
736735
def superClass: Symbol = {
737736
val t = toDenot(sym).asClass.superClass
738737
if (t.exists) t
739-
else if (sym is Flags.ModuleClass) {
738+
else if (sym.is(Flags.ModuleClass)) {
740739
// workaround #371
741740

742741
println(s"Warning: mocking up superclass for $sym")
@@ -749,7 +748,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
749748
def linkedClass: Symbol = toDenot(sym)(ctx).linkedClass(ctx) //exitingPickler(sym.linkedClassOfClass)
750749
def companionClass: Symbol = toDenot(sym).companionClass
751750
def companionModule: Symbol = toDenot(sym).companionModule
752-
def companionSymbol: Symbol = if (sym is Flags.Module) companionClass else companionModule
751+
def companionSymbol: Symbol = if (sym.is(Flags.Module)) companionClass else companionModule
753752
def moduleClass: Symbol = toDenot(sym).moduleClass
754753
def enclosingClassSym: Symbol = {
755754
if (this.isClass) {
@@ -859,7 +858,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
859858
implicit def typeHelper(tp: Type): TypeHelper = new TypeHelper {
860859
def member(string: Name): Symbol = tp.member(string.toTermName).symbol
861860

862-
def isFinalType: Boolean = tp.typeSymbol is Flags.Final //in scalac checks for type parameters. Why? Aren't they gone by backend?
861+
def isFinalType: Boolean = tp.typeSymbol.is(Flags.Final) //in scalac checks for type parameters. Why? Aren't they gone by backend?
863862

864863
def underlying: Type = tp match {
865864
case t: TypeProxy => t.underlying
@@ -881,7 +880,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
881880
def =:=(other: Type): Boolean = tp =:= other
882881

883882
def membersBasedOnFlags(excludedFlags: Flags, requiredFlags: Flags): List[Symbol] =
884-
tp.membersBasedOnFlags(termFlagConjunction(requiredFlags), termFlagSet(excludedFlags)).map(_.symbol).toList
883+
tp.membersBasedOnFlags(termFlagSet(requiredFlags), termFlagSet(excludedFlags)).map(_.symbol).toList
885884

886885
def resultType: Type = tp.resultType
887886

compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ class JSCodeGen()(implicit ctx: Context) {
447447
"genClassFields called with a ClassDef other than the current one")
448448

449449
// Term members that are neither methods nor modules are fields
450-
classSym.info.decls.filter(f => !f.is(Method | Module) && f.isTerm).map({ f =>
450+
classSym.info.decls.filter(f => !f.isOneOf(Method | Module) && f.isTerm).map({ f =>
451451
implicit val pos = f.span
452452

453453
val name =
@@ -540,7 +540,7 @@ class JSCodeGen()(implicit ctx: Context) {
540540
implicit pos: SourcePosition): Option[js.Tree] = {
541541
val ctors =
542542
if (sym.is(Abstract)) Nil
543-
else sym.info.member(nme.CONSTRUCTOR).alternatives.map(_.symbol).filter(m => !m.is(Private | Protected))
543+
else sym.info.member(nme.CONSTRUCTOR).alternatives.map(_.symbol).filter(m => !m.isOneOf(Private | Protected))
544544

545545
if (ctors.isEmpty) {
546546
None

compiler/src/dotty/tools/backend/sjs/JUnitBootstrappers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class JUnitBootstrappers extends MiniPhase {
128128

129129
def isTestClass(sym: Symbol): Boolean = {
130130
sym.isClass &&
131-
!sym.is(ModuleClass | Abstract | Trait) &&
131+
!sym.isOneOf(ModuleClass | Abstract | Trait) &&
132132
hasTests(sym.asClass)
133133
}
134134

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ object desugar {
9090
* in apply/unapply methods.
9191
*/
9292
override def ensureCompletions(implicit ctx: Context): Unit =
93-
if (!(ctx.owner is Package))
93+
if (!ctx.owner.is(Package))
9494
if (ctx.owner.isClass) {
9595
ctx.owner.ensureCompleted()
96-
if (ctx.owner is ModuleClass)
96+
if (ctx.owner.is(ModuleClass))
9797
ctx.owner.linkedClass.ensureCompleted()
9898
}
9999
else ensureCompletions(ctx.outer)
@@ -159,7 +159,7 @@ object desugar {
159159
val vdef @ ValDef(name, tpt, rhs) = transformQuotedPatternName(vdef0)
160160
val mods = vdef.mods
161161
val setterNeeded =
162-
(mods is Mutable) && ctx.owner.isClass && (!(mods is PrivateLocal) || (ctx.owner is Trait))
162+
mods.is(Mutable) && ctx.owner.isClass && (!mods.isAllOf(PrivateLocal) || ctx.owner.is(Trait))
163163
if (setterNeeded) {
164164
// TODO: copy of vdef as getter needed?
165165
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
@@ -174,15 +174,15 @@ object desugar {
174174
vparamss = (setterParam :: Nil) :: Nil,
175175
tpt = TypeTree(defn.UnitType),
176176
rhs = setterRhs
177-
).withMods((mods | Accessor) &~ (CaseAccessor | ImplicitOrGiven | Lazy))
177+
).withMods((mods | Accessor) &~ (CaseAccessor | GivenOrImplicit | Lazy))
178178
Thicket(vdef, setter)
179179
}
180180
else vdef
181181
}
182182

183183
def makeImplicitParameters(tpts: List[Tree], implicitFlag: FlagSet, forPrimaryConstructor: Boolean = false)(implicit ctx: Context): List[ValDef] =
184184
for (tpt <- tpts) yield {
185-
val paramFlags: FlagSet = if (forPrimaryConstructor) PrivateLocalParamAccessor else Param
185+
val paramFlags: FlagSet = if (forPrimaryConstructor) LocalParamAccessor else Param
186186
val epname = EvidenceParamName.fresh()
187187
ValDef(epname, tpt, EmptyTree).withFlags(paramFlags | implicitFlag)
188188
}
@@ -323,7 +323,7 @@ object desugar {
323323
meth
324324
case evidenceParams =>
325325
val vparamss1 = meth.vparamss.reverse match {
326-
case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods is ImplicitOrGiven =>
326+
case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods.isOneOf(GivenOrImplicit) =>
327327
((evidenceParams ++ vparams) :: rvparamss).reverse
328328
case _ =>
329329
meth.vparamss :+ evidenceParams
@@ -334,7 +334,7 @@ object desugar {
334334
/** The implicit evidence parameters of `meth`, as generated by `desugar.defDef` */
335335
private def evidenceParams(meth: DefDef)(implicit ctx: Context): List[ValDef] =
336336
meth.vparamss.reverse match {
337-
case (vparams @ (vparam :: _)) :: _ if vparam.mods is ImplicitOrGiven =>
337+
case (vparams @ (vparam :: _)) :: _ if vparam.mods.isOneOf(GivenOrImplicit) =>
338338
vparams.dropWhile(!_.name.is(EvidenceParamName))
339339
case _ =>
340340
Nil
@@ -345,7 +345,7 @@ object desugar {
345345
private def toDefParam(tparam: TypeDef): TypeDef =
346346
tparam.withMods(tparam.rawMods & EmptyFlags | Param)
347347
private def toDefParam(vparam: ValDef): ValDef =
348-
vparam.withMods(vparam.rawMods & (ImplicitOrGiven | Erased) | Param)
348+
vparam.withMods(vparam.rawMods & (GivenOrImplicit | Erased) | Param)
349349

350350
/** The expansion of a class definition. See inline comments for what is involved */
351351
def classDef(cdef: TypeDef)(implicit ctx: Context): Tree = {
@@ -413,7 +413,7 @@ object desugar {
413413
if (isCaseClass && originalTparams.isEmpty)
414414
ctx.error(CaseClassMissingParamList(cdef), namePos)
415415
ListOfNil
416-
} else if (isCaseClass && originalVparamss.head.exists(_.mods.is(ImplicitOrGiven))) {
416+
} else if (isCaseClass && originalVparamss.head.exists(_.mods.isOneOf(GivenOrImplicit))) {
417417
ctx.error("Case classes should have a non-implicit parameter list", namePos)
418418
ListOfNil
419419
}
@@ -444,7 +444,7 @@ object desugar {
444444
if (enumCases.isEmpty)
445445
ctx.error("Enumerations must constain at least one case", namePos)
446446
val enumCompanionRef = new TermRefTree()
447-
val enumImport = Import(importImplied = false, enumCompanionRef, enumCases.flatMap(caseIds))
447+
val enumImport = Import(importDelegate = false, enumCompanionRef, enumCases.flatMap(caseIds))
448448
(enumImport :: enumStats, enumCases, enumCompanionRef)
449449
}
450450
else (stats, Nil, EmptyTree)
@@ -508,7 +508,7 @@ object desugar {
508508
// new C[Ts](paramss)
509509
lazy val creatorExpr = {
510510
val vparamss = constrVparamss match {
511-
case (vparam :: _) :: _ if vparam.mods.is(ImplicitOrGiven) => // add a leading () to match class parameters
511+
case (vparam :: _) :: _ if vparam.mods.isOneOf(GivenOrImplicit) => // add a leading () to match class parameters
512512
Nil :: constrVparamss
513513
case _ =>
514514
constrVparamss
@@ -658,7 +658,7 @@ object desugar {
658658
def widenedCreatorExpr =
659659
(creatorExpr /: widenDefs)((rhs, meth) => Apply(Ident(meth.name), rhs :: Nil))
660660
val applyMeths =
661-
if (mods is Abstract) Nil
661+
if (mods.is(Abstract)) Nil
662662
else {
663663
val copiedFlagsMask = DefaultParameterized | (copiedAccessFlags & Private)
664664
val appMods = {
@@ -703,9 +703,9 @@ object desugar {
703703
// synthetic implicit C[Ts](p11: T11, ..., p1N: T1N) ... (pM1: TM1, ..., pMN: TMN): C[Ts] =
704704
// new C[Ts](p11, ..., p1N) ... (pM1, ..., pMN) =
705705
val implicitWrappers =
706-
if (!mods.is(ImplicitOrImplied))
706+
if (!mods.isOneOf(DelegateOrImplicit))
707707
Nil
708-
else if (ctx.owner is Package) {
708+
else if (ctx.owner.is(Package)) {
709709
ctx.error(TopLevelImplicitClass(cdef), cdef.sourcePos)
710710
Nil
711711
}
@@ -717,7 +717,7 @@ object desugar {
717717
ctx.error(ImplicitCaseClass(cdef), cdef.sourcePos)
718718
Nil
719719
}
720-
else if (arity != 1 && !mods.is(Implied)) {
720+
else if (arity != 1 && !mods.is(Delegate)) {
721721
ctx.error(ImplicitClassPrimaryConstructorArity(), cdef.sourcePos)
722722
Nil
723723
}
@@ -731,7 +731,7 @@ object desugar {
731731
// implicit wrapper is typechecked in same scope as constructor, so
732732
// we can reuse the constructor parameters; no derived params are needed.
733733
DefDef(className.toTermName, constrTparams, defParamss, classTypeRef, creatorExpr)
734-
.withMods(companionMods | mods.flags.toTermFlags & ImplicitOrImplied | Synthetic | Final)
734+
.withMods(companionMods | mods.flags.toTermFlags & DelegateOrImplicit | Synthetic | Final)
735735
.withSpan(cdef.span) :: Nil
736736
}
737737

@@ -792,7 +792,7 @@ object desugar {
792792
if (mods.is(Final) && !mods.is(Synthetic))
793793
ctx.warning(em"${hl("final")} modifier is redundant for objects", flagSourcePos(Final))
794794

795-
if (mods is Package)
795+
if (mods.is(Package))
796796
PackageDef(Ident(moduleName), cpy.ModuleDef(mdef)(nme.PACKAGE, impl).withMods(mods &~ Package) :: Nil)
797797
else if (isEnumCase) {
798798
typeParamIsReferenced(enumClass.typeParams, Nil, Nil, impl.parents)
@@ -982,7 +982,7 @@ object desugar {
982982
val restDefs =
983983
for (((named, tpt), n) <- vars.zipWithIndex if named.name != nme.WILDCARD)
984984
yield
985-
if (mods is Lazy) derivedDefDef(original, named, tpt, selector(n), mods &~ Lazy)
985+
if (mods.is(Lazy)) derivedDefDef(original, named, tpt, selector(n), mods &~ Lazy)
986986
else derivedValDef(original, named, tpt, selector(n), mods)
987987
flatTree(firstDef :: restDefs)
988988
}
@@ -1016,9 +1016,9 @@ object desugar {
10161016
case tree: MemberDef =>
10171017
var tested: MemberDef = tree
10181018
def fail(msg: String) = ctx.error(msg, tree.sourcePos)
1019-
def checkApplicable(flag: FlagSet, test: MemberDefTest): Unit =
1019+
def checkApplicable(flag: Flag, test: MemberDefTest): Unit =
10201020
if (tested.mods.is(flag) && !test.applyOrElse(tree, (md: MemberDef) => false)) {
1021-
fail(i"modifier `$flag` is not allowed for this definition")
1021+
fail(i"modifier `${flag.flagsString}` is not allowed for this definition")
10221022
tested = tested.withMods(tested.mods.withoutFlags(flag))
10231023
}
10241024
checkApplicable(Opaque, legalOpaque)
@@ -1109,8 +1109,8 @@ object desugar {
11091109
def needsObject(stat: Tree) = stat match {
11101110
case _: ValDef | _: PatDef | _: DefDef | _: Export => true
11111111
case stat: ModuleDef =>
1112-
stat.mods.is(ImplicitOrImplied) || opaqueNames.contains(stat.name.stripModuleClassSuffix.toTypeName)
1113-
case stat: TypeDef => !stat.isClassDef || stat.mods.is(ImplicitOrImplied)
1112+
stat.mods.isOneOf(DelegateOrImplicit) || opaqueNames.contains(stat.name.stripModuleClassSuffix.toTypeName)
1113+
case stat: TypeDef => !stat.isClassDef || stat.mods.isOneOf(DelegateOrImplicit)
11141114
case _ => false
11151115
}
11161116
val (nestedStats, topStats) = pdef.stats.partition(needsObject)

0 commit comments

Comments
 (0)