diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java index 106e7ddaa46..1e4abc2277e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNewExpression.java @@ -6,19 +6,25 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression; -import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; +import org.eclipse.core.runtime.Assert; /** * @author jcamelon @@ -31,6 +37,9 @@ public class CPPASTNewExpression extends CPPASTNode implements private IASTExpression initializer; private IASTTypeId typeId; private boolean isNewTypeId; + + private IASTExpression [] arrayExpressions = null; + public CPPASTNewExpression() { @@ -96,20 +105,44 @@ public class CPPASTNewExpression extends CPPASTNode implements } public IASTExpression [] getNewTypeIdArrayExpressions() { - if( arrayExpressions == null ) return IASTExpression.EMPTY_EXPRESSION_ARRAY; - return (IASTExpression[]) ArrayUtil.trim( IASTExpression.class, arrayExpressions ); + if( arrayExpressions == null ) { + if (typeId != null) { + IASTDeclarator dtor= CPPVisitor.findInnermostDeclarator(typeId.getAbstractDeclarator()); + if (dtor instanceof IASTArrayDeclarator) { + IASTArrayDeclarator ad= (IASTArrayDeclarator) dtor; + IASTArrayModifier[] ams= ad.getArrayModifiers(); + arrayExpressions= new IASTExpression[ams.length]; + for (int i = 0; i < ams.length; i++) { + IASTArrayModifier am = ams[i]; + arrayExpressions[i]= am.getConstantExpression(); + } + return arrayExpressions; + } + } + arrayExpressions= IASTExpression.EMPTY_EXPRESSION_ARRAY; + } + return arrayExpressions; } public void addNewTypeIdArrayExpression(IASTExpression expression) { - arrayExpressions = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, arrayExpressions, expression ); - if(expression != null) { - expression.setParent(this); - expression.setPropertyInParent(NEW_TYPEID_ARRAY_EXPRESSION); - } + Assert.isNotNull(typeId); + IASTDeclarator dtor= CPPVisitor.findInnermostDeclarator(typeId.getAbstractDeclarator()); + if (dtor instanceof IASTArrayDeclarator == false) { + Assert.isNotNull(dtor); + Assert.isTrue(dtor.getParent() == typeId); + IASTArrayDeclarator adtor= new CPPASTArrayDeclarator(dtor.getName()); + IASTPointerOperator[] ptrOps= dtor.getPointerOperators(); + for (IASTPointerOperator ptr : ptrOps) { + adtor.addPointerOperator(ptr); + } + typeId.setAbstractDeclarator(adtor); + dtor= adtor; + } + IASTArrayModifier mod= new CPPASTArrayModifier(expression); + ((ASTNode) mod).setOffsetAndLength((ASTNode)expression); + ((IASTArrayDeclarator) dtor).addArrayModifier(mod); } - private IASTExpression [] arrayExpressions = null; - @Override public boolean accept( ASTVisitor action ){ if( action.shouldVisitExpressions ){ @@ -122,11 +155,6 @@ public class CPPASTNewExpression extends CPPASTNode implements if( placement != null ) if( !placement.accept( action ) ) return false; if( typeId != null ) if( !typeId.accept( action ) ) return false; - - IASTExpression [] exps = getNewTypeIdArrayExpressions(); - for( int i = 0; i < exps.length; i++ ) - if( !exps[i].accept( action ) ) return false; - if( initializer != null ) if( !initializer.accept( action ) ) return false; if( action.shouldVisitExpressions ){ @@ -152,14 +180,6 @@ public class CPPASTNewExpression extends CPPASTNode implements other.setParent( child.getParent() ); initializer = (IASTExpression) other; } - if( arrayExpressions == null ) return; - for( int i = 0; i < arrayExpressions.length; ++i ) - if( arrayExpressions[i] == child ) - { - other.setPropertyInParent( child.getPropertyInParent() ); - other.setParent( child.getParent() ); - arrayExpressions[i] = (IASTExpression) other; - } } public IType getExpressionType() { |