From bf8c96a8b15fbe00240bc1aa239d17d5204b213a Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 2 Jun 2004 17:39:45 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=64271 --- .../parser/tests/CompleteParseASTTest.java | 18 +++++++++++- .../parser/tests/CompletionParseTest.java | 29 +++++++++++++++++++ .../parser/ast/IASTEnumerationSpecifier.java | 7 ++++- .../cdt/core/parser/ast/IASTEnumerator.java | 6 +++- .../internal/core/parser/CompleteParser.java | 1 + .../core/parser/ExpressionParser.java | 8 +++++ .../cdt/internal/core/parser/Parser.java | 10 +++++-- .../ast/complete/ASTEnumerationSpecifier.java | 16 ++++++++++ .../parser/ast/complete/ASTEnumerator.java | 7 +++++ .../ast/complete/CompleteParseASTFactory.java | 2 +- .../ast/quick/ASTEnumerationSpecifier.java | 6 ++++ .../core/parser/ast/quick/ASTEnumerator.java | 6 ++++ 12 files changed, 109 insertions(+), 7 deletions(-) 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 8994266a4d3..69ce4029013 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 @@ -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() ); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java index c08660f1f1b..3fb746bccb6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java @@ -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 ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerationSpecifier.java index 8c8b13bea00..04e26712ea9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerationSpecifier.java @@ -20,5 +20,10 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; */ public interface IASTEnumerationSpecifier extends ISourceElementCallbackDelegate, IASTScopedTypeSpecifier, IASTOffsetableNamedElement { - public Iterator getEnumerators(); + public Iterator getEnumerators(); + + /** + * @param referenceManager + */ + public void freeReferences(IReferenceManager referenceManager); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerator.java index 34662ef1cff..1adcc117ac3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTEnumerator.java @@ -19,5 +19,9 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; public interface IASTEnumerator extends IASTOffsetableNamedElement, IASTNode, ISourceElementCallbackDelegate { public IASTEnumerationSpecifier getOwnerEnumerationSpecifier(); - public IASTExpression getInitialValue(); + public IASTExpression getInitialValue(); + /** + * @param referenceManager + */ + public void freeReferences(IReferenceManager referenceManager); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompleteParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompleteParser.java index 56c27ca166c..91b04c562a2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompleteParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/CompleteParser.java @@ -84,4 +84,5 @@ public class CompleteParser extends Parser { return ((CompleteParseASTFactory)astFactory).validateCaches(); return false; } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java index 2528d5a989b..ff61f16a31a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java @@ -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$ + } } 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 162949f6f33..ed3a814b6f1 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 @@ -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 ) { } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerationSpecifier.java index 4eb0c9a2f08..429a12562a7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerationSpecifier.java @@ -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); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerator.java index 04cfd754b54..2f7aa0bcaf7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTEnumerator.java @@ -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); + } } 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 b3fa651bed7..b8af3daa49e 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 @@ -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() ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerationSpecifier.java index 24316ecde3c..b3a4fabc528 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerationSpecifier.java @@ -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 + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerator.java index 1e22d7a6a9a..4f97ca85960 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTEnumerator.java @@ -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 + } }