@@ -983,15 +983,56 @@ public class JavaScriptCompiler {
983
983
}
984
984
985
985
case . unaryExpression( let unaryExpression) :
986
- let argument = try compileExpression ( unaryExpression. argument)
987
-
988
986
if unaryExpression. operator == " typeof " {
987
+ let argument = try compileExpression ( unaryExpression. argument)
989
988
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
990
1035
}
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
995
1036
996
1037
case . binaryExpression( let binaryExpression) :
997
1038
let lhs = try compileExpression ( binaryExpression. lhs)
0 commit comments