[WASM] ~~ Progress
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
index 2a0666d..320347d 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ast/WasmAst.kt
@@ -51,6 +51,33 @@
     }
 }
 
+class WasmGetGlobal(val name: String): WasmInstruction() {
+    override fun toWat(ident: String): String {
+        return "$ident(get_global $$name)"
+    }
+}
+
+class WasmSetGlobal(
+    val name: String,
+    val instruction: WasmInstruction
+): WasmInstruction() {
+    override fun toWat(ident: String): String {
+        return "$ident(set_global $$name ${instruction.toWat("")})"
+    }
+}
+
+class WasmSetLocal(
+    val name: String,
+    val instruction: WasmInstruction
+): WasmInstruction() {
+    override fun toWat(ident: String): String {
+        return "$ident(set_local $$name ${instruction.toWat("")})"
+    }
+}
+
+
+
+
 sealed class WasmConst<KotlinType, WasmType : WasmValueType>(
     val value: KotlinType,
     val type: WasmType
@@ -75,12 +102,25 @@
         "(param $$name $type)"
 }
 
+class WasmGlobal(
+    val name: String,
+    val type: WasmValueType,
+    val isMutable: Boolean,
+    val init: WasmInstruction?
+): WasmModuleField() {
+    override fun toWat(): String {
+        val watMut = if (isMutable) "mut " else ""
+        val watInit = if (init != null) " " + init.toWat("") else ""
+        return "(global $$name ($watMut$type) $watInit)"
+    }
+}
+
+
 class WasmLocal
 class WasmBody {
     fun toWat(): String = "TODO: Body"
 }
 class WasmImport
-class WasmGlobal
 
 enum class WasmExportKind(val identifier: String) {
     FUNCTION("func"),
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
index 276fbc0..c114db2 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrDeclarationToWasmTransformer.kt
@@ -7,8 +7,7 @@
 
 import org.jetbrains.kotlin.backend.wasm.ast.*
 import org.jetbrains.kotlin.ir.declarations.*
-import org.jetbrains.kotlin.ir.types.IrType
-import org.jetbrains.kotlin.ir.types.isInt
+import org.jetbrains.kotlin.ir.types.*
 import org.jetbrains.kotlin.ir.util.isAnnotationClass
 
 @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
@@ -34,7 +33,15 @@
     }
 
     override fun visitField(declaration: IrField, context: WasmStaticContext): List<WasmModuleField> {
-        TODO()
+        val global = WasmGlobal(
+            name = context.getNameForField(declaration).ident,
+            type = context.transformType(declaration.type),
+            isMutable = true,
+            init = declaration.initializer?.let {
+                expressionToWasmInstruction(it.expression, context)
+            }
+        )
+        return listOf(global)
     }
 }
 
@@ -46,6 +53,13 @@
 
 fun WasmStaticContext.transformType(irType: IrType): WasmValueType =
     when {
+        irType.isBoolean() -> WasmI32
+        irType.isByte() -> WasmI32
+        irType.isShort() -> WasmI32
         irType.isInt() -> WasmI32
+        irType.isLong() -> WasmI64
+        irType.isChar() -> WasmI32
+        irType.isFloat() -> WasmF32
+        irType.isDouble() -> WasmF64
         else -> TODO()
     }
\ No newline at end of file
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
index 79f3aa3..d3cb9cc 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/codegen/IrElementToWasmExpressionTransformer.kt
@@ -7,6 +7,8 @@
 
 import org.jetbrains.kotlin.backend.wasm.ast.*
 import org.jetbrains.kotlin.ir.backend.js.utils.IrNamer
+import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
+import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
 import org.jetbrains.kotlin.ir.expressions.*
 
 class IrElementToWasmExpressionTransformer : BaseIrElementToWasmNodeTransformer<WasmInstruction, IrNamer> {
@@ -41,7 +43,11 @@
     }
 
     override fun visitGetField(expression: IrGetField, data: IrNamer): WasmInstruction {
-        TODO()
+        val fieldName = data.getNameForField(expression.symbol.owner).ident
+        if (expression.receiver != null)
+            TODO("Support member fields")
+
+        return WasmGetGlobal(fieldName)
     }
 
     override fun visitGetValue(expression: IrGetValue, data: IrNamer): WasmInstruction =
@@ -52,18 +58,18 @@
     }
 
     override fun visitSetField(expression: IrSetField, data: IrNamer): WasmInstruction {
-        TODO()
-//        val fieldName = data.getNameForField(expression.symbol.owner)
-//        val dest = JsNameRef(fieldName, expression.receiver?.accept(this, data))
-//        val source = expression.value.accept(this, data)
-//        return jsAssignment(dest, source)
+        val fieldName = data.getNameForField(expression.symbol.owner).ident
+        if (expression.receiver != null)
+            TODO("Support member fields")
+
+        val value = expression.value.accept(this, data)
+        return WasmSetGlobal(fieldName, value)
     }
 
     override fun visitSetVariable(expression: IrSetVariable, data: IrNamer): WasmInstruction {
-        TODO()
-//        val ref = JsNameRef(data.getNameForValueDeclaration(expression.symbol.owner))
-//        val value = expression.value.accept(this, data)
-//        return JsBinaryOperation(JsBinaryOperator.ASG, ref, value)
+        val fieldName = data.getNameForValueDeclaration(expression.symbol.owner).ident
+        val value = expression.value.accept(this, data)
+        return WasmSetLocal(fieldName, value)
     }
 
     override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: IrNamer): WasmInstruction {
@@ -75,6 +81,13 @@
     }
 
     override fun visitCall(expression: IrCall, data: IrNamer): WasmInstruction {
+        if (expression.dispatchReceiver != null)
+            TODO("Support member calls")
+
+        val function = expression.symbol.owner.realOverrideTarget
+        require(function is IrSimpleFunction) { "Only IrSimpleFunction could be called via IrCall" }
+        val symbol = function.symbol
+
         TODO()
 //        return translateCall(expression, context, this)
     }
diff --git a/js/js.translator/testData/box/wasm/trivial.kt b/js/js.translator/testData/box/wasm/trivial.kt
index d6d5d66..2d4b60c 100644
--- a/js/js.translator/testData/box/wasm/trivial.kt
+++ b/js/js.translator/testData/box/wasm/trivial.kt
@@ -2,9 +2,10 @@
 fun foo(x: Int, y: Int): Int = x
 fun foo2(x: Int, y: Int): Int = y
 
+val x = 42
 
 fun box(): Int {
-    return 42
+    return x
 //    if (true) {
 //        return 42
 //    } else {