Skip to content

Commit

Permalink
🦄 refactor: Revise call expr, member expr
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed May 19, 2024
1 parent 5f64d3f commit 24cf9dd
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 92 deletions.
67 changes: 12 additions & 55 deletions src/main/java/com/caoccao/javet/swc4j/ast/expr/Swc4jAstBinExpr.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.caoccao.javet.swc4j.ast.expr;

import com.caoccao.javet.swc4j.ast.Swc4jAst;
import com.caoccao.javet.swc4j.ast.clazz.Swc4jAstComputedPropName;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstBinaryOp;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstType;
import com.caoccao.javet.swc4j.ast.expr.lit.Swc4jAstArrayLit;
Expand Down Expand Up @@ -111,63 +110,21 @@ public Optional<ISwc4jAst> eval() {
String value = left.toString() + right;
return Optional.of(Swc4jAstStr.create(value));
} else if ((leftType.isPrimitive() || leftType.isArrayLit()) && rightType.isCallExpr()) {
Swc4jAstCallExpr callExpr = right.as(Swc4jAstCallExpr.class);
if (callExpr.getCallee() instanceof Swc4jAstMemberExpr && callExpr.getArgs().isEmpty()) {
Swc4jAstMemberExpr memberExpr = callExpr.getCallee().as(Swc4jAstMemberExpr.class);
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
if (obj instanceof Swc4jAstArrayLit && memberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = memberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
Swc4jAstStr str = expr.as(Swc4jAstStr.class);
String leftString = left.as(ISwc4jAstCoercionPrimitive.class).asString();
String rightString = Swc4jAstArrayLit.ARRAY_FUNCTION_STRING_MAP.getOrDefault(str.getValue(), Swc4jAstIdent.UNDEFINED);
return Optional.of(Swc4jAstStr.create(leftString + rightString));
}
}
}
return right.as(Swc4jAstCallExpr.class).evalAsString()
.map(rightString -> left.as(ISwc4jAstCoercionPrimitive.class).asString() + rightString)
.map(Swc4jAstStr::create);
} else if ((rightType.isPrimitive() || rightType.isArrayLit()) && leftType.isCallExpr()) {
Swc4jAstCallExpr callExpr = left.as(Swc4jAstCallExpr.class);
if (callExpr.getCallee() instanceof Swc4jAstMemberExpr && callExpr.getArgs().isEmpty()) {
Swc4jAstMemberExpr memberExpr = callExpr.getCallee().as(Swc4jAstMemberExpr.class);
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
if (obj instanceof Swc4jAstArrayLit && memberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = memberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
Swc4jAstStr str = expr.as(Swc4jAstStr.class);
String leftString = Swc4jAstArrayLit.ARRAY_FUNCTION_STRING_MAP.getOrDefault(str.getValue(), Swc4jAstIdent.UNDEFINED);
String rightString = right.as(ISwc4jAstCoercionPrimitive.class).asString();
return Optional.of(Swc4jAstStr.create(leftString + rightString));
}
}
}
return left.as(Swc4jAstCallExpr.class).evalAsString()
.map(leftString -> leftString + right.as(ISwc4jAstCoercionPrimitive.class).asString())
.map(Swc4jAstStr::create);
} else if ((leftType.isPrimitive() || leftType.isArrayLit()) && rightType.isMemberExpr()) {
Swc4jAstMemberExpr memberExpr = right.as(Swc4jAstMemberExpr.class);
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
if (obj instanceof Swc4jAstArrayLit && memberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = memberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
Swc4jAstStr str = expr.as(Swc4jAstStr.class);
String leftString = left.as(ISwc4jAstCoercionPrimitive.class).asString();
String rightString = "function " + str.getValue() + "() { [native code] }";
return Optional.of(Swc4jAstStr.create(leftString + rightString));
}
}
return right.as(Swc4jAstMemberExpr.class).evalAsString()
.map(rightString -> left.as(ISwc4jAstCoercionPrimitive.class).asString() + rightString)
.map(Swc4jAstStr::create);
} else if ((rightType.isPrimitive() || rightType.isArrayLit()) && leftType.isMemberExpr()) {
Swc4jAstMemberExpr memberExpr = left.as(Swc4jAstMemberExpr.class);
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
if (obj instanceof Swc4jAstArrayLit && memberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = memberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
Swc4jAstStr str = expr.as(Swc4jAstStr.class);
String leftString = "function " + str.getValue() + "() { [native code] }";
String rightString = right.as(ISwc4jAstCoercionPrimitive.class).asString();
return Optional.of(Swc4jAstStr.create(leftString + rightString));
}
}
return left.as(Swc4jAstMemberExpr.class).evalAsString()
.map(leftString -> leftString + right.as(ISwc4jAstCoercionPrimitive.class).asString())
.map(Swc4jAstStr::create);
}
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@

import com.caoccao.javet.swc4j.Swc4j;
import com.caoccao.javet.swc4j.ast.Swc4jAst;
import com.caoccao.javet.swc4j.ast.clazz.Swc4jAstComputedPropName;
import com.caoccao.javet.swc4j.ast.clazz.Swc4jAstFunction;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstType;
import com.caoccao.javet.swc4j.ast.expr.lit.Swc4jAstArrayLit;
import com.caoccao.javet.swc4j.ast.expr.lit.Swc4jAstRegex;
import com.caoccao.javet.swc4j.ast.expr.lit.Swc4jAstStr;
import com.caoccao.javet.swc4j.ast.interfaces.ISwc4jAst;
Expand Down Expand Up @@ -77,30 +77,21 @@ public Swc4jAstCallExpr(
public Optional<ISwc4jAst> eval() {
switch (callee.getType()) {
case MemberExpr:
String specialCall = null;
Swc4jAstMemberExpr memberExpr = callee.as(Swc4jAstMemberExpr.class);
if (memberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName prop = memberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = prop.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
specialCall = expr.as(Swc4jAstStr.class).getValue();
}
} else if (memberExpr.getProp() instanceof Swc4jAstIdent) {
specialCall = memberExpr.getProp().as(Swc4jAstIdent.class).getSym();
}
if (specialCall != null) {
if (BUILT_IN_FUNCTION_SET.contains(specialCall)) {
Optional<String> call = memberExpr.evalAsCall();
if (call.isPresent()) {
if (BUILT_IN_FUNCTION_SET.contains(call.get())) {
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
if (obj instanceof Swc4jAstStr) {
String objString = obj.as(Swc4jAstStr.class).getValue();
if (FONTCOLOR.equals(specialCall)) {
if (FONTCOLOR.equals(call.get())) {
String argString = args.isEmpty() ? Swc4jAstIdent.UNDEFINED : args.get(0).toString();
return Optional.of(Swc4jAstStr.create("<font color=\"" + argString + "\">" + objString + "</font>"));
} else if (ITALICS.equals(specialCall)) {
} else if (ITALICS.equals(call.get())) {
return Optional.of(Swc4jAstStr.create("<i>" + objString + "</i>"));
}
}
} else if (Swc4jAstMemberExpr.CONSTRUCTOR.equals(specialCall)) {
} else if (Swc4jAstMemberExpr.CONSTRUCTOR.equals(call.get())) {
if (memberExpr.getObj() instanceof Swc4jAstRegex) {
switch (args.size()) {
case 0:
Expand Down Expand Up @@ -153,6 +144,17 @@ public Optional<ISwc4jAst> eval() {
return super.eval();
}

public Optional<String> evalAsString() {
if (callee instanceof Swc4jAstMemberExpr && args.isEmpty()) {
Swc4jAstMemberExpr memberExpr = callee.as(Swc4jAstMemberExpr.class);
ISwc4jAstExpr obj = memberExpr.getObj().unParenExpr();
return memberExpr.evalAsCall()
.filter(c -> obj instanceof Swc4jAstArrayLit)
.map(c -> Swc4jAstArrayLit.ARRAY_FUNCTION_STRING_MAP.getOrDefault(c, Swc4jAstIdent.UNDEFINED));
}
return Optional.empty();
}

@Jni2RustMethod
public List<Swc4jAstExprOrSpread> getArgs() {
return args;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,28 +76,13 @@ public Optional<ISwc4jAst> eval() {
}
break;
case MemberExpr: {
String specialCall = null;
if (prop instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = prop.as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
specialCall = expr.as(Swc4jAstStr.class).getValue();
}
} else if (prop instanceof Swc4jAstIdent) {
specialCall = prop.as(Swc4jAstIdent.class).getSym();
}
if (CONSTRUCTOR.equals(specialCall)) {
Optional<String> call = evalAsCall();
if (call.isPresent() && CONSTRUCTOR.equals(call.get())) {
Swc4jAstMemberExpr childMemberExpr = obj.as(Swc4jAstMemberExpr.class);
if (childMemberExpr.getObj() instanceof Swc4jAstArrayLit
&& childMemberExpr.getProp() instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName childComputedPropName = childMemberExpr.getProp().as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr childExpr = childComputedPropName.getExpr().unParenExpr();
if (childExpr instanceof Swc4jAstStr) {
Swc4jAstStr childStr = childExpr.as(Swc4jAstStr.class);
if (Swc4jAstArrayLit.ARRAY_FUNCTION_SET.contains(childStr.getValue())) {
return Optional.of(Swc4jAstIdent.create(Swc4jAstFunction.CONSTRUCTOR));
}
}
if (childMemberExpr.getObj() instanceof Swc4jAstArrayLit) {
return childMemberExpr.evalAsCall()
.filter(Swc4jAstArrayLit.ARRAY_FUNCTION_SET::contains)
.map(c -> Swc4jAstIdent.create(Swc4jAstFunction.CONSTRUCTOR));
}
}
break;
Expand Down Expand Up @@ -136,6 +121,38 @@ public Optional<ISwc4jAst> eval() {
return super.eval();
}

public Optional<String> evalAsCall() {
if (prop instanceof Swc4jAstComputedPropName) {
Swc4jAstComputedPropName computedPropName = prop.as(Swc4jAstComputedPropName.class);
ISwc4jAstExpr expr = computedPropName.getExpr().unParenExpr();
if (expr instanceof Swc4jAstStr) {
return Optional.of(expr.as(Swc4jAstStr.class).getValue());
}
} else if (prop instanceof Swc4jAstIdent) {
return Optional.of(prop.as(Swc4jAstIdent.class).getSym());
}
return Optional.empty();
}

public Optional<String> evalAsString() {
ISwc4jAstExpr obj = this.obj.unParenExpr();
Optional<String> call = evalAsCall();
if (call.isPresent()) {
switch (obj.getType()) {
case ArrayLit:
call = call.filter(Swc4jAstArrayLit.ARRAY_FUNCTION_SET::contains);
break;
case Number:
call = call.filter(CONSTRUCTOR::equals).map(c -> Swc4jAstNumber.CONSTRUCTOR);
break;
default:
call = Optional.empty();
break;
}
}
return call.map(c -> "function " + c + "() { [native code] }");
}

@Override
public List<ISwc4jAst> getChildNodes() {
return SimpleList.of(obj, prop);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
public class Swc4jAstNumber
extends Swc4jAst
implements ISwc4jAstLit, ISwc4jAstPropName, ISwc4jAstTsLit, ISwc4jAstCoercionPrimitive {
public static final String CONSTRUCTOR = "Number";
public static final String INFINITY = "Infinity";
protected static final int MAX_EXPONENT = 308;
protected static final Pattern PATTERN_DECIMAL_ZEROS =
Expand Down

0 comments on commit 24cf9dd

Please sign in to comment.