diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/IScannerInfoPluginTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/IScannerInfoPluginTest.java new file mode 100644 index 00000000000..ffe30893972 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/IScannerInfoPluginTest.java @@ -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$ + } + +} diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java index 6c3e998b7f1..2650ccf2b00 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java @@ -48,6 +48,7 @@ public class ParserTestSuite extends TestCase { suite.addTestSuite( StructuralParseTest.class ); suite.addTestSuite( ObjectMapTest.class ); suite.addTest( CompleteParsePluginTest.suite() ); + suite.addTest( IScannerInfoPluginTest.suite() ); suite.addTest( ScannerParserLoopTest.suite() ); suite.addTest( GCCParserExtensionTestSuite.suite() ); return suite; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java index 3a6ca5698c8..767038fadbd 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java @@ -237,10 +237,15 @@ public class CModelBuilder { while (i.hasNext()){ IASTOffsetableElement offsetable = (IASTOffsetableElement)i.next(); if(offsetable instanceof IASTInclusion){ - createInclusion(translationUnit, (IASTInclusion) offsetable); + IASTInclusion inc = (IASTInclusion) offsetable; + if( ! inc.isImplicit() ) + createInclusion(translationUnit, inc ); } else if(offsetable instanceof IASTMacro){ - createMacro(translationUnit, (IASTMacro) offsetable); + + IASTMacro macro = (IASTMacro) offsetable; + if( ! macro.isImplicit() ) + createMacro(translationUnit, macro); }else if(offsetable instanceof IASTDeclaration){ try{ generateModelElements (translationUnit, (IASTDeclaration) offsetable); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ExtendedScannerInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ExtendedScannerInfo.java new file mode 100644 index 00000000000..e47781848fd --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ExtendedScannerInfo.java @@ -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 + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IExtendedScannerInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IExtendedScannerInfo.java new file mode 100644 index 00000000000..2d22b9fe5c0 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IExtendedScannerInfo.java @@ -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(); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java index c71549c2607..3237fb6d399 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java @@ -27,7 +27,7 @@ public interface IASTFactory char[] name, int startingOffset, 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( char[] name, @@ -35,7 +35,7 @@ public interface IASTFactory boolean local, int startingOffset, 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( IASTScope scope, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTInclusion.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTInclusion.java index 2368659919d..8a8286dd2cf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTInclusion.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTInclusion.java @@ -25,4 +25,5 @@ public interface IASTInclusion extends IASTOffsetableNamedElement, ISourceElemen public boolean isLocal(); + public boolean isImplicit(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTMacro.java index 6a1d1cc3527..ae2e8d89da4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTMacro.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTMacro.java @@ -17,6 +17,11 @@ import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; * */ public interface IASTMacro extends IASTOffsetableNamedElement, ISourceElementCallbackDelegate{ + + /** + * @return + */ + boolean isImplicit(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInclusion.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInclusion.java index 4ae24a65c19..750079aad16 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInclusion.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTInclusion.java @@ -19,7 +19,7 @@ import org.eclipse.cdt.core.parser.ast.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.fileName = fileName; @@ -29,6 +29,7 @@ public class ASTInclusion implements IASTInclusion { setNameEndOffsetAndLineNumber(nameEndOffset, nameLine); setEndingOffsetAndLineNumber(endOffset, endLine); this.filename = fn; + this.isImplicit = i; } private int nameEndOffset; @@ -183,6 +184,7 @@ public class ASTInclusion implements IASTInclusion { private int fileIndex; private final char[] filename; + private final boolean isImplicit; /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex() */ @@ -203,4 +205,10 @@ public class ASTInclusion implements IASTInclusion { public char[] getFilename() { return filename; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTInclusion#isImplicit() + */ + public boolean isImplicit() { + return isImplicit; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java index ebe967711ef..7682ea22078 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java @@ -24,7 +24,7 @@ public class ASTMacro implements IASTMacro { private final char[] name; 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; setStartingOffsetAndLineNumber(start, startLine); @@ -32,6 +32,7 @@ public class ASTMacro implements IASTMacro { setNameEndOffsetAndLineNumber(nameEnd, nameLine); setEndingOffsetAndLineNumber(end, endLine); this.fn = fn; + this.isImplicit = implicit; } private int startingOffset = 0, endingOffset = 0, nameOffset = 0; @@ -149,6 +150,7 @@ public class ASTMacro implements IASTMacro { private int fileIndex; + private final boolean isImplicit; /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getFileIndex() */ @@ -168,5 +170,11 @@ public class ASTMacro implements IASTMacro { public char[] getFilename() { return fn; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTMacro#isImplicit() + */ + public boolean isImplicit() { + return isImplicit; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java index 7bc6e1e8ee9..9f7aab05077 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java @@ -43,16 +43,16 @@ public class BaseASTFactory { /* (non-Javadoc) * @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) { - IASTMacro m = new ASTMacro( name, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, 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, isImplicit ); return m; } /* (non-Javadoc) * @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) { - IASTInclusion inclusion = new ASTInclusion( name, fileName, local, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine, 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, isImplicit ); return inclusion; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index e98eee26ba7..1e866e01992 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -21,6 +21,7 @@ import java.util.Map; import org.eclipse.cdt.core.parser.CodeReader; 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.IParserLogService; import org.eclipse.cdt.core.parser.IProblem; @@ -136,6 +137,9 @@ public class Scanner2 implements IScanner, IScannerData { private ParserMode parserMode; private List workingCopies; + + private Iterator preIncludeFiles = EmptyIterator.EMPTY_ITERATOR; + private boolean isInitialized = false; { // try { @@ -169,8 +173,6 @@ public class Scanner2 implements IScanner, IScannerData { if (reader.filename != null) fileCache.put(reader.filename, reader); - - pushContext(reader.buffer, reader); setupBuiltInMacros(); @@ -187,9 +189,45 @@ public class Scanner2 implements IScanner, IScannerData { } } } - 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) { @@ -280,15 +318,32 @@ public class Scanner2 implements IScanner, IScannerData { buffer.append( ((InclusionData)bufferData[bufferStackPos]).reader.filename ); log.traceLog( buffer.toString() ); } - callbackManager.pushCallback( ((InclusionData) bufferData[bufferStackPos]).inclusion ); } bufferData[bufferStackPos] = null; --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) * @see org.eclipse.cdt.core.parser.IScanner#addDefinition(java.lang.String, java.lang.String) */ @@ -361,6 +416,7 @@ public class Scanner2 implements IScanner, IScannerData { private static final char[] EMPTY_STRING_CHAR_ARRAY = new char[0]; private boolean isCancelled = false; + public synchronized void cancel() { isCancelled = true; @@ -1624,7 +1680,7 @@ public class Scanner2 implements IScanner, IScannerData { 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( inclusion ); } @@ -1648,7 +1704,7 @@ public class Scanner2 implements IScanner, IScannerData { } if (reader != null) { 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 )); return; } @@ -1676,7 +1732,7 @@ public class Scanner2 implements IScanner, IScannerData { } if (reader != null) { 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 )); return; } @@ -1817,7 +1873,7 @@ public class Scanner2 implements IScanner, IScannerData { if (usesVarArgInDefinition && definitions.get(name) instanceof FunctionStyleMacro && !((FunctionStyleMacro)definitions.get(name)).hasVarArgs()) 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 ){