From 83c27c9bb196ae2cdd9d75484fffad7e37c19e80 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Thu, 14 Aug 2003 15:33:32 +0000 Subject: [PATCH] CORE Added X-Reference support for ArrayModifiers and Exception Specifications. Fixed Bug 41551 - HandleInclusion always throws ScannerException on local includes. TESTS Added CompleteParseASTTest::testArrayModExpression(), testPointerVariable() & testExceptionSpecification(). --- core/org.eclipse.cdt.core.tests/ChangeLog | 4 ++ .../parser/tests/CompleteParseASTTest.java | 34 ++++++++++ .../internal/core/model/CModelBuilder.java | 2 +- core/org.eclipse.cdt.core/parser/ChangeLog | 4 ++ .../parser/ast/IASTAbstractDeclaration.java | 4 +- .../core/parser/ast/IASTArrayModifier.java | 4 +- .../ast/IASTExceptionSpecification.java | 4 +- .../cdt/core/parser/ast/IASTFactory.java | 2 +- .../cdt/internal/core/parser/Parser.java | 16 +++-- .../cdt/internal/core/parser/Scanner.java | 6 +- .../parser/ast/ASTAbstractDeclaration.java | 26 +++++++ .../ast/{quick => }/ASTArrayModifier.java | 26 ++++++- .../core/parser/ast/ASTInitializerClause.java | 1 - .../core/parser/ast/BaseASTFactory.java | 6 ++ .../complete/ASTExceptionSpecification.java | 68 +++++++++++++++++++ .../core/parser/ast/complete/ASTField.java | 3 +- .../core/parser/ast/complete/ASTFunction.java | 22 ++++-- .../core/parser/ast/complete/ASTMethod.java | 10 +-- .../core/parser/ast/complete/ASTTypedef.java | 3 +- .../core/parser/ast/complete/ASTVariable.java | 3 + .../ast/complete/CompleteParseASTFactory.java | 41 +++++++---- .../ast/quick/ASTExceptionSpecification.java | 22 ++++++ .../ast/quick/QuickParseASTFactory.java | 11 +-- 23 files changed, 274 insertions(+), 48 deletions(-) rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/{quick => }/ASTArrayModifier.java (55%) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExceptionSpecification.java diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 78bae413f12..888cae4a5aa 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,7 @@ +2003-08-14 John Camelon + Added CompleteParseASTTest::testArrayModExpression(), testPointerVariable() & + testExceptionSpecification(). + 2003-08-13 John Camelon Added testBug41520() to FullParseFailedTests.java. Added testConstructorChain() to CompleteParseASTTest.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index 100b6d4af3e..4d32e0e79aa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -887,6 +887,9 @@ public class CompleteParseASTTest extends TestCase assertEquals( fqnClass[i], fqnElab[i]); assertEquals( callback.getReferences().size(), 1 ); assertEquals( callback.getForewardDecls().size(), 1 ); + IASTClassReference ref = (IASTClassReference)callback.getReferences().get(0); + assertTrue( ref.getReferencedElement() instanceof IASTElaboratedTypeSpecifier ); + assertEquals( ref.getReferencedElement(), elab ); } @@ -947,4 +950,35 @@ public class CompleteParseASTTest extends TestCase assertEquals( reference2.getReferencedElement(), variableX ); } + public void testArrayModExpression() throws Exception + { + Iterator i = parse( "const int x = 5; int y [ x ]; ").getDeclarations(); + IASTVariable varX = (IASTVariable)i.next(); + IASTVariable varY = (IASTVariable)i.next(); + assertFalse( i.hasNext() ); + assertEquals( callback.getReferences().size(), 1 ); + } + + + public void testPointerVariable() throws Exception + { + Iterator i = parse( "class A { }; A * anA;").getDeclarations(); + IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + IASTVariable varAnA = (IASTVariable)i.next(); + assertFalse( i.hasNext() ); + assertEquals( callback.getReferences().size(), 1 ); + IASTClassReference ref = (IASTClassReference)callback.getReferences().get(0); + assertEquals( ref.getReferencedElement(), classA ); + } + + public void testExceptionSpecification() throws Exception + { + Iterator i = parse( "class A { }; void foo( void ) throw ( A );").getDeclarations(); + IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + IASTFunction function = (IASTFunction)i.next(); + assertFalse( i.hasNext() ); + assertEquals( callback.getReferences().size(), 1 ); + IASTClassReference ref = (IASTClassReference)callback.getReferences().get(0); + assertEquals( ref.getReferencedElement(), classA ); + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java index 22ac7e1ca7d..5044abf178f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java @@ -53,7 +53,7 @@ import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; import org.eclipse.cdt.core.parser.ast.IASTVariable; import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ScannerInfo; -import org.eclipse.cdt.internal.core.parser.ast.quick.ASTArrayModifier; +import org.eclipse.cdt.internal.core.parser.ast.ASTArrayModifier; import org.eclipse.core.resources.IProject; diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index 818098704d0..20103ce328b 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,7 @@ +2003-08-14 John Camelon + Added X-Reference support for ArrayModifiers and Exception Specifications. + Fixed Bug 41551 - HandleInclusion always throws ScannerException on local includes. + 2003-08-13 John Camelon Added constructor expression support for variables. Added constructor chain x-reference support for methods. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTAbstractDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTAbstractDeclaration.java index 846def9f26d..fb8aa7168ee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTAbstractDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTAbstractDeclaration.java @@ -12,11 +12,13 @@ package org.eclipse.cdt.core.parser.ast; import java.util.Iterator; +import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; + /** * @author jcamelon * */ -public interface IASTAbstractDeclaration extends IASTTypeSpecifierOwner +public interface IASTAbstractDeclaration extends IASTTypeSpecifierOwner, ISourceElementCallbackDelegate { public boolean isConst(); public boolean isVolatile(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTArrayModifier.java index 56d98da9b70..3f4dd9edcce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTArrayModifier.java @@ -10,12 +10,14 @@ ***********************************************************************/ package org.eclipse.cdt.core.parser.ast; +import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; + /** * @author jcamelon * */ -public interface IASTArrayModifier +public interface IASTArrayModifier extends ISourceElementCallbackDelegate { public IASTExpression getExpression(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTExceptionSpecification.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTExceptionSpecification.java index 66f5ef20afb..d00509cb06f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTExceptionSpecification.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTExceptionSpecification.java @@ -12,11 +12,13 @@ package org.eclipse.cdt.core.parser.ast; import java.util.Iterator; +import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; + /** * @author jcamelon * */ -public interface IASTExceptionSpecification +public interface IASTExceptionSpecification extends ISourceElementCallbackDelegate { public Iterator getTypeIds(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java index 400aac226b2..5e0345b8770 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java @@ -102,7 +102,7 @@ public interface IASTFactory IASTInitializerClause.Kind kind, IASTExpression assignmentExpression, List initializerClauses); - public IASTExceptionSpecification createExceptionSpecification(List typeIds); + public IASTExceptionSpecification createExceptionSpecification(IASTScope scope, List typeIds) throws ASTSemanticException; /** * @param exp */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 5427b968efc..543787d60e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -1968,10 +1968,18 @@ public class Parser implements IParser } } if (exceptionSpecIds != null) - d.setExceptionSpecification( - astFactory - .createExceptionSpecification( - exceptionSpecIds)); + try + { + d.setExceptionSpecification( + astFactory + .createExceptionSpecification( + d.getDeclarationWrapper().getScope(), exceptionSpecIds)); + } + catch (ASTSemanticException e) + { + failParse(); + throw backtrack; + } } // check for optional pure virtual if (LT(1) == IToken.tASSIGN diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java index 7380edb27b5..004cd6640a7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java @@ -308,6 +308,9 @@ public class Scanner implements IScanner { } } } + + if (throwExceptionOnInclusionNotFound && inclusionReader == null ) + throw new ScannerException("Cannot find inclusion " + fileName); } else // local inclusion { @@ -332,9 +335,6 @@ public class Scanner implements IScanner { handleInclusion( fileName, true, nameOffset, beginOffset, endOffset ); } } - - if (throwExceptionOnInclusionNotFound && inclusionReader == null ) - throw new ScannerException("Cannot find inclusion " + fileName); IASTInclusion inclusion = astFactory.createInclusion( fileName, newPath, !useIncludePaths, beginOffset, endOffset, nameOffset ); contextStack.updateContext(inclusionReader, newPath, ScannerContext.INCLUSION, inclusion, requestor ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java index 6c9afbfe3f9..e3468ee10cb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java @@ -13,8 +13,10 @@ package org.eclipse.cdt.internal.core.parser.ast; import java.util.Iterator; import java.util.List; +import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTPointerOperator; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; /** @@ -65,6 +67,7 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration */ public Iterator getPointerOperators() { + if( pointerOperators == null ) return new EmptyIterator(); return pointerOperators.iterator(); } /* (non-Javadoc) @@ -72,6 +75,7 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration */ public Iterator getArrayModifiers() { + if( arrayModifiers == null ) return new EmptyIterator(); return arrayModifiers.iterator(); } /* (non-Javadoc) @@ -79,6 +83,7 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration */ public Iterator getParameters() { + if( parms == null ) return new EmptyIterator(); return parms.iterator(); } /* (non-Javadoc) @@ -95,4 +100,25 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration { return isVolatile; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + Iterator arrayMods = getArrayModifiers(); + while( arrayMods.hasNext() ) + ((IASTArrayModifier)arrayMods.next()).acceptElement(requestor); + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void enterScope(ISourceElementRequestor requestor) + { + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void exitScope(ISourceElementRequestor requestor) + { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTArrayModifier.java similarity index 55% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTArrayModifier.java index df65183361b..bd0839088a0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTArrayModifier.java @@ -8,8 +8,9 @@ * Contributors: * IBM Rational Software - Initial API and implementation ***********************************************************************/ -package org.eclipse.cdt.internal.core.parser.ast.quick; +package org.eclipse.cdt.internal.core.parser.ast; +import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTExpression; @@ -35,4 +36,27 @@ public class ASTArrayModifier implements IASTArrayModifier { return expression; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + if( expression != null ) + expression.acceptElement( requestor ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void enterScope(ISourceElementRequestor requestor) + { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void exitScope(ISourceElementRequestor requestor) + { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInitializerClause.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInitializerClause.java index dd2d7f550c8..42c53db2321 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInitializerClause.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInitializerClause.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.parser.ast; import java.util.Iterator; import java.util.List; -import java.util.NoSuchElementException; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.IASTExpression; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java index 763e430f79b..d75661aa53c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java @@ -14,6 +14,7 @@ import java.util.List; import org.eclipse.cdt.core.parser.ast.ASTPointerOperator; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTExpression; import org.eclipse.cdt.core.parser.ast.IASTInclusion; import org.eclipse.cdt.core.parser.ast.IASTInitializerClause; @@ -65,5 +66,10 @@ public class BaseASTFactory { return new ASTInitializerClause( kind, assignmentExpression, initializerClauses ); } + public IASTArrayModifier createArrayModifier(IASTExpression exp) + { + return new ASTArrayModifier( exp ); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExceptionSpecification.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExceptionSpecification.java new file mode 100644 index 00000000000..a1d46cee274 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExceptionSpecification.java @@ -0,0 +1,68 @@ +/********************************************************************** + * Copyright (c) 2002,2003 Rational Software Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * IBM Rational Software - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.internal.core.parser.ast.complete; + +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.core.parser.ISourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.IASTExceptionSpecification; +import org.eclipse.cdt.internal.core.parser.ast.EmptyIterator; + +/** + * @author jcamelon + * + */ +public class ASTExceptionSpecification implements IASTExceptionSpecification +{ + private final List typeIds; + private final ASTReferenceStore store; + /** + * @param newTypeIds + * @param references + */ + public ASTExceptionSpecification(List newTypeIds, List references) + { + this.typeIds = newTypeIds; + store = new ASTReferenceStore( references ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTExceptionSpecification#getTypeIds() + */ + public Iterator getTypeIds() + { + if( typeIds == null ) return new EmptyIterator(); + return typeIds.iterator(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + store.processReferences(requestor); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void enterScope(ISourceElementRequestor requestor) + { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void exitScope(ISourceElementRequestor requestor) + { + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTField.java index c16f39bd66b..3c808db9084 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTField.java @@ -57,6 +57,7 @@ public class ASTField extends ASTVariable implements IASTField referenceDelegate.processReferences(requestor); if( getInitializerClause() != null ) getInitializerClause().acceptElement(requestor); - + if( getAbstractDeclaration() != null ) + getAbstractDeclaration().acceptElement(requestor); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java index 2efd4057155..6ac052448f6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java @@ -15,6 +15,7 @@ import java.util.List; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTExceptionSpecification; import org.eclipse.cdt.core.parser.ast.IASTFunction; import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; @@ -191,13 +192,22 @@ public class ASTFunction extends ASTScope implements IASTFunction public void acceptElement(ISourceElementRequestor requestor) { requestor.acceptFunctionDeclaration(this); + functionCallbacks(requestor); + } + + protected void functionCallbacks(ISourceElementRequestor requestor) + { references.processReferences(requestor); - processParameterInitializers(requestor); + processParameterInitializersAndArrayMods(requestor); + if( getReturnType() != null ) + getReturnType().acceptElement(requestor); + if( getExceptionSpec() != null ) + getExceptionSpec().acceptElement(requestor); } /** * @param requestor */ - protected void processParameterInitializers(ISourceElementRequestor requestor) + protected void processParameterInitializersAndArrayMods(ISourceElementRequestor requestor) { Iterator i = parameters.iterator(); while( i.hasNext() ) @@ -205,6 +215,11 @@ public class ASTFunction extends ASTScope implements IASTFunction IASTParameterDeclaration parm = (IASTParameterDeclaration)i.next(); if( parm.getDefaultValue() != null ) parm.getDefaultValue().acceptElement(requestor); + Iterator arrays = parm.getArrayModifiers(); + while( arrays.hasNext() ) + { + ((IASTArrayModifier)arrays.next()).acceptElement(requestor); + } } } @@ -215,8 +230,7 @@ public class ASTFunction extends ASTScope implements IASTFunction public void enterScope(ISourceElementRequestor requestor) { requestor.enterFunctionBody( this ); - references.processReferences(requestor); - processParameterInitializers(requestor); + functionCallbacks( requestor ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java index a59272445dd..9942618d29e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java @@ -126,8 +126,11 @@ public class ASTMethod extends ASTFunction implements IASTMethod public void acceptElement(ISourceElementRequestor requestor) { requestor.acceptMethodDeclaration(this); - references.processReferences(requestor); - processParameterInitializers(requestor); + methodCallbacks(requestor); + } + protected void methodCallbacks(ISourceElementRequestor requestor) + { + functionCallbacks(requestor); processConstructorChain(requestor); } @@ -149,8 +152,7 @@ public class ASTMethod extends ASTFunction implements IASTMethod public void enterScope(ISourceElementRequestor requestor) { requestor.enterMethodBody(this); - references.processReferences(requestor); - processConstructorChain(requestor); + methodCallbacks( requestor ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypedef.java index 6ef5e09b415..67f9822a271 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypedef.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTypedef.java @@ -70,7 +70,8 @@ public class ASTTypedef extends ASTSymbol implements IASTTypedefDeclaration public void acceptElement(ISourceElementRequestor requestor) { requestor.acceptTypedefDeclaration(this); - referenceStore.processReferences(requestor); + referenceStore.processReferences(requestor); + getAbstractDeclarator().acceptElement( requestor ); } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTVariable.java index 7eff1004cfd..58763f2a3e0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTVariable.java @@ -166,6 +166,9 @@ public class ASTVariable extends ASTSymbol implements IASTVariable initializerClause.acceptElement(requestor); if( constructorExpression != null ) constructorExpression.acceptElement(requestor); + if( getAbstractDeclaration() != null ) + getAbstractDeclaration().acceptElement(requestor); + } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index 913152aabde..fbe0476d1fd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -483,7 +483,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto symbol = (IContainerSymbol)symbol.lookup( t.getImage() ); else symbol = symbol.lookupNestedNameSpecifier( t.getImage() ); - references.add( createReference( symbol, t.getImage(), t.getOffset() )); + + if( symbol != null ) + references.add( createReference( symbol, t.getImage(), t.getOffset() )); + else + throw new ASTSemanticException(); } catch( ParserSymbolTableException pste ) { @@ -687,18 +691,24 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createExceptionSpecification(java.util.List) */ - public IASTExceptionSpecification createExceptionSpecification(List typeIds) + public IASTExceptionSpecification createExceptionSpecification(IASTScope scope, List typeIds) throws ASTSemanticException { - // TODO Auto-generated method stub - return null; - } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createArrayModifier(org.eclipse.cdt.core.parser.ast.IASTExpression) - */ - public IASTArrayModifier createArrayModifier(IASTExpression exp) - { - // TODO Auto-generated method stub - return null; + List references = new ArrayList(); + List newTypeIds = new ArrayList(); + if( typeIds != null ) + { + Iterator iter =typeIds.iterator(); + while( iter.hasNext() ) + { + ITokenDuple duple = (ITokenDuple)iter.next(); + if( duple != null ) + { + lookupQualifiedName( scopeToSymbol( scope ), duple, references, false ); + newTypeIds.add( duple.toString() ); + } + } + } + return new ASTExceptionSpecification( newTypeIds, references ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createConstructorMemberInitializer(org.eclipse.cdt.core.parser.ITokenDuple, org.eclipse.cdt.core.parser.ast.IASTExpression) @@ -784,8 +794,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto typeSymbol = ((IContainerSymbol)typeSymbol).lookupNestedNameSpecifier( current.getImage()); else typeSymbol = ((IContainerSymbol)typeSymbol).lookup( current.getImage()); - - references.add( createReference( typeSymbol, current.getImage(), current.getOffset() )); + + if( typeSymbol != null ) + references.add( createReference( typeSymbol, current.getImage(), current.getOffset() )); + else + throw new ASTSemanticException(); } catch (ParserSymbolTableException e) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTExceptionSpecification.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTExceptionSpecification.java index 7f80611a1d8..6328ca0e9d0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTExceptionSpecification.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTExceptionSpecification.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ITokenDuple; import org.eclipse.cdt.core.parser.ast.IASTExceptionSpecification; @@ -42,4 +43,25 @@ public class ASTExceptionSpecification implements IASTExceptionSpecification { return typeIds.iterator(); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void enterScope(ISourceElementRequestor requestor) + { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void exitScope(ISourceElementRequestor requestor) + { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java index c8d75fa989c..a9a33ed12b1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java @@ -20,7 +20,6 @@ import org.eclipse.cdt.core.parser.ast.ASTSemanticException; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; -import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; @@ -163,19 +162,11 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createExceptionSpecification(java.util.List) */ - public IASTExceptionSpecification createExceptionSpecification(List typeIds) + public IASTExceptionSpecification createExceptionSpecification(IASTScope scope, List typeIds) { return new ASTExceptionSpecification( typeIds ); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createArrayModifier(org.eclipse.cdt.core.parser.ast.IASTExpression) - */ - public IASTArrayModifier createArrayModifier(IASTExpression exp) - { - return new ASTArrayModifier( exp ); - } - /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createConstructorMemberInitializer(org.eclipse.cdt.core.parser.ITokenDuple, org.eclipse.cdt.core.parser.ast.IASTExpression) */