private Expression generateCopyExpression(
      DefinedParamType type,
      String inputParmId,
      int inputIndex,
      String outputParamId,
      int outputIndex) {
    // GOAL: ((InputSocket<Mat>) inputs[0]).getValue().assignTo(((OutputSocket<Mat>)
    // outputs[0]).getValue());
    final ClassOrInterfaceType outputType = new ClassOrInterfaceType("OutputSocket");
    final ClassOrInterfaceType inputType = new ClassOrInterfaceType("InputSocket");
    outputType.setTypeArgs(Collections.singletonList(type.getType()));
    inputType.setTypeArgs(Collections.singletonList(type.getType()));

    final MethodCallExpr copyExpression =
        new MethodCallExpr(
            getOrSetValueExpression(
                new EnclosedExpr(new CastExpr(inputType, arrayAccessExpr(inputParmId, inputIndex))),
                null),
            "assignTo",
            Collections.singletonList(
                getOrSetValueExpression(
                    new EnclosedExpr(
                        new CastExpr(outputType, arrayAccessExpr(outputParamId, outputIndex))),
                    null)));
    copyExpression.setComment(
        new BlockComment(
            " Sets the value of the input Mat to the output because this operation does not have a destination Mat. "));
    return copyExpression;
  }
 private final void addToLists(
     DefinedParamType type,
     Map<Type, List<DefinedParamType>> assignmentMap,
     List<DefinedParamType> assignmentList) {
   assignmentMap.putIfAbsent(type.getType(), new ArrayList<>()); // Will return null if new
   assignmentMap.get(type.getType()).add(type);
   if (!assignmentList.contains(type)) {
     assignmentList.add(type);
   }
 }
  /** @param paramTypes */
  public SocketHintDeclarationCollection(
      DefaultValueCollector collector, List<DefinedParamType> paramTypes) {
    this.paramTypes = paramTypes;
    this.collector = collector;

    // Figure out which hint map to put this defined param type into
    for (DefinedParamType type : paramTypes) {
      if (type.getDirection().isInput()) {
        addToInput(type);
      }
      if (type.getDirection().isOutput()) {
        addToOutput(type);
      }
    }
  }
 private BlockStmt getInputOrOutputSocketBody(
     List<DefinedParamType> paramTypes,
     ClassOrInterfaceType socketType,
     String inputOrOutputPostfix) {
   List<Expression> passedExpressions = new ArrayList<>();
   for (DefinedParamType inputParam : paramTypes) {
     if (inputParam.isIgnored()) continue;
     passedExpressions.add(getSocketListParam(inputParam, socketType, inputOrOutputPostfix));
   }
   BlockStmt returnStatement =
       new BlockStmt(
           Arrays.asList(
               new ReturnStmt(
                   new ArrayCreationExpr(
                       socketType, 1, new ArrayInitializerExpr(passedExpressions)))));
   return returnStatement;
 }
 public ObjectCreationExpr getSocketListParam(
     DefinedParamType definedParamType,
     ClassOrInterfaceType socketType,
     String inputOrOutputPostfix) {
   // System.out.println("Generating for default " +
   // (definedParamType.getDefaultValue().isPresent() ?
   // definedParamType.getDefaultValue().get().getName().toString() : "null"));
   return new ObjectCreationExpr(
       null,
       socketType,
       Arrays.asList(
           new NameExpr("eventBus"),
           new NameExpr(
               definedParamType.getName()
                   + inputOrOutputPostfix
                   + SocketHintDeclaration.HINT_POSTFIX)));
 }
  public List<Expression> getSocketAssignments(String inputParamId, String outputParamId) {
    List<Expression> assignments = new ArrayList<>();
    int inputIndex = 0;
    int outputIndex = 0;
    for (DefinedParamType paramType : paramTypes) {
      // We still need to increment the values if the param is ignored
      if (paramType.isIgnored()) continue;

      int index;
      String paramId;
      if (inputParamTypes.contains(paramType) && outputParamTypes.contains(paramType)) {
        if (paramType.getType().toStringWithoutComments().contains("Mat")) {
          assignments.add(
              generateCopyExpression(
                  paramType,
                  inputParamId,
                  inputParamTypes.indexOf(paramType),
                  outputParamId,
                  outputParamTypes.indexOf(paramType)));
        } else {
          throw new IllegalStateException(
              "Can not generate Input/Output Socket for type: " + paramType.getType().toString());
        }

        // We have used the input socket
        inputIndex++;
      }

      // Generate the output socket event if this is an input/output socket
      if (outputParamTypes.contains(paramType)) {
        paramId = outputParamId;
        index = outputIndex;
        outputIndex++;
      } else if (inputParamTypes.contains(paramType)) {
        paramId = inputParamId;
        index = inputIndex;
        inputIndex++;
      } else {
        assert false : "The paramType was not in either the input or output list";
        return null;
      }

      final MethodCallExpr getValueExpression = getValueExpression(paramId, index);
      final Expression assignExpression;
      if (paramType.getType() instanceof PrimitiveType
          && (!((PrimitiveType) paramType.getType())
              .getType()
              .equals(PrimitiveType.Primitive.Boolean))) {
        final String numberConversionFunction;
        switch (((PrimitiveType) paramType.getType()).getType()) {
          case Int:
            numberConversionFunction = "intValue";
            break;
          case Short:
          case Char:
            numberConversionFunction = "shortValue";
            break;
          case Float:
            numberConversionFunction = "floatValue";
            break;
          case Double:
            numberConversionFunction = "doubleValue";
            break;
          case Byte:
            numberConversionFunction = "byteValue";
            break;
          case Long:
            numberConversionFunction = "longValue";
            break;
          default:
            throw new IllegalStateException(
                "Conversion for type " + paramType.getType() + " is not defined");
        }
        assignExpression =
            new MethodCallExpr(
                new EnclosedExpr(
                    new CastExpr(ASTHelper.createReferenceType("Number", 0), getValueExpression)),
                numberConversionFunction);
      } else {
        assignExpression = new CastExpr(paramType.getTypeBoxedIfPossible(), getValueExpression);
      }

      assignments.add(
          new VariableDeclarationExpr(
              ModifierSet.FINAL,
              paramType.getType(),
              Collections.singletonList(
                  new VariableDeclarator(
                      new VariableDeclaratorId(paramType.getName()), assignExpression))));
    }
    return assignments;
  }