diff --git a/Sources/SkipSyntax/Kotlin/KotlinExpressionTypes.swift b/Sources/SkipSyntax/Kotlin/KotlinExpressionTypes.swift index 2c4c466f..701105d6 100644 --- a/Sources/SkipSyntax/Kotlin/KotlinExpressionTypes.swift +++ b/Sources/SkipSyntax/Kotlin/KotlinExpressionTypes.swift @@ -956,6 +956,9 @@ final class KotlinFunctionCall: KotlinExpression, KotlinMainActorTargeting, APIC if let number128Init = number128InitFunction(expression: expression, arguments: karguments) { return number128Init } + if let boolToggle = boolToggleToAssignment(expression: expression, translator: translator) { + return boolToggle + } let kfunction = translator.translateExpression(expression.function) // E.g. [Int](), [String: Int]() @@ -1034,6 +1037,20 @@ final class KotlinFunctionCall: KotlinExpression, KotlinMainActorTargeting, APIC return kexpression } + private static func boolToggleToAssignment(expression: FunctionCall, translator: KotlinTranslator) -> KotlinExpression? { + guard expression.arguments.isEmpty, + let memberAccess = expression.function as? MemberAccess, + memberAccess.member == "toggle", + memberAccess.baseType == .bool, + let base = memberAccess.base else { + return nil + } + let klhs = translator.translateExpression(base) + let krhsTarget = translator.translateExpression(base) + let krhs = KotlinPrefixOperator(operatorSymbol: "!", target: krhsTarget, sourceFile: expression.sourceFile, sourceRange: expression.sourceRange) + return KotlinBinaryOperator(op: Operator.with(symbol: "="), lhs: klhs, rhs: krhs, sourceFile: expression.sourceFile, sourceRange: expression.sourceRange) + } + private static func isFunction(expression: FunctionCall, named: String, moduleName: String) -> Bool { if let identifier = expression.function as? Identifier { return identifier.name == named diff --git a/Tests/SkipSyntaxTests/BuiltinTypeTests.swift b/Tests/SkipSyntaxTests/BuiltinTypeTests.swift index 4f5e3d43..c9b99f1b 100644 --- a/Tests/SkipSyntaxTests/BuiltinTypeTests.swift +++ b/Tests/SkipSyntaxTests/BuiltinTypeTests.swift @@ -670,4 +670,18 @@ final class BuiltinTypeTests: XCTestCase { get() = 4.0 """) } + + func testBoolToggle() async throws { + try await check(swift: """ + { + var flag: Bool = true + flag.toggle() + } + """, kotlin: """ + { -> + var flag: Boolean = true + flag = !flag + } + """) + } }