Ejemplo n.º 1
0
 void changeTypeContext(ResolutionContext old, ResolutionContext new_, MethodDeclaration m) {
   m.setType(changeTypeContext(old, new_, m.getType()));
   m.setBody(
       new BlockStmt(
           Collections.singletonList(
               new ThrowStmt(
                   new ObjectCreationExpr(
                       null,
                       new ClassOrInterfaceType("UnsupportedOperationException"),
                       Collections.emptyList())))));
   NodeUtil.forChildren(
       m,
       node -> {
         Expression scope = node.getScope();
         // TODO: Currently guesses that it's a type name if first character is uppercase.
         // Should check for fields/variables which match instead
         if (scope instanceof NameExpr
             && Character.isUpperCase(((NameExpr) scope).getName().charAt(0))) {
           String name = ((NameExpr) scope).getName();
           node.setScope(ASTHelper.createNameExpr(new_.typeToString(old.resolve(name))));
         }
       },
       MethodCallExpr.class);
   NodeUtil.forChildren(
       m,
       node -> node.setType(changeTypeContext(old, new_, node.getType())),
       VariableDeclarationExpr.class);
   NodeUtil.forChildren(
       m, node -> node.setType(changeTypeContext(old, new_, node.getType())), TypeExpr.class);
   NodeUtil.forChildren(
       m,
       node -> node.setType(changeTypeContext(old, new_, node.getType())),
       com.github.javaparser.ast.body.Parameter.class);
 }
  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;
  }