예제 #1
0
  private ExpressionBase convertCheck(Check chk, OldExpressionConverter exprConv) {
    final SourcePos sourcePos = exprConv.getSourcePos(chk);

    final ExpressionBase preCondExpression =
        (chk.getGuard() == null)
            ? exprConv.convert(chk.getConstraint())
            : new OrExpression(
                new InvocationOnObjectExpression(
                    new QualifiedName(SysLibNames.OPERATOR_NOT),
                    Arrays.asList(exprConv.convert(chk.getGuard())),
                    true,
                    sourcePos),
                new AndExpression(
                    exprConv.convert(chk.getGuard()),
                    exprConv.convert(chk.getConstraint()),
                    sourcePos),
                sourcePos);

    final String addIssueMethodName = chk.isErrorCheck() ? "addError" : "addWarning";

    final List<ExpressionBase> failureParams = new ArrayList<ExpressionBase>();
    failureParams.add(new LocalVarEvalExpression(ISSUES_PARAM_NAME, sourcePos));
    failureParams.add(exprConv.convert(chk.getMsg()));
    failureParams.add(new LocalVarEvalExpression(SyntaxConstants.THIS, sourcePos));

    final ExpressionBase failureExpression =
        new InvocationOnObjectExpression(
            new QualifiedName(addIssueMethodName), failureParams, true, sourcePos);

    final ExpressionBase onEachExpression =
        new IfExpression(
            preCondExpression,
            new LiteralExpression(null, sourcePos),
            failureExpression,
            sourcePos);

    final List<ExpressionBase> typeSelectParams = new ArrayList<ExpressionBase>();
    typeSelectParams.add(new LocalVarEvalExpression(ALL_OBJECTS_PARAM_NAME, sourcePos));
    typeSelectParams.add(
        new LiteralExpression(_typeConverter.convertToBackendType(chk.getType()), sourcePos));
    final ExpressionBase typeSelectExpression =
        new InvocationOnObjectExpression(
            new QualifiedName(SysLibNames.TYPE_SELECT), typeSelectParams, true, sourcePos);

    final List<ExpressionBase> collectParams = new ArrayList<ExpressionBase>();
    collectParams.add(typeSelectExpression);
    collectParams.add(
        new InitClosureExpression(
            Arrays.asList(SyntaxConstants.THIS),
            Arrays.asList(ObjectType.INSTANCE),
            onEachExpression,
            sourcePos));
    return new InvocationOnObjectExpression(
        new QualifiedName(SysLibNames.COLLECT), collectParams, true, sourcePos);
  }
예제 #2
0
  public NamedFunction createCheckFunction(BackendTypesystem ts, ExtensionFile extensionFile) {
    final OldExpressionConverter exprConv =
        new OldExpressionConverter(
            _emptyExecutionContext.cloneWithResource(extensionFile),
            _typeConverter,
            OldHelper.normalizeXtendResourceName(extensionFile.getFullyQualifiedName()));
    final List<String> paramNames = Arrays.asList(ISSUES_PARAM_NAME, ALL_OBJECTS_PARAM_NAME);
    final List<BackendType> paramTypes =
        Arrays.asList(ts.findType(Issues.class), CollectionType.INSTANCE);

    final List<ExpressionBase> allChecks = new ArrayList<ExpressionBase>();
    for (Check chk : extensionFile.getChecks()) {
      if (!exprConv.hasThis()) {
        ExecutionContext oldCtx = exprConv.getExecutionContext();
        exprConv.setExecutionContext(
            oldCtx.cloneWithVariable(
                new Variable(
                    ExecutionContext.IMPLICIT_VARIABLE,
                    oldCtx.getTypeForName(chk.getType().getValue()))));
        allChecks.add(convertCheck(chk, exprConv));
        exprConv.setExecutionContext(oldCtx);
      }
    }

    final ExpressionBase body =
        new SequenceExpression(allChecks, exprConv.getSourcePos(extensionFile));

    return new NamedFunction(
        ALL_CHECKS_FUNCTION_NAME,
        new SourceDefinedFunction(
            ALL_CHECKS_FUNCTION_NAME,
            paramNames,
            paramTypes,
            BooleanType.INSTANCE,
            body,
            false,
            null));
  }