コード例 #1
0
  @Override
  protected final IASTNode doResolveAmbiguity(ASTVisitor visitor) {
    final IASTAmbiguityParent owner = (IASTAmbiguityParent) getParent();
    IASTNode nodeToReplace = this;

    // handle nested ambiguities first
    owner.replace(nodeToReplace, fCastExpression);
    nodeToReplace = fCastExpression;
    fCastExpression.getTypeId().accept(visitor);

    owner.replace(nodeToReplace, fBinaryExpression);
    nodeToReplace = fBinaryExpression;
    fBinaryExpression.accept(visitor);

    // find nested names
    final NameCollector nameCollector = new NameCollector();
    fCastExpression.getTypeId().accept(nameCollector);
    final IASTName[] names = nameCollector.getNames();

    // resolve names
    boolean hasIssue = false;
    for (IASTName name : names) {
      try {
        IBinding b = name.resolveBinding();
        if (b instanceof IProblemBinding) {
          hasIssue = true;
          break;
        }
      } catch (Exception t) {
        hasIssue = true;
        break;
      }
    }
    if (hasIssue) {
      return nodeToReplace;
    }

    final IASTExpression left = fBinaryExpression.getOperand1();
    final IASTExpression right = fBinaryExpression.getOperand2();
    left.setParent(null);
    right.setParent(null);
    IASTUnaryExpression primaryInParenthesis = findTrailingBracketedPrimaryExpression(left);
    IASTExpression leadingCastExpression = findLeadingCastExpression(right);
    IASTExpression castedUnary = fCastExpression.getOperand();
    if (primaryInParenthesis != null
        && leadingCastExpression != null
        && castedUnary instanceof IASTUnaryExpression) {
      IASTExpression lp = (IASTExpression) primaryInParenthesis.getParent();
      IASTBinaryExpression rp = (IASTBinaryExpression) leadingCastExpression.getParent();
      ((IASTUnaryExpression) castedUnary).setOperand(leadingCastExpression);
      setEnd(castedUnary, leadingCastExpression);
      setRange(fCastExpression, primaryInParenthesis, leadingCastExpression);
      IASTExpression root = joinExpressions(lp, fCastExpression, rp);
      if (root != null) {
        owner.replace(nodeToReplace, root);
        return root;
      }
    }
    return nodeToReplace;
  }