@Override public Object visitListExpression(ListExpression listExpression, Object arg) throws Exception { MethodVisitor mv = ((InheritedAttributes) arg).mv; if (listExpression.expressionType.equalsIgnoreCase("Ljava/util/List;")) { mv.visitTypeInsn(NEW, "java/util/ArrayList"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false); } else if (listExpression.expressionType.startsWith("Ljava/util/List<")) { mv.visitTypeInsn(NEW, "java/util/ArrayList"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false); for (Expression expr : listExpression.expressionList) { // expr. mv.visitInsn(DUP); expr.visit(this, arg); if (listExpression.expressionType.equalsIgnoreCase("Ljava/util/List<I>;")) mv.visitMethodInsn( INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); else if (listExpression.expressionType.equalsIgnoreCase("Ljava/util/List<Z>;")) mv.visitMethodInsn( INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); // else if(listExpression.expressionType.startsWith("Ljava/util/List<Ljava/util/List")) // mv.visitMethodInsn(INVOKESTATIC, "java/util/ArrayList", "valueOf", // "(I)Ljava/lang/Integer;",false); mv.visitMethodInsn( INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z", false); mv.visitInsn(POP); } } /*else if(listExpression.expressionType.equalsIgnoreCase("Ljava/util/List<Z>;")) { mv.visitTypeInsn(NEW, "java/util/ArrayList"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false); for(Expression expr: listExpression.expressionList) { mv.visitInsn(DUP); expr.visit(this, arg); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;",false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z", false); mv.visitInsn(POP); } } else { mv.visitTypeInsn(NEW, "java/util/ArrayList"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false); for(Expression expr: listExpression.expressionList) { mv.visitInsn(DUP); expr.visit(this, arg); //mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf", "(java/lang/String)Ljava/lang/Boolean;",false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z", false); mv.visitInsn(POP); } } */ // if(listExpression.expressionType.startsWith("Ljava/util/List<Ljava/util/List")) // listExpression.setType(removeLayer(listExpression.expressionType)); // else listExpression.setType(emptyList); return listExpression.expressionType; }