From 8a37c61a8cf7ad9a8e5afee104a5b301a0555dbb Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 6 Jun 2005 15:41:09 +0000 Subject: [PATCH] Patch for Devin Steffler. Fixing ArrayUtil.removeNulls(). --- .../cdt/core/parser/util/ArrayUtil.java | 26 ++++++++++++++++++ .../core/dom/parser/c/CASTAmbiguity.java | 9 +++++-- .../dom/parser/c/CASTAmbiguousExpression.java | 9 +++++-- .../dom/parser/c/CASTAmbiguousStatement.java | 9 +++++-- .../dom/parser/c/CASTArrayDeclarator.java | 10 ++++--- .../parser/c/CASTCompositeTypeSpecifier.java | 9 +++++-- .../core/dom/parser/c/CASTDeclarator.java | 9 +++++-- .../parser/c/CASTDesignatedInitializer.java | 9 +++++-- .../parser/c/CASTEnumerationSpecifier.java | 9 +++++-- .../dom/parser/c/CASTFunctionDeclarator.java | 9 +++++-- .../dom/parser/c/CASTInitializerList.java | 9 +++++-- .../dom/parser/c/CASTSimpleDeclaration.java | 9 +++++-- .../dom/parser/c/CASTTranslationUnit.java | 9 +++++-- .../core/dom/parser/cpp/CPPASTAmbiguity.java | 9 +++++-- .../cpp/CPPASTAmbiguousDeclaration.java | 10 ++++--- .../parser/cpp/CPPASTAmbiguousExpression.java | 9 +++++-- .../parser/cpp/CPPASTAmbiguousStatement.java | 9 +++++-- .../dom/parser/cpp/CPPASTArrayDeclarator.java | 10 ++++--- .../cpp/CPPASTCompositeTypeSpecifier.java | 9 +++++-- .../core/dom/parser/cpp/CPPASTDeclarator.java | 10 ++++--- .../cpp/CPPASTEnumerationSpecifier.java | 9 +++++-- .../parser/cpp/CPPASTFunctionDeclarator.java | 27 ++++++++++++++----- .../cpp/CPPASTFunctionTryBlockDeclarator.java | 9 +++++-- .../dom/parser/cpp/CPPASTInitializerList.java | 9 +++++-- .../dom/parser/cpp/CPPASTQualifiedName.java | 9 ++++--- .../parser/cpp/CPPASTSimpleDeclaration.java | 9 +++++-- .../parser/cpp/CPPASTTemplateDeclaration.java | 9 +++++-- .../CPPASTTemplatedTypeTemplateParameter.java | 9 +++++-- .../parser/cpp/CPPASTTryBlockStatement.java | 9 +++++-- .../core/parser/scanner2/DependencyTree.java | 8 ++++-- .../core/parser/scanner2/InclusionNode.java | 8 ++++-- .../core/parser/scanner2/LocationMap.java | 8 ++++-- 32 files changed, 253 insertions(+), 71 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java index 09db286cb65..e93d1c3b9af 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java @@ -190,6 +190,9 @@ public class ArrayUtil { } /** + * Note that this should only be used when the placement of + * nulls within the array is unknown (due to performance efficiency). + * * Removes all of the nulls from the array and returns a new * array that contains all of the non-null elements. * @@ -219,6 +222,29 @@ public class ArrayUtil { return newArray; } + + /** + * To improve performance, this method should be used instead of ArrayUtil#removeNulls(Class, Object[]) when + * all of the non-null elements in the array are grouped together at the beginning of the array + * and all of the nulls are at the end of the array. + * The position of the last non-null element in the array must also be known. + * + * @return + */ + public static Object[] removeNullsAfter(Class c, Object[] array, int index) { + if( array == null || index < 0) + return (Object[]) Array.newInstance( c, 0 ); + + if( array.length == index + 1 ) + return array; + + Object[] newArray = (Object[]) Array.newInstance(c, index + 1); + for( int i = 0; i <= index; i++ ){ + newArray[i] = array[i]; + } + + return newArray; + } /** * Insert the obj at the beginning of the array, shifting the whole thing one index diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java index d5f937aa082..e5af3b45323 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java @@ -29,19 +29,24 @@ public abstract class CASTAmbiguity extends CASTNode { protected static class CASTNameCollector extends CASTVisitor { private IASTName[] names = new IASTName[ 2 ]; + private int namesPos=-1; { shouldVisitNames = true; } public int visit(IASTName name) { - names = (IASTName[]) ArrayUtil.append( IASTName.class, names, name ); + if (name != null) { + namesPos++; + names = (IASTName[]) ArrayUtil.append( IASTName.class, names, name ); + } return PROCESS_CONTINUE; } public IASTName [] getNames() { - return (IASTName[]) ArrayUtil.removeNulls( IASTName.class, names ); + names = (IASTName[]) ArrayUtil.removeNullsAfter( IASTName.class, names, namesPos ); + return names; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousExpression.java index f434f861a03..683c868a1ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousExpression.java @@ -19,13 +19,18 @@ public class CASTAmbiguousExpression extends CASTAmbiguity implements IASTAmbiguousExpression { private IASTExpression [] expressions = new IASTExpression[2]; + private int expressionsPos=-1; public void addExpression(IASTExpression e) { - expressions = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, expressions, e ); + if (e != null) { + expressionsPos++; + expressions = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, expressions, e ); + } } public IASTExpression[] getExpressions() { - return (IASTExpression[]) ArrayUtil.removeNulls( IASTExpression.class, expressions ); + expressions = (IASTExpression[]) ArrayUtil.removeNullsAfter( IASTExpression.class, expressions, expressionsPos ); + return expressions; } protected IASTNode[] getNodes() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousStatement.java index 7544d51171a..a544fa4d013 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousStatement.java @@ -19,13 +19,18 @@ public class CASTAmbiguousStatement extends CASTAmbiguity implements IASTAmbiguousStatement { private IASTStatement [] stmts = new IASTStatement[2]; + private int stmtsPos=-1; public void addStatement(IASTStatement s) { - stmts = (IASTStatement[]) ArrayUtil.append( IASTStatement.class, stmts, s ); + if (s != null) { + stmtsPos++; + stmts = (IASTStatement[]) ArrayUtil.append( IASTStatement.class, stmts, s ); + } } public IASTStatement[] getStatements() { - return (IASTStatement[]) ArrayUtil.removeNulls( IASTStatement.class, stmts ); + stmts = (IASTStatement[]) ArrayUtil.removeNullsAfter( IASTStatement.class, stmts, stmtsPos ); + return stmts; } protected IASTNode[] getNodes() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java index 3a436b42fd0..5a00e976176 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java @@ -22,16 +22,20 @@ public class CASTArrayDeclarator extends CASTDeclarator implements IASTArrayDeclarator { private IASTArrayModifier [] arrayMods = null; - + private int arrayModsPos=-1; public IASTArrayModifier[] getArrayModifiers() { if( arrayMods == null ) return IASTArrayModifier.EMPTY_ARRAY; - return (IASTArrayModifier[]) ArrayUtil.removeNulls( IASTArrayModifier.class, arrayMods ); + arrayMods = (IASTArrayModifier[]) ArrayUtil.removeNullsAfter( IASTArrayModifier.class, arrayMods, arrayModsPos ); + return arrayMods; } public void addArrayModifier(IASTArrayModifier arrayModifier) { - arrayMods = (IASTArrayModifier[]) ArrayUtil.append( IASTArrayModifier.class, arrayMods, arrayModifier ); + if (arrayModifier != null) { + arrayModsPos++; + arrayMods = (IASTArrayModifier[]) ArrayUtil.append( IASTArrayModifier.class, arrayMods, arrayModifier ); + } } protected boolean postAccept( ASTVisitor action ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java index 9207131427c..4b153601f9e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java @@ -56,6 +56,7 @@ public class CASTCompositeTypeSpecifier extends CASTBaseDeclSpecifier implements private IASTDeclaration [] declarations = null; + private int declarationsPos=-1; private IScope scope = null; @@ -64,14 +65,18 @@ public class CASTCompositeTypeSpecifier extends CASTBaseDeclSpecifier implements */ public IASTDeclaration [] getMembers() { if( declarations == null ) return IASTDeclaration.EMPTY_DECLARATION_ARRAY; - return (IASTDeclaration[]) ArrayUtil.removeNulls( IASTDeclaration.class, declarations ); + declarations = (IASTDeclaration[]) ArrayUtil.removeNullsAfter( IASTDeclaration.class, declarations, declarationsPos ); + return declarations; } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier#addMemberDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) */ public void addMemberDeclaration(IASTDeclaration declaration) { - declarations = (IASTDeclaration[]) ArrayUtil.append( IASTDeclaration.class, declarations, declaration ); + if (declaration != null) { + declarationsPos++; + declarations = (IASTDeclaration[]) ArrayUtil.append( IASTDeclaration.class, declarations, declaration ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java index 48cd6a4c1ca..a376cc53d6d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java @@ -33,6 +33,7 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator { private IASTName name; private IASTDeclarator nestedDeclarator; private IASTPointerOperator [] pointerOps = null; + private int pointerOpsPos=-1; @@ -41,7 +42,8 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator { */ public IASTPointerOperator[] getPointerOperators() { if( pointerOps == null ) return IASTPointerOperator.EMPTY_ARRAY; - return (IASTPointerOperator[]) ArrayUtil.removeNulls( IASTPointerOperator.class, pointerOps ); + pointerOps = (IASTPointerOperator[]) ArrayUtil.removeNullsAfter( IASTPointerOperator.class, pointerOps, pointerOpsPos ); + return pointerOps; } /* (non-Javadoc) @@ -76,7 +78,10 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator { * @see org.eclipse.cdt.core.dom.ast.IASTDeclarator#addPointerOperator(org.eclipse.cdt.core.dom.ast.IASTPointerOperator) */ public void addPointerOperator(IASTPointerOperator operator) { - pointerOps = (IASTPointerOperator[]) ArrayUtil.append( IASTPointerOperator.class, pointerOps, operator ); + if (operator != null) { + pointerOpsPos++; + pointerOps = (IASTPointerOperator[]) ArrayUtil.append( IASTPointerOperator.class, pointerOps, operator ); + } } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java index ad6633fc23e..9678a992937 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java @@ -28,7 +28,10 @@ public class CASTDesignatedInitializer extends CASTNode implements * @see org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer#addDesignator(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator) */ public void addDesignator(ICASTDesignator designator) { - designators = (ICASTDesignator[]) ArrayUtil.append( ICASTDesignator.class, designators, designator ); + if (designator != null) { + designatorsPos++; + designators = (ICASTDesignator[]) ArrayUtil.append( ICASTDesignator.class, designators, designator ); + } } /* (non-Javadoc) @@ -36,10 +39,12 @@ public class CASTDesignatedInitializer extends CASTNode implements */ public ICASTDesignator[] getDesignators() { if( designators == null ) return ICASTDesignatedInitializer.EMPTY_DESIGNATOR_ARRAY; - return (ICASTDesignator[]) ArrayUtil.removeNulls( ICASTDesignator.class, designators ); + designators = (ICASTDesignator[]) ArrayUtil.removeNullsAfter( ICASTDesignator.class, designators, designatorsPos ); + return designators; } private ICASTDesignator [] designators = null; + int designatorsPos=-1; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer#getRHSInitializer() */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java index 0dba239a165..e9fcf1dd8e4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java @@ -26,7 +26,10 @@ public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#addEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) */ public void addEnumerator(IASTEnumerator enumerator) { - enumerators = (IASTEnumerator[]) ArrayUtil.append( IASTEnumerator.class, enumerators, enumerator ); + if (enumerator != null) { + enumeratorsPos++; + enumerators = (IASTEnumerator[]) ArrayUtil.append( IASTEnumerator.class, enumerators, enumerator ); + } } /* (non-Javadoc) @@ -34,10 +37,12 @@ public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements */ public IASTEnumerator[] getEnumerators() { if( enumerators == null ) return IASTEnumerator.EMPTY_ENUMERATOR_ARRAY; - return (IASTEnumerator[]) ArrayUtil.removeNulls( IASTEnumerator.class, enumerators ); + enumerators = (IASTEnumerator[]) ArrayUtil.removeNullsAfter( IASTEnumerator.class, enumerators, enumeratorsPos ); + return enumerators; } private IASTEnumerator [] enumerators = null; + private int enumeratorsPos=-1; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#setName(org.eclipse.cdt.core.dom.ast.IASTName) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFunctionDeclarator.java index 899852da79d..3c0bd1aac22 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFunctionDeclarator.java @@ -21,6 +21,7 @@ public class CASTFunctionDeclarator extends CASTDeclarator implements IASTStandardFunctionDeclarator { private IASTParameterDeclaration [] parameters = null; + private int parametersPos=-1; private boolean varArgs; @@ -30,14 +31,18 @@ public class CASTFunctionDeclarator extends CASTDeclarator implements */ public IASTParameterDeclaration[] getParameters() { if( parameters == null ) return IASTParameterDeclaration.EMPTY_PARAMETERDECLARATION_ARRAY; - return (IASTParameterDeclaration[]) ArrayUtil.removeNulls( IASTParameterDeclaration.class, parameters ); + parameters = (IASTParameterDeclaration[]) ArrayUtil.removeNullsAfter( IASTParameterDeclaration.class, parameters, parametersPos ); + return parameters; } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator#addParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) */ public void addParameterDeclaration(IASTParameterDeclaration parameter) { - parameters = (IASTParameterDeclaration[]) ArrayUtil.append( IASTParameterDeclaration.class, parameters, parameter ); + if (parameter != null) { + parametersPos++; + parameters = (IASTParameterDeclaration[]) ArrayUtil.append( IASTParameterDeclaration.class, parameters, parameter ); + } } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTInitializerList.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTInitializerList.java index ef6276662f1..908702c7aa9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTInitializerList.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTInitializerList.java @@ -26,15 +26,20 @@ public class CASTInitializerList extends CASTNode implements */ public IASTInitializer[] getInitializers() { if( initializers == null ) return IASTInitializer.EMPTY_INITIALIZER_ARRAY; - return (IASTInitializer[]) ArrayUtil.removeNulls( IASTInitializer.class, initializers ); + initializers = (IASTInitializer[]) ArrayUtil.removeNullsAfter( IASTInitializer.class, initializers, initializersPos ); + return initializers; } public void addInitializer( IASTInitializer d ) { - initializers = (IASTInitializer[]) ArrayUtil.append( IASTInitializer.class, initializers, d ); + if (d != null) { + initializersPos++; + initializers = (IASTInitializer[]) ArrayUtil.append( IASTInitializer.class, initializers, d ); + } } private IASTInitializer [] initializers = null; + private int initializersPos=-1; public boolean accept( ASTVisitor action ){ if( action.shouldVisitInitializers ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTSimpleDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTSimpleDeclaration.java index c72b235f4f1..dc905f3bcb8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTSimpleDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTSimpleDeclaration.java @@ -34,16 +34,21 @@ public class CASTSimpleDeclaration extends CASTNode implements */ public IASTDeclarator[] getDeclarators() { if( declarators == null ) return IASTDeclarator.EMPTY_DECLARATOR_ARRAY; - return (IASTDeclarator[]) ArrayUtil.removeNulls( IASTDeclarator.class, declarators ); + declarators = (IASTDeclarator[]) ArrayUtil.removeNullsAfter( IASTDeclarator.class, declarators, declaratorsPos ); + return declarators; } public void addDeclarator( IASTDeclarator d ) { - declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, d ); + if (d != null) { + declaratorsPos++; + declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, d ); + } } private IASTDeclarator [] declarators = null; + private int declaratorsPos=-1; private IASTDeclSpecifier declSpecifier; /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java index d5da261f0a3..636e9b467ba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java @@ -50,6 +50,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit, IRequiresLocationInformation { private IASTDeclaration[] decls = null; + private int declsPos=-1; // Binding private CScope compilationUnit = null; @@ -71,7 +72,10 @@ public class CASTTranslationUnit extends CASTNode implements private static final IASTName[] EMPTY_NAME_ARRAY = new IASTName[0]; public void addDeclaration(IASTDeclaration d) { - decls = (IASTDeclaration[]) ArrayUtil.append( IASTDeclaration.class, decls, d ); + if (d != null) { + declsPos++; + decls = (IASTDeclaration[]) ArrayUtil.append( IASTDeclaration.class, decls, d ); + } } /* @@ -81,7 +85,8 @@ public class CASTTranslationUnit extends CASTNode implements */ public IASTDeclaration[] getDeclarations() { if (decls == null) return IASTDeclaration.EMPTY_DECLARATION_ARRAY; - return (IASTDeclaration[]) ArrayUtil.removeNulls( IASTDeclaration.class, decls ); + decls = (IASTDeclaration[]) ArrayUtil.removeNullsAfter( IASTDeclaration.class, decls, declsPos ); + return decls; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java index a4cdd532bc4..ab9c4af6e3d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java @@ -29,17 +29,22 @@ public abstract class CPPASTAmbiguity extends CPPASTNode { protected static class CPPASTNameCollector extends CPPASTVisitor { private IASTName[] names = new IASTName[2]; + private int namesPos=-1; { shouldVisitNames = true; } public int visit(IASTName name) { - names = (IASTName[]) ArrayUtil.append(IASTName.class, names, name); + if (name != null) { + namesPos++; + names = (IASTName[]) ArrayUtil.append(IASTName.class, names, name); + } return PROCESS_CONTINUE; } public IASTName[] getNames() { - return (IASTName[]) ArrayUtil.removeNulls(IASTName.class, names); + names = (IASTName[]) ArrayUtil.removeNullsAfter(IASTName.class, names, namesPos); + return names; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousDeclaration.java index d700038ad84..56660a13c12 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousDeclaration.java @@ -23,14 +23,18 @@ public class CPPASTAmbiguousDeclaration extends CPPASTAmbiguity implements } private IASTDeclaration [] decls = new IASTDeclaration[2]; + private int declsPos=-1; public void addDeclaration(IASTDeclaration d) { - decls = (IASTDeclaration[]) ArrayUtil.append(IASTDeclaration.class, decls, d ); - + if (d != null) { + declsPos++; + decls = (IASTDeclaration[]) ArrayUtil.append(IASTDeclaration.class, decls, d ); + } } public IASTDeclaration[] getDeclarations() { - return (IASTDeclaration[]) ArrayUtil.removeNulls( IASTDeclaration.class, decls ); + decls = (IASTDeclaration[]) ArrayUtil.removeNullsAfter( IASTDeclaration.class, decls, declsPos ); + return decls; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousExpression.java index 0c5293c0c03..1026df23296 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousExpression.java @@ -19,13 +19,18 @@ public class CPPASTAmbiguousExpression extends CPPASTAmbiguity implements IASTAmbiguousExpression { private IASTExpression [] exp = new IASTExpression[2]; + private int expPos=-1; public void addExpression(IASTExpression e) { - exp = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, exp, e ); + if (e != null) { + expPos++; + exp = (IASTExpression[]) ArrayUtil.append( IASTExpression.class, exp, e ); + } } public IASTExpression[] getExpressions() { - return (IASTExpression[]) ArrayUtil.removeNulls( IASTExpression.class, exp ); + exp = (IASTExpression[]) ArrayUtil.removeNullsAfter( IASTExpression.class, exp, expPos ); + return exp; } protected IASTNode[] getNodes() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousStatement.java index e051dd0bd29..11580cc732d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousStatement.java @@ -19,13 +19,18 @@ public class CPPASTAmbiguousStatement extends CPPASTAmbiguity implements IASTAmbiguousStatement { private IASTStatement [] stmts = new IASTStatement[2]; + private int stmtsPos=-1; public void addStatement(IASTStatement s) { - stmts = (IASTStatement[]) ArrayUtil.append( IASTStatement.class, stmts, s ); + if (s != null) { + stmtsPos++; + stmts = (IASTStatement[]) ArrayUtil.append( IASTStatement.class, stmts, s ); + } } public IASTStatement[] getStatements() { - return (IASTStatement[]) ArrayUtil.removeNulls( IASTStatement.class, stmts ); + stmts = (IASTStatement[]) ArrayUtil.removeNullsAfter( IASTStatement.class, stmts, stmtsPos ); + return stmts; } protected IASTNode[] getNodes() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayDeclarator.java index 49432bcda1b..007e4add242 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayDeclarator.java @@ -23,15 +23,19 @@ public class CPPASTArrayDeclarator extends CPPASTDeclarator implements IASTArrayDeclarator { private IASTArrayModifier [] arrayMods = null; - + private int arrayModsPos=-1; public IASTArrayModifier[] getArrayModifiers() { if( arrayMods == null ) return IASTArrayModifier.EMPTY_ARRAY; - return (IASTArrayModifier[]) ArrayUtil.removeNulls( IASTArrayModifier.class, arrayMods ); + arrayMods = (IASTArrayModifier[]) ArrayUtil.removeNullsAfter( IASTArrayModifier.class, arrayMods, arrayModsPos ); + return arrayMods; } public void addArrayModifier(IASTArrayModifier arrayModifier) { - arrayMods = (IASTArrayModifier[]) ArrayUtil.append( IASTArrayModifier.class, arrayMods, arrayModifier ); + if (arrayModifier != null) { + arrayModsPos++; + arrayMods = (IASTArrayModifier[]) ArrayUtil.append( IASTArrayModifier.class, arrayMods, arrayModifier ); + } } protected boolean postAccept( ASTVisitor action ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java index f7cd2d43860..d796e3be2d2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java @@ -41,14 +41,18 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier */ public ICPPASTBaseSpecifier[] getBaseSpecifiers() { if( baseSpecs == null ) return ICPPASTBaseSpecifier.EMPTY_BASESPECIFIER_ARRAY; - return (ICPPASTBaseSpecifier[]) ArrayUtil.removeNulls( ICPPASTBaseSpecifier.class, baseSpecs ); + baseSpecs = (ICPPASTBaseSpecifier[]) ArrayUtil.removeNullsAfter( ICPPASTBaseSpecifier.class, baseSpecs, baseSpecsPos ); + return baseSpecs; } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier#addBaseSpecifier(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier) */ public void addBaseSpecifier(ICPPASTBaseSpecifier baseSpec) { - baseSpecs = (ICPPASTBaseSpecifier[]) ArrayUtil.append( ICPPASTBaseSpecifier.class, baseSpecs, baseSpec ); + if (baseSpec != null) { + baseSpecsPos++; + baseSpecs = (ICPPASTBaseSpecifier[]) ArrayUtil.append( ICPPASTBaseSpecifier.class, baseSpecs, baseSpec ); + } } /* (non-Javadoc) @@ -98,6 +102,7 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier private IASTDeclaration [] declarations = new IASTDeclaration[4]; private ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier [] baseSpecs = null; + private int baseSpecsPos=-1; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier#getScope() diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java index c0ce5409b57..57ae5169da5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java @@ -33,7 +33,7 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator { private IASTName name; private IASTDeclarator nestedDeclarator; private IASTPointerOperator [] pointerOps = null; - + private int pointerOpsPos=-1; /* (non-Javadoc) @@ -41,7 +41,8 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator { */ public IASTPointerOperator[] getPointerOperators() { if( pointerOps == null ) return IASTPointerOperator.EMPTY_ARRAY; - return (IASTPointerOperator[]) ArrayUtil.removeNulls( IASTPointerOperator.class, pointerOps ); + pointerOps = (IASTPointerOperator[]) ArrayUtil.removeNullsAfter( IASTPointerOperator.class, pointerOps, pointerOpsPos ); + return pointerOps; } /* (non-Javadoc) @@ -76,7 +77,10 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator { * @see org.eclipse.cdt.core.dom.ast.IASTDeclarator#addPointerOperator(org.eclipse.cdt.core.dom.ast.IASTPointerOperator) */ public void addPointerOperator(IASTPointerOperator operator) { - pointerOps = (IASTPointerOperator[]) ArrayUtil.append( IASTPointerOperator.class, pointerOps, operator ); + if (operator != null) { + pointerOpsPos++; + pointerOps = (IASTPointerOperator[]) ArrayUtil.append( IASTPointerOperator.class, pointerOps, operator ); + } } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java index 3f3bffe6276..7289ec8460d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java @@ -30,7 +30,10 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#addEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) */ public void addEnumerator(IASTEnumerator enumerator) { - enumerators = (IASTEnumerator[]) ArrayUtil.append( IASTEnumerator.class, enumerators, enumerator ); + if (enumerator != null) { + enumeratorsPos++; + enumerators = (IASTEnumerator[]) ArrayUtil.append( IASTEnumerator.class, enumerators, enumerator ); + } } /* @@ -41,11 +44,13 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier public IASTEnumerator[] getEnumerators() { if (enumerators == null) return IASTEnumerator.EMPTY_ENUMERATOR_ARRAY; - return (IASTEnumerator[]) ArrayUtil.removeNulls( IASTEnumerator.class, enumerators ); + enumerators = (IASTEnumerator[]) ArrayUtil.removeNullsAfter( IASTEnumerator.class, enumerators, enumeratorsPos ); + return enumerators; } private IASTEnumerator[] enumerators = null; + private int enumeratorsPos=-1; /* * (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java index 3b1aa0e1db2..b2bb776b58e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java @@ -29,6 +29,7 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements ICPPASTFunctionDeclarator { private IASTParameterDeclaration [] parameters = null; + private int parametersPos=-1; private ICPPFunctionScope scope = null; private boolean varArgs; private boolean pureVirtual; @@ -42,14 +43,18 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements */ public IASTParameterDeclaration [] getParameters() { if( parameters == null ) return IASTParameterDeclaration.EMPTY_PARAMETERDECLARATION_ARRAY; - return (IASTParameterDeclaration[]) ArrayUtil.removeNulls( IASTParameterDeclaration.class, parameters ); + parameters = (IASTParameterDeclaration[]) ArrayUtil.removeNullsAfter( IASTParameterDeclaration.class, parameters, parametersPos ); + return parameters; } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator#addParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) */ public void addParameterDeclaration(IASTParameterDeclaration parameter) { - parameters = (IASTParameterDeclaration []) ArrayUtil.append( IASTParameterDeclaration.class, parameters, parameter ); + if (parameter != null) { + parametersPos++; + parameters = (IASTParameterDeclaration []) ArrayUtil.append( IASTParameterDeclaration.class, parameters, parameter ); + } } /* (non-Javadoc) @@ -99,12 +104,14 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements } private IASTTypeId [] typeIds = null; + private int typeIdsPos=-1; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator#getExceptionSpecification() */ public IASTTypeId[] getExceptionSpecification() { if( typeIds == null ) return IASTTypeId.EMPTY_TYPEID_ARRAY; - return (IASTTypeId[]) ArrayUtil.removeNulls( IASTTypeId.class, typeIds ); + typeIds = (IASTTypeId[]) ArrayUtil.removeNullsAfter( IASTTypeId.class, typeIds, typeIdsPos ); + return typeIds; } @@ -112,7 +119,10 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator#addExceptionSpecificationTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) */ public void addExceptionSpecificationTypeId(IASTTypeId typeId) { - typeIds = (IASTTypeId[]) ArrayUtil.append( IASTTypeId.class, typeIds, typeId ); + if (typeId != null) { + typeIdsPos++; + typeIds = (IASTTypeId[]) ArrayUtil.append( IASTTypeId.class, typeIds, typeId ); + } } @@ -133,13 +143,15 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements private ICPPASTConstructorChainInitializer [] constructorChain = null; + private int constructorChainPos=-1; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator#getConstructorChain() */ public ICPPASTConstructorChainInitializer[] getConstructorChain() { if( constructorChain == null ) return ICPPASTConstructorChainInitializer.EMPTY_CONSTRUCTORCHAININITIALIZER_ARRAY; - return (ICPPASTConstructorChainInitializer[]) ArrayUtil.removeNulls( ICPPASTConstructorChainInitializer.class, constructorChain ); + constructorChain = (ICPPASTConstructorChainInitializer[]) ArrayUtil.removeNullsAfter( ICPPASTConstructorChainInitializer.class, constructorChain, constructorChainPos ); + return constructorChain; } @@ -147,7 +159,10 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator#addConstructorToChain(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer) */ public void addConstructorToChain(ICPPASTConstructorChainInitializer initializer) { - constructorChain = (ICPPASTConstructorChainInitializer[]) ArrayUtil.append( ICPPASTConstructorChainInitializer.class, constructorChain, initializer ); + if (initializer != null) { + constructorChainPos++; + constructorChain = (ICPPASTConstructorChainInitializer[]) ArrayUtil.append( ICPPASTConstructorChainInitializer.class, constructorChain, initializer ); + } } public ICPPFunctionScope getFunctionScope(){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionTryBlockDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionTryBlockDeclarator.java index 3021350fbdd..47f17bc8925 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionTryBlockDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionTryBlockDeclarator.java @@ -25,7 +25,10 @@ public class CPPASTFunctionTryBlockDeclarator extends CPPASTFunctionDeclarator * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator#addCatchHandler(org.eclipse.cdt.core.dom.ast.IASTStatement) */ public void addCatchHandler(ICPPASTCatchHandler statement) { - catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.append( ICPPASTCatchHandler.class, catchHandlers, statement ); + if (statement != null) { + catchHandlersPos++; + catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.append( ICPPASTCatchHandler.class, catchHandlers, statement ); + } } /* (non-Javadoc) @@ -33,11 +36,13 @@ public class CPPASTFunctionTryBlockDeclarator extends CPPASTFunctionDeclarator */ public ICPPASTCatchHandler [] getCatchHandlers() { if( catchHandlers == null ) return ICPPASTCatchHandler.EMPTY_CATCHHANDLER_ARRAY; - return (ICPPASTCatchHandler[]) ArrayUtil.removeNulls( ICPPASTCatchHandler.class, catchHandlers ); + catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.removeNullsAfter( ICPPASTCatchHandler.class, catchHandlers, catchHandlersPos ); + return catchHandlers; } private ICPPASTCatchHandler [] catchHandlers = null; + private int catchHandlersPos=-1; protected boolean postAccept( ASTVisitor action ){ if( !super.postAccept( action ) ) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTInitializerList.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTInitializerList.java index 867f3da5602..7f32aba895b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTInitializerList.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTInitializerList.java @@ -27,16 +27,21 @@ public class CPPASTInitializerList extends CPPASTNode implements */ public IASTInitializer [] getInitializers() { if( initializers == null ) return IASTInitializer.EMPTY_INITIALIZER_ARRAY; - return (IASTInitializer[]) ArrayUtil.removeNulls( IASTInitializer.class, initializers ); + initializers = (IASTInitializer[]) ArrayUtil.removeNullsAfter( IASTInitializer.class, initializers, initializersPos ); + return initializers; } public void addInitializer( IASTInitializer d ) { - initializers = (IASTInitializer[]) ArrayUtil.append( IASTInitializer.class, initializers, d ); + if (d != null) { + initializersPos++; + initializers = (IASTInitializer[]) ArrayUtil.append( IASTInitializer.class, initializers, d ); + } } private IASTInitializer [] initializers = null; + private int initializersPos=-1; public boolean accept( ASTVisitor action ){ if( action.shouldVisitInitializers ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java index 0261808c8b7..66deee0b029 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java @@ -66,18 +66,21 @@ public class CPPASTQualifiedName extends CPPASTNode implements * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#addName(org.eclipse.cdt.core.dom.ast.IASTName) */ public void addName(IASTName name) { - names = (IASTName[]) ArrayUtil.append( IASTName.class, names, name ); + if (name != null) { + namesPos++; + names = (IASTName[]) ArrayUtil.append( IASTName.class, names, name ); + } } /** * @param decls2 */ private void removeNullNames() { - names = (IASTName[]) ArrayUtil.removeNulls( IASTName.class, names ); - + names = (IASTName[]) ArrayUtil.removeNullsAfter( IASTName.class, names, namesPos ); } private IASTName[] names = null; + private int namesPos=-1; private boolean value; private String signature; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleDeclaration.java index b4de6c2d2b1..28c94137579 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleDeclaration.java @@ -36,15 +36,20 @@ public class CPPASTSimpleDeclaration extends CPPASTNode implements */ public IASTDeclarator[] getDeclarators() { if( declarators == null ) return IASTDeclarator.EMPTY_DECLARATOR_ARRAY; - return (IASTDeclarator[]) ArrayUtil.removeNulls( IASTDeclarator.class, declarators ); + declarators = (IASTDeclarator[]) ArrayUtil.removeNullsAfter( IASTDeclarator.class, declarators, declaratorsPos ); + return declarators; } public void addDeclarator( IASTDeclarator d ) { - declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, d ); + if (d != null) { + declaratorsPos++; + declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, d ); + } } private IASTDeclarator [] declarators = null; + private int declaratorsPos=-1; private IASTDeclSpecifier declSpecifier; /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateDeclaration.java index 6ef94586f2e..d2b713efc4e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateDeclaration.java @@ -62,17 +62,22 @@ public class CPPASTTemplateDeclaration extends CPPASTNode implements */ public ICPPASTTemplateParameter [] getTemplateParameters() { if( parameters == null ) return ICPPASTTemplateParameter.EMPTY_TEMPLATEPARAMETER_ARRAY; - return (ICPPASTTemplateParameter[]) ArrayUtil.removeNulls( ICPPASTTemplateParameter.class, parameters ); + parameters = (ICPPASTTemplateParameter[]) ArrayUtil.removeNullsAfter( ICPPASTTemplateParameter.class, parameters, parametersPos ); + return parameters; } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration#addTemplateParamter(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter) */ public void addTemplateParamter(ICPPASTTemplateParameter parm) { - parameters = (ICPPASTTemplateParameter[]) ArrayUtil.append( ICPPASTTemplateParameter.class, parameters, parm ); + if (parm != null) { + parametersPos++; + parameters = (ICPPASTTemplateParameter[]) ArrayUtil.append( ICPPASTTemplateParameter.class, parameters, parm ); + } } private ICPPASTTemplateParameter [] parameters = null; + private int parametersPos=-1; public boolean accept( ASTVisitor action ){ if( action.shouldVisitDeclarations ){ switch( action.visit( this ) ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java index efb4d1897f3..46c59b1e081 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java @@ -28,14 +28,19 @@ public class CPPASTTemplatedTypeTemplateParameter extends CPPASTNode implements public ICPPASTTemplateParameter[] getTemplateParameters() { if( parameters == null ) return ICPPASTTemplateParameter.EMPTY_TEMPLATEPARAMETER_ARRAY; - return (ICPPASTTemplateParameter[]) ArrayUtil.removeNulls( ICPPASTTemplateParameter.class, parameters ); + parameters = (ICPPASTTemplateParameter[]) ArrayUtil.removeNullsAfter( ICPPASTTemplateParameter.class, parameters, parametersPos ); + return parameters; } public void addTemplateParamter(ICPPASTTemplateParameter parm) { - parameters = (ICPPASTTemplateParameter[]) ArrayUtil.append( ICPPASTTemplateParameter.class, parameters, parm ); + if(parm != null) { + parametersPos++; + parameters = (ICPPASTTemplateParameter[]) ArrayUtil.append( ICPPASTTemplateParameter.class, parameters, parm ); + } } private ICPPASTTemplateParameter [] parameters = null; + private int parametersPos=-1; private IASTName name; private IASTExpression defaultValue; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTryBlockStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTryBlockStatement.java index 6024357cc22..9131709fe91 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTryBlockStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTryBlockStatement.java @@ -28,7 +28,10 @@ public class CPPASTTryBlockStatement extends CPPASTNode implements * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator#addCatchHandler(org.eclipse.cdt.core.dom.ast.IASTStatement) */ public void addCatchHandler(ICPPASTCatchHandler statement) { - catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.append( ICPPASTCatchHandler.class, catchHandlers, statement ); + if (statement != null) { + catchHandlersPos++; + catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.append( ICPPASTCatchHandler.class, catchHandlers, statement ); + } } /* (non-Javadoc) @@ -36,11 +39,13 @@ public class CPPASTTryBlockStatement extends CPPASTNode implements */ public ICPPASTCatchHandler[] getCatchHandlers() { if( catchHandlers == null ) return ICPPASTCatchHandler.EMPTY_CATCHHANDLER_ARRAY; - return (ICPPASTCatchHandler[]) ArrayUtil.removeNulls( ICPPASTCatchHandler.class, catchHandlers ); + catchHandlers = (ICPPASTCatchHandler[]) ArrayUtil.removeNullsAfter( ICPPASTCatchHandler.class, catchHandlers, catchHandlersPos ); + return catchHandlers; } private ICPPASTCatchHandler [] catchHandlers = null; + private int catchHandlersPos=-1; private IASTStatement tryBody; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTryBlockStatement#setTryBody(org.eclipse.cdt.core.dom.ast.IASTStatement) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DependencyTree.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DependencyTree.java index 3ed10b5db03..e88dab78607 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DependencyTree.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DependencyTree.java @@ -27,14 +27,18 @@ public class DependencyTree implements IASTTranslationUnit.IDependencyTree, IDep } private IASTInclusionNode [] incs = new IASTInclusionNode[2]; + private int incsPos=-1; public IASTInclusionNode[] getInclusions() { - incs = (IASTInclusionNode[]) ArrayUtil.removeNulls( IASTInclusionNode.class, incs ); + incs = (IASTInclusionNode[]) ArrayUtil.removeNullsAfter( IASTInclusionNode.class, incs, incsPos ); return incs; } public void addInclusionNode(IASTInclusionNode node) { - incs = (IASTInclusionNode[]) ArrayUtil.append( IASTInclusionNode.class, incs, node ); + if (node != null) { + incsPos++; + incs = (IASTInclusionNode[]) ArrayUtil.append( IASTInclusionNode.class, incs, node ); + } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/InclusionNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/InclusionNode.java index 18e8146edcd..45b144cc2c3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/InclusionNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/InclusionNode.java @@ -27,14 +27,18 @@ public class InclusionNode implements IASTInclusionNode, IDependencyNodeHost { } private IASTInclusionNode [] incs = new IASTInclusionNode[2]; + private int incsPos=-1; public IASTInclusionNode[] getNestedInclusions() { - incs = (IASTInclusionNode[]) ArrayUtil.removeNulls( IASTInclusionNode.class, incs ); + incs = (IASTInclusionNode[]) ArrayUtil.removeNullsAfter( IASTInclusionNode.class, incs, incsPos ); return incs; } public void addInclusionNode(IASTInclusionNode node) { - incs = (IASTInclusionNode[]) ArrayUtil.append( IASTInclusionNode.class, incs, node ); + if (node != null) { + incsPos++; + incs = (IASTInclusionNode[]) ArrayUtil.append( IASTInclusionNode.class, incs, node ); + } } public String toString() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index 674ec3fd42f..028d8857821 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -1154,14 +1154,18 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } IMacroDefinition [] builtins = new IMacroDefinition[2]; + private int builtinsPos=-1; public void addBuiltinMacro(IMacroDefinition def) { - builtins = (IMacroDefinition[]) ArrayUtil.append( IMacroDefinition.class, builtins, def ); + if (def != null) { + builtinsPos++; + builtins = (IMacroDefinition[]) ArrayUtil.append( IMacroDefinition.class, builtins, def ); + } } public IMacroDefinition [] getBuiltinMacroDefinitions() { - builtins = (IMacroDefinition[]) ArrayUtil.removeNulls( IMacroDefinition.class, builtins ); + builtins = (IMacroDefinition[]) ArrayUtil.removeNullsAfter( IMacroDefinition.class, builtins, builtinsPos ); return builtins; }