@@ -28,11 +28,13 @@ import org.scalajs.linker.standard.LinkedClass
28
28
29
29
/** Checker for the validity of the IR. */
30
30
private final class ClassDefChecker (classDef : ClassDef ,
31
- postBaseLinker : Boolean , postOptimizer : Boolean , reporter : ErrorReporter ) {
31
+ previousPhase : CheckingPhase , reporter : ErrorReporter ) {
32
32
import ClassDefChecker ._
33
33
34
34
import reporter .reportError
35
35
36
+ private val featureSet = FeatureSet .allowedAfter(previousPhase)
37
+
36
38
private [this ] val isJLObject = classDef.name.name == ObjectClass
37
39
38
40
private [this ] val instanceThisType : Type = {
@@ -107,7 +109,7 @@ private final class ClassDefChecker(classDef: ClassDef,
107
109
* module classes and JS classes that are never instantiated. The classes
108
110
* may still exist because their class data are accessed.
109
111
*/
110
- if (! postBaseLinker ) {
112
+ if (! featureSet.supports( FeatureSet . OptionalConstructors ) ) {
111
113
/* Check that we have exactly 1 constructor in a module class. This goes
112
114
* together with `checkMethodDef`, which checks that a constructor in a
113
115
* module class must be 0-arg.
@@ -489,7 +491,7 @@ private final class ClassDefChecker(classDef: ClassDef,
489
491
private def checkMethodNameNamespace (name : MethodName , namespace : MemberNamespace )(
490
492
implicit ctx : ErrorContext ): Unit = {
491
493
if (name.isReflectiveProxy) {
492
- if (postBaseLinker ) {
494
+ if (featureSet.supports( FeatureSet . ReflectiveProxies ) ) {
493
495
if (namespace != MemberNamespace .Public )
494
496
reportError(" reflective profixes are only allowed in the public namespace" )
495
497
} else {
@@ -557,7 +559,7 @@ private final class ClassDefChecker(classDef: ClassDef,
557
559
}
558
560
559
561
if (rest.isEmpty) {
560
- if (! postOptimizer )
562
+ if (! featureSet.supports( FeatureSet . RelaxedCtorBodies ) )
561
563
reportError(i " Constructor must contain a delegate constructor call " )
562
564
563
565
val bodyStatsStoreModulesHandled =
@@ -576,7 +578,7 @@ private final class ClassDefChecker(classDef: ClassDef,
576
578
577
579
checkTree(receiver, unrestrictedEnv) // check that the This itself is valid
578
580
579
- if (! postOptimizer ) {
581
+ if (! featureSet.supports( FeatureSet . RelaxedCtorBodies ) ) {
580
582
if (! (cls == classDef.className || classDef.superClass.exists(_.name == cls))) {
581
583
implicit val ctx = ErrorContext (delegateCtorCall)
582
584
reportError(
@@ -597,7 +599,7 @@ private final class ClassDefChecker(classDef: ClassDef,
597
599
implicit ctx : ErrorContext ): List [Tree ] = {
598
600
599
601
if (classDef.kind.hasModuleAccessor) {
600
- if (postOptimizer ) {
602
+ if (featureSet.supports( FeatureSet . RelaxedCtorBodies ) ) {
601
603
/* If the super constructor call was inlined, the StoreModule can be anywhere.
602
604
* Moreover, the optimizer can remove StoreModules altogether in many cases.
603
605
*/
@@ -673,7 +675,7 @@ private final class ClassDefChecker(classDef: ClassDef,
673
675
case Assign (lhs, rhs) =>
674
676
lhs match {
675
677
case Select (This (), field) if env.isThisRestricted =>
676
- if (postOptimizer || field.name.className == classDef.className)
678
+ if (featureSet.supports( FeatureSet . RelaxedCtorBodies ) || field.name.className == classDef.className)
677
679
checkTree(lhs, env.withIsThisRestricted(false ))
678
680
else
679
681
checkTree(lhs, env)
@@ -819,11 +821,13 @@ private final class ClassDefChecker(classDef: ClassDef,
819
821
checkTree(index, env)
820
822
821
823
case RecordSelect (record, _) =>
822
- checkAllowTransients()
824
+ if (! featureSet.supports(FeatureSet .Records ))
825
+ reportError(" invalid use of records" )
823
826
checkTree(record, env)
824
827
825
828
case RecordValue (_, elems) =>
826
- checkAllowTransients()
829
+ if (! featureSet.supports(FeatureSet .Records ))
830
+ reportError(" invalid use of records" )
827
831
checkTrees(elems, env)
828
832
829
833
case IsInstanceOf (expr, testType) =>
@@ -987,7 +991,9 @@ private final class ClassDefChecker(classDef: ClassDef,
987
991
checkTrees(captureValues, env)
988
992
989
993
case Transient (transient) =>
990
- checkAllowTransients()
994
+ if (! featureSet.supports(FeatureSet .OptimizedTransients ))
995
+ reportError(i " invalid transient tree of class ${transient.getClass().getName()}" )
996
+
991
997
transient.traverse(new Traversers .Traverser {
992
998
override def traverse (tree : Tree ): Unit = checkTree(tree, env)
993
999
})
@@ -996,11 +1002,6 @@ private final class ClassDefChecker(classDef: ClassDef,
996
1002
newEnv
997
1003
}
998
1004
999
- private def checkAllowTransients ()(implicit ctx : ErrorContext ): Unit = {
1000
- if (! postOptimizer)
1001
- reportError(" invalid transient tree" )
1002
- }
1003
-
1004
1005
private def checkArrayType (tpe : ArrayType )(
1005
1006
implicit ctx : ErrorContext ): Unit = {
1006
1007
checkArrayTypeRef(tpe.arrayTypeRef)
@@ -1036,13 +1037,13 @@ object ClassDefChecker {
1036
1037
*
1037
1038
* @return Count of IR checking errors (0 in case of success)
1038
1039
*/
1039
- def check (classDef : ClassDef , postBaseLinker : Boolean , postOptimizer : Boolean , logger : Logger ): Int = {
1040
+ def check (classDef : ClassDef , previousPhase : CheckingPhase , logger : Logger ): Int = {
1040
1041
val reporter = new LoggerErrorReporter (logger)
1041
- new ClassDefChecker (classDef, postBaseLinker, postOptimizer , reporter).checkClassDef()
1042
+ new ClassDefChecker (classDef, previousPhase , reporter).checkClassDef()
1042
1043
reporter.errorCount
1043
1044
}
1044
1045
1045
- def check (linkedClass : LinkedClass , postOptimizer : Boolean , logger : Logger ): Int = {
1046
+ def check (linkedClass : LinkedClass , previousPhase : CheckingPhase , logger : Logger ): Int = {
1046
1047
// Rebuild a ClassDef out of the LinkedClass
1047
1048
import linkedClass ._
1048
1049
implicit val pos = linkedClass.pos
@@ -1063,7 +1064,7 @@ object ClassDefChecker {
1063
1064
topLevelExportDefs = Nil
1064
1065
)(optimizerHints)
1065
1066
1066
- check(classDef, postBaseLinker = true , postOptimizer , logger)
1067
+ check(classDef, previousPhase , logger)
1067
1068
}
1068
1069
1069
1070
private class Env (
0 commit comments