@@ -773,7 +773,7 @@ class JSCodeGen()(using genCtx: Context) {
773773 // Generate the fields of a class ------------------------------------------
774774
775775 /** 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 ] = {
777777 val classSym = td.symbol.asClass
778778 assert(currentClassSym.get == classSym,
779779 " genClassFields called with a ClassDef other than the current one" )
@@ -785,19 +785,37 @@ class JSCodeGen()(using genCtx: Context) {
785785 ! f.isOneOf(Method | Module ) && f.isTerm
786786 && ! f.hasAnnotation(jsdefn.JSNativeAnnot )
787787 && ! f.hasAnnotation(jsdefn.JSOptionalAnnot )
788- }.map ({ f =>
788+ }.flatMap ({ f =>
789789 implicit val pos = f.span
790790
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)
792797
793798 val irTpe =
794799 if (isJSClass) genExposedFieldIRType(f)
795800 else toIRType(f.info)
796801
797802 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
799804 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
801819 }).toList
802820 }
803821
@@ -1433,8 +1451,6 @@ class JSCodeGen()(using genCtx: Context) {
14331451
14341452 case Assign (lhs0, rhs) =>
14351453 val sym = lhs0.symbol
1436- if (sym.is(JavaStaticTerm ))
1437- throw new FatalError (s " Assignment to static member ${sym.fullName} not supported " )
14381454 def genRhs = genExpr(rhs)
14391455 val lhs = lhs0 match {
14401456 case lhs : Ident => desugarIdent(lhs).getOrElse(lhs)
@@ -3899,8 +3915,13 @@ class JSCodeGen()(using genCtx: Context) {
38993915
39003916 (f, true)
39013917 } 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))
39043925
39053926 (f, false )
39063927 }
0 commit comments