forked from openrs2/openrs2
It's fairly similar to the ComplementTransformer, and translates expressions like: !a == !b => a == b !a == b => a != b Signed-off-by: Graham <gpe@openrs2.dev>
parent
b20115f1a7
commit
4bc11159d8
@ -0,0 +1,62 @@ |
||||
package dev.openrs2.deob.ast.transform |
||||
|
||||
import com.github.javaparser.ast.CompilationUnit |
||||
import com.github.javaparser.ast.expr.BinaryExpr |
||||
import com.github.javaparser.ast.expr.BinaryExpr.Operator.EQUALS |
||||
import com.github.javaparser.ast.expr.BinaryExpr.Operator.NOT_EQUALS |
||||
import com.github.javaparser.ast.expr.BooleanLiteralExpr |
||||
import com.github.javaparser.ast.expr.Expression |
||||
import com.github.javaparser.ast.expr.UnaryExpr |
||||
import com.github.javaparser.ast.expr.UnaryExpr.Operator.LOGICAL_COMPLEMENT |
||||
import dev.openrs2.deob.ast.Library |
||||
import dev.openrs2.deob.ast.LibraryGroup |
||||
import dev.openrs2.deob.ast.util.not |
||||
import dev.openrs2.deob.ast.util.walk |
||||
import javax.inject.Singleton |
||||
|
||||
@Singleton |
||||
class NotTransformer : Transformer() { |
||||
override fun transformUnit(group: LibraryGroup, library: Library, unit: CompilationUnit) { |
||||
unit.walk { expr: BinaryExpr -> |
||||
val op = expr.operator.flip() ?: return@walk |
||||
val left = expr.left |
||||
val right = expr.right |
||||
|
||||
val bothLiteral = left is BooleanLiteralExpr && right is BooleanLiteralExpr |
||||
if (bothLiteral) { |
||||
return@walk |
||||
} |
||||
|
||||
val leftNotOrLiteral = left.isNotOrLiteral() |
||||
val rightNotOrLiteral = right.isNotOrLiteral() |
||||
|
||||
if (leftNotOrLiteral && rightNotOrLiteral) { |
||||
expr.left = left.not() |
||||
expr.right = right.not() |
||||
return@walk |
||||
} else if (leftNotOrLiteral) { |
||||
expr.operator = op |
||||
expr.left = left.not() |
||||
} else if (rightNotOrLiteral) { |
||||
expr.operator = op |
||||
expr.right = right.not() |
||||
} |
||||
} |
||||
} |
||||
|
||||
private fun Expression.isNot(): Boolean { |
||||
return this is UnaryExpr && operator == LOGICAL_COMPLEMENT |
||||
} |
||||
|
||||
private fun Expression.isNotOrLiteral(): Boolean { |
||||
return isNot() || this is BooleanLiteralExpr |
||||
} |
||||
|
||||
private fun BinaryExpr.Operator.flip(): BinaryExpr.Operator? { |
||||
return when (this) { |
||||
EQUALS -> NOT_EQUALS |
||||
NOT_EQUALS -> EQUALS |
||||
else -> null |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue