recurisively looking into method parameters for more private access expression

This commit is contained in:
金戟 2021-01-07 19:48:18 +08:00
parent 860fdcf072
commit 444967f676

View File

@ -110,7 +110,7 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
public void visitVarDef(JCVariableDecl jcVariableDecl) { public void visitVarDef(JCVariableDecl jcVariableDecl) {
jcVariableDecl.init = checkAndExchange(jcVariableDecl.init); jcVariableDecl.init = checkAndExchange(jcVariableDecl.init);
super.visitVarDef(jcVariableDecl); super.visitVarDef(jcVariableDecl);
if (jcVariableDecl.vartype.getClass().equals(JCIdent.class) && if (jcVariableDecl.vartype instanceof JCIdent &&
((JCIdent)jcVariableDecl.vartype).name.equals(sourceClassName)) { ((JCIdent)jcVariableDecl.vartype).name.equals(sourceClassName)) {
sourceClassIns.add(jcVariableDecl.name); sourceClassIns.add(jcVariableDecl.name);
} }
@ -123,7 +123,7 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
@Override @Override
public void visitExec(JCExpressionStatement jcExpressionStatement) { public void visitExec(JCExpressionStatement jcExpressionStatement) {
// visitExec could be an assign statement to a private field // visitExec could be an assign statement to a private field
if (jcExpressionStatement.expr.getClass().equals(JCAssign.class)) { if (jcExpressionStatement.expr instanceof JCAssign) {
MemberType memberType = checkSetterType((JCAssign)jcExpressionStatement.expr); MemberType memberType = checkSetterType((JCAssign)jcExpressionStatement.expr);
if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) { if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) {
jcExpressionStatement.expr = privateAccessStatementGenerator.fetchSetterStatement( jcExpressionStatement.expr = privateAccessStatementGenerator.fetchSetterStatement(
@ -168,7 +168,7 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
@Override @Override
protected JCExpression checkAndExchange(JCExpression expr) { protected JCExpression checkAndExchange(JCExpression expr) {
// check is accessing a private field of source class // check is accessing a private field of source class
if (expr.getClass().equals(JCFieldAccess.class)) { if (expr instanceof JCFieldAccess) {
MemberType memberType = checkGetterType((JCFieldAccess)expr); MemberType memberType = checkGetterType((JCFieldAccess)expr);
if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) { if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) {
expr = privateAccessStatementGenerator.fetchGetterStatement((JCFieldAccess)expr); expr = privateAccessStatementGenerator.fetchGetterStatement((JCFieldAccess)expr);
@ -177,14 +177,22 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
} }
} }
// check is invoking a private method of source class // check is invoking a private method of source class
if (expr.getClass().equals(JCMethodInvocation.class)) { if (expr instanceof JCMethodInvocation) {
MemberType memberType = checkInvokeType((JCMethodInvocation)expr); JCMethodInvocation invocation = (JCMethodInvocation)expr;
// recursively check it parameters
invocation.args = checkAndExchange(invocation.args);
MemberType memberType = checkInvokeType(invocation);
if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) { if (memberType.equals(MemberType.PRIVATE_OR_FINAL)) {
expr = privateAccessStatementGenerator.fetchInvokeStatement((JCMethodInvocation)expr); expr = privateAccessStatementGenerator.fetchInvokeStatement(invocation);
} else if (memberType.equals(MemberType.STATIC_PRIVATE)) { } else if (memberType.equals(MemberType.STATIC_PRIVATE)) {
expr = privateAccessStatementGenerator.fetchStaticInvokeStatement((JCMethodInvocation)expr); expr = privateAccessStatementGenerator.fetchStaticInvokeStatement(invocation);
} }
} }
// check the casted expression
if (expr instanceof JCTypeCast) {
JCTypeCast typeCast = (JCTypeCast)expr;
typeCast.expr = checkAndExchange(typeCast.expr);
}
return expr; return expr;
} }
@ -194,16 +202,14 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
} }
private MemberType checkGetterType(JCFieldAccess access) { private MemberType checkGetterType(JCFieldAccess access) {
if (access.selected.getClass().equals(JCIdent.class) && if (access.selected instanceof JCIdent && privateOrFinalFields.contains(access.name.toString())) {
privateOrFinalFields.contains(access.name.toString())) {
return checkSourceClassOrIns(((JCIdent)access.selected).name); return checkSourceClassOrIns(((JCIdent)access.selected).name);
} }
return MemberType.NONE_PRIVATE; return MemberType.NONE_PRIVATE;
} }
private MemberType checkSetterType(JCAssign assign) { private MemberType checkSetterType(JCAssign assign) {
if (assign.lhs.getClass().equals(JCFieldAccess.class) && if (assign.lhs instanceof JCFieldAccess && ((JCFieldAccess)(assign).lhs).selected instanceof JCIdent &&
((JCFieldAccess)(assign).lhs).selected.getClass().equals(JCIdent.class) &&
privateOrFinalFields.contains(((JCFieldAccess)(assign).lhs).name.toString())) { privateOrFinalFields.contains(((JCFieldAccess)(assign).lhs).name.toString())) {
return checkSourceClassOrIns(((JCIdent)((JCFieldAccess)(assign).lhs).selected).name); return checkSourceClassOrIns(((JCIdent)((JCFieldAccess)(assign).lhs).selected).name);
} }
@ -211,8 +217,7 @@ public class EnablePrivateAccessTranslator extends BaseTranslator {
} }
private MemberType checkInvokeType(JCMethodInvocation expr) { private MemberType checkInvokeType(JCMethodInvocation expr) {
if (expr.meth.getClass().equals(JCFieldAccess.class) && if (expr.meth instanceof JCFieldAccess && ((JCFieldAccess)(expr).meth).selected instanceof JCIdent &&
((JCFieldAccess)(expr).meth).selected.getClass().equals(JCIdent.class) &&
privateMethods.contains(((JCFieldAccess)(expr).meth).name.toString())) { privateMethods.contains(((JCFieldAccess)(expr).meth).name.toString())) {
return checkSourceClassOrIns(((JCIdent)((JCFieldAccess)(expr).meth).selected).name); return checkSourceClassOrIns(((JCIdent)((JCFieldAccess)(expr).meth).selected).name);
} }