@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; }