1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00
Added X-Ref/Elaborated type support w/element requestor callbacks.  

TESTS
	Added CompleteParseASTTest::testForewardDeclarationWithUsage().
This commit is contained in:
John Camelon 2003-08-12 20:40:11 +00:00
parent 8dba12bff3
commit 891454830b
16 changed files with 161 additions and 18 deletions

View file

@ -1,4 +1,7 @@
2003-08-12
2003-08-12 John Camelon
Added CompleteParseASTTest::testForewardDeclarationWithUsage().
2003-08-12 Hoda Amer
Added CompletionProposalsTest to the suit to test the generation
of completion proposals.

View file

@ -104,6 +104,7 @@ public class CompleteParseASTTest extends TestCase
public class FullParseCallback implements ISourceElementRequestor
{
private List references = new ArrayList();
private List forewardDecls = new ArrayList();
private Stack inclusions = new Stack();
private Scope compilationUnit;
@ -499,6 +500,22 @@ public class CompleteParseASTTest extends TestCase
{
return references;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
*/
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType)
{
forewardDecls.add( elaboratedType );
}
/**
* @return
*/
public List getForewardDecls()
{
return forewardDecls;
}
}
protected Iterator getDeclarations( IASTScope scope )
@ -852,6 +869,25 @@ public class CompleteParseASTTest extends TestCase
assertEquals( variableA.getAbstractDeclaration().getTypeSpecifier(), elab );
}
public void testForewardDeclarationWithUsage() throws Exception
{
Iterator declarations = parse( "class A; A * anA;class A { };").getDeclarations();
IASTAbstractTypeSpecifierDeclaration forewardDecl = (IASTAbstractTypeSpecifierDeclaration)declarations.next();
IASTVariable variable = (IASTVariable)declarations.next();
IASTAbstractTypeSpecifierDeclaration classDecl = (IASTAbstractTypeSpecifierDeclaration)declarations.next();
IASTElaboratedTypeSpecifier elab = (IASTElaboratedTypeSpecifier)forewardDecl.getTypeSpecifier();
IASTClassSpecifier clasSpec = (IASTClassSpecifier)classDecl.getTypeSpecifier();
assertEquals( elab.getName(), clasSpec.getName() );
String [] fqnClass = clasSpec.getFullyQualifiedName();
String [] fqnElab = elab.getFullyQualifiedName();
assertEquals( fqnClass.length, fqnElab.length );
for( int i = 0; i < fqnClass.length; ++i )
assertEquals( fqnClass[i], fqnElab[i]);
assertEquals( callback.getReferences().size(), 1 );
assertEquals( callback.getForewardDecls().size(), 1 );
}
public void testASM() throws Exception
{
IASTASMDefinition asm = (IASTASMDefinition)parse( "asm ( \"blah blah blah\" );" ).getDeclarations().next();

View file

@ -951,4 +951,12 @@ public class DOMBuilder implements ISourceElementRequestor
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
*/
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType)
{
// TODO Auto-generated method stub
}
}

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
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.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTField;
@ -403,4 +404,11 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
if (reference.getReferencedElement() instanceof IASTMethod)
indexer.addMethodReference((IASTMethod) reference.getReferencedElement());
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
*/
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType)
{
// TODO BOGDAN IMPLEMENT THIS
}
}

View file

@ -1,3 +1,6 @@
2003-08-12 John Camelon
Added X-Ref/Elaborated type support w/element requestor callbacks.
2003-08-11 John Camelon
Added Complete Parse support for ASM Definitions.
Added isVolatile() to abstract declarations.

View file

@ -15,6 +15,7 @@ import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
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.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTField;
@ -54,6 +55,7 @@ public interface ISourceElementRequestor {
public void acceptASMDefinition( IASTASMDefinition asmDefinition );
public void acceptTypedefDeclaration( IASTTypedefDeclaration typedef );
public void acceptEnumerationSpecifier( IASTEnumerationSpecifier enumeration );
public void acceptElaboratedForewardDeclaration( IASTElaboratedTypeSpecifier elaboratedType );
public void acceptAbstractTypeSpecDeclaration( IASTAbstractTypeSpecifierDeclaration abstractDeclaration );
public void enterFunctionBody( IASTFunction function );

View file

@ -16,5 +16,5 @@ package org.eclipse.cdt.core.parser.ast;
*/
public interface IASTClassReference extends IASTReference
{
public boolean isResolved();
}

View file

@ -10,13 +10,15 @@
***********************************************************************/
package org.eclipse.cdt.core.parser.ast;
import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
/**
* @author jcamelon
*
*/
public interface IASTElaboratedTypeSpecifier extends IASTTypeSpecifier, IASTOffsetableElement {
public interface IASTElaboratedTypeSpecifier extends IASTTypeSpecifier, IASTOffsetableElement, IASTQualifiedNameElement, ISourceElementCallbackDelegate {
public String getName();
public ASTClassKind getClassKind();

View file

@ -7,6 +7,7 @@ import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
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.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTField;
@ -395,5 +396,14 @@ public class NullSourceElementRequestor implements ISourceElementRequestor
{
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
*/
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType)
{
// TODO Auto-generated method stub
}
}

View file

@ -1493,7 +1493,8 @@ public class Parser implements IParser
ITokenDuple d = name();
IASTElaboratedTypeSpecifier elaboratedTypeSpec = null;
final boolean isForewardDecl = ( LT(1) == IToken.tSEMI );
try
{
elaboratedTypeSpec =
@ -1503,7 +1504,7 @@ public class Parser implements IParser
d,
t.getOffset(),
d.getLastToken().getEndOffset(),
( LT(1) == IToken.tSEMI ) );
isForewardDecl );
}
catch (ASTSemanticException e)
{
@ -1511,6 +1512,9 @@ public class Parser implements IParser
throw backtrack;
}
sdw.setTypeSpecifier(elaboratedTypeSpec);
if( isForewardDecl )
elaboratedTypeSpec.acceptElement( requestor );
}
/**
* Consumes template parameters.

View file

@ -14,6 +14,7 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
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.IASTTypeSpecifier;
/**
* @author jcamelon
@ -23,13 +24,13 @@ public class ASTClassReference
extends ASTReference
implements IASTClassReference
{
private final IASTClassSpecifier reference;
private final IASTTypeSpecifier reference;
/**
* @param i
* @param string
* @param specifier
*/
public ASTClassReference(int i, String string, IASTClassSpecifier specifier)
public ASTClassReference(int i, String string, IASTTypeSpecifier specifier)
{
super( i, string );
reference = specifier;
@ -39,7 +40,7 @@ public class ASTClassReference
*/
public ISourceElementCallbackDelegate getReferencedElement()
{
return reference;
return (ISourceElementCallbackDelegate)reference;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor)
@ -60,4 +61,11 @@ public class ASTClassReference
public void exitScope(ISourceElementRequestor requestor)
{
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTClassReference#isResolved()
*/
public boolean isResolved()
{
return ( reference instanceof IASTClassSpecifier );
}
}

View file

@ -10,10 +10,13 @@
***********************************************************************/
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.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.ast.ASTQualifiedNamedElement;
import org.eclipse.cdt.internal.core.parser.ast.Offsets;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
@ -23,8 +26,11 @@ import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
*/
public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElaboratedTypeSpecifier
{
private final ASTClassKind kind;
private final boolean isForwardDeclaration;
private final ASTClassKind kind;
private final ASTQualifiedNamedElement qualifiedName;
private Offsets offsets = new Offsets();
private final ASTReferenceStore store;
/**
* @param checkSymbol
@ -32,12 +38,16 @@ public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElabora
* @param startingOffset
* @param endOffset
*/
public ASTElaboratedTypeSpecifier(ISymbol checkSymbol, ASTClassKind kind, int startingOffset, int endOffset)
public ASTElaboratedTypeSpecifier(ISymbol checkSymbol, ASTClassKind kind, int startingOffset, int endOffset, List references, boolean isDecl )
{
super( checkSymbol );
this.kind = kind;
setStartingOffset( startingOffset );
setEndingOffset( endOffset );
qualifiedName = new ASTQualifiedNamedElement( getOwnerScope(), checkSymbol.getName() );
store = new ASTReferenceStore( references );
isForwardDeclaration = isDecl;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#getName()
@ -93,6 +103,9 @@ public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElabora
*/
public void acceptElement(ISourceElementRequestor requestor)
{
if( isForwardDeclaration )
requestor.acceptElaboratedForewardDeclaration(this);
store.processReferences(requestor);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor)
@ -106,4 +119,11 @@ public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElabora
public void exitScope(ISourceElementRequestor requestor)
{
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTQualifiedNameElement#getFullyQualifiedName()
*/
public String[] getFullyQualifiedName()
{
return qualifiedName.getFullyQualifiedName();
}
}

View file

@ -400,6 +400,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IDerivableContainerSymbol newSymbol = pst.newDerivableContainerSymbol( lastToken.getImage(), pstType );
if( classSymbol != null )
classSymbol.setTypeSymbol( newSymbol );
try
{
currentScopeSymbol.addSymbol( newSymbol );
@ -408,9 +411,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{
throw new ASTSemanticException();
}
if( classSymbol != null )
classSymbol.setTypeSymbol( newSymbol );
ASTClassSpecifier classSpecifier = new ASTClassSpecifier( newSymbol, kind, type, access, startingOffset, nameOffset, references );
try
@ -500,7 +500,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
symbol.getType() == TypeInfo.t_struct ||
symbol.getType() == TypeInfo.t_union )
{
return new ASTClassReference( offset, string, (IASTClassSpecifier)symbol.getASTExtension().getPrimaryDeclaration() );
return new ASTClassReference( offset, string, (IASTTypeSpecifier)symbol.getASTExtension().getPrimaryDeclaration() );
}
else if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ))
{
@ -1296,7 +1296,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
}
ASTElaboratedTypeSpecifier elab =
new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, endOffset );
new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, endOffset, references, isForewardDecl );
try
{

View file

@ -10,9 +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.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
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.Offsets;
/**
@ -24,19 +27,21 @@ public class ASTElaboratedTypeSpecifier implements IASTElaboratedTypeSpecifier
private Offsets offsets = new Offsets();
private final String typeName;
private final ASTClassKind classKind;
private final ASTClassKind classKind;
private final ASTQualifiedNamedElement qualifiedName;
/**
* @param elaboratedClassKind
* @param typeName
* @param startingOffset
* @param endOffset
*/
public ASTElaboratedTypeSpecifier(ASTClassKind elaboratedClassKind, String typeName, int startingOffset, int endOffset)
public ASTElaboratedTypeSpecifier(IASTScope scope, ASTClassKind elaboratedClassKind, String typeName, int startingOffset, int endOffset)
{
classKind = elaboratedClassKind;
this.typeName = typeName;
offsets.setStartingOffset( startingOffset );
offsets.setEndingOffset( endOffset );
qualifiedName = new ASTQualifiedNamedElement( scope, typeName );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#getTypeName()
@ -88,4 +93,30 @@ public class ASTElaboratedTypeSpecifier implements IASTElaboratedTypeSpecifier
{
throw new ASTNotImplementedException();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTQualifiedNameElement#getFullyQualifiedName()
*/
public String[] getFullyQualifiedName()
{
return qualifiedName.getFullyQualifiedName();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor)
*/
public void acceptElement(ISourceElementRequestor requestor)
{
requestor.acceptElaboratedForewardDeclaration(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)
{
}
}

View file

@ -280,6 +280,6 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory
public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(IASTScope scope, ASTClassKind elaboratedClassKind, ITokenDuple typeName, int startingOffset, int endOffset, boolean isForewardDecl)
{
return new ASTElaboratedTypeSpecifier( elaboratedClassKind, typeName.toString(), startingOffset, endOffset );
return new ASTElaboratedTypeSpecifier( scope, elaboratedClassKind, typeName.toString(), startingOffset, endOffset );
}
}

View file

@ -35,6 +35,7 @@ import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
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.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTField;
@ -413,6 +414,13 @@ public class MatchLocator implements ISourceElementRequestor, ICSearchConstants
private IASTScope currentScope = null;
private LinkedList scopeStack = new LinkedList();
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
*/
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType)
{
//TODO BOGDAN IMPLEMENT THIS
}
}