diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTUnaryExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTUnaryExpression.java index f8a6958d3a9..517b5161557 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTUnaryExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTUnaryExpression.java @@ -25,7 +25,8 @@ public interface IASTUnaryExpression extends IASTExpression { public static final int op_sizeof = 8; public static final int op_postFixIncr = 9; public static final int op_postFixDecr = 10; - public static final int op_last = op_postFixDecr; + public static final int op_bracketedPrimary = 11; + public static final int op_last = op_bracketedPrimary; public int getOperator(); public void setOperator( int value ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 8a300904af8..9a8f9243431 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -1124,8 +1124,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { t = consume(); //TODO - do we need to return a wrapper? IASTExpression lhs = expression(); - consume(IToken.tRPAREN); - return lhs; + int finalOffset = consume(IToken.tRPAREN).getEndOffset(); + return buildUnaryExpression( IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(), finalOffset ); case IToken.tIDENTIFIER: int startingOffset = LA(1).getOffset(); @@ -1694,6 +1694,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { d.setInitializer(i); i.setParent(d); i.setPropertyInParent(IASTDeclarator.INITIALIZER); + ((ASTNode)d).setLength( calculateEndOffset( i ) - ((ASTNode)d).getOffset() ); } return d; } finally { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index b49c4887cac..ba7e472b9ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -1675,13 +1675,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); } - //TODO We need to wrap this IASTExpression lhs = expression(); - consume(IToken.tRPAREN).getEndOffset(); + int finalOffset = consume(IToken.tRPAREN).getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); } - return lhs; + return buildUnaryExpression( IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(), finalOffset ); case IToken.tIDENTIFIER: case IToken.tCOLONCOLON: case IToken.t_operator: @@ -3317,6 +3316,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { d.setInitializer(initializer); initializer.setParent(d); initializer.setPropertyInParent(IASTDeclarator.INITIALIZER); + ((ASTNode)d).setLength( calculateEndOffset( initializer ) - ((ASTNode)d).getOffset() ); } return d; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/ImagedToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/ImagedToken.java index 8d8ea168735..cb34a230654 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/ImagedToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/ImagedToken.java @@ -10,6 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.token; +import org.eclipse.cdt.core.parser.IToken; + /** * @author johnc @@ -47,10 +49,39 @@ public class ImagedToken extends SimpleToken { { this.image = image; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.token.SimpleToken#getOffset() + */ + public int getOffset() { + int s_val = super.getOffset(); + switch( getType() ) + { + case IToken.tSTRING: + case IToken.tCHAR: + return s_val; + case IToken.tLSTRING: + case IToken.tLCHAR: + return s_val - 1; + default: + return s_val; + } + } public int getLength() { if( getCharImage() == null ) return 0; - return getCharImage().length; + int s_length = getCharImage().length; + switch( getType() ) + { + case IToken.tSTRING: + case IToken.tCHAR: + return s_length + 2; + case IToken.tLSTRING: + case IToken.tLCHAR: + return s_length + 3; + default: + return s_length; + } } }