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 d3e397b89f9..dbf819e54fc 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 @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.parser.tests; import java.io.StringReader; import java.util.ArrayList; +import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Stack; @@ -19,21 +20,31 @@ import java.util.Stack; import junit.framework.TestCase; import org.eclipse.cdt.core.parser.IParser; +import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ParserFactory; import org.eclipse.cdt.core.parser.ParserMode; +import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTClassReference; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; import org.eclipse.cdt.core.parser.ast.IASTDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference; import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.parser.ast.IASTField; +import org.eclipse.cdt.core.parser.ast.IASTFieldReference; import org.eclipse.cdt.core.parser.ast.IASTFunction; +import org.eclipse.cdt.core.parser.ast.IASTFunctionReference; import org.eclipse.cdt.core.parser.ast.IASTInclusion; import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification; +import org.eclipse.cdt.core.parser.ast.IASTMacro; import org.eclipse.cdt.core.parser.ast.IASTMethod; +import org.eclipse.cdt.core.parser.ast.IASTMethodReference; import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; +import org.eclipse.cdt.core.parser.ast.IASTNamespaceReference; import org.eclipse.cdt.core.parser.ast.IASTPointerToFunction; import org.eclipse.cdt.core.parser.ast.IASTPointerToMethod; import org.eclipse.cdt.core.parser.ast.IASTScope; @@ -41,10 +52,11 @@ import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation; import org.eclipse.cdt.core.parser.ast.IASTTemplateSpecialization; import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTTypedefReference; import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration; import org.eclipse.cdt.core.parser.ast.IASTUsingDirective; import org.eclipse.cdt.core.parser.ast.IASTVariable; -import org.eclipse.cdt.internal.core.parser.NullSourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.IASTVariableReference; import org.eclipse.cdt.internal.core.parser.ParserException; import org.eclipse.cdt.internal.core.parser.ScannerInfo; @@ -73,11 +85,20 @@ public class CompleteParseASTTest extends TestCase { return decls.iterator(); } + + /** + * @return + */ + public IASTScope getScope() + { + + return scope; + } } - public class FullParseCallback extends NullSourceElementRequestor implements ISourceElementRequestor + public class FullParseCallback implements ISourceElementRequestor { - + private List references = new ArrayList(); private Stack inclusions = new Stack(); private Scope compilationUnit; @@ -378,7 +399,9 @@ public class CompleteParseASTTest extends TestCase protected Scope popScope() { - return (Scope)scopes.pop(); + Scope s = (Scope)scopes.pop(); + h.put( s.getScope(), s ); + return s; } protected void pushScope( IASTScope scope ) @@ -386,6 +409,113 @@ public class CompleteParseASTTest extends TestCase scopes.push( new Scope( scope )); } + Hashtable h = new Hashtable(); + + public Scope lookup( IASTScope s) + { + return (Scope)h.get(s); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptProblem(org.eclipse.cdt.core.parser.IProblem) + */ + public void acceptProblem(IProblem problem) + { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMacro(org.eclipse.cdt.core.parser.ast.IASTMacro) + */ + public void acceptMacro(IASTMacro macro) + { + // TODO Auto-generated method stub + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptClassReference(org.eclipse.cdt.core.parser.ast.IASTClassReference) + */ + public void acceptClassReference(IASTClassReference reference) + { + references.add( reference ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptTypedefReference(org.eclipse.cdt.core.parser.ast.IASTTypedefReference) + */ + public void acceptTypedefReference(IASTTypedefReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptNamespaceReference(org.eclipse.cdt.core.parser.ast.IASTNamespaceReference) + */ + public void acceptNamespaceReference(IASTNamespaceReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptEnumerationReference(org.eclipse.cdt.core.parser.ast.IASTEnumerationReference) + */ + public void acceptEnumerationReference(IASTEnumerationReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptVariableReference(org.eclipse.cdt.core.parser.ast.IASTVariableReference) + */ + public void acceptVariableReference(IASTVariableReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptFunctionReference(org.eclipse.cdt.core.parser.ast.IASTFunctionReference) + */ + public void acceptFunctionReference(IASTFunctionReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptFieldReference(org.eclipse.cdt.core.parser.ast.IASTFieldReference) + */ + public void acceptFieldReference(IASTFieldReference reference) + { + references.add( reference ); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMethodReference(org.eclipse.cdt.core.parser.ast.IASTMethodReference) + */ + public void acceptMethodReference(IASTMethodReference reference) + { + references.add( reference ); + + } + + public List getReferences() + { + return references; + } + } + + protected Iterator getDeclarations( IASTScope scope ) + { + Scope s = callback.lookup( scope ); + if( s != null ) + return s.getDeclarations(); + return null; } @@ -422,7 +552,7 @@ public class CompleteParseASTTest extends TestCase Iterator declarations = parse( "namespace A { }").getDeclarations(); IASTNamespaceDefinition namespaceDefinition = (IASTNamespaceDefinition)declarations.next(); assertEquals( namespaceDefinition.getName(), "A" ); - assertFalse( namespaceDefinition.getDeclarations().hasNext() ); + assertFalse( getDeclarations( namespaceDefinition ).hasNext() ); } public void testMultipleNamespaceDefinitions() throws Exception @@ -432,7 +562,7 @@ public class CompleteParseASTTest extends TestCase assertEquals( namespaceDefinition.getName(), "A" ); namespaceDefinition = (IASTNamespaceDefinition)declarations.next(); assertEquals( namespaceDefinition.getName(), "A" ); - assertFalse( namespaceDefinition.getDeclarations().hasNext() ); + assertFalse( getDeclarations( namespaceDefinition ).hasNext() ); } public void testNestedNamespaceDefinitions() throws Exception @@ -441,18 +571,46 @@ public class CompleteParseASTTest extends TestCase IASTNamespaceDefinition namespaceDefinition = (IASTNamespaceDefinition)declarations.next(); assertEquals( namespaceDefinition.getName(), "A" ); assertFalse( declarations.hasNext() ); - Iterator subDeclarations = namespaceDefinition.getDeclarations(); + Iterator subDeclarations = getDeclarations( namespaceDefinition ); IASTNamespaceDefinition subDeclaration = (IASTNamespaceDefinition)subDeclarations.next(); assertEquals( subDeclaration.getName(), "B" ); assertFalse( subDeclarations.hasNext() ); } -// public void testEmptyClassDeclaration() throws Exception -// { -// Iterator declarations = parse( "class A { };").getDeclarations(); -// IASTClassSpecifier classSpec = (IASTClassSpecifier)declarations.next(); -// assertEquals( classSpec.getName(), "A"); -// assertFalse( classSpec.getDeclarations().hasNext() ); -// assertFalse( declarations.hasNext() ); -// } + public void testEmptyClassDeclaration() throws Exception + { + Iterator declarations = parse( "class A { };").getDeclarations(); + IASTAbstractTypeSpecifierDeclaration abs = (IASTAbstractTypeSpecifierDeclaration)declarations.next(); + IASTClassSpecifier classSpec = (IASTClassSpecifier)abs.getTypeSpecifier(); + assertEquals( classSpec.getName(), "A"); + assertFalse( getDeclarations( classSpec ).hasNext() ); + assertFalse( declarations.hasNext() ); + } + + public void testSimpleSubclass() throws Exception + { + Iterator declarations = parse( "class A { }; class B : public A { };").getDeclarations(); + IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)declarations.next()).getTypeSpecifier(); + IASTClassSpecifier classB = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)declarations.next()).getTypeSpecifier(); + Iterator parentClasses = classB.getBaseClauses(); + IASTBaseSpecifier baseClass = (IASTBaseSpecifier)parentClasses.next(); + assertEquals( classA, baseClass.getParentClassSpecifier() ); + assertEquals( baseClass.getParentClassName(), "A"); + assertEquals( baseClass.getAccess(), ASTAccessVisibility.PUBLIC); + assertFalse( baseClass.isVirtual() ); + } + + public void testNestedSubclass() throws Exception + { + Iterator declarations = parse( "namespace N { class A { }; } class B : protected virtual N::A { };").getDeclarations(); + IASTNamespaceDefinition namespaceDefinition = (IASTNamespaceDefinition)declarations.next(); + IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)getDeclarations( namespaceDefinition).next() ).getTypeSpecifier(); + IASTClassSpecifier classB = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)declarations.next()).getTypeSpecifier(); + Iterator baseClauses = classB.getBaseClauses(); + IASTBaseSpecifier baseClass = (IASTBaseSpecifier)baseClauses.next(); + assertEquals( classA, baseClass.getParentClassSpecifier() ); + assertEquals( callback.getReferences().size(), 2 ); + } + + } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java index cb7f4662d47..0992282ed72 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java @@ -307,10 +307,10 @@ public class ParserSymbolTableTest extends TestCase { IDerivableContainerSymbol c = table.newDerivableContainerSymbol("C"); IDerivableContainerSymbol a = table.newDerivableContainerSymbol("A"); - a.addParent( c, true, ASTAccessVisibility.PUBLIC ); + a.addParent( c, true, ASTAccessVisibility.PUBLIC, 3, null ); IDerivableContainerSymbol b = table.newDerivableContainerSymbol("B"); - b.addParent( c, true, ASTAccessVisibility.PUBLIC ); + b.addParent( c, true, ASTAccessVisibility.PUBLIC, 6, null ); decl.addParent( a ); decl.addParent( b ); diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index e2e6aec45b0..682f439c734 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,6 @@ +2003-07-21 John Camelon + Addded in support for BaseSpecifier & class/namespace reference callbacks upon those. + 2003-07-21 John Camelon Fleshed out basic declarations for FullParse AST. Fixed Bug 40554 - Fields coming back as Vars diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTBaseSpecifier.java index 07a4b80438a..1925f22e91e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTBaseSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTBaseSpecifier.java @@ -10,16 +10,19 @@ ***********************************************************************/ package org.eclipse.cdt.core.parser.ast; +import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; + /** * @author jcamelon * */ -public interface IASTBaseSpecifier { +public interface IASTBaseSpecifier extends ISourceElementCallbackDelegate { public ASTAccessVisibility getAccess(); public boolean isVirtual(); public String getParentClassName(); public IASTClassSpecifier getParentClassSpecifier() throws ASTNotImplementedException; + public int getNameOffset(); } 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 b7f8918f20d..d57bd999a8d 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 @@ -73,7 +73,7 @@ public interface IASTFactory IASTClassSpecifier astClassSpec, boolean isVirtual, ASTAccessVisibility visibility, - String string); + ITokenDuple parentClassName) throws ASTSemanticException; public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier( ASTClassKind elaboratedClassKind, String typeName, 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 db9749262e1..dbce24046a9 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 @@ -2343,11 +2343,18 @@ public class Parser implements IParser nameDuple = name(); break; case IToken.tCOMMA : - astFactory.addBaseSpecifier( - astClassSpec, - isVirtual, - visibility, - nameDuple.toString()); + try + { + astFactory.addBaseSpecifier( + astClassSpec, + isVirtual, + visibility, + nameDuple ); + } + catch (ASTSemanticException e) + { + // TODO Auto-generated catch block + } isVirtual = false; visibility = ASTAccessVisibility.PUBLIC; nameDuple = null; @@ -2358,11 +2365,18 @@ public class Parser implements IParser } } - astFactory.addBaseSpecifier( - astClassSpec, - isVirtual, - visibility, - nameDuple.toString()); + try + { + astFactory.addBaseSpecifier( + astClassSpec, + isVirtual, + visibility, + nameDuple ); + } + catch (ASTSemanticException e) + { + // TODO Auto-generated catch block + } } /** * Parses a function body. 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 2b3cb52bc00..1c08c23dd0b 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 @@ -313,7 +313,7 @@ public class Scanner implements IScanner { { String currentFilename = contextStack.getCurrentContext().getFilename(); File currentIncludeFile = new File( currentFilename ); - String parentDirectory = currentIncludeFile.getParent(); + String parentDirectory = currentIncludeFile.getParentFile().getAbsolutePath(); currentIncludeFile = null; newPath = parentDirectory + File.separatorChar + fileName; File includeFile = new File( newPath ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/TokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/TokenDuple.java index bf1637cedd5..607dd6d1172 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/TokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/TokenDuple.java @@ -55,7 +55,7 @@ public class TokenDuple implements ITokenDuple { * @see java.util.Iterator#hasNext() */ public boolean hasNext() { - return ( iter != TokenDuple.this.lastToken); + return ( iter != null ); } /* (non-Javadoc) @@ -65,7 +65,10 @@ public class TokenDuple implements ITokenDuple { if( ! hasNext() ) throw new NoSuchElementException(); IToken temp = iter; - iter = iter.getNext(); + if( iter == lastToken ) + iter = null; + else + iter = iter.getNext(); return temp; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTBaseSpecifier.java new file mode 100644 index 00000000000..1b3f9b44afd --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTBaseSpecifier.java @@ -0,0 +1,115 @@ +/********************************************************************** + * 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.List; + +import org.eclipse.cdt.core.parser.ISourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; +import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; +import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; +import org.eclipse.cdt.internal.core.parser.pst.ISymbol; + +/** + * @author jcamelon + * + */ +public class ASTBaseSpecifier implements IASTBaseSpecifier +{ + private ASTReferenceStore referenceDelegate; + private final boolean isVirtual; + private final ISymbol symbol; + private final ASTAccessVisibility visibility; + private final int offset; + /** + * @param symbol + * @param b + * @param visibility + */ + public ASTBaseSpecifier(ISymbol symbol, boolean b, ASTAccessVisibility visibility, int nameOffset, List references) + { + isVirtual = b; + this.visibility = visibility; + this.symbol = symbol; + this.offset = nameOffset; + referenceDelegate = new ASTReferenceStore( references ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getAccess() + */ + public ASTAccessVisibility getAccess() + { + return visibility; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#isVirtual() + */ + public boolean isVirtual() + { + return isVirtual; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getParentClassName() + */ + public String getParentClassName() + { + return symbol.getName(); + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getParentClassSpecifier() + */ + public IASTClassSpecifier getParentClassSpecifier() + throws ASTNotImplementedException + { + return (IASTClassSpecifier)symbol.getASTExtension().getPrimaryDeclaration(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getNameOffset() + */ + public int getNameOffset() + { + return offset; + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReferenceStore#processReferences() + */ + public void processReferences(ISourceElementRequestor requestor) throws ASTNotImplementedException + { + referenceDelegate.processReferences(requestor); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + referenceDelegate.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/ASTClassReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassReference.java new file mode 100644 index 00000000000..d53dccbb294 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassReference.java @@ -0,0 +1,63 @@ +/********************************************************************** + * 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 org.eclipse.cdt.core.parser.ISourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.IASTClassReference; +import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTScopedElement; + +/** + * @author jcamelon + * + */ +public class ASTClassReference + extends ASTReference + implements IASTClassReference +{ + private final IASTClassSpecifier reference; + /** + * @param i + * @param string + * @param specifier + */ + public ASTClassReference(int i, String string, IASTClassSpecifier specifier) + { + super( i, string ); + reference = specifier; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReference#getReferencedElement() + */ + public IASTScopedElement getReferencedElement() + { + return reference; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + requestor.acceptClassReference( this ); + } + /* (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/ASTClassSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java index ba307b0dfd5..af37e66c049 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java @@ -11,15 +11,20 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import java.util.Iterator; +import java.util.NoSuchElementException; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.ASTClassKind; +import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.internal.core.parser.ast.ASTQualifiedNamedElement; import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets; +import org.eclipse.cdt.internal.core.parser.pst.IDerivableContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbol; +import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable; +import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Declaration.ParentWrapper; /** * @author jcamelon @@ -27,6 +32,54 @@ import org.eclipse.cdt.internal.core.parser.pst.ISymbol; */ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier { + + public class BaseIterator implements Iterator + { + + private final Iterator parents; + /** + * @param symbol + */ + public BaseIterator(IDerivableContainerSymbol symbol) + { + if( symbol.getParents() != null ) + parents = symbol.getParents().iterator(); + else + parents = null; + } + /* (non-Javadoc) + * @see java.util.Iterator#hasNext() + */ + public boolean hasNext() + { + if( parents == null ) + return false; + return parents.hasNext(); + } + /* (non-Javadoc) + * @see java.util.Iterator#next() + */ + public Object next() + { + if( ! hasNext() ) + throw new NoSuchElementException(); + + ParserSymbolTable.Declaration.ParentWrapper pw = (ParentWrapper)parents.next(); + + return new ASTBaseSpecifier( pw.getParent(), pw.isVirtual(), pw.getAccess(), pw.getOffset(), pw.getReferences() ); + + } + /* (non-Javadoc) + * @see java.util.Iterator#remove() + */ + public void remove() + { + throw new UnsupportedOperationException(); + } + } + + + private NamedOffsets offsets = new NamedOffsets(); private final ClassNameType classNameType; private final ASTClassKind classKind; @@ -65,8 +118,7 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier */ public Iterator getBaseClauses() { - // TODO Auto-generated method stub - return null; + return new BaseIterator( (IDerivableContainerSymbol)getSymbol() ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTClassSpecifier#getCurrentVisibilityMode() @@ -116,8 +168,13 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier */ public void enterScope(ISourceElementRequestor requestor) { - //TODO Iterate baseClauses and callback on their references requestor.enterClassSpecifier(this); + Iterator i = getBaseClauses(); + while( i.hasNext() ) + { + IASTBaseSpecifier baseSpec = (IASTBaseSpecifier)i.next(); + baseSpec.acceptElement(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/ASTNamespaceReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNamespaceReference.java new file mode 100644 index 00000000000..7700af017ec --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNamespaceReference.java @@ -0,0 +1,65 @@ +/********************************************************************** + * 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 org.eclipse.cdt.core.parser.ISourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; +import org.eclipse.cdt.core.parser.ast.IASTNamespaceReference; +import org.eclipse.cdt.core.parser.ast.IASTScopedElement; + +/** + * @author jcamelon + * + */ +public class ASTNamespaceReference + extends ASTReference + implements IASTNamespaceReference +{ + private final IASTNamespaceDefinition reference; + + /** + * @param offset + * @param string + * @param definition + */ + public ASTNamespaceReference(int offset, String string, IASTNamespaceDefinition definition) + { + super(offset, string); + reference = definition; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReference#getReferencedElement() + */ + public IASTScopedElement getReferencedElement() + { + return reference; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + requestor.acceptNamespaceReference( this ); + } + /* (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/ASTReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTReference.java new file mode 100644 index 00000000000..845f5e2a47c --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTReference.java @@ -0,0 +1,46 @@ +/********************************************************************** + * 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 org.eclipse.cdt.core.parser.ast.IASTReference; + + +/** + * @author jcamelon + * + */ +public abstract class ASTReference implements IASTReference +{ + protected final String name; + protected final int offset; + /** + * + */ + public ASTReference(int offset, String name) + { + this.offset = offset; + this.name = name; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReference#getOffset() + */ + public int getOffset() + { + return offset; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReference#getName() + */ + public String getName() + { + return name; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTReferenceStore.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTReferenceStore.java new file mode 100644 index 00000000000..f84c0ec77bf --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTReferenceStore.java @@ -0,0 +1,43 @@ +/********************************************************************** + * 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.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.core.parser.ISourceElementRequestor; +import org.eclipse.cdt.core.parser.ast.IASTReference; + +/** + * @author jcamelon + * + */ +public class ASTReferenceStore +{ + private List references = new ArrayList(); + + public ASTReferenceStore( List assortedReferences ) + { + references.addAll( assortedReferences ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReferenceStore#processReferences() + */ + public void processReferences(ISourceElementRequestor requestor) + { + Iterator i = references.iterator(); + while( i.hasNext() ) + ((IASTReference)i.next()).acceptElement(requestor); + references.clear(); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTScope.java index af353cc3cb0..f25f56257a9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTScope.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import java.util.Iterator; +import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbol; @@ -38,9 +39,9 @@ public abstract class ASTScope extends ASTSymbol implements IASTScope /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTScope#getDeclarations() */ - public Iterator getDeclarations() + public Iterator getDeclarations() throws ASTNotImplementedException { - return new ScopeIterator( getContainerSymbol().getContainedSymbols() ); + throw new ASTNotImplementedException(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTUsingDirective.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTUsingDirective.java index 0e06aad2b3e..e7045992bdf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTUsingDirective.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTUsingDirective.java @@ -10,6 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.complete; +import java.util.List; + import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; @@ -25,17 +27,19 @@ public class ASTUsingDirective extends ASTAnonymousDeclaration implements IASTUs { private final IASTNamespaceDefinition namespace; private Offsets offsets = new Offsets(); + private final ASTReferenceStore referenceDelegate; /** * @param namespaceDefinition * @param startingOffset * @param endingOffset */ - public ASTUsingDirective(IContainerSymbol ownerSymbol, IASTNamespaceDefinition namespaceDefinition, int startingOffset, int endingOffset) + public ASTUsingDirective(IContainerSymbol ownerSymbol, IASTNamespaceDefinition namespaceDefinition, int startingOffset, int endingOffset, List references ) { super( ownerSymbol ); namespace = namespaceDefinition; setStartingOffset(startingOffset); setEndingOffset(endingOffset); + referenceDelegate = new ASTReferenceStore( references ); } /* (non-Javadoc) @@ -87,21 +91,20 @@ public class ASTUsingDirective extends ASTAnonymousDeclaration implements IASTUs */ public void acceptElement(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub + requestor.acceptUsingDirective( this ); + referenceDelegate.processReferences(requestor); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void enterScope(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void exitScope(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub } /* (non-Javadoc) 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 0dfc6d86b2a..26ecab3df0e 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 @@ -10,6 +10,7 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.complete; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -39,6 +40,7 @@ import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTPointerToFunction; import org.eclipse.cdt.core.parser.ast.IASTPointerToMethod; +import org.eclipse.cdt.core.parser.ast.IASTReference; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; import org.eclipse.cdt.core.parser.ast.IASTTemplate; @@ -99,8 +101,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto IToken t1 = (IToken)iter.next(); IContainerSymbol symbol = null; + List references = new ArrayList(); - symbol = getScopeToSearchUpon(scope, t1 ); + symbol = getScopeToSearchUpon(scope, t1, references ); while( iter.hasNext() ) { @@ -109,6 +112,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto try { symbol = symbol.LookupNestedNameSpecifier( t.getImage() ); + references.add( createReference( symbol, t.getImage(), t.getOffset() )); } catch( ParserSymbolTableException pste ) { @@ -121,14 +125,14 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } catch (ParserSymbolTableException pste) { } - IASTUsingDirective astUD = new ASTUsingDirective( scopeToSymbol(scope), ((IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration()), startingOffset, endingOffset ); + IASTUsingDirective astUD = new ASTUsingDirective( scopeToSymbol(scope), ((IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration()), startingOffset, endingOffset, references ); return astUD; } protected IContainerSymbol getScopeToSearchUpon( IASTScope currentScope, - IToken firstToken ) + IToken firstToken, List references ) throws ASTSemanticException { IContainerSymbol symbol = null; if( firstToken.getType() == IToken.tCOLONCOLON ) @@ -138,6 +142,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto try { symbol = (IContainerSymbol)scopeToSymbol(currentScope).Lookup( firstToken.getImage() ); + references.add( createReference( symbol, firstToken.getImage(), firstToken.getOffset() )); } catch( ParserSymbolTableException pste ) { @@ -331,6 +336,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } return classSpecifier; } + + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#addBaseSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier, boolean, org.eclipse.cdt.core.parser.ast.ASTAccessVisibility, java.lang.String) */ @@ -338,10 +345,58 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto IASTClassSpecifier astClassSpec, boolean isVirtual, ASTAccessVisibility visibility, - String string) + ITokenDuple parentClassName) throws ASTSemanticException { - // TODO Auto-generated method stub + IDerivableContainerSymbol classSymbol = (IDerivableContainerSymbol)scopeToSymbol( astClassSpec); + Iterator iterator = parentClassName.iterator(); + List references = new ArrayList(); + + if( ! iterator.hasNext() ) + throw new ASTSemanticException(); + + IToken t1 = (IToken)iterator.next(); + IContainerSymbol symbol = null; + + symbol = getScopeToSearchUpon(astClassSpec.getOwnerScope(), t1, references ); + + while( iterator.hasNext() ) + { + IToken t = (IToken)iterator.next(); + if( t.getType() == IToken.tCOLONCOLON ) continue; + try + { + symbol = symbol.LookupNestedNameSpecifier( t.getImage() ); + references.add( createReference( symbol, t.getImage(), t.getOffset() )); + } + catch( ParserSymbolTableException pste ) + { + throw new ASTSemanticException(); + } + } + + classSymbol.addParent( symbol, isVirtual, visibility, parentClassName.getFirstToken().getOffset(), references ); + } + /** + * @param symbol + * @param string + * @return + */ + private IASTReference createReference(ISymbol symbol, String string, int offset ) throws ASTSemanticException + { + if( symbol.getType() == ParserSymbolTable.TypeInfo.t_namespace ) + { + return new ASTNamespaceReference( offset, string, (IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration()); + } + else if( symbol.getType() == ParserSymbolTable.TypeInfo.t_class || + symbol.getType() == ParserSymbolTable.TypeInfo.t_struct || + symbol.getType() == ParserSymbolTable.TypeInfo.t_union ) + { + return new ASTClassReference( offset, string, (IASTClassSpecifier)symbol.getASTExtension().getPrimaryDeclaration() ); + } + throw new ASTSemanticException(); + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createElaboratedTypeSpecifier(org.eclipse.cdt.core.parser.ast.ASTClassKind, java.lang.String, int, int) */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ScopeIterator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ScopeIterator.java deleted file mode 100644 index f5ab5a81571..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ScopeIterator.java +++ /dev/null @@ -1,73 +0,0 @@ -/********************************************************************** - * 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.Map; -import java.util.NoSuchElementException; - -import org.eclipse.cdt.internal.core.parser.pst.ISymbol; -import org.eclipse.cdt.internal.core.parser.pst.ISymbolASTExtension; - -/** - * @author jcamelon - * - */ -public class ScopeIterator implements Iterator -{ - private final Map sourceMap; - private final Iterator keyIter; - private Iterator subIterator = null; - - public ScopeIterator( Map in ) - { - sourceMap = in; - if( sourceMap != null ) - keyIter = in.keySet().iterator(); - else - keyIter = null; - } - - /* (non-Javadoc) - * @see java.util.Iterator#hasNext() - */ - public boolean hasNext() { - if( keyIter == null ) - return false; - if( subIterator != null && subIterator.hasNext() ) - return true; - subIterator = null; - return keyIter.hasNext(); - } - - /* (non-Javadoc) - * @see java.util.Iterator#next() - */ - public Object next() { - if( ! hasNext() ) - throw new NoSuchElementException(); - - if( subIterator != null ) - return subIterator.next(); - - - ISymbolASTExtension symbol = ((ISymbol)sourceMap.get( keyIter.next() )).getASTExtension(); - subIterator = symbol.getAllDefinitions(); - return next(); - } - - /* (non-Javadoc) - * @see java.util.Iterator#remove() - */ - public void remove() { - throw new UnsupportedOperationException(); - } -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTBaseSpecifier.java index adb1bc6debd..ea16a768b25 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTBaseSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTBaseSpecifier.java @@ -10,10 +10,12 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.quick; +import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTReference; /** * @author jcamelon @@ -21,15 +23,17 @@ import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; */ public class ASTBaseSpecifier implements IASTBaseSpecifier { - private final ASTAccessVisibility visibility; + private final int offset; + private final ASTAccessVisibility visibility; private final boolean isVirtual; private final String parentClassName; - public ASTBaseSpecifier( String className, boolean v, ASTAccessVisibility a ) + public ASTBaseSpecifier( String className, boolean v, ASTAccessVisibility a, int o ) { parentClassName = className; isVirtual = v; visibility = a; + offset = o; } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getAccess() @@ -58,5 +62,45 @@ public class ASTBaseSpecifier implements IASTBaseSpecifier { { throw new ASTNotImplementedException(); } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier#getNameOffset() + */ + public int getNameOffset() + { + return offset; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReferenceStore#addReference(org.eclipse.cdt.core.parser.ast.IASTReference) + */ + public void addReference(IASTReference reference) throws ASTNotImplementedException + { + throw new ASTNotImplementedException(); + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTReferenceStore#processReferences() + */ + public void processReferences(ISourceElementRequestor requestor)throws ASTNotImplementedException + { + throw new ASTNotImplementedException(); + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + // no references to process + } + /* (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 cc11d03c40b..a81734a3282 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 @@ -125,8 +125,8 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#addBaseSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier, boolean, org.eclipse.cdt.core.parser.ast.AccessVisibility, java.lang.String) */ - public void addBaseSpecifier(IASTClassSpecifier astClassSpec, boolean isVirtual, ASTAccessVisibility visibility, String string) { - IASTBaseSpecifier baseSpecifier = new ASTBaseSpecifier( string, isVirtual, visibility ); + public void addBaseSpecifier(IASTClassSpecifier astClassSpec, boolean isVirtual, ASTAccessVisibility visibility, ITokenDuple parentClassName) { + IASTBaseSpecifier baseSpecifier = new ASTBaseSpecifier( parentClassName.toString(), isVirtual, visibility, parentClassName.getFirstToken().getOffset() ); ((IASTQClassSpecifier)astClassSpec).addBaseClass(baseSpecifier); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java index c764b355171..188ca147bf6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java @@ -29,7 +29,7 @@ import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; public interface IDerivableContainerSymbol extends IContainerSymbol { public void addParent( ISymbol parent ); - public void addParent( ISymbol parent, boolean virtual, ASTAccessVisibility visibility ); + public void addParent( ISymbol parent, boolean virtual, ASTAccessVisibility visibility, int offset, List references ); public List getParents(); public boolean hasParents(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index c58c09ef4a8..5e53946d843 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -2336,14 +2336,14 @@ public class ParserSymbolTable { } public void addParent( ISymbol parent ){ - addParent( parent, false, ASTAccessVisibility.PUBLIC ); + addParent( parent, false, ASTAccessVisibility.PUBLIC, -1, null ); } - public void addParent( ISymbol parent, boolean virtual, ASTAccessVisibility visibility ){ + public void addParent( ISymbol parent, boolean virtual, ASTAccessVisibility visibility, int offset, List references ){ if( _parentScopes == null ){ _parentScopes = new LinkedList(); } - ParentWrapper wrapper = new ParentWrapper( parent, virtual, visibility ); + ParentWrapper wrapper = new ParentWrapper( parent, virtual, visibility, offset, references ); _parentScopes.add( wrapper ); Command command = new AddParentCommand( this, wrapper ); @@ -3103,10 +3103,12 @@ public class ParserSymbolTable { public class ParentWrapper implements IDerivableContainerSymbol.IParentSymbol { - public ParentWrapper( ISymbol p, boolean v, ASTAccessVisibility s ){ + public ParentWrapper( ISymbol p, boolean v, ASTAccessVisibility s, int offset, List r ){ parent = p; isVirtual = v; access = s; + this.offset = offset; + this.references = r; } public void setParent( ISymbol parent ){ @@ -3127,7 +3129,9 @@ public class ParserSymbolTable { private boolean isVirtual = false; private ISymbol parent = null; - private final ASTAccessVisibility access; + private final ASTAccessVisibility access; + private final int offset; + private final List references; /** * @return */ @@ -3135,6 +3139,22 @@ public class ParserSymbolTable { return access; } + /** + * + */ + public int getOffset() + { + return offset; + } + + /** + * + */ + public List getReferences() + { + return references; + } + } }