@@ -983,15 +983,56 @@ public class JavaScriptCompiler {
983983 }
984984
985985 case . unaryExpression( let unaryExpression) :
986- let argument = try compileExpression ( unaryExpression. argument)
987-
988986 if unaryExpression. operator == " typeof " {
987+ let argument = try compileExpression ( unaryExpression. argument)
989988 return emit ( TypeOf ( ) , withInputs: [ argument] ) . output
989+ } else if unaryExpression. operator == " delete " {
990+ guard case . memberExpression( let memberExpression) = unaryExpression. argument. expression else {
991+ throw CompilerError . invalidNodeError ( " delete operator must be applied to a member expression " )
992+ }
993+
994+ let obj = try compileExpression ( memberExpression. object)
995+ // isGuarded is true if the member expression is optional (e.g., obj?.prop)
996+ let isGuarded = memberExpression. isOptional
997+
998+ if !memberExpression. name. isEmpty {
999+ // Deleting a non-computed property (e.g., delete obj.prop)
1000+ let propertyName = memberExpression. name
1001+ let instr = emit (
1002+ DeleteProperty ( propertyName: propertyName, isGuarded: isGuarded) ,
1003+ withInputs: [ obj]
1004+ )
1005+ return instr. output
1006+ } else {
1007+ // Deleting a computed property (e.g., delete obj[expr])
1008+ let propertyExpression = memberExpression. expression
1009+ let propertyExpr = propertyExpression. expression
1010+ let property = try compileExpression ( propertyExpression)
1011+
1012+ if case . numberLiteral( let numberLiteral) = propertyExpr {
1013+ // Delete an element (e.g., delete arr[42])
1014+ let index = Int64 ( numberLiteral. value)
1015+ let instr = emit (
1016+ DeleteElement ( index: index, isGuarded: isGuarded) ,
1017+ withInputs: [ obj]
1018+ )
1019+ return instr. output
1020+ } else {
1021+ // Use DeleteComputedProperty for other computed properties (e.g., delete obj["key"])
1022+ let instr = emit (
1023+ DeleteComputedProperty ( isGuarded: isGuarded) ,
1024+ withInputs: [ obj, property]
1025+ )
1026+ return instr. output
1027+ }
1028+ }
1029+ } else {
1030+ guard let op = UnaryOperator ( rawValue: unaryExpression. operator) else {
1031+ throw CompilerError . invalidNodeError ( " invalid unary operator: \( unaryExpression. operator) " )
1032+ }
1033+ let argument = try compileExpression ( unaryExpression. argument)
1034+ return emit ( UnaryOperation ( op) , withInputs: [ argument] ) . output
9901035 }
991- guard let op = UnaryOperator ( rawValue: unaryExpression. operator) else {
992- throw CompilerError . invalidNodeError ( " invalid unary operator: \( unaryExpression. operator) " )
993- }
994- return emit ( UnaryOperation ( op) , withInputs: [ argument] ) . output
9951036
9961037 case . binaryExpression( let binaryExpression) :
9971038 let lhs = try compileExpression ( binaryExpression. lhs)
0 commit comments