diff -r b647ecaa2068 cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionQuery.java --- a/cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionQuery.java Fri Sep 11 17:03:04 2015 +0300 +++ b/cnd.completion/src/org/netbeans/modules/cnd/completion/cplusplus/ext/CsmCompletionQuery.java Wed Sep 16 20:11:18 2015 +0300 @@ -384,11 +384,13 @@ csmFile = CsmUtilities.getCsmFile(baseDocument, true, false); } + final boolean processAsExpression = CsmKindUtilities.isExpression(expression); + CsmCompletionTokenProcessor tp; CsmScope passedScope = null; - if (CsmKindUtilities.isExpression(expression)) { + if (processAsExpression) { passedScope = ((CsmExpression) expression).getScope(); tp = processTokensInExpression((CsmExpression) expression, task.isFindTypeTask()); } else { @@ -399,7 +401,7 @@ try { pushResolveContext(CsmResolveContext.create(csmFile, startOffset)); - CsmCompletionExpression exp = tp.getResultExp(); + CsmCompletionExpression exp = getResultExpression(tp, processAsExpression, task.isFindTypeTask()); Context ctx = getResolvedContext( null, @@ -744,8 +746,8 @@ CppTokenId.LPAREN.fixedText() + expression.getExpandedText().toString() + CppTokenId.RPAREN.fixedText() : expression.getExpandedText().toString(); - int exprStartOffset = expression.getStartOffset(); - int exprEndOffset = exprStartOffset + expressionText.length(); + int exprStartOffset = expression.getStartOffset() - (keepWholeAst ? 1 : 0); + int exprEndOffset = exprStartOffset + expressionText.length() + (keepWholeAst ? 1 : 0); final CsmCompletionTokenProcessor tp = new CsmCompletionTokenProcessor(exprEndOffset, exprStartOffset); TokenHierarchy hi = TokenHierarchy.create( @@ -777,6 +779,17 @@ return tp; } + + private CsmCompletionExpression getResultExpression(CsmCompletionTokenProcessor tp, boolean processedAsExpression, boolean keepWholeAst) { + if (processedAsExpression && keepWholeAst) { + // See implementation of processTokensInExpression + CsmCompletionExpression resultExp = tp.getResultExp(); + if (resultExp != null && resultExp.getParameterCount() == 1 && resultExp.getExpID() == CsmCompletionExpression.PARENTHESIS) { + return resultExp.getParameter(0); + } + } + return tp.getResultExp(); + } abstract protected boolean isProjectBeeingParsed(boolean openingSource);