Skip to content

Commit e181bfc

Browse files
committed
enable static fields on classes
1 parent ff3fa46 commit e181bfc

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

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

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)