@@ -773,7 +773,7 @@ class JSCodeGen()(using genCtx: Context) {
773
773
// Generate the fields of a class ------------------------------------------
774
774
775
775
/** Gen definitions for the fields of a class. */
776
- private def genClassFields (td : TypeDef ): List [js.AnyFieldDef ] = {
776
+ private def genClassFields (td : TypeDef ): List [js.MemberDef ] = {
777
777
val classSym = td.symbol.asClass
778
778
assert(currentClassSym.get == classSym,
779
779
" genClassFields called with a ClassDef other than the current one" )
@@ -785,19 +785,37 @@ class JSCodeGen()(using genCtx: Context) {
785
785
! f.isOneOf(Method | Module ) && f.isTerm
786
786
&& ! f.hasAnnotation(jsdefn.JSNativeAnnot )
787
787
&& ! f.hasAnnotation(jsdefn.JSOptionalAnnot )
788
- }.map ({ f =>
788
+ }.flatMap ({ f =>
789
789
implicit val pos = f.span
790
790
791
- val flags = js.MemberFlags .empty.withMutable(f.is(Mutable ))
791
+ val isStaticField = f.is(JavaStatic ).ensuring(isStatic => ! (isStatic && isJSClass))
792
+
793
+ val namespace = if isStaticField then js.MemberNamespace .PublicStatic else js.MemberNamespace .Public
794
+ val mutable = isStaticField || f.is(Mutable )
795
+
796
+ val flags = js.MemberFlags .empty.withMutable(mutable).withNamespace(namespace)
792
797
793
798
val irTpe =
794
799
if (isJSClass) genExposedFieldIRType(f)
795
800
else toIRType(f.info)
796
801
797
802
if (isJSClass && f.isJSExposed)
798
- js.JSFieldDef (flags, genExpr(f.jsName)(f.sourcePos), irTpe)
803
+ js.JSFieldDef (flags, genExpr(f.jsName)(f.sourcePos), irTpe) :: Nil
799
804
else
800
- js.FieldDef (flags, encodeFieldSym(f), originalNameOfField(f), irTpe)
805
+ val fieldDef = js.FieldDef (flags, encodeFieldSym(f), originalNameOfField(f), irTpe)
806
+ val rest =
807
+ if isStaticField then
808
+ val className = encodeClassName(classSym)
809
+ val body = js.Block (
810
+ js.LoadModule (className),
811
+ js.SelectStatic (className, encodeFieldSym(f))(toIRType(f.info)))
812
+ js.MethodDef (js.MemberFlags .empty.withNamespace(js.MemberNamespace .PublicStatic ),
813
+ encodeStaticMemberSym(f), originalNameOfField(f), Nil , toIRType(f.info),
814
+ Some (body))(
815
+ OptimizerHints .empty, None ) :: Nil
816
+ else
817
+ Nil
818
+ fieldDef :: rest
801
819
}).toList
802
820
}
803
821
@@ -1433,8 +1451,6 @@ class JSCodeGen()(using genCtx: Context) {
1433
1451
1434
1452
case Assign (lhs0, rhs) =>
1435
1453
val sym = lhs0.symbol
1436
- if (sym.is(JavaStaticTerm ))
1437
- throw new FatalError (s " Assignment to static member ${sym.fullName} not supported " )
1438
1454
def genRhs = genExpr(rhs)
1439
1455
val lhs = lhs0 match {
1440
1456
case lhs : Ident => desugarIdent(lhs).getOrElse(lhs)
@@ -3899,8 +3915,13 @@ class JSCodeGen()(using genCtx: Context) {
3899
3915
3900
3916
(f, true)
3901
3917
} else*/ {
3902
- val f = js.Select (qual, encodeClassName(sym.owner),
3903
- encodeFieldSym(sym))(toIRType(sym.info))
3918
+ val f =
3919
+ if sym.is(JavaStatic ) then
3920
+ js.SelectStatic (encodeClassName(sym.owner),
3921
+ encodeFieldSym(sym))(toIRType(sym.info))
3922
+ else
3923
+ js.Select (qual, encodeClassName(sym.owner),
3924
+ encodeFieldSym(sym))(toIRType(sym.info))
3904
3925
3905
3926
(f, false )
3906
3927
}
0 commit comments