1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

org.eclipse.cdt.core : Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697 <BR>

org.eclipse.cdt.core.tests : Added CompleteParseASTTest::testBug39697().
This commit is contained in:
John Camelon 2004-04-15 21:00:18 +00:00
parent df56f209bb
commit b1c5ca5c96
5 changed files with 91 additions and 13 deletions

View file

@ -1,3 +1,6 @@
2004-04-15 John Camelon
Added CompleteParseASTTest::testBug39697().
2004-04-15 Andrew Niefer 2004-04-15 Andrew Niefer
added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug57791() added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug57791()

View file

@ -1511,4 +1511,43 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertEquals( f_SD_01.getName(), "f_SD_01"); assertEquals( f_SD_01.getName(), "f_SD_01");
assertAllReferences( 1, createTaskList( new Task( SD_01 ))); assertAllReferences( 1, createTaskList( new Task( SD_01 )));
} }
public void testBug39697() throws Exception
{
Writer writer = new StringWriter();
writer.write( "__asm__( \"CODE\" );\n" );
writer.write( "__inline__ int foo() { return 4; }\n");
writer.write( "__const__ int constInt;\n");
writer.write( "__volatile__ int volInt;\n");
writer.write( "__signed__ int signedInt;\n");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTASMDefinition asmDefinition = (IASTASMDefinition) i.next();
assertEquals( asmDefinition.getBody(), "CODE");
IASTFunction foo = (IASTFunction) i.next();
assertTrue( foo.isInline() );
IASTVariable constInt = (IASTVariable) i.next();
assertTrue( constInt.getAbstractDeclaration().isConst());
IASTVariable volInt = (IASTVariable) i.next();
assertTrue( volInt.getAbstractDeclaration().isVolatile() );
IASTVariable signedInt = (IASTVariable) i.next();
assertTrue( ((IASTSimpleTypeSpecifier) signedInt.getAbstractDeclaration().getTypeSpecifier()).isSigned() );
assertFalse( i.hasNext() );
writer = new StringWriter();
writer.write( "int * __restrict__ resPointer1;\n");
writer.write( "int * __restrict resPointer2;\n");
i = parse( writer.toString(), true, ParserLanguage.C ).getDeclarations();
int count = 0;
while( i.hasNext() )
{
++count;
IASTVariable resPointer = (IASTVariable) i.next();
Iterator pOps = resPointer.getAbstractDeclaration().getPointerOperators();
assertTrue( pOps.hasNext() );
ASTPointerOperator op = (ASTPointerOperator) pOps.next();
assertFalse( pOps.hasNext() );
assertEquals( op, ASTPointerOperator.RESTRICT_POINTER );
}
assertEquals( count, 2 );
}
} }

View file

@ -1,3 +1,6 @@
2004-04-15 John Camelon
Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697
2004-04-15 John Camelon 2004-04-15 John Camelon
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=58175 Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=58175

View file

@ -18,6 +18,7 @@ import java.util.Set;
import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.IASTInclusion; import org.eclipse.cdt.core.parser.ast.IASTInclusion;
import org.eclipse.cdt.core.parser.extension.IScannerExtension; import org.eclipse.cdt.core.parser.extension.IScannerExtension;
@ -30,16 +31,29 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
public class GCCScannerExtension implements IScannerExtension { public class GCCScannerExtension implements IScannerExtension {
private static final String __CONST__ = "__const__"; //$NON-NLS-1$
private static final String __INLINE__ = "__inline__"; //$NON-NLS-1$
private static final String __VOLATILE__ = "__volatile__"; //$NON-NLS-1$
private static final String __SIGNED__ = "__signed__"; //$NON-NLS-1$
private static final String __RESTRICT = "__restrict"; //$NON-NLS-1$
private static final String __RESTRICT__ = "__restrict__"; //$NON-NLS-1$
private static final String __ASM__ = "__asm__"; //$NON-NLS-1$
private IScannerData scannerData; private IScannerData scannerData;
private static final String __ATTRIBUTE__ = "__attribute__"; private static final String __ATTRIBUTE__ = "__attribute__"; //$NON-NLS-1$
private static final String __DECLSPEC = "__declspec"; private static final String __DECLSPEC = "__declspec"; //$NON-NLS-1$
private static final List EMPTY_LIST = new ArrayList(); private static final List EMPTY_LIST = new ArrayList();
private static final List simpleIdentifiers; private static final List simpleIdentifiersDeclSpec;
private static final List simpleIdentifiersAttribute;
static static
{ {
simpleIdentifiers = new ArrayList(); simpleIdentifiersDeclSpec = new ArrayList( 1 );
simpleIdentifiers.add( "x" ); //$NON-NLS-1 simpleIdentifiersDeclSpec.add( "x" ); //$NON-NLS-1$
simpleIdentifiersAttribute = new ArrayList( 1 );
simpleIdentifiersAttribute.add( "xyz"); //$NON-NLS-1$
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerExtension#initializeMacroValue(java.lang.String) * @see org.eclipse.cdt.core.parser.IScannerExtension#initializeMacroValue(java.lang.String)
@ -56,23 +70,42 @@ public class GCCScannerExtension implements IScannerExtension {
public void setupBuiltInMacros(ParserLanguage language) { public void setupBuiltInMacros(ParserLanguage language) {
if( scannerData.getScanner().getDefinition( __ATTRIBUTE__) == null ) if( scannerData.getScanner().getDefinition( __ATTRIBUTE__) == null )
{ scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiers, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
}
if( scannerData.getScanner().getDefinition( __DECLSPEC) == null ) if( scannerData.getScanner().getDefinition( __DECLSPEC) == null )
{ scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiers, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
}
if( language == ParserLanguage.CPP ) if( language == ParserLanguage.CPP )
if( scannerData.getScanner().getDefinition( IScanner.__CPLUSPLUS ) == null ) if( scannerData.getScanner().getDefinition( IScanner.__CPLUSPLUS ) == null )
scannerData.getScanner().addDefinition( IScanner.__CPLUSPLUS, new ObjectMacroDescriptor( IScanner.__CPLUSPLUS, "1")); //$NON-NLS-1$ scannerData.getScanner().addDefinition( IScanner.__CPLUSPLUS, new ObjectMacroDescriptor( IScanner.__CPLUSPLUS, "1")); //$NON-NLS-1$
if( scannerData.getScanner().getDefinition(IScanner.__STDC_HOSTED__) == null ) if( scannerData.getScanner().getDefinition(IScanner.__STDC_HOSTED__) == null )
scannerData.getScanner().addDefinition(IScanner.__STDC_HOSTED__, new ObjectMacroDescriptor( IScanner.__STDC_HOSTED__, "0")); //$NON-NLS-1$ scannerData.getScanner().addDefinition(IScanner.__STDC_HOSTED__, new ObjectMacroDescriptor( IScanner.__STDC_HOSTED__, "0")); //$NON-NLS-1$
if( scannerData.getScanner().getDefinition( IScanner.__STDC_VERSION__) == null ) if( scannerData.getScanner().getDefinition( IScanner.__STDC_VERSION__) == null )
scannerData.getScanner().addDefinition( IScanner.__STDC_VERSION__, new ObjectMacroDescriptor( IScanner.__STDC_VERSION__, "199001L")); //$NON-NLS-1$ scannerData.getScanner().addDefinition( IScanner.__STDC_VERSION__, new ObjectMacroDescriptor( IScanner.__STDC_VERSION__, "199001L")); //$NON-NLS-1$
setupAlternativeKeyword(__CONST__, Keywords.CONST);
setupAlternativeKeyword(__INLINE__, Keywords.INLINE);
setupAlternativeKeyword(__SIGNED__, Keywords.SIGNED);
setupAlternativeKeyword(__VOLATILE__, Keywords.VOLATILE);
if( language == ParserLanguage.C )
{
setupAlternativeKeyword( __RESTRICT, Keywords.RESTRICT);
setupAlternativeKeyword( __RESTRICT__, Keywords.RESTRICT);
}
else
setupAlternativeKeyword( __ASM__, Keywords.ASM );
}
/**
*
*/
protected void setupAlternativeKeyword(String keyword, String mapping) {
// alternate keyword forms
// TODO - make this more efficient - update TokenFactory to avoid a context push for these token to token cases
if( scannerData.getScanner().getDefinition( keyword ) == null )
scannerData.getScanner().addDefinition( keyword, new ObjectMacroDescriptor( __CONST__, mapping )); //$NON-NLS-1$
} }
public void setScannerData(IScannerData scannerData) { public void setScannerData(IScannerData scannerData) {

View file

@ -21,7 +21,7 @@ import org.eclipse.cdt.core.parser.IToken;
*/ */
public class ObjectMacroDescriptor implements IMacroDescriptor { public class ObjectMacroDescriptor implements IMacroDescriptor {
private static final ArrayList EMPTY_LIST = new ArrayList(); private static final ArrayList EMPTY_LIST = new ArrayList(0);
private final String expansionSignature; private final String expansionSignature;
private final String name; private final String name;
private final IToken token; private final IToken token;