mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-21 07:55:24 +02:00
IScannerInfo enhancements.
- Definition of IExtendedScannerInfo - Scanner2 implementation for bulk of this - added support to core model builder to ignore implicit inclusions/macros - JUnit
This commit is contained in:
parent
71be97ba3e
commit
6c0f439c6c
12 changed files with 322 additions and 21 deletions
|
@ -0,0 +1,123 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002-2004 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.core.parser.tests;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.parser.CodeReader;
|
||||||
|
import org.eclipse.cdt.core.parser.ExtendedScannerInfo;
|
||||||
|
import org.eclipse.cdt.core.parser.IParser;
|
||||||
|
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||||
|
import org.eclipse.cdt.core.parser.NullLogService;
|
||||||
|
import org.eclipse.cdt.core.parser.ParserFactory;
|
||||||
|
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||||
|
import org.eclipse.cdt.core.parser.ParserMode;
|
||||||
|
import org.eclipse.cdt.core.parser.ast.IASTScope;
|
||||||
|
import org.eclipse.cdt.core.parser.ast.IASTVariable;
|
||||||
|
import org.eclipse.cdt.core.parser.tests.CompleteParseBaseTest.Scope;
|
||||||
|
import org.eclipse.cdt.internal.core.parser.Parser;
|
||||||
|
import org.eclipse.cdt.internal.core.parser.ParserException;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author jcamelon
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class IScannerInfoPluginTest extends FileBasePluginTest {
|
||||||
|
|
||||||
|
private static final String [] EMPTY_STRING_ARRAY = new String[0];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param className
|
||||||
|
*/
|
||||||
|
public IScannerInfoPluginTest(String name) {
|
||||||
|
super(name, IScannerInfoPluginTest.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Test suite() {
|
||||||
|
TestSuite suite = new TestSuite( IScannerInfoPluginTest.class );
|
||||||
|
suite.addTest( new CompleteParsePluginTest("cleanupProject") ); //$NON-NLS-1$
|
||||||
|
return suite;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Iterator getDeclarations(IASTScope scope)
|
||||||
|
{
|
||||||
|
Scope s = c.lookup( scope );
|
||||||
|
if( s != null )
|
||||||
|
return s.getDeclarations();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompleteParseBaseTest.FullParseCallback c;
|
||||||
|
|
||||||
|
protected IASTScope parse(IFile code, ParserLanguage language, IScannerInfo scannerInfo ) throws Exception
|
||||||
|
{
|
||||||
|
c = new CompleteParseBaseTest.FullParseCallback();
|
||||||
|
InputStream stream = code.getContents();
|
||||||
|
IParser parser = ParserFactory.createParser(
|
||||||
|
ParserFactory.createScanner( new CodeReader( code.getLocation().toOSString(), stream ), scannerInfo, //$NON-NLS-1$
|
||||||
|
ParserMode.COMPLETE_PARSE, language, c, new NullLogService(), null ), c, ParserMode.COMPLETE_PARSE, language, null
|
||||||
|
);
|
||||||
|
stream.close();
|
||||||
|
boolean parseResult = parser.parse();
|
||||||
|
// throw exception if there are generated IProblems
|
||||||
|
if( !parseResult ) throw new ParserException( "FAILURE"); //$NON-NLS-1$
|
||||||
|
assertTrue( ((Parser)parser).validateCaches());
|
||||||
|
return c.getCompilationUnit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testMacroFileLoading() throws Exception
|
||||||
|
{
|
||||||
|
String imacroContent = "#define ONE 1\n"; //$NON-NLS-1$
|
||||||
|
IFile imacroFile = importFile( "imacros.h", imacroContent ); //$NON-NLS-1$
|
||||||
|
String code = "int x = ONE;\n"; //$NON-NLS-1$
|
||||||
|
IFile sourceCode = importFile( "source.cpp", code ); //$NON-NLS-1$
|
||||||
|
String [] imacroz = new String[1];
|
||||||
|
imacroz[0] = imacroFile.getFullPath().toOSString();
|
||||||
|
IScannerInfo scannerInfo = new ExtendedScannerInfo( Collections.EMPTY_MAP, EMPTY_STRING_ARRAY, imacroz, EMPTY_STRING_ARRAY );
|
||||||
|
Iterator i = parse( sourceCode, ParserLanguage.C, scannerInfo ).getDeclarations();
|
||||||
|
assertTrue( i.hasNext() );
|
||||||
|
IASTVariable x = (IASTVariable) i.next();
|
||||||
|
assertFalse( i.hasNext() );
|
||||||
|
assertEquals( x.getName(), "x" ); //$NON-NLS-1$
|
||||||
|
assertNotNull( x.getInitializerClause() );
|
||||||
|
assertNotNull( x.getInitializerClause().getAssigmentExpression() );
|
||||||
|
assertEquals( x.getInitializerClause().getAssigmentExpression().toString(), "1"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIncludeFileLoading() throws Exception
|
||||||
|
{
|
||||||
|
String inclContent = "int x = 4;\n\n"; //$NON-NLS-1$
|
||||||
|
IFile inclFile = importFile( "includeMe.h", inclContent ); //$NON-NLS-1$
|
||||||
|
String code = "int y = x;\n"; //$NON-NLS-1$
|
||||||
|
IFile sourceCode = importFile( "source.cpp", code ); //$NON-NLS-1$
|
||||||
|
String [] includez = new String[1];
|
||||||
|
includez[0] = inclFile.getFullPath().toOSString();
|
||||||
|
IScannerInfo scannerInfo = new ExtendedScannerInfo( Collections.EMPTY_MAP, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, includez );
|
||||||
|
Iterator i = parse( sourceCode, ParserLanguage.C, scannerInfo ).getDeclarations();
|
||||||
|
assertTrue( i.hasNext() );
|
||||||
|
assertTrue(i.next() instanceof IASTVariable );
|
||||||
|
IASTVariable y = (IASTVariable) i.next();
|
||||||
|
assertFalse( i.hasNext() );
|
||||||
|
assertEquals( y.getName(), "y" ); //$NON-NLS-1$
|
||||||
|
assertNotNull( y.getInitializerClause() );
|
||||||
|
assertNotNull( y.getInitializerClause().getAssigmentExpression() );
|
||||||
|
assertEquals( y.getInitializerClause().getAssigmentExpression().toString(), "x"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -48,6 +48,7 @@ public class ParserTestSuite extends TestCase {
|
||||||
suite.addTestSuite( StructuralParseTest.class );
|
suite.addTestSuite( StructuralParseTest.class );
|
||||||
suite.addTestSuite( ObjectMapTest.class );
|
suite.addTestSuite( ObjectMapTest.class );
|
||||||
suite.addTest( CompleteParsePluginTest.suite() );
|
suite.addTest( CompleteParsePluginTest.suite() );
|
||||||
|
suite.addTest( IScannerInfoPluginTest.suite() );
|
||||||
suite.addTest( ScannerParserLoopTest.suite() );
|
suite.addTest( ScannerParserLoopTest.suite() );
|
||||||
suite.addTest( GCCParserExtensionTestSuite.suite() );
|
suite.addTest( GCCParserExtensionTestSuite.suite() );
|
||||||
return suite;
|
return suite;
|
||||||
|
|
|
@ -237,10 +237,15 @@ public class CModelBuilder {
|
||||||
while (i.hasNext()){
|
while (i.hasNext()){
|
||||||
IASTOffsetableElement offsetable = (IASTOffsetableElement)i.next();
|
IASTOffsetableElement offsetable = (IASTOffsetableElement)i.next();
|
||||||
if(offsetable instanceof IASTInclusion){
|
if(offsetable instanceof IASTInclusion){
|
||||||
createInclusion(translationUnit, (IASTInclusion) offsetable);
|
IASTInclusion inc = (IASTInclusion) offsetable;
|
||||||
|
if( ! inc.isImplicit() )
|
||||||
|
createInclusion(translationUnit, inc );
|
||||||
}
|
}
|
||||||
else if(offsetable instanceof IASTMacro){
|
else if(offsetable instanceof IASTMacro){
|
||||||
createMacro(translationUnit, (IASTMacro) offsetable);
|
|
||||||
|
IASTMacro macro = (IASTMacro) offsetable;
|
||||||
|
if( ! macro.isImplicit() )
|
||||||
|
createMacro(translationUnit, macro);
|
||||||
}else if(offsetable instanceof IASTDeclaration){
|
}else if(offsetable instanceof IASTDeclaration){
|
||||||
try{
|
try{
|
||||||
generateModelElements (translationUnit, (IASTDeclaration) offsetable);
|
generateModelElements (translationUnit, (IASTDeclaration) offsetable);
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002-2004 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.core.parser;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author jcamelon
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ExtendedScannerInfo extends ScannerInfo implements IExtendedScannerInfo {
|
||||||
|
|
||||||
|
private static final String [] EMPTY_STRING_ARRAY = new String[ 0 ];
|
||||||
|
private String [] m, i;
|
||||||
|
|
||||||
|
public ExtendedScannerInfo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendedScannerInfo( Map d, String [] incs )
|
||||||
|
{
|
||||||
|
super(d,incs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendedScannerInfo( Map d, String [] incs, String [] macros, String [] includes )
|
||||||
|
{
|
||||||
|
super(d,incs);
|
||||||
|
m = macros;
|
||||||
|
i = includes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.parser.IExtendedScannerInfo#getMacroFiles()
|
||||||
|
*/
|
||||||
|
public String[] getMacroFiles() {
|
||||||
|
if( m == null ) return EMPTY_STRING_ARRAY;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.parser.IExtendedScannerInfo#getIncludeFiles()
|
||||||
|
*/
|
||||||
|
public String[] getIncludeFiles() {
|
||||||
|
if( i == null ) return EMPTY_STRING_ARRAY;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.parser.IExtendedScannerInfo#getLocalIncludePath()
|
||||||
|
*/
|
||||||
|
public String[] getLocalIncludePath() {
|
||||||
|
return EMPTY_STRING_ARRAY; //TODO add impl
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2002-2004 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.core.parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author jcamelon
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IExtendedScannerInfo extends IScannerInfo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String [] getMacroFiles();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String [] getIncludeFiles();
|
||||||
|
|
||||||
|
public String [] getLocalIncludePath();
|
||||||
|
}
|
|
@ -27,7 +27,7 @@ public interface IASTFactory
|
||||||
char[] name,
|
char[] name,
|
||||||
int startingOffset,
|
int startingOffset,
|
||||||
int startingLine,
|
int startingLine,
|
||||||
int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn);
|
int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn, boolean isImplicit);
|
||||||
|
|
||||||
public IASTInclusion createInclusion(
|
public IASTInclusion createInclusion(
|
||||||
char[] name,
|
char[] name,
|
||||||
|
@ -35,7 +35,7 @@ public interface IASTFactory
|
||||||
boolean local,
|
boolean local,
|
||||||
int startingOffset,
|
int startingOffset,
|
||||||
int startingLine,
|
int startingLine,
|
||||||
int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn) ;
|
int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn, boolean isImplicit) ;
|
||||||
|
|
||||||
public IASTUsingDirective createUsingDirective(
|
public IASTUsingDirective createUsingDirective(
|
||||||
IASTScope scope,
|
IASTScope scope,
|
||||||
|
|
|
@ -25,4 +25,5 @@ public interface IASTInclusion extends IASTOffsetableNamedElement, ISourceElemen
|
||||||
|
|
||||||
public boolean isLocal();
|
public boolean isLocal();
|
||||||
|
|
||||||
|
public boolean isImplicit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,5 +18,10 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
|
||||||
*/
|
*/
|
||||||
public interface IASTMacro extends IASTOffsetableNamedElement, ISourceElementCallbackDelegate{
|
public interface IASTMacro extends IASTOffsetableNamedElement, ISourceElementCallbackDelegate{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean isImplicit();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.eclipse.cdt.core.parser.ast.IASTInclusion;
|
||||||
*/
|
*/
|
||||||
public class ASTInclusion implements IASTInclusion {
|
public class ASTInclusion implements IASTInclusion {
|
||||||
|
|
||||||
public ASTInclusion( char[] name, char[] fileName, boolean local, int startingOffset, int startLine, int nameOffset, int nameEndOffset, int nameLine, int endOffset, int endLine, char [] fn )
|
public ASTInclusion( char[] name, char[] fileName, boolean local, int startingOffset, int startLine, int nameOffset, int nameEndOffset, int nameLine, int endOffset, int endLine, char [] fn, boolean i )
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.fileName = fileName;
|
this.fileName = fileName;
|
||||||
|
@ -29,6 +29,7 @@ public class ASTInclusion implements IASTInclusion {
|
||||||
setNameEndOffsetAndLineNumber(nameEndOffset, nameLine);
|
setNameEndOffsetAndLineNumber(nameEndOffset, nameLine);
|
||||||
setEndingOffsetAndLineNumber(endOffset, endLine);
|
setEndingOffsetAndLineNumber(endOffset, endLine);
|
||||||
this.filename = fn;
|
this.filename = fn;
|
||||||
|
this.isImplicit = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int nameEndOffset;
|
private int nameEndOffset;
|
||||||
|
@ -183,6 +184,7 @@ public class ASTInclusion implements IASTInclusion {
|
||||||
|
|
||||||
private int fileIndex;
|
private int fileIndex;
|
||||||
private final char[] filename;
|
private final char[] filename;
|
||||||
|
private final boolean isImplicit;
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex()
|
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex()
|
||||||
*/
|
*/
|
||||||
|
@ -203,4 +205,10 @@ public class ASTInclusion implements IASTInclusion {
|
||||||
public char[] getFilename() {
|
public char[] getFilename() {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.parser.ast.IASTInclusion#isImplicit()
|
||||||
|
*/
|
||||||
|
public boolean isImplicit() {
|
||||||
|
return isImplicit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class ASTMacro implements IASTMacro {
|
||||||
private final char[] name;
|
private final char[] name;
|
||||||
private final char[] fn;
|
private final char[] fn;
|
||||||
|
|
||||||
public ASTMacro( char[] name, int start, int startLine, int nameBeg, int nameEnd, int nameLine, int end, int endLine, char[] fn )
|
public ASTMacro( char[] name, int start, int startLine, int nameBeg, int nameEnd, int nameLine, int end, int endLine, char[] fn, boolean implicit )
|
||||||
{
|
{
|
||||||
this.name =name;
|
this.name =name;
|
||||||
setStartingOffsetAndLineNumber(start, startLine);
|
setStartingOffsetAndLineNumber(start, startLine);
|
||||||
|
@ -32,6 +32,7 @@ public class ASTMacro implements IASTMacro {
|
||||||
setNameEndOffsetAndLineNumber(nameEnd, nameLine);
|
setNameEndOffsetAndLineNumber(nameEnd, nameLine);
|
||||||
setEndingOffsetAndLineNumber(end, endLine);
|
setEndingOffsetAndLineNumber(end, endLine);
|
||||||
this.fn = fn;
|
this.fn = fn;
|
||||||
|
this.isImplicit = implicit;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int startingOffset = 0, endingOffset = 0, nameOffset = 0;
|
private int startingOffset = 0, endingOffset = 0, nameOffset = 0;
|
||||||
|
@ -149,6 +150,7 @@ public class ASTMacro implements IASTMacro {
|
||||||
|
|
||||||
|
|
||||||
private int fileIndex;
|
private int fileIndex;
|
||||||
|
private final boolean isImplicit;
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex()
|
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex()
|
||||||
*/
|
*/
|
||||||
|
@ -168,5 +170,11 @@ public class ASTMacro implements IASTMacro {
|
||||||
public char[] getFilename() {
|
public char[] getFilename() {
|
||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.parser.ast.IASTMacro#isImplicit()
|
||||||
|
*/
|
||||||
|
public boolean isImplicit() {
|
||||||
|
return isImplicit;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,16 +43,16 @@ public class BaseASTFactory {
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.parser.ast.IASTFactory#createMacro(java.lang.String, int, int, int)
|
* @see org.eclipse.cdt.internal.core.parser.ast.IASTFactory#createMacro(java.lang.String, int, int, int)
|
||||||
*/
|
*/
|
||||||
public IASTMacro createMacro(char[] name, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn) {
|
public IASTMacro createMacro(char[] name, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn, boolean isImplicit) {
|
||||||
IASTMacro m = new ASTMacro( name, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, fn );
|
IASTMacro m = new ASTMacro( name, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, fn, isImplicit );
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.parser.ast.IASTFactory#createInclusion(java.lang.String, java.lang.String, boolean)
|
* @see org.eclipse.cdt.internal.core.parser.ast.IASTFactory#createInclusion(java.lang.String, java.lang.String, boolean)
|
||||||
*/
|
*/
|
||||||
public IASTInclusion createInclusion(char[] name, char[] fileName, boolean local, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn) {
|
public IASTInclusion createInclusion(char[] name, char[] fileName, boolean local, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine, char[] fn, boolean isImplicit) {
|
||||||
IASTInclusion inclusion = new ASTInclusion( name, fileName, local, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, fn );
|
IASTInclusion inclusion = new ASTInclusion( name, fileName, local, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, fn, isImplicit );
|
||||||
return inclusion;
|
return inclusion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.parser.CodeReader;
|
import org.eclipse.cdt.core.parser.CodeReader;
|
||||||
import org.eclipse.cdt.core.parser.EndOfFileException;
|
import org.eclipse.cdt.core.parser.EndOfFileException;
|
||||||
|
import org.eclipse.cdt.core.parser.IExtendedScannerInfo;
|
||||||
import org.eclipse.cdt.core.parser.IMacro;
|
import org.eclipse.cdt.core.parser.IMacro;
|
||||||
import org.eclipse.cdt.core.parser.IParserLogService;
|
import org.eclipse.cdt.core.parser.IParserLogService;
|
||||||
import org.eclipse.cdt.core.parser.IProblem;
|
import org.eclipse.cdt.core.parser.IProblem;
|
||||||
|
@ -137,6 +138,9 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
|
|
||||||
private List workingCopies;
|
private List workingCopies;
|
||||||
|
|
||||||
|
private Iterator preIncludeFiles = EmptyIterator.EMPTY_ITERATOR;
|
||||||
|
private boolean isInitialized = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
// try {
|
// try {
|
||||||
// dlog = new PrintStream(new FileOutputStream("C:/dlog.txt"));
|
// dlog = new PrintStream(new FileOutputStream("C:/dlog.txt"));
|
||||||
|
@ -170,8 +174,6 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
if (reader.filename != null)
|
if (reader.filename != null)
|
||||||
fileCache.put(reader.filename, reader);
|
fileCache.put(reader.filename, reader);
|
||||||
|
|
||||||
pushContext(reader.buffer, reader);
|
|
||||||
|
|
||||||
setupBuiltInMacros();
|
setupBuiltInMacros();
|
||||||
|
|
||||||
if (info.getDefinedSymbols() != null) {
|
if (info.getDefinedSymbols() != null) {
|
||||||
|
@ -187,9 +189,45 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
includePaths = info.getIncludePaths();
|
includePaths = info.getIncludePaths();
|
||||||
|
|
||||||
|
if( info instanceof IExtendedScannerInfo )
|
||||||
|
{
|
||||||
|
IExtendedScannerInfo einfo = (IExtendedScannerInfo) info;
|
||||||
|
if( einfo.getMacroFiles() != null )
|
||||||
|
for( int i = 0; i < einfo.getMacroFiles().length; ++i )
|
||||||
|
{
|
||||||
|
CodeReader r = ScannerUtility.createReaderDuple( einfo.getMacroFiles()[i], requestor, getWorkingCopies() );
|
||||||
|
if( r == null )
|
||||||
|
continue;
|
||||||
|
pushContext( r.buffer, r );
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
nextToken();
|
||||||
|
} catch (EndOfFileException e) {
|
||||||
|
finished = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( einfo.getIncludeFiles() != null && einfo.getIncludeFiles().length > 0 )
|
||||||
|
preIncludeFiles = Arrays.asList( einfo.getIncludeFiles() ).iterator();
|
||||||
|
|
||||||
|
pushContext(reader.buffer, reader);
|
||||||
|
|
||||||
|
if( preIncludeFiles.hasNext() )
|
||||||
|
pushForcedInclusion();
|
||||||
|
|
||||||
|
isInitialized = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pushContext(reader.buffer, reader);
|
||||||
|
isInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pushContext(char[] buffer) {
|
private void pushContext(char[] buffer) {
|
||||||
|
@ -280,15 +318,32 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
buffer.append( ((InclusionData)bufferData[bufferStackPos]).reader.filename );
|
buffer.append( ((InclusionData)bufferData[bufferStackPos]).reader.filename );
|
||||||
log.traceLog( buffer.toString() );
|
log.traceLog( buffer.toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
callbackManager.pushCallback( ((InclusionData) bufferData[bufferStackPos]).inclusion );
|
callbackManager.pushCallback( ((InclusionData) bufferData[bufferStackPos]).inclusion );
|
||||||
}
|
}
|
||||||
bufferData[bufferStackPos] = null;
|
bufferData[bufferStackPos] = null;
|
||||||
--bufferStackPos;
|
--bufferStackPos;
|
||||||
|
|
||||||
|
if( preIncludeFiles.hasNext() )
|
||||||
|
pushForcedInclusion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void pushForcedInclusion() {
|
||||||
|
CodeReader r = null;
|
||||||
|
while( r == null )
|
||||||
|
{
|
||||||
|
if( preIncludeFiles.hasNext() )
|
||||||
|
r = ScannerUtility.createReaderDuple( (String)preIncludeFiles.next(), requestor, getWorkingCopies() );
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if( r == null ) return;
|
||||||
|
IASTInclusion i = getASTFactory().createInclusion( r.filename, r.filename, false, -1, -1, -1, -1, -1, -1, -1, EMPTY_STRING_CHAR_ARRAY, true );
|
||||||
|
InclusionData d = new InclusionData( r, i );
|
||||||
|
pushContext( r.buffer, d );
|
||||||
|
}
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.parser.IScanner#addDefinition(java.lang.String, java.lang.String)
|
* @see org.eclipse.cdt.core.parser.IScanner#addDefinition(java.lang.String, java.lang.String)
|
||||||
*/
|
*/
|
||||||
|
@ -362,6 +417,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
|
|
||||||
private boolean isCancelled = false;
|
private boolean isCancelled = false;
|
||||||
|
|
||||||
|
|
||||||
public synchronized void cancel() {
|
public synchronized void cancel() {
|
||||||
isCancelled = true;
|
isCancelled = true;
|
||||||
int index = bufferStackPos < 0 ? 0 : bufferStackPos;
|
int index = bufferStackPos < 0 ? 0 : bufferStackPos;
|
||||||
|
@ -1624,7 +1680,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
|
|
||||||
if( parserMode == ParserMode.QUICK_PARSE )
|
if( parserMode == ParserMode.QUICK_PARSE )
|
||||||
{
|
{
|
||||||
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, EMPTY_STRING_CHAR_ARRAY, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
|
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, EMPTY_STRING_CHAR_ARRAY, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename(), false );
|
||||||
callbackManager.pushCallback( new InclusionData( null, inclusion ) );
|
callbackManager.pushCallback( new InclusionData( null, inclusion ) );
|
||||||
callbackManager.pushCallback( inclusion );
|
callbackManager.pushCallback( inclusion );
|
||||||
}
|
}
|
||||||
|
@ -1648,7 +1704,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
}
|
}
|
||||||
if (reader != null) {
|
if (reader != null) {
|
||||||
if (dlog != null) dlog.println("#include \"" + finalPath + "\""); //$NON-NLS-1$ //$NON-NLS-2$
|
if (dlog != null) dlog.println("#include \"" + finalPath + "\""); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
|
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename(), false );
|
||||||
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
|
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1676,7 +1732,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
}
|
}
|
||||||
if (reader != null) {
|
if (reader != null) {
|
||||||
if (dlog != null) dlog.println("#include <" + finalPath + ">"); //$NON-NLS-1$ //$NON-NLS-2$
|
if (dlog != null) dlog.println("#include <" + finalPath + ">"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename() );
|
IASTInclusion inclusion = getASTFactory().createInclusion( fileNameArray, reader.filename, local, startOffset, startingLineNumber, nameOffset, nameEndOffset, nameLine, endOffset, endLine, getCurrentFilename(), false );
|
||||||
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
|
pushContext(reader.buffer, new InclusionData( reader, inclusion ));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1817,7 +1873,7 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
if (usesVarArgInDefinition && definitions.get(name) instanceof FunctionStyleMacro && !((FunctionStyleMacro)definitions.get(name)).hasVarArgs())
|
if (usesVarArgInDefinition && definitions.get(name) instanceof FunctionStyleMacro && !((FunctionStyleMacro)definitions.get(name)).hasVarArgs())
|
||||||
handleProblem(IProblem.PREPROCESSOR_INVALID_VA_ARGS, varArgDefinitionInd, null);
|
handleProblem(IProblem.PREPROCESSOR_INVALID_VA_ARGS, varArgDefinitionInd, null);
|
||||||
|
|
||||||
callbackManager.pushCallback( getASTFactory().createMacro( name, startingOffset, startingLineNumber, idstart, idstart + idlen, nameLine, textstart + textlen, endingLine, getCurrentFilename() ) );
|
callbackManager.pushCallback( getASTFactory().createMacro( name, startingOffset, startingLineNumber, idstart, idstart + idlen, nameLine, textstart + textlen, endingLine, getCurrentFilename(), !isInitialized ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
private char[][] extractMacroParameters( int idstart, char[] name, boolean reportProblems ){
|
private char[][] extractMacroParameters( int idstart, char[] name, boolean reportProblems ){
|
||||||
|
|
Loading…
Add table
Reference in a new issue