Minor refactoring of JS AST nodes representing boolean literals
This commit is contained in:
@@ -21,10 +21,17 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
public final class JsBooleanLiteral extends JsLiteral.JsValueLiteral {
|
public final class JsBooleanLiteral extends JsLiteral.JsValueLiteral {
|
||||||
private final boolean value;
|
private final boolean value;
|
||||||
|
|
||||||
// Should be interned by JsProgram
|
|
||||||
public JsBooleanLiteral(boolean value) {
|
public JsBooleanLiteral(boolean value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isTrue(@NotNull JsExpression expression) {
|
||||||
|
return expression instanceof JsBooleanLiteral && ((JsBooleanLiteral) expression).getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFalse(@NotNull JsExpression expression) {
|
||||||
|
return expression instanceof JsBooleanLiteral && !((JsBooleanLiteral) expression).getValue();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean getValue() {
|
public boolean getValue() {
|
||||||
return value;
|
return value;
|
||||||
|
|||||||
@@ -25,12 +25,4 @@ public abstract class JsLiteral extends JsExpression {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTrueBoolean(@NotNull JsExpression expression) {
|
|
||||||
return expression instanceof JsBooleanLiteral && ((JsBooleanLiteral) expression).getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isFalseBoolean(@NotNull JsExpression expression) {
|
|
||||||
return expression instanceof JsBooleanLiteral && !((JsBooleanLiteral) expression).getValue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ class CoroutineBodyTransformer(private val context: CoroutineTransformationConte
|
|||||||
currentStatements += stateAndJump(bodyEntryBlock, x)
|
currentStatements += stateAndJump(bodyEntryBlock, x)
|
||||||
|
|
||||||
currentBlock = bodyEntryBlock
|
currentBlock = bodyEntryBlock
|
||||||
if (!JsLiteral.isTrueBoolean(x.condition)) {
|
if (!JsBooleanLiteral.isTrue(x.condition)) {
|
||||||
currentStatements += JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
currentStatements += JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ class CoroutineBodyTransformer(private val context: CoroutineTransformationConte
|
|||||||
x.body.accept(this)
|
x.body.accept(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!JsLiteral.isTrueBoolean(x.condition)) {
|
if (!JsBooleanLiteral.isTrue(x.condition)) {
|
||||||
val jsIf = JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
val jsIf = JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
||||||
currentStatements.add(jsIf)
|
currentStatements.add(jsIf)
|
||||||
}
|
}
|
||||||
@@ -168,7 +168,7 @@ class CoroutineBodyTransformer(private val context: CoroutineTransformationConte
|
|||||||
currentStatements += stateAndJump(bodyEntryBlock, x)
|
currentStatements += stateAndJump(bodyEntryBlock, x)
|
||||||
|
|
||||||
currentBlock = bodyEntryBlock
|
currentBlock = bodyEntryBlock
|
||||||
if (x.condition != null && !JsLiteral.isTrueBoolean(x.condition)) {
|
if (x.condition != null && !JsBooleanLiteral.isTrue(x.condition)) {
|
||||||
currentStatements += JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
currentStatements += JsIf(JsAstUtils.notOptimized(x.condition), JsBlock(stateAndJump(successor, x))).apply { source = x.source }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class WhileConditionFolding(val body: JsBlock) {
|
|||||||
statement.body = remove(statement.body)
|
statement.body = remove(statement.body)
|
||||||
val existingCondition = statement.condition
|
val existingCondition = statement.condition
|
||||||
statement.condition = when {
|
statement.condition = when {
|
||||||
JsLiteral.isTrueBoolean(existingCondition) -> condition
|
JsBooleanLiteral.isTrue(existingCondition) -> condition
|
||||||
else -> combine(existingCondition, condition)
|
else -> combine(existingCondition, condition)
|
||||||
}
|
}
|
||||||
changed = true
|
changed = true
|
||||||
@@ -142,7 +142,7 @@ class WhileConditionFolding(val body: JsBlock) {
|
|||||||
// Just a little optimization. When inner statement is a single `break`, `nextCondition` would be false.
|
// Just a little optimization. When inner statement is a single `break`, `nextCondition` would be false.
|
||||||
// However, `A || false` can be rewritten as simply `A`
|
// However, `A || false` can be rewritten as simply `A`
|
||||||
nextCondition == null -> null
|
nextCondition == null -> null
|
||||||
JsLiteral.isFalseBoolean(nextCondition) -> JsAstUtils.notOptimized(statement.ifExpression)
|
JsBooleanLiteral.isFalse(nextCondition) -> JsAstUtils.notOptimized(statement.ifExpression)
|
||||||
else -> JsAstUtils.or(JsAstUtils.notOptimized(statement.ifExpression), nextCondition)
|
else -> JsAstUtils.or(JsAstUtils.notOptimized(statement.ifExpression), nextCondition)
|
||||||
}
|
}
|
||||||
result
|
result
|
||||||
|
|||||||
Reference in New Issue
Block a user