コード例 #1
0
  @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;
  }