1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00
John Camelon 2004-06-02 17:39:45 +00:00
parent 3f2cd224a1
commit bf8c96a8b1
12 changed files with 109 additions and 7 deletions

View file

@ -28,7 +28,6 @@ import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
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.IASTLinkageSpecification;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
@ -1875,4 +1874,21 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
IASTFunction f = (IASTFunction) d.next();
}
public void testBug64271() throws Exception
{
Writer writer = new StringWriter();
writer.write( "typedef int DWORD;\n" ); //$NON-NLS-1$
writer.write( "typedef char BYTE;\n"); //$NON-NLS-1$
writer.write( "#define MAKEFOURCC(ch0, ch1, ch2, ch3) \\n"); //$NON-NLS-1$
writer.write( "((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \\n"); //$NON-NLS-1$
writer.write( "((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))\n"); //$NON-NLS-1$
writer.write( "enum e {\n"); //$NON-NLS-1$
writer.write( "blah1 = 5,\n"); //$NON-NLS-1$
writer.write( "blah2 = MAKEFOURCC('a', 'b', 'c', 'd'),\n"); //$NON-NLS-1$
writer.write( "blah3\n"); //$NON-NLS-1$
writer.write( "};\n"); //$NON-NLS-1$
writer.write( "e mye = blah;\n"); //$NON-NLS-1$
parse( writer.toString().toString() );
}
}

View file

@ -1117,4 +1117,33 @@ public class CompletionParseTest extends CompletionParseBaseTest {
assertTrue( ((IASTFunction)node.getCompletionScope()).getName().equals( "f" ) ); //$NON-NLS-1$
assertNotNull( node.getCompletionContext() );
}
public void testBug64271() throws Exception
{
Writer writer = new StringWriter();
writer.write( "typedef int DWORD;\n" ); //$NON-NLS-1$
writer.write( "typedef char BYTE;\n"); //$NON-NLS-1$
writer.write( "#define MAKEFOURCC(ch0, ch1, ch2, ch3) \\n"); //$NON-NLS-1$
writer.write( "((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \\n"); //$NON-NLS-1$
writer.write( "((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))\n"); //$NON-NLS-1$
writer.write( "enum e {\n"); //$NON-NLS-1$
writer.write( "blah1 = 5,\n"); //$NON-NLS-1$
writer.write( "blah2 = MAKEFOURCC('a', 'b', 'c', 'd'),\n"); //$NON-NLS-1$
writer.write( "blah3\n"); //$NON-NLS-1$
writer.write( "};\n"); //$NON-NLS-1$
writer.write( "e mye = bl\n"); //$NON-NLS-1$
String code = writer.toString();
IASTCompletionNode node = parse( code, code.indexOf( "= bl") + 4); //$NON-NLS-1$
assertNotNull( node );
assertEquals( node.getCompletionKind(), IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE );
assertEquals( node.getCompletionPrefix(), "bl"); //$NON-NLS-1$
assertNull( node.getCompletionContext() );
assertFalse( node.getKeywords().hasNext() );
LookupKind[] kind = new LookupKind[1];
kind[0] = LookupKind.ENUMERATORS;
ILookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), kind, null, null );
assertNotNull( result );
assertEquals( result.getResultsSize(), 3 );
}
}

View file

@ -21,4 +21,9 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
public interface IASTEnumerationSpecifier extends ISourceElementCallbackDelegate, IASTScopedTypeSpecifier, IASTOffsetableNamedElement {
public Iterator getEnumerators();
/**
* @param referenceManager
*/
public void freeReferences(IReferenceManager referenceManager);
}

View file

@ -20,4 +20,8 @@ public interface IASTEnumerator extends IASTOffsetableNamedElement, IASTNode, IS
public IASTEnumerationSpecifier getOwnerEnumerationSpecifier();
public IASTExpression getInitialValue();
/**
* @param referenceManager
*/
public void freeReferences(IReferenceManager referenceManager);
}

View file

@ -84,4 +84,5 @@ public class CompleteParser extends Parser {
return ((CompleteParseASTFactory)astFactory).validateCaches();
return false;
}
}

View file

@ -2983,4 +2983,12 @@ public class ExpressionParser implements IExpressionParser, IParserData {
{
return true;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return scanner.toString(); //$NON-NLS-1$
}
}

View file

@ -2533,12 +2533,12 @@ public abstract class Parser extends ExpressionParser implements IParser
consume(IToken.tASSIGN);
initialValue = constantExpression(sdw.getScope(), CompletionKind.SINGLE_NAME_REFERENCE, Key.EXPRESSION);
}
IASTEnumerator enumerator = null;
if (LT(1) == IToken.tRBRACE)
{
try
{
IASTEnumerator enumerator = astFactory.addEnumerator(
enumerator = astFactory.addEnumerator(
enumeration,
enumeratorIdentifier.getImage(),
enumeratorIdentifier.getOffset(),
@ -2560,11 +2560,14 @@ public abstract class Parser extends ExpressionParser implements IParser
}
if (LT(1) != IToken.tCOMMA)
{
enumeration.freeReferences( astFactory.getReferenceManager() );
if( enumerator != null )
enumerator.freeReferences( astFactory.getReferenceManager() );
throw backtrack;
}
try
{
IASTEnumerator enumerator = astFactory.addEnumerator(
enumerator = astFactory.addEnumerator(
enumeration,
enumeratorIdentifier.getImage(),
enumeratorIdentifier.getOffset(),
@ -3275,4 +3278,5 @@ public abstract class Parser extends ExpressionParser implements IParser
*/
protected void handleOffsetableNamedElement(IASTOffsetableNamedElement node ) {
}
}

View file

@ -72,6 +72,13 @@ public class ASTEnumerationSpecifier
{
/* do nothing */
}
if( enumerators.isEmpty() ) return;
for( int i = 0; i < enumerators.size(); ++i )
{
IASTEnumerator enumerator = (IASTEnumerator) enumerators.get(i);
if( enumerator.getInitialValue() != null )
enumerator.getInitialValue().acceptElement(requestor, manager );
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor)
@ -176,4 +183,13 @@ public class ASTEnumerationSpecifier
public int getNameLineNumber() {
return offsets.getNameLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier#freeReferences(org.eclipse.cdt.core.parser.ast.IReferenceManager)
*/
public void freeReferences(IReferenceManager referenceManager) {
if( enumerators.isEmpty() ) return;
for( int i = 0; i < enumerators.size(); ++i )
((IASTEnumerator) enumerators.get(i)).freeReferences(referenceManager);
}
}

View file

@ -159,4 +159,11 @@ public class ASTEnumerator extends ASTSymbol implements IASTEnumerator
public int getNameLineNumber() {
return offsets.getNameLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTEnumerator#freeReferences(org.eclipse.cdt.core.parser.ast.IReferenceManager)
*/
public void freeReferences(IReferenceManager referenceManager) {
if( initialValue != null )
initialValue.freeReferences(referenceManager);
}
}

View file

@ -3412,7 +3412,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( result.getType() == TypeInfo.t_type )
{
ISymbol typeSymbol = lookupQualifiedName( scopeToSymbol(scope), typeId.getTokenDuple(), refs, true );
if( typeSymbol == null || typeSymbol.getType() == TypeInfo.t_type )
if( typeSymbol == null /*|| typeSymbol.getType() == TypeInfo.t_type*/ )
{
freeReferences( refs );
handleProblem( scope, IProblem.SEMANTIC_INVALID_TYPE, id.getTypeOrClassName() );

View file

@ -168,4 +168,10 @@ public class ASTEnumerationSpecifier extends ASTScopedTypeSpecifier
public int getNameLineNumber() {
return offsets.getNameLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier#freeReferences(org.eclipse.cdt.core.parser.ast.IReferenceManager)
*/
public void freeReferences(IReferenceManager referenceManager) {
// do nothing
}
}

View file

@ -163,4 +163,10 @@ public class ASTEnumerator extends ASTNode
public int getNameLineNumber() {
return offsets.getNameLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTEnumerator#freeReferences(org.eclipse.cdt.core.parser.ast.IReferenceManager)
*/
public void freeReferences(IReferenceManager referenceManager) {
// do nothing
}
}