1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

remove LinkedLists, start reducing the use of Iterators

This commit is contained in:
Andrew Niefer 2004-07-29 21:08:36 +00:00
parent 61c8f7bb5c
commit 9ffd548ae7
17 changed files with 219 additions and 220 deletions

View file

@ -303,7 +303,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
char [] fn = start.getFilename(); char [] fn = start.getFilename();
start = null; start = null;
IASTExpression expression = null; IASTExpression expression = null;
List list = new LinkedList(); List list = new ArrayList();
boolean completedArg = false; boolean completedArg = false;
boolean failed = false; boolean failed = false;

View file

@ -10,6 +10,7 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast; package org.eclipse.cdt.internal.core.parser.ast;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -71,6 +72,10 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration
if( pointerOperators == null ) return EmptyIterator.EMPTY_ITERATOR; if( pointerOperators == null ) return EmptyIterator.EMPTY_ITERATOR;
return pointerOperators.iterator(); return pointerOperators.iterator();
} }
public List getPointerOperatorsList(){
if( pointerOperators == null ) return Collections.EMPTY_LIST;
return pointerOperators;
}
public int getNumPointerOperators(){ public int getNumPointerOperators(){
if( pointerOperators == null ) if( pointerOperators == null )
@ -87,6 +92,11 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration
return arrayModifiers.iterator(); return arrayModifiers.iterator();
} }
public List getArrayModifiersList(){
if( arrayModifiers == null ) return Collections.EMPTY_LIST;
return arrayModifiers;
}
public int getNumArrayModifiers(){ public int getNumArrayModifiers(){
if( arrayModifiers == null ) if( arrayModifiers == null )
return 0; return 0;

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.parser.ast.complete; package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
@ -234,26 +235,29 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier
declarations = new ArrayList(0); declarations = new ArrayList(0);
} }
private List unresolvedCrossReferences = new ArrayList(); private List unresolvedCrossReferences = Collections.EMPTY_LIST;
private boolean processingUnresolvedReferences = false; private boolean processingUnresolvedReferences = false;
public void addUnresolvedReference( UnresolvedReferenceDuple duple) public void addUnresolvedReference( UnresolvedReferenceDuple duple)
{ {
//avoid a ConcurrentModificationException by not adding more references when we are //avoid a ConcurrentModificationException by not adding more references when we are
//in the middle of processing them //in the middle of processing them
if( !processingUnresolvedReferences ) if( !processingUnresolvedReferences ){
if( unresolvedCrossReferences == Collections.EMPTY_LIST )
unresolvedCrossReferences = new ArrayList();
unresolvedCrossReferences.add( duple ); unresolvedCrossReferences.add( duple );
}
} }
public Iterator getUnresolvedReferences() public List getUnresolvedReferences()
{ {
return unresolvedCrossReferences.iterator(); return unresolvedCrossReferences;
} }
public void setProcessingUnresolvedReferences( boolean processing ){ public void setProcessingUnresolvedReferences( boolean processing ){
processingUnresolvedReferences = processing; processingUnresolvedReferences = processing;
} }
private List resolvedCrossReferences = new ArrayList(); private List resolvedCrossReferences = Collections.EMPTY_LIST;
/** /**
* @param references2 * @param references2
*/ */
@ -263,6 +267,8 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier
for( int i = 0; i < references.size(); ++i ) for( int i = 0; i < references.size(); ++i )
{ {
IASTReference r = (IASTReference)references.get(i); IASTReference r = (IASTReference)references.get(i);
if( resolvedCrossReferences == Collections.EMPTY_LIST )
resolvedCrossReferences = new ArrayList( references.size() );
resolvedCrossReferences.add( r ); resolvedCrossReferences.add( r );
} }
} }

View file

@ -137,13 +137,15 @@ public abstract class ASTExpression extends ASTNode implements IASTExpression
{ {
if( subExpression != null && subExpression.getReferences() != null ) if( subExpression != null && subExpression.getReferences() != null )
{ {
Iterator subExp = subExpression.getReferences().iterator(); List refs = subExpression.getReferences();
while( subExp.hasNext() ) int size = refs.size();
for( int i = 0; i < size; i++ )
{ {
IASTReference aReference = (IASTReference)subExp.next(); IASTReference aReference = (IASTReference)refs.get(i);
if( aReference != null && references.contains( aReference ) ) if( aReference != null && references.contains( aReference ) )
{ {
subExp.remove(); refs.remove(i--);
size--;
manager.returnReference( aReference ); manager.returnReference( aReference );
} }
} }

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.parser.ast.complete; package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -65,6 +66,9 @@ public class ASTInitializerClause implements IASTInitializerClause
return initializerClauses.iterator(); return initializerClauses.iterator();
} }
public List getInitializersList(){
return ( initializerClauses != null ) ? initializerClauses : Collections.EMPTY_LIST;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTInitializerClause#getAssigmentExpression() * @see org.eclipse.cdt.core.parser.ast.IASTInitializerClause#getAssigmentExpression()
*/ */
@ -108,6 +112,10 @@ public class ASTInitializerClause implements IASTInitializerClause
{ {
return designators.iterator(); return designators.iterator();
} }
public List getDesignatorList(){
return designators;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTInitializerClause#setOwnerDeclaration(org.eclipse.cdt.core.parser.ast.IASTDeclaration) * @see org.eclipse.cdt.core.parser.ast.IASTInitializerClause#setOwnerDeclaration(org.eclipse.cdt.core.parser.ast.IASTDeclaration)
*/ */

View file

@ -50,6 +50,9 @@ public class ASTNewDescriptor implements IASTNewExpressionDescriptor {
return newInitializerExpressions.iterator(); return newInitializerExpressions.iterator();
} }
public List getNewInitializerExpressionsList(){
return newInitializerExpressions;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor)

View file

@ -10,8 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.complete; package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
@ -145,7 +145,7 @@ public class ASTNode implements IASTNode {
if( parameterExpression == null ) if( parameterExpression == null )
return null; return null;
List params = new LinkedList(); List params = new ArrayList();
ASTExpression exp = (ASTExpression) parameterExpression; ASTExpression exp = (ASTExpression) parameterExpression;
while( exp != null ){ while( exp != null ){
params.add( exp.getResultType().getResult() ); params.add( exp.getResultType().getResult() );

View file

@ -101,6 +101,9 @@ public class ASTParameterDeclaration extends ASTSymbol implements IASTParameterD
{ {
return abstractDeclaration.getPointerOperators(); return abstractDeclaration.getPointerOperators();
} }
public List getPointerOperatorsList(){
return abstractDeclaration.getPointerOperatorsList();
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getArrayModifiers() * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getArrayModifiers()
*/ */
@ -108,6 +111,9 @@ public class ASTParameterDeclaration extends ASTSymbol implements IASTParameterD
{ {
return abstractDeclaration.getArrayModifiers(); return abstractDeclaration.getArrayModifiers();
} }
public List getArrayModifiersList(){
return abstractDeclaration.getArrayModifiersList();
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getParameters() * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getParameters()
*/ */

View file

@ -10,8 +10,8 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.complete; package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ISourceElementRequestor;
@ -74,7 +74,7 @@ public class ASTTemplateDeclaration extends ASTSymbol implements IASTTemplateDec
factory.pushTemplate( template ); factory.pushTemplate( template );
templateParameters = ( parameters != null ) ? parameters : new LinkedList(); templateParameters = ( parameters != null ) ? parameters : Collections.EMPTY_LIST;
ownerScope = scope; ownerScope = scope;
fn = filename; fn = filename;
} }

View file

@ -91,6 +91,9 @@ public class ASTTypeId implements IASTTypeId
{ {
return pointerOps.iterator(); return pointerOps.iterator();
} }
public List getPointerOperatorsList(){
return pointerOps;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTypeId#getArrayModifiers() * @see org.eclipse.cdt.core.parser.ast.IASTTypeId#getArrayModifiers()
*/ */
@ -98,6 +101,9 @@ public class ASTTypeId implements IASTTypeId
{ {
return arrayModifiers.iterator(); return arrayModifiers.iterator();
} }
public List getArrayModifiersList(){
return arrayModifiers;
}
public List getReferences() public List getReferences()
{ {

View file

@ -14,10 +14,8 @@ package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Stack;
import org.eclipse.cdt.core.parser.Enum; import org.eclipse.cdt.core.parser.Enum;
import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.IProblem;
@ -166,15 +164,16 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
cache.returnReference( reference ); cache.returnReference( reference );
return; return;
} }
Iterator i = references.iterator(); int size = references.size();
while (i.hasNext()){ for( int i = 0; i < size; i++ ){
IASTReference ref = (IASTReference)i.next(); IASTReference ref = (IASTReference)references.get(i);
if (ref != null){ if (ref != null){
if( (CharArrayUtils.equals( ref.getNameCharArray(), reference.getNameCharArray())) if( (CharArrayUtils.equals( ref.getNameCharArray(), reference.getNameCharArray()))
&& (ref.getOffset() == reference.getOffset()) && (ref.getOffset() == reference.getOffset())
){ ){
cache.returnReference( ref ); cache.returnReference( ref );
i.remove(); references.remove(i--);
size--;
break; break;
} }
} }
@ -186,16 +185,17 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( templateArgs == null ) if( templateArgs == null )
return; return;
Iterator i = templateArgs.iterator(); int numArgs = templateArgs.size();
while( i.hasNext() ){ for( int i = 0; i < numArgs; i++ ){
ASTExpression exp = (ASTExpression) i.next(); ASTExpression exp = (ASTExpression) templateArgs.get(i);
Iterator j = null; List refs = null;
if( exp.getExpressionKind() == IASTExpression.Kind.POSTFIX_TYPEID_TYPEID ) if( exp.getExpressionKind() == IASTExpression.Kind.POSTFIX_TYPEID_TYPEID )
j = ((ASTTypeId) exp.getTypeId()).getReferences().iterator(); refs = ((ASTTypeId) exp.getTypeId()).getReferences();
else else
j = exp.getReferences().iterator(); refs = exp.getReferences();
while( j.hasNext() ){ int numRefs = refs.size();
IASTReference r = (IASTReference) j.next(); for( int j = 0; j < numRefs; j++ ){
IASTReference r = (IASTReference) refs.get(j);
addReference( references, cache.getReference(r.getOffset(), r.getReferencedElement())); addReference( references, cache.getReference(r.getOffset(), r.getReferencedElement()));
} }
} }
@ -205,9 +205,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
* Parameters are list of TypeInfos * Parameters are list of TypeInfos
*/ */
protected boolean validParameterList(List parameters){ protected boolean validParameterList(List parameters){
Iterator i = parameters.iterator(); int size = parameters.size();
while (i.hasNext()){ for( int i = 0; i < size; i++ ){
ITypeInfo info = (ITypeInfo)i.next(); ITypeInfo info = (ITypeInfo)parameters.get( i );
if (info != null){ if (info != null){
if((info.getType() == ITypeInfo.t_type) if((info.getType() == ITypeInfo.t_type)
&& (info.getTypeSymbol() == null)) && (info.getTypeSymbol() == null))
@ -231,19 +231,19 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if(validParameterList(parameters)) if(validParameterList(parameters))
if(type == ITypeInfo.t_constructor){ if(type == ITypeInfo.t_constructor){
IDerivableContainerSymbol startingDerivableScope = (IDerivableContainerSymbol) startingScope; IDerivableContainerSymbol startingDerivableScope = (IDerivableContainerSymbol) startingScope;
result = startingDerivableScope.lookupConstructor( new LinkedList(parameters)); result = startingDerivableScope.lookupConstructor(parameters);
} }
else { else {
if( arguments != null ) if( arguments != null )
result = startingScope.lookupFunctionTemplateId( name, new LinkedList( parameters), new LinkedList( arguments ), ( lookupType == LookupType.FORDEFINITION ) ); result = startingScope.lookupFunctionTemplateId( name, parameters, arguments, ( lookupType == LookupType.FORDEFINITION ) );
else if( lookupType == LookupType.QUALIFIED ) else if( lookupType == LookupType.QUALIFIED )
result = startingScope.qualifiedFunctionLookup(name, new LinkedList(parameters)); result = startingScope.qualifiedFunctionLookup(name, parameters);
else if( lookupType == LookupType.UNQUALIFIED || lookupType == LookupType.FORPARENTSCOPE) else if( lookupType == LookupType.UNQUALIFIED || lookupType == LookupType.FORPARENTSCOPE)
result = startingScope.unqualifiedFunctionLookup( name, new LinkedList( parameters ) ); result = startingScope.unqualifiedFunctionLookup( name, parameters );
else if( lookupType == LookupType.FORDEFINITION ) else if( lookupType == LookupType.FORDEFINITION )
result = startingScope.lookupMethodForDefinition( name, new LinkedList( parameters ) ); result = startingScope.lookupMethodForDefinition( name, parameters );
else if( lookupType == LookupType.FORFRIENDSHIP ){ else if( lookupType == LookupType.FORFRIENDSHIP ){
result = ((IDerivableContainerSymbol)startingScope).lookupFunctionForFriendship( name, new LinkedList( parameters) ); result = ((IDerivableContainerSymbol)startingScope).lookupFunctionForFriendship( name, parameters );
} }
} }
else else
@ -312,7 +312,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
protected ISymbol lookupQualifiedName( IContainerSymbol startingScope, ITokenDuple name, ITypeInfo.eType type, List parameters, List references, boolean throwOnError, LookupType lookup ) throws ASTSemanticException protected ISymbol lookupQualifiedName( IContainerSymbol startingScope, ITokenDuple name, ITypeInfo.eType type, List parameters, List references, boolean throwOnError, LookupType lookup ) throws ASTSemanticException
{ {
ISymbol result = null; ISymbol result = null;
IToken firstSymbol = null;
if( name == null && throwOnError ) handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null ); if( name == null && throwOnError ) handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null );
else if( name == null ) return null; else if( name == null ) return null;
@ -366,15 +365,17 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
break; break;
default: default:
Iterator iter = name.iterator(); IToken t = null;
firstSymbol = name.getFirstToken(); IToken last = name.getLastToken();
result = startingScope; result = startingScope;
if( firstSymbol.getType() == IToken.tCOLONCOLON ) if( name.getFirstToken().getType() == IToken.tCOLONCOLON )
result = pst.getCompilationUnit(); result = pst.getCompilationUnit();
while( iter.hasNext() ) for( ; ; )
{ {
IToken t = (IToken)iter.next(); if( t == last)
break;
t = ( t != null ) ? t.getNext() : name.getFirstToken();
if( t.getType() == IToken.tCOLONCOLON ){ if( t.getType() == IToken.tCOLONCOLON ){
idx++; idx++;
continue; continue;
@ -387,8 +388,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
int offset = t.getOffset(); int offset = t.getOffset();
if( templateArgLists != null && templateArgLists[ idx ] != null ){ if( templateArgLists != null && templateArgLists[ idx ] != null ){
if( iter.hasNext() && t.getNext().getType() == IToken.tLT ) if( t != last && t.getNext().getType() == IToken.tLT )
t = TokenFactory.consumeTemplateIdArguments( (IToken) iter.next(), iter ); t = TokenFactory.consumeTemplateIdArguments( t.getNext(), last );
} }
try try
@ -397,7 +398,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
result = ((IDeferredTemplateInstance)result).getTemplate().getTemplatedSymbol(); result = ((IDeferredTemplateInstance)result).getTemplate().getTemplatedSymbol();
} }
args = ( templateArgLists != null ) ? getTemplateArgList( templateArgLists[ idx ] ) : null; args = ( templateArgLists != null ) ? getTemplateArgList( templateArgLists[ idx ] ) : null;
if( t == name.getLastToken() ) if( t == last )
result = lookupElement((IContainerSymbol)result, image, type, parameters, args, ( lookup == LookupType.FORDEFINITION ) ? lookup : LookupType.QUALIFIED ); result = lookupElement((IContainerSymbol)result, image, type, parameters, args, ( lookup == LookupType.FORDEFINITION ) ? lookup : LookupType.QUALIFIED );
else else
if( templateArgLists != null && templateArgLists[idx] != null ) if( templateArgLists != null && templateArgLists[idx] != null )
@ -440,50 +441,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return result; return result;
} }
protected IToken consumeTemplateIdArguments( IToken name, Iterator iter ){
IToken token = name;
if( token.getNext().getType() == IToken.tLT )
{
token = (IToken) iter.next();
Stack scopes = new Stack();
scopes.push(new Integer(IToken.tLT));
while (!scopes.empty())
{
int top;
token = (IToken) iter.next();
switch( token.getType() ){
case IToken.tGT:
if (((Integer)scopes.peek()).intValue() == IToken.tLT) {
scopes.pop();
}
break;
case IToken.tRBRACKET :
do {
top = ((Integer)scopes.pop()).intValue();
} while (!scopes.empty() && (top == IToken.tGT || top == IToken.tLT));
//if (top != IToken.tLBRACKET) throw backtrack;
break;
case IToken.tRPAREN :
do {
top = ((Integer)scopes.pop()).intValue();
} while (!scopes.empty() && (top == IToken.tGT || top == IToken.tLT));
//if (top != IToken.tLPAREN) throw backtrack;
break;
case IToken.tLT :
case IToken.tLBRACKET:
case IToken.tLPAREN:
scopes.push(new Integer(token.getType()));
break;
}
}
}
return token;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createUsingDirective(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ITokenDuple, int, int) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createUsingDirective(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ITokenDuple, int, int)
*/ */
@ -524,11 +481,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
protected IContainerSymbol getScopeToSearchUpon( protected IContainerSymbol getScopeToSearchUpon(
IASTScope currentScope, IASTScope currentScope,
IToken firstToken, Iterator iterator ) IToken firstToken )
{ {
if( firstToken.getType() == IToken.tCOLONCOLON ) if( firstToken.getType() == IToken.tCOLONCOLON )
{ {
iterator.next();
return pst.getCompilationUnit(); return pst.getCompilationUnit();
} }
return scopeToSymbol(currentScope); return scopeToSymbol(currentScope);
@ -591,9 +547,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( endResult != null ) if( endResult != null )
{ {
Iterator i = endResult.getReferencedSymbols().iterator(); List refs = endResult.getReferencedSymbols();
while( i.hasNext() ) int numRefs = refs.size();
addReference( references, createReference( (ISymbol) i.next(), name.getLastToken().getCharImage(), name.getLastToken().getOffset() ) ); for( int i = 0; i < numRefs; i++ )
addReference( references, createReference( (ISymbol) refs.get(i), name.getLastToken().getCharImage(), name.getLastToken().getOffset() ) );
} }
ASTUsingDeclaration using = new ASTUsingDeclaration( scope, name.getLastToken().getCharImage(), ASTUsingDeclaration using = new ASTUsingDeclaration( scope, name.getLastToken().getCharImage(),
@ -841,13 +798,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( args == null ) if( args == null )
return null; return null;
List list = new LinkedList(); int size = args.size();
Iterator iter = args.iterator(); List list = new ArrayList( size );
ASTExpression exp; ASTExpression exp;
while( iter.hasNext() ) for( int i = 0; i < size; i++ )
{ {
exp = (ASTExpression) iter.next(); exp = (ASTExpression) args.get( i );
ITypeInfo info = exp.getResultType().getResult(); ITypeInfo info = exp.getResultType().getResult();
@ -934,16 +891,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
setFilename( parentClassName ); setFilename( parentClassName );
IDerivableContainerSymbol classSymbol = (IDerivableContainerSymbol)scopeToSymbol( astClassSpec); IDerivableContainerSymbol classSymbol = (IDerivableContainerSymbol)scopeToSymbol( astClassSpec);
Iterator iterator = null;
List references = new ArrayList(); List references = new ArrayList();
if( parentClassName != null ) if( parentClassName == null || parentClassName.getFirstToken() == null )
{
iterator = parentClassName.iterator();
if( !iterator.hasNext() )
handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null );
}
else
handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null ); handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null );
//Its possible that the parent is not an IContainerSymbol if its a template parameter or some kinds of template instances //Its possible that the parent is not an IContainerSymbol if its a template parameter or some kinds of template instances
@ -1186,15 +1136,15 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( symbol == null || !( symbol instanceof IDerivableContainerSymbol ) ) if( symbol == null || !( symbol instanceof IDerivableContainerSymbol ) )
return; return;
Iterator i = descriptor.getNewInitializerExpressions(); List initializers = ((ASTNewDescriptor)descriptor).getNewInitializerExpressionsList();
ASTExpression exp = ( i.hasNext() )? (ASTExpression) i.next() : null; ASTExpression exp = ( initializers.size() > 0 ) ? (ASTExpression) initializers.get(0) : null;
ITokenDuple duple = ((ASTTypeId)typeId).getTokenDuple().getLastSegment(); ITokenDuple duple = ((ASTTypeId)typeId).getTokenDuple().getLastSegment();
if( createConstructorReference( symbol, exp, duple, references ) ){ if( createConstructorReference( symbol, exp, duple, references ) ){
//if we have a constructor reference, get rid of the class reference. //if we have a constructor reference, get rid of the class reference.
i = ((ASTTypeId)typeId).getReferences().iterator(); Iterator i = ((ASTTypeId)typeId).getReferences().iterator();
while( i.hasNext() ) while( i.hasNext() )
{ {
ReferenceCache.ASTReference ref = (ReferenceCache.ASTReference) i.next(); ReferenceCache.ASTReference ref = (ReferenceCache.ASTReference) i.next();
@ -1219,7 +1169,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return false; return false;
} }
List parameters = new LinkedList(); List parameters = new ArrayList();
while( expressionList != null ){ while( expressionList != null ){
parameters.add( expressionList.getResultType().getResult() ); parameters.add( expressionList.getResultType().getResult() );
expressionList = (ASTExpression) expressionList.getRHSExpression(); expressionList = (ASTExpression) expressionList.getRHSExpression();
@ -1942,9 +1892,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
List newTypeIds = new ArrayList(); List newTypeIds = new ArrayList();
if( typeIds != null ) if( typeIds != null )
{ {
Iterator iter =typeIds.iterator(); int size = typeIds.size();
while( iter.hasNext() ) for( int i = 0; i < size; i++ )
newTypeIds.add( ((IASTTypeId)iter.next()).toString() ); newTypeIds.add( ((IASTTypeId)typeIds.get(i)).toString() );
} }
return new ASTExceptionSpecification( newTypeIds ); return new ASTExceptionSpecification( newTypeIds );
@ -2041,10 +1991,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME ) if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
{ {
// lookup the duple // lookup the duple
Iterator i = typeName.iterator(); IToken last = typeName.getLastToken();
IToken first = typeName.getFirstToken(); IToken current = null;
ISymbol typeSymbol = getScopeToSearchUpon( scope, typeName.getFirstToken() );
ISymbol typeSymbol = getScopeToSearchUpon( scope, first, i );
if( isGlobal ) if( isGlobal )
typeSymbol = typeSymbol.getSymbolTable().getCompilationUnit(); typeSymbol = typeSymbol.getSymbolTable().getCompilationUnit();
@ -2052,9 +2001,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
List [] argLists = typeName.getTemplateIdArgLists(); List [] argLists = typeName.getTemplateIdArgLists();
int idx = 0; int idx = 0;
while( i.hasNext() ) for( ; ; )
{ {
IToken current = (IToken)i.next(); if( current == last )
break;
current = ( current != null ) ? current.getNext() : typeName.getFirstToken();
if( current.getType() == IToken.tCOLONCOLON ){ if( current.getType() == IToken.tCOLONCOLON ){
idx++; idx++;
@ -2065,8 +2016,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
int offset = current.getOffset(); int offset = current.getOffset();
if( argLists != null && argLists[ idx ] != null ){ if( argLists != null && argLists[ idx ] != null ){
if( i.hasNext() && current.getNext().getType() == IToken.tLT ) if( current != last && current.getNext().getType() == IToken.tLT )
current = TokenFactory.consumeTemplateIdArguments( (IToken) i.next(), i ); current = TokenFactory.consumeTemplateIdArguments( current.getNext(), last );
} }
if( typeSymbol instanceof IDeferredTemplateInstance ){ if( typeSymbol instanceof IDeferredTemplateInstance ){
@ -2076,7 +2027,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
if( argLists != null && argLists[ idx ] != null ) if( argLists != null && argLists[ idx ] != null )
typeSymbol = ((IContainerSymbol)typeSymbol).lookupTemplateId( image, getTemplateArgList( argLists[idx] ) ); typeSymbol = ((IContainerSymbol)typeSymbol).lookupTemplateId( image, getTemplateArgList( argLists[idx] ) );
else if( current != typeName.getLastToken() ) else if( current != last )
typeSymbol = ((IContainerSymbol)typeSymbol).lookupNestedNameSpecifier( image ); typeSymbol = ((IContainerSymbol)typeSymbol).lookupNestedNameSpecifier( image );
else else
typeSymbol = ((IContainerSymbol)typeSymbol).lookup( image ); typeSymbol = ((IContainerSymbol)typeSymbol).lookup( image );
@ -2205,12 +2156,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
symbol.setIsForwardDeclaration(!isFunctionDefinition); symbol.setIsForwardDeclaration(!isFunctionDefinition);
boolean previouslyDeclared = false; boolean previouslyDeclared = false;
List functionParameters = new LinkedList(); int size = parameters.size();
List functionParameters = new ArrayList( size );
// the lookup requires a list of type infos // the lookup requires a list of type infos
// instead of a list of IASTParameterDeclaration // instead of a list of IASTParameterDeclaration
Iterator p = parameters.iterator(); for( int i = 0; i < size; i++ ){
while (p.hasNext()){ ASTParameterDeclaration param = (ASTParameterDeclaration)parameters.get(i);
ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
if( param.getSymbol() == null ) if( param.getSymbol() == null )
handleProblem( IProblem.SEMANTICS_RELATED, param.getNameCharArray(), param.getNameOffset(), param.getEndingOffset(), param.getStartingLine(), true ); handleProblem( IProblem.SEMANTICS_RELATED, param.getNameCharArray(), param.getNameOffset(), param.getEndingOffset(), param.getStartingLine(), true );
functionParameters.add(param.getSymbol().getTypeInfo()); functionParameters.add(param.getSymbol().getTypeInfo());
@ -2393,7 +2344,15 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
paramSymbol.getTypeInfo().setBit( absDecl.isConst(), ITypeInfo.isConst ); paramSymbol.getTypeInfo().setBit( absDecl.isConst(), ITypeInfo.isConst );
paramSymbol.getTypeInfo().setBit( absDecl.isVolatile(), ITypeInfo.isVolatile ); paramSymbol.getTypeInfo().setBit( absDecl.isVolatile(), ITypeInfo.isVolatile );
setPointerOperators( paramSymbol, absDecl.getPointerOperators(), absDecl.getArrayModifiers() ); List ptrs = null, arrayMods = null;
if( absDecl instanceof ASTParameterDeclaration ){
ptrs = ((ASTParameterDeclaration)absDecl).getPointerOperatorsList();
arrayMods = ((ASTParameterDeclaration)absDecl).getArrayModifiersList();
} else {
ptrs = ((ASTAbstractDeclaration)absDecl).getPointerOperatorsList();
arrayMods = ((ASTAbstractDeclaration)absDecl).getArrayModifiersList();
}
setPointerOperators( paramSymbol, ptrs, arrayMods );
if( isParameter) if( isParameter)
symbol.addParameter( paramSymbol ); symbol.addParameter( paramSymbol );
@ -2415,11 +2374,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
* @param paramSymbol * @param paramSymbol
* @param iterator * @param iterator
*/ */
protected void setPointerOperators(ISymbol symbol, Iterator pointerOpsIterator, Iterator arrayModsIterator) throws ASTSemanticException protected void setPointerOperators(ISymbol symbol, List pointerOps, List arrayMods) throws ASTSemanticException
{ {
while( pointerOpsIterator.hasNext() ) int ptrOpsSize = pointerOps.size();
for( int i = 0; i < ptrOpsSize; i++)
{ {
ASTPointerOperator pointerOperator = (ASTPointerOperator)pointerOpsIterator.next(); ASTPointerOperator pointerOperator = (ASTPointerOperator)pointerOps.get(i);
if( pointerOperator == ASTPointerOperator.REFERENCE ) if( pointerOperator == ASTPointerOperator.REFERENCE )
symbol.addPtrOperator( new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_reference )); symbol.addPtrOperator( new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_reference ));
else if( pointerOperator == ASTPointerOperator.POINTER ) else if( pointerOperator == ASTPointerOperator.POINTER )
@ -2433,10 +2393,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
// else // else
// assert false : pointerOperator; // assert false : pointerOperator;
} }
int arrayModsSize = arrayMods.size();
while( arrayModsIterator.hasNext() ) for( int i = 0; i < arrayModsSize; i++)
{ {
arrayModsIterator.next();
symbol.addPtrOperator( new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_array )); symbol.addPtrOperator( new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_array ));
} }
} }
@ -2559,12 +2518,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( isFunctionDefinition || isFriend ) if( isFunctionDefinition || isFriend )
{ {
List functionParameters = new LinkedList(); int size = parameters.size();
List functionParameters = new ArrayList( size );
// the lookup requires a list of type infos // the lookup requires a list of type infos
// instead of a list of IASTParameterDeclaration // instead of a list of IASTParameterDeclaration
Iterator p = parameters.iterator(); for( int i = 0; i < size; i++ ){
while (p.hasNext()){ ASTParameterDeclaration param = (ASTParameterDeclaration)parameters.get(i);
ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
if( param.getSymbol() == null ) if( param.getSymbol() == null )
handleProblem( IProblem.SEMANTICS_RELATED, param.getNameCharArray(), param.getNameOffset(), param.getEndingOffset(), param.getNameLineNumber(), true ); handleProblem( IProblem.SEMANTICS_RELATED, param.getNameCharArray(), param.getNameOffset(), param.getEndingOffset(), param.getNameLineNumber(), true );
functionParameters.add(param.getSymbol().getTypeInfo()); functionParameters.add(param.getSymbol().getTypeInfo());
@ -2645,10 +2604,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
if( constructorChain != null ) if( constructorChain != null )
{ {
Iterator initializers = constructorChain.iterator(); int size = constructorChain.size();
while( initializers.hasNext()) for( int i = 0; i < size; i++ )
{ {
IASTConstructorMemberInitializer initializer = (IASTConstructorMemberInitializer)initializers.next(); IASTConstructorMemberInitializer initializer = (IASTConstructorMemberInitializer)constructorChain.get(i);
if( initializer.getNameCharArray().length > 0 && if( initializer.getNameCharArray().length > 0 &&
initializer instanceof ASTConstructorMemberInitializer && initializer instanceof ASTConstructorMemberInitializer &&
((ASTConstructorMemberInitializer)initializer).requiresNameResolution() ) ((ASTConstructorMemberInitializer)initializer).requiresNameResolution() )
@ -2660,8 +2619,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
} }
} }
} }
/** /**
@ -2749,7 +2706,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
int numPtrOps = ((ASTAbstractDeclaration)abstractDeclaration).getNumArrayModifiers() + int numPtrOps = ((ASTAbstractDeclaration)abstractDeclaration).getNumArrayModifiers() +
((ASTAbstractDeclaration)abstractDeclaration).getNumPointerOperators(); ((ASTAbstractDeclaration)abstractDeclaration).getNumPointerOperators();
newSymbol.preparePtrOperatros( numPtrOps ); newSymbol.preparePtrOperatros( numPtrOps );
setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() ); setPointerOperators( newSymbol, ((ASTAbstractDeclaration)abstractDeclaration).getPointerOperatorsList(),
((ASTAbstractDeclaration)abstractDeclaration).getArrayModifiersList() );
newSymbol.setIsForwardDeclaration( isStatic || isExtern ); newSymbol.setIsForwardDeclaration( isStatic || isExtern );
boolean previouslyDeclared = false; boolean previouslyDeclared = false;
@ -2807,10 +2765,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return; return;
ITypeInfo currentTypeInfo = TypeInfoProvider.newTypeInfo( currentSymbol.getTypeInfo() ); ITypeInfo currentTypeInfo = TypeInfoProvider.newTypeInfo( currentSymbol.getTypeInfo() );
Iterator designators = clause.getDesignators(); List designators = clause.getDesignatorList();
while( designators.hasNext() ) int size = designators.size();
for( int i = 0; i < size; i++ )
{ {
ASTDesignator designator = (ASTDesignator)designators.next(); ASTDesignator designator = (ASTDesignator)designators.get(i);
if( designator.getKind() == IASTDesignator.DesignatorKind.FIELD ) if( designator.getKind() == IASTDesignator.DesignatorKind.FIELD )
{ {
ISymbol lookup = null; ISymbol lookup = null;
@ -2854,9 +2813,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( clause.getKind() == IASTInitializerClause.Kind.DESIGNATED_INITIALIZER_LIST || if( clause.getKind() == IASTInitializerClause.Kind.DESIGNATED_INITIALIZER_LIST ||
clause.getKind() == IASTInitializerClause.Kind.INITIALIZER_LIST ) clause.getKind() == IASTInitializerClause.Kind.INITIALIZER_LIST )
{ {
Iterator subInitializers = clause.getInitializers(); List subInitializers = clause.getInitializersList();
while( subInitializers.hasNext() ) int size = subInitializers.size();
addDesignatorReferences( (ASTInitializerClause)subInitializers.next() ); for( int i = 0; i < size; i++ )
addDesignatorReferences( (ASTInitializerClause)subInitializers.get(i) );
} }
} }
@ -2984,7 +2944,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
isRegister, isRegister,
isStatic, isStatic,
newSymbol); newSymbol);
setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() ); setPointerOperators( newSymbol, ((ASTAbstractDeclaration)abstractDeclaration).getPointerOperatorsList(),
((ASTAbstractDeclaration)abstractDeclaration).getArrayModifiersList() );
newSymbol.setIsForwardDeclaration(isStatic); newSymbol.setIsForwardDeclaration(isStatic);
boolean previouslyDeclared = false; boolean previouslyDeclared = false;
@ -3041,9 +3002,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
// the lookup requires a list of type infos // the lookup requires a list of type infos
// instead of a list of IASTParameterDeclaration // instead of a list of IASTParameterDeclaration
Iterator iter = templateParameters.iterator(); int size = templateParameters.size();
while (iter.hasNext()){ for( int i = 0; i < size; i++ ){
ASTTemplateParameter param = (ASTTemplateParameter)iter.next(); ASTTemplateParameter param = (ASTTemplateParameter)templateParameters.get(i);
try { try {
template.addTemplateParameter( param.getSymbol() ); template.addTemplateParameter( param.getSymbol() );
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
@ -3086,9 +3047,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
provider.setType( ITypeInfo.t_templateParameter ); provider.setType( ITypeInfo.t_templateParameter );
provider.setTemplateParameterType( ITypeInfo.t_template ); provider.setTemplateParameterType( ITypeInfo.t_template );
template.setTypeInfo( provider.completeConstruction() ); template.setTypeInfo( provider.completeConstruction() );
Iterator iter = parms.iterator(); int size = parms.size();
while (iter.hasNext()){ for( int i = 0; i < size; i++ ){
ASTTemplateParameter param = (ASTTemplateParameter)iter.next(); ASTTemplateParameter param = (ASTTemplateParameter)parms.get(i);
try { try {
template.addTemplateParameter( param.getSymbol() ); template.addTemplateParameter( param.getSymbol() );
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
@ -3169,7 +3130,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( typeSymbol == null ) if( typeSymbol == null )
handleProblem( scope, IProblem.SEMANTICS_RELATED, name, nameOffset, nameEndOffset, nameLine, true ); handleProblem( scope, IProblem.SEMANTICS_RELATED, name, nameOffset, nameEndOffset, nameLine, true );
setPointerOperators( typeSymbol, mapping.getPointerOperators(), mapping.getArrayModifiers() ); setPointerOperators( typeSymbol, ((ASTAbstractDeclaration)mapping).getPointerOperatorsList(),
((ASTAbstractDeclaration)mapping).getArrayModifiersList() );
if( typeSymbol.getType() != ITypeInfo.t_type ){ if( typeSymbol.getType() != ITypeInfo.t_type ){
ISymbol newSymbol = pst.newSymbol( name, ITypeInfo.t_type); ISymbol newSymbol = pst.newSymbol( name, ITypeInfo.t_type);
@ -3551,7 +3513,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
typeId.addReferences( refs, cache ); typeId.addReferences( refs, cache );
} }
setPointerOperators( result, id.getPointerOperators(), id.getArrayModifiers() ); setPointerOperators( result, ((ASTTypeId)id).getPointerOperatorsList(), ((ASTTypeId)id).getArrayModifiersList() );
return result; return result;
} }
@ -3581,11 +3543,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
astImplementation.setProcessingUnresolvedReferences( true ); astImplementation.setProcessingUnresolvedReferences( true );
Iterator i = astImplementation.getUnresolvedReferences(); List unresolved = astImplementation.getUnresolvedReferences();
List references = new ArrayList(); List references = new ArrayList();
while( i.hasNext() ) int size = unresolved.size();
for( int i = 0; i < size; i++ )
{ {
UnresolvedReferenceDuple duple = (UnresolvedReferenceDuple) i.next(); UnresolvedReferenceDuple duple = (UnresolvedReferenceDuple) unresolved.get(i);
try try
{ {
@ -3650,11 +3613,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return null; return null;
} }
List parameters = new LinkedList(); List parameters = new ArrayList();
Iterator newInitializerExpressions = expression.getNewExpressionDescriptor().getNewInitializerExpressions(); ASTNewDescriptor newDescriptor = (ASTNewDescriptor) expression.getNewExpressionDescriptor();
if( newInitializerExpressions.hasNext() ) List newInitializerExpressions = newDescriptor.getNewInitializerExpressionsList();
int size = newInitializerExpressions.size();
for( int i = 0; i < size; i++ )
{ {
ASTExpression expressionList = (ASTExpression) newInitializerExpressions.next(); ASTExpression expressionList = (ASTExpression) newInitializerExpressions.get(i);
while( expressionList != null ){ while( expressionList != null ){
parameters.add( expressionList.getResultType().getResult() ); parameters.add( expressionList.getResultType().getResult() );
expressionList = (ASTExpression) expressionList.getRHSExpression(); expressionList = (ASTExpression) expressionList.getRHSExpression();

View file

@ -1025,16 +1025,16 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
} }
public Iterator getContentsIterator(){ public Iterator getContentsIterator(){
return new ContentsIterator( getContents().iterator() ); return new ContentsIterator( getContents() );
} }
protected class ContentsIterator implements Iterator { protected class ContentsIterator implements Iterator {
final Iterator internalIterator; final List internalList;
private int idx = 0;
ObjectSet alreadyReturned = new ObjectSet( 2 ); ObjectSet alreadyReturned = new ObjectSet( 2 );
public ContentsIterator( Iterator iter ){ public ContentsIterator( List contents ){
internalIterator = iter; internalList = contents;
} }
IExtensibleSymbol next = null; IExtensibleSymbol next = null;
@ -1042,10 +1042,10 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
if( next != null ){ if( next != null ){
return true; return true;
} }
if( !internalIterator.hasNext() ) if( internalList.size() <= idx )
return false; return false;
while( internalIterator.hasNext() ){ for( ; idx < internalList.size(); ){
IExtensibleSymbol extensible = (IExtensibleSymbol) internalIterator.next(); IExtensibleSymbol extensible = (IExtensibleSymbol) internalList.get(idx++);
if( !alreadyReturned.containsKey( extensible ) ){ if( !alreadyReturned.containsKey( extensible ) ){
if( extensible instanceof ISymbol ){ if( extensible instanceof ISymbol ){
ISymbol symbol = (ISymbol) extensible; ISymbol symbol = (ISymbol) extensible;
@ -1075,8 +1075,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
return extensible; return extensible;
} }
while( internalIterator.hasNext() ){ for( ; idx < internalList.size(); ){
extensible = (IExtensibleSymbol) internalIterator.next(); extensible = (IExtensibleSymbol) internalList.get(idx++);
if( !alreadyReturned.containsKey( extensible ) ){ if( !alreadyReturned.containsKey( extensible ) ){
if( extensible instanceof ISymbol ){ if( extensible instanceof ISymbol ){
ISymbol symbol = (ISymbol) extensible; ISymbol symbol = (ISymbol) extensible;
@ -1099,11 +1099,6 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
public void remove() { public void remove() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
protected void removeSymbol(){
internalIterator.remove();
}
} }
// static private class AddSymbolCommand extends Command{ // static private class AddSymbolCommand extends Command{
// AddSymbolCommand( ISymbol newDecl, IContainerSymbol context ){ // AddSymbolCommand( ISymbol newDecl, IContainerSymbol context ){

View file

@ -16,7 +16,6 @@ package org.eclipse.cdt.internal.core.parser.pst;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.internal.core.parser.scanner2.CharArrayObjectMap; import org.eclipse.cdt.internal.core.parser.scanner2.CharArrayObjectMap;
@ -222,12 +221,11 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz
for( ITypeInfo nfo = info; nfo != null; nfo = fInfo ){ for( ITypeInfo nfo = info; nfo != null; nfo = fInfo ){
//an array declaration is adjusted to become a pointer declaration //an array declaration is adjusted to become a pointer declaration
//only the second and subsequent array dimensions are significant in parameter types //only the second and subsequent array dimensions are significant in parameter types
ListIterator ptrs = nfo.getPtrOperators().listIterator(); List ptrs = nfo.getPtrOperators();
if( ptrs.hasNext() ){ if( ptrs.size() > 0 ){
ITypeInfo.PtrOp op = (ITypeInfo.PtrOp) ptrs.next(); ITypeInfo.PtrOp op = (ITypeInfo.PtrOp) ptrs.get(0);
if( op.getType() == ITypeInfo.PtrOp.t_array ){ if( op.getType() == ITypeInfo.PtrOp.t_array ){
ptrs.remove(); ptrs.set( 0, new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_pointer, op.isConst(), op.isVolatile() ) );
ptrs.add( new ITypeInfo.PtrOp( ITypeInfo.PtrOp.t_pointer, op.isConst(), op.isVolatile() ) );
} }
} }

View file

@ -14,7 +14,6 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
@ -363,9 +362,9 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
* @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#elaboratedLookup(org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType, java.lang.String) * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#elaboratedLookup(org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType, java.lang.String)
*/ */
public ISymbol elaboratedLookup(ITypeInfo.eType type, char[] name) throws ParserSymbolTableException { public ISymbol elaboratedLookup(ITypeInfo.eType type, char[] name) throws ParserSymbolTableException {
ListIterator iter = templates.listIterator( templates.size() ); int size = templates.size();
while( iter.hasPrevious() ){ for( int i = size - 1; i >= 0; i-- ){
ITemplateSymbol template = (ITemplateSymbol) iter.previous(); ITemplateSymbol template = (ITemplateSymbol) templates.get(i);
ISymbol look = template.lookupMemberForDefinition( name ); ISymbol look = template.lookupMemberForDefinition( name );
if( look != null && look.isType( type ) ){ if( look != null && look.isType( type ) ){
@ -380,9 +379,9 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
* @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookup(java.lang.String) * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookup(java.lang.String)
*/ */
public ISymbol lookup(char[] name) throws ParserSymbolTableException { public ISymbol lookup(char[] name) throws ParserSymbolTableException {
ListIterator iter = templates.listIterator( templates.size() ); int size = templates.size();
while( iter.hasPrevious() ){ for( int i = size - 1; i >= 0; i-- ){
ITemplateSymbol template = (ITemplateSymbol) iter.previous(); ITemplateSymbol template = (ITemplateSymbol) templates.get(i);
ISymbol look = template.lookupMemberForDefinition( name ); ISymbol look = template.lookupMemberForDefinition( name );
if( look != null ){ if( look != null ){

View file

@ -66,15 +66,15 @@ public class BasicTokenDuple implements ITokenDuple {
public ITokenDuple getLastSegment() public ITokenDuple getLastSegment()
{ {
Iterator iter = iterator();
IToken first = null, last = null, token = null; IToken first = null, last = null, token = null;
while( iter.hasNext() ){ for( ; ; ){
token = (IToken) iter.next(); if( token == getLastToken() )
break;
token = ( token != null ) ? token.getNext() : getFirstToken();
if( first == null ) if( first == null )
first = token; first = token;
if( token.getType() == IToken.tLT ) if( token.getType() == IToken.tLT )
token = TokenFactory.consumeTemplateIdArguments( token, iter ); token = TokenFactory.consumeTemplateIdArguments( token, getLastToken() );
else if( token.getType() == IToken.tCOLONCOLON ){ else if( token.getType() == IToken.tCOLONCOLON ){
first = null; first = null;
continue; continue;
@ -95,8 +95,7 @@ public class BasicTokenDuple implements ITokenDuple {
public ITokenDuple getLeadingSegments(){ public ITokenDuple getLeadingSegments(){
Iterator iter = iterator(); if( getFirstToken() == null )
if( !iter.hasNext() )
return null; return null;
int num = getSegmentCount(); int num = getSegmentCount();
@ -107,12 +106,14 @@ public class BasicTokenDuple implements ITokenDuple {
IToken first = null, last = null; IToken first = null, last = null;
IToken previous = null, token = null; IToken previous = null, token = null;
while( iter.hasNext() ){ for( ; ; ){
token = (IToken) iter.next(); if( token == getLastToken() )
break;
token = ( token != null ) ? token.getNext() : getFirstToken();
if( first == null ) if( first == null )
first = token; first = token;
if( token.getType() == IToken.tLT ) if( token.getType() == IToken.tLT )
token = TokenFactory.consumeTemplateIdArguments( token, iter ); token = TokenFactory.consumeTemplateIdArguments( token, getLastToken() );
else if( token.getType() == IToken.tCOLONCOLON ){ else if( token.getType() == IToken.tCOLONCOLON ){
last = previous; last = previous;
continue; continue;
@ -428,7 +429,7 @@ public class BasicTokenDuple implements ITokenDuple {
IToken first = i; IToken first = i;
IToken temp = null; IToken temp = null;
while( i != last ){ while( i != last ){
temp = (IToken) i.next; temp = i.next;
if( temp.getType() != IToken.tLT ) if( temp.getType() != IToken.tLT )
i = (AbstractToken) temp; i = (AbstractToken) temp;
else else
@ -511,13 +512,15 @@ public class BasicTokenDuple implements ITokenDuple {
*/ */
protected int calculateSegmentCount() { protected int calculateSegmentCount() {
int n = 1; int n = 1;
Iterator iter = iterator();
IToken token = null; IToken token = null;
while( iter.hasNext() ){ IToken last = getLastToken();
token = (IToken) iter.next(); for( ;; ){
if( token == last )
break;
token = ( token != null ) ? token.getNext() : getFirstToken();
if( token.getType() == IToken.tLT ) if( token.getType() == IToken.tLT )
token = TokenFactory.consumeTemplateIdArguments( token, iter ); token = TokenFactory.consumeTemplateIdArguments( token, last );
if( token.getType() == IToken.tCOLONCOLON ){ if( token.getType() == IToken.tCOLONCOLON ){
n++; n++;
continue; continue;

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.internal.core.parser.token; package org.eclipse.cdt.internal.core.parser.token;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ISourceElementRequestor;
@ -50,15 +49,15 @@ public class TemplateTokenDuple extends BasicTokenDuple {
} }
public ITokenDuple getLastSegment() public ITokenDuple getLastSegment()
{ {
Iterator iter = iterator();
IToken first = null, last = null, token = null; IToken first = null, last = null, token = null;
while( iter.hasNext() ){ for( ; ; ){
token = (IToken) iter.next(); if( token == getLastToken() )
break;
token = ( token != null ) ? token.getNext() : getFirstToken();
if( first == null ) if( first == null )
first = token; first = token;
if( token.getType() == IToken.tLT ) if( token.getType() == IToken.tLT )
token = TokenFactory.consumeTemplateIdArguments( token, iter ); token = TokenFactory.consumeTemplateIdArguments( token, getLastToken() );
else if( token.getType() == IToken.tCOLONCOLON ){ else if( token.getType() == IToken.tCOLONCOLON ){
first = null; first = null;
continue; continue;

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.internal.core.parser.token; package org.eclipse.cdt.internal.core.parser.token;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.IToken;
@ -82,12 +81,12 @@ public class TokenFactory {
return new TemplateTokenDuple( firstDuple, secondDuple ); return new TemplateTokenDuple( firstDuple, secondDuple );
} }
public static IToken consumeTemplateIdArguments( IToken name, Iterator iter ){ public static IToken consumeTemplateIdArguments( IToken name, IToken last ){
IToken token = name; IToken token = name;
if( token.getType() == IToken.tLT ) if( token.getType() == IToken.tLT )
{ {
if( ! iter.hasNext() ) if( token == last )
return token; return token;
BraceCounter scopes = BraceCounter.getCounter(); BraceCounter scopes = BraceCounter.getCounter();
@ -95,11 +94,11 @@ public class TokenFactory {
{ {
scopes.addValue( IToken.tLT ); scopes.addValue( IToken.tLT );
while (!scopes.isEmpty() && iter.hasNext() ) while (!scopes.isEmpty() && token != last )
{ {
int top; int top;
token = (IToken) iter.next(); token = token.getNext();
switch( token.getType() ){ switch( token.getType() ){
case IToken.tGT: case IToken.tGT:
if( scopes.getLast() == IToken.tLT ) { if( scopes.getLast() == IToken.tLT ) {