Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser patch - bugfixes, lineNumbers, etc.

CORE
	Fixed bug36434 - Broken outline in winbase.h
	Partial Fix for bug36379 - The parser to set Line informations when
scanning.
	Fixed CModelManager to include header files with .H extension as C++
headers. 
	Fixed bug36448 - Parser fails for C programs containing C++ keywords
as identifiers

TESTS
	Added ScannerTestCase::testBug36434().
	Added ScannerTestCase::testMultipleLines(). 
	Added ParserTestSuite. 
	Added LineNumberTest.
	Updated CModelElementsTests to set the Nature of the C++ project
appropriately.

Note:  Unzip resources.zip into
org.eclipse.cdt.ui.tests\parser\org\eclipse\cdt\core\parser

JohnC

Index: dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java,v
retrieving revision 1.9
diff -u -r1.9 ClassSpecifier.java
--- dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java	11 Apr 2003 14:42:24 -0000	1.9
+++ dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java	15 Apr 2003 23:36:22 -0000
@@ -11,6 +11,7 @@
 	private AccessSpecifier access = new AccessSpecifier( AccessSpecifier.v_private );
 	private ClassKey key = new ClassKey();
 	private int startingOffset = 0, totalLength = 0;
+	private int topLine = 0, bottomLine = 0; 
 	private Token classKeyToken = null;
 
 	public int getClassKey() { return key.getClassKey(); }
@@ -96,6 +97,34 @@
 	 */
 	public void setClassKeyToken(Token classKeyToken) {
 		this.classKeyToken = classKeyToken;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() {
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
 	}
 
 }
Index: dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java,v
retrieving revision 1.22
diff -u -r1.22 DOMBuilder.java
--- dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	14 Apr 2003 14:14:50 -0000	1.22
+++ dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	15 Apr 2003 23:36:22 -0000
@@ -1,6 +1,7 @@
 package org.eclipse.cdt.internal.core.dom;
 
 
+import org.eclipse.cdt.internal.core.parser.IParser;
 import org.eclipse.cdt.internal.core.parser.IParserCallback;
 import org.eclipse.cdt.internal.core.parser.Token;
 
@@ -55,6 +56,7 @@
 		ClassSpecifier classSpecifier = new ClassSpecifier(kind, decl);
 		classSpecifier.setVisibility( visibility );
 		classSpecifier.setStartingOffset( classKey.getOffset() );
+		classSpecifier.setTopLine( parser.getLineNumberForOffset(classKey.getOffset()) );
 		classSpecifier.setClassKeyToken( classKey );
 		decl.setTypeSpecifier(classSpecifier);
 		return classSpecifier;
@@ -73,6 +75,7 @@
 	public void classSpecifierEnd(Object classSpecifier, Token closingBrace) {
 		ClassSpecifier c = (ClassSpecifier)classSpecifier;
 		c.setTotalLength( closingBrace.getOffset() + closingBrace.getLength() - c.getStartingOffset() );
+		c.setBottomLine( parser.getLineNumberForOffset(closingBrace.getOffset()) );
 	}
 
 	/**
@@ -158,7 +161,11 @@
 	 * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#inclusionBegin(java.lang.String)
 	 */
 	public void inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
-		translationUnit.addInclusion( new Inclusion( includeFile, offset, inclusionBeginOffset, offset - inclusionBeginOffset + includeFile.length() + 1 ) );
+		Inclusion inclusion = new Inclusion( includeFile, offset, inclusionBeginOffset, offset - inclusionBeginOffset + includeFile.length() + 1 );
+		int lineNo = parser.getLineNumberForOffset(offset);
+		inclusion.setTopLine(lineNo);
+		inclusion.setBottomLine( lineNo ); 
+		translationUnit.addInclusion( inclusion );
 	}
 
 	/**
@@ -171,7 +178,10 @@
 	 * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#macro(java.lang.String)
 	 */
 	public void macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
-		translationUnit.addMacro( new Macro(  macroName, offset, macroBeginOffset, macroEndOffset - macroBeginOffset));
+		Macro macro = new Macro(  macroName, offset, macroBeginOffset, macroEndOffset - macroBeginOffset);
+		macro.setTopLine( parser.getLineNumberForOffset(macroBeginOffset));
+		macro.setBottomLine( parser.getLineNumberForOffset(macroEndOffset)); 	
+		translationUnit.addMacro( macro );
 	}
 
 	/**
@@ -182,6 +192,7 @@
 		if( container instanceof IAccessable )
 			decl.setAccessSpecifier(new AccessSpecifier( ((IAccessable)container).getVisibility() ));
 		((IOffsetable)decl).setStartingOffset( firstToken.getOffset() );
+		((IOffsetable)decl).setTopLine( parser.getLineNumberForOffset(firstToken.getOffset()) );
 		return decl;
 	}
 
@@ -191,11 +202,8 @@
 	public void simpleDeclarationEnd(Object declaration, Token lastToken) {
 		SimpleDeclaration decl = (SimpleDeclaration)declaration;
 		IOffsetable offsetable = (IOffsetable)decl;
-		// TODO Kludge solve me!
-		if( lastToken != null )
-			offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset());
-		else
-			offsetable.setTotalLength( 0 );
+		offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset());
+		offsetable.setBottomLine( parser.getLineNumberForOffset(lastToken.getOffset() ) );	
 		decl.getOwnerScope().addDeclaration(decl);
 	}
 
@@ -511,6 +519,7 @@
 		NamespaceDefinition namespaceDef = new NamespaceDefinition(ownerScope);
 		namespaceDef.setStartToken(namespace);
 		((IOffsetable)namespaceDef).setStartingOffset( namespace.getOffset() );
+		((IOffsetable)namespaceDef).setTopLine( parser.getLineNumberForOffset(namespace.getOffset()) );
 		return namespaceDef;
 		
 	}
@@ -535,6 +544,7 @@
 	public void namespaceDefinitionEnd(Object namespace, Token closingBrace) {
 		NamespaceDefinition ns = (NamespaceDefinition)namespace; 
 		ns.setTotalLength( closingBrace.getOffset() + closingBrace.getLength() - ns.getStartingOffset() );
+		ns.setBottomLine( parser.getLineNumberForOffset(closingBrace.getOffset()));
 		ns.getOwnerScope().addDeclaration(ns);
 	}
 
@@ -626,7 +636,8 @@
 		EnumerationSpecifier es = new EnumerationSpecifier( decl );
 		es.setStartToken(enumKey);
 		decl.setTypeSpecifier(es);
-		((IOffsetable)es).setStartingOffset( enumKey.getOffset() ); 
+		((IOffsetable)es).setStartingOffset( enumKey.getOffset() );
+		((IOffsetable)es).setStartingOffset( parser.getLineNumberForOffset(enumKey.getOffset()) );
 		return es;
 	}
 
@@ -652,6 +663,7 @@
 	public void enumSpecifierEnd(Object enumSpec, Token closingBrace) {
 		IOffsetable offsetable = (IOffsetable)enumSpec;
 		offsetable.setTotalLength( closingBrace.getOffset() + closingBrace.getLength() - offsetable.getStartingOffset());
+		offsetable.setBottomLine( parser.getLineNumberForOffset(closingBrace.getOffset()) );
 	}
 
 	/* (non-Javadoc)
@@ -671,6 +683,7 @@
 		EnumeratorDefinition definition = (EnumeratorDefinition)enumDefn;
 		definition.setName( currName );
 		((IOffsetable)enumDefn).setStartingOffset( currName.getStartOffset() );
+		((IOffsetable)enumDefn).setTopLine(parser.getLineNumberForOffset(currName.getStartOffset()));
 	}
 
 	/* (non-Javadoc)
@@ -679,6 +692,7 @@
 	public void enumeratorEnd(Object enumDefn, Token lastToken) {
 		IOffsetable offsetable = (IOffsetable)enumDefn;
 		offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset());
+		offsetable.setBottomLine(parser.getLineNumberForOffset(lastToken.getOffset() ));
 	}
 
 	/* (non-Javadoc)
@@ -799,6 +813,7 @@
 	 */
 	public Object templateDeclarationBegin(Object container, Token exported) {
 		TemplateDeclaration d = new TemplateDeclaration( (IScope)container, exported );
+		d.setTopLine( parser.getLineNumberForOffset(exported.getOffset()) );
 		if( container instanceof IAccessable )
 			d.setVisibility( ((IAccessable)container).getVisibility() );
 		return d;
@@ -817,6 +832,7 @@
 	public void templateDeclarationEnd(Object templateDecl, Token lastToken) {
 		TemplateDeclaration decl = (TemplateDeclaration)templateDecl;
 		decl.setLastToken(lastToken);
+		decl.setBottomLine( parser.getLineNumberForOffset(lastToken.getOffset()) );
 		decl.getOwnerScope().addDeclaration(decl);
 	}
 
@@ -895,4 +911,13 @@
 	 */
 	public void templateParameterListEnd(Object parameterList) {
 	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#setParser(org.eclipse.cdt.internal.core.parser.IParser)
+	 */
+	public void setParser(IParser parser) {
+		this.parser = parser;
+	}
+	
+	private IParser parser = null; 
 }
Index: dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java,v
retrieving revision 1.6
diff -u -r1.6 EnumerationSpecifier.java
--- dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java	9 Apr 2003 21:11:59 -0000	1.6
+++ dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java	15 Apr 2003 23:36:22 -0000
@@ -105,4 +105,36 @@
 		this.startToken = startToken;
 	}
 
+	private int topLine = 0, bottomLine = 0; 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() {
+		return topLine;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+
 }
Index: dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java,v
retrieving revision 1.4
diff -u -r1.4 EnumeratorDefinition.java
--- dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java	9 Apr 2003 21:11:59 -0000	1.4
+++ dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java	15 Apr 2003 23:36:22 -0000
@@ -80,4 +80,34 @@
 		totalLength = i;
 	}
 
+	int bottomLine = 0, topLine = 0; 
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() {
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+
 }
Index: dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java,v
retrieving revision 1.1
diff -u -r1.1 IOffsetable.java
--- dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java	8 Apr 2003 21:30:53 -0000	1.1
+++ dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java	15 Apr 2003 23:36:22 -0000
@@ -35,4 +35,10 @@
 	 * @param i
 	 */
 	public abstract void setTotalLength(int i);
+	
+	public abstract void setTopLine( int lineNumber );
+	public abstract void setBottomLine( int lineNumber );
+	public abstract int  getTopLine();
+	public abstract int  getBottomLine(); 
+	
 }
Index: dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java,v
retrieving revision 1.6
diff -u -r1.6 NamespaceDefinition.java
--- dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java	13 Apr 2003 22:01:29 -0000	1.6
+++ dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java	15 Apr 2003 23:36:22 -0000
@@ -109,4 +109,32 @@
 		this.startToken = startToken;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() { 
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+	private int topLine = 0, bottomLine = 0; 
 }
Index: dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java,v
retrieving revision 1.2
diff -u -r1.2 PreprocessorStatement.java
--- dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java	8 Apr 2003 21:30:53 -0000	1.2
+++ dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java	15 Apr 2003 23:36:22 -0000
@@ -75,4 +75,33 @@
 		totalLength = i;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() { 
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+	private int topLine = 0, bottomLine = 0; 
+
 }
Index: dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java,v
retrieving revision 1.9
diff -u -r1.9 SimpleDeclaration.java
--- dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java	14 Apr 2003 14:14:50 -0000	1.9
+++ dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java	15 Apr 2003 23:36:22 -0000
@@ -114,4 +114,33 @@
 		totalLength = i;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() { 
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+	private int topLine = 0, bottomLine = 0; 
+
 }
Index: dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java,v
retrieving revision 1.5
diff -u -r1.5 TemplateDeclaration.java
--- dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java	13 Apr 2003 22:01:29 -0000	1.5
+++ dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java	15 Apr 2003 23:36:22 -0000
@@ -144,4 +144,34 @@
 		else this.visibility.setAccess(visibility);
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setTopLine(int)
+	 */
+	public void setTopLine(int lineNumber) {
+		topLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#setBottomLine(int)
+	 */
+	public void setBottomLine(int lineNumber) {
+		bottomLine = lineNumber;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getTopLine()
+	 */
+	public int getTopLine() { 
+		return topLine;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IOffsetable#getBottomLine()
+	 */
+	public int getBottomLine() {
+		return bottomLine;
+	}
+	private int topLine = 0, bottomLine = 0; 
+
+
 }
Index: model/org/eclipse/cdt/internal/core/model/CModelManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java,v
retrieving revision 1.22
diff -u -r1.22 CModelManager.java
--- model/org/eclipse/cdt/internal/core/model/CModelManager.java	12 Apr 2003 14:04:10 -0000	1.22
+++ model/org/eclipse/cdt/internal/core/model/CModelManager.java	15 Apr 2003 23:36:23 -0000
@@ -101,7 +101,7 @@
 
 	public static final String [] sourceExtensions = {"c", "cxx", "cc", "C", "cpp"};
 
-	public static final String [] headerExtensions = {"h", "hh", "hpp"};
+	public static final String [] headerExtensions = {"h", "hh", "hpp", "H"};
 
 	static CModelManager factory = null;
 	
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.30
diff -u -r1.30 ChangeLog
--- parser/ChangeLog	15 Apr 2003 18:40:07 -0000	1.30
+++ parser/ChangeLog	15 Apr 2003 23:36:23 -0000
@@ -1,3 +1,9 @@
+2003-04-15 John Camelon
+	Fixed bug36434 - Broken outline in winbase.h
+	Partial Fix for bug36379 - The parser to set Line informations when scanning.
+	Fixed CModelManager to include header files with .H extension as C++ headers. 
+	Fixed bug36448 - Parser fails for C programs containing C++ keywords as identifiers
+
 2003-04-15 Andrew Niefer
 	Added scanner support to fix Bug36047
 
Index: parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java,v
retrieving revision 1.11
diff -u -r1.11 CModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java	15 Apr 2003 18:37:32 -0000	1.11
+++ parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java	15 Apr 2003 23:36:23 -0000
@@ -46,6 +46,7 @@
 import org.eclipse.cdt.internal.core.dom.TemplateParameter;
 import org.eclipse.cdt.internal.core.dom.TranslationUnit;
 import org.eclipse.cdt.internal.core.dom.TypeSpecifier;
+import org.eclipse.cdt.internal.core.parser.IParser;
 import org.eclipse.cdt.internal.core.parser.Parser;
 import org.eclipse.core.resources.IProject;
 
@@ -62,14 +63,22 @@
 	public Map parse() throws Exception {
 		DOMBuilder domBuilder = new DOMBuilder();
 		String code = translationUnit.getBuffer().getContents();
-		Parser parser = new Parser(code, domBuilder, true);
+		IParser parser = new Parser(code, domBuilder, true);
 		if( translationUnit.getCProject() != null )
 		{
 			IProject currentProject = translationUnit.getCProject().getProject();
 			boolean hasCppNature = CoreModel.getDefault().hasCCNature(currentProject);
 			parser.setCppNature(hasCppNature);
 		}
-		parser.parse();
+		try
+		{
+			parser.parse();
+		}
+		catch( Exception e )
+		{
+			System.out.println( "Parse Exception in Outline View" ); 
+			e.printStackTrace();
+		}
 		long startTime = System.currentTimeMillis(); 
 		generateModelElements(domBuilder.getTranslationUnit());
 		System.out.println("CModel build: "+ ( System.currentTimeMillis() - startTime ) + "ms" );
Index: parser/org/eclipse/cdt/internal/core/parser/ContextStack.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextStack.java,v
retrieving revision 1.1
diff -u -r1.1 ContextStack.java
--- parser/org/eclipse/cdt/internal/core/parser/ContextStack.java	11 Apr 2003 21:20:14 -0000	1.1
+++ parser/org/eclipse/cdt/internal/core/parser/ContextStack.java	15 Apr 2003 23:36:23 -0000
@@ -51,7 +51,9 @@
 		if( currentContext != null )
 			contextStack.push(currentContext);
 		
-		currentContext = context;		
+		currentContext = context;
+		if( context.getKind() == IScannerContext.TOP )
+			topContext = context;
 	}
 	
 	public boolean rollbackContext() {
@@ -118,13 +120,35 @@
 		return currentContext;
 	}
 	
-	private IScannerContext currentContext;
-	
+	private IScannerContext currentContext, topContext;
 	private Stack contextStack = new Stack();
 	private LinkedList undoStack = new LinkedList();
-	
-	
 	private Set inclusions = new HashSet(); 
 	private Set defines = new HashSet();
+	private OffsetMapping offsetLineMap = new OffsetMapping(); 
+	
+	/**
+	 * @return
+	 */
+	public IScannerContext getTopContext() {
+		return topContext;
+	}
+	
+	public int mapOffsetToLineNumber( int offset )
+	{
+		return offsetLineMap.getLineNo(offset);
+	}
 	
+	public void newLine()
+	{
+		if( currentContext == topContext )
+			offsetLineMap.newLine( topContext.getOffset() );
+	}
+
+	public void recantNewline()
+	{
+		if( currentContext == topContext )
+			offsetLineMap.recantLastNewLine();
+		
+	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java,v
retrieving revision 1.19
diff -u -r1.19 ExpressionEvaluator.java
--- parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java	14 Apr 2003 14:14:50 -0000	1.19
+++ parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java	15 Apr 2003 23:36:23 -0000
@@ -693,4 +693,10 @@
 	 */
 	public void templateParameterListEnd(Object parameterList) {
 	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#setParser(org.eclipse.cdt.internal.core.parser.IParser)
+	 */
+	public void setParser(IParser parser) {
+	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/IParser.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/IParser.java
diff -N parser/org/eclipse/cdt/internal/core/parser/IParser.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/internal/core/parser/IParser.java	15 Apr 2003 23:36:23 -0000
@@ -0,0 +1,29 @@
+/*
+ * Created on Apr 14, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.cdt.internal.core.parser;
+
+import org.eclipse.cdt.internal.core.parser.Parser.Backtrack;
+
+/**
+ * @author jcamelon
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public interface IParser {
+	public abstract boolean parse() throws Backtrack;
+	public abstract void expression(Object expression) throws Backtrack;
+	/**
+	 * @return
+	 */
+	public abstract boolean isCppNature();
+	/**
+	 * @param b
+	 */
+	public abstract void setCppNature(boolean b);
+	public abstract int getLineNumberForOffset(int offset);
+}
\ No newline at end of file
Index: parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java,v
retrieving revision 1.18
diff -u -r1.18 IParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java	14 Apr 2003 14:14:50 -0000	1.18
+++ parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java	15 Apr 2003 23:36:23 -0000
@@ -12,6 +12,8 @@
 
 public interface IParserCallback {
 
+	public void setParser( IParser parser );
+	
 	public Object translationUnitBegin();
 	public void translationUnitEnd(Object unit);
 	
Index: parser/org/eclipse/cdt/internal/core/parser/IScanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IScanner.java,v
retrieving revision 1.5
diff -u -r1.5 IScanner.java
--- parser/org/eclipse/cdt/internal/core/parser/IScanner.java	15 Apr 2003 18:40:07 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/IScanner.java	15 Apr 2003 23:36:23 -0000
@@ -28,7 +28,8 @@
 	public void overwriteIncludePath( List newIncludePaths );
 	
 	public Token nextToken() throws ScannerException, Parser.EndOfFile;
-	 
+	public int getLineNumberForOffset(int offset); 
+	public void setCppNature( boolean value );
 	public void setQuickScan(boolean qs);
 	public void setCallback(IParserCallback c);
 }
Index: parser/org/eclipse/cdt/internal/core/parser/IScannerContext.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IScannerContext.java,v
retrieving revision 1.3
diff -u -r1.3 IScannerContext.java
--- parser/org/eclipse/cdt/internal/core/parser/IScannerContext.java	11 Mar 2003 02:42:47 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/IScannerContext.java	15 Apr 2003 23:36:23 -0000
@@ -28,7 +28,6 @@
 	int popUndo();
 	void pushUndo(int undo);
 	
-	
 	int getKind(); 
 	void setKind( int kind ); 
 }
Index: parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java,v
retrieving revision 1.18
diff -u -r1.18 NullParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java	14 Apr 2003 14:14:50 -0000	1.18
+++ parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java	15 Apr 2003 23:36:23 -0000
@@ -608,4 +608,10 @@
 	public void templateParameterListEnd(Object parameterList) {
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#setParser(org.eclipse.cdt.internal.core.parser.IParser)
+	 */
+	public void setParser(IParser parser) {
+	}
+
 }
Index: parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
diff -N parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java	15 Apr 2003 23:36:23 -0000
@@ -0,0 +1,75 @@
+/**********************************************************************
+ * Copyright (c) 2002,2003 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.internal.core.parser;
+
+import java.util.Iterator;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+
+
+/**
+ * @author jcamelon
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class OffsetMapping  {
+
+	public OffsetMapping()
+	{
+	}
+	
+	public void newLine( int offset )
+	{
+		lastOffset = offset;
+		store.put( new Integer( offset ), new Integer( ++lineCounter ) );
+	}
+	
+	public void recantLastNewLine()
+	{
+		if( store.remove( new Integer( lastOffset ) ) != null ) 
+		{
+			--lineCounter;
+			lastOffset = -1;
+		}
+	}
+	
+	public int getLineNo( int offset )
+	{
+		Iterator iter = store.keySet().iterator();
+		int first = -1, second = -1; 
+		if( ! iter.hasNext() ) return 1; 
+		first = ((Integer)iter.next()).intValue();
+		if( ( offset <= first ) ||  ! iter.hasNext() ) 
+			return ((Integer)store.get( new Integer( first ))).intValue();
+
+		while( true )
+		{
+			second = ((Integer)iter.next()).intValue();
+			if( offset > first && offset <= second )
+				return ((Integer)store.get( new Integer( second ))).intValue();
+			if( ! iter.hasNext() ) break;
+			first = second; 
+		}
+		
+		return lineCounter;
+	}
+	
+	public int getCurrentLineNumber()
+	{
+		return lineCounter;
+	}
+	
+	private int lineCounter = 1;
+	private int lastOffset = -1;  
+	private SortedMap store = new TreeMap();
+}
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.30
diff -u -r1.30 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	14 Apr 2003 16:00:18 -0000	1.30
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	15 Apr 2003 23:36:24 -0000
@@ -17,13 +17,18 @@
 import java.util.HashMap;
 import java.util.Map;
 
-public class Parser {
+public class Parser implements IParser {
 
 	private IParserCallback callback;
 	private boolean quickParse = false;
 	private boolean parsePassed = true;
 	private boolean cppNature = true;
 	
+	protected void failParse()
+	{
+		parsePassed = false;
+	}
+	
 	// TO DO: convert to a real symbol table
 	private Map currRegion = new HashMap();
 	
@@ -83,6 +88,7 @@
 	 * 
 	 */
 	protected void translationUnit() throws Backtrack {
+		try { callback.setParser( this ); } catch( Exception e) {}
 		Object translationUnit = null;
 		try{ translationUnit = callback.translationUnitBegin();} catch( Exception e ) {}
 		Token lastBacktrack = null;
@@ -98,7 +104,7 @@
 				break;
 			} catch (Backtrack b) {
 				// Mark as failure and try to reach a recovery point
-				parsePassed = false;
+				failParse(); 
 				
 				if (lastBacktrack != null && lastBacktrack == LA(1)) {
 					// we haven't progressed from the last backtrack
@@ -109,12 +115,16 @@
 					lastBacktrack = LA(1);
 				}
 			}
+			catch( Exception e )
+			{
+				failParse(); 
+			}
 		}
 		try{ callback.translationUnitEnd(translationUnit);} catch( Exception e ) {}
 	}
 
 	protected void consumeToNextSemicolon() throws EndOfFile {
-		parsePassed = false;
+		failParse();
 		consume();
 		// TODO - we should really check for matching braces too
 		while (LT(1) != Token.tSEMI) {
@@ -2252,6 +2262,12 @@
 	 */
 	public void setCppNature(boolean b) {
 		cppNature = b;
+		if( scanner != null )
+			scanner.setCppNature( b ); 
 	}
 
+	public int getLineNumberForOffset(int offset)
+	{
+		return scanner.getLineNumberForOffset(offset);
+	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/Scanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java,v
retrieving revision 1.20
diff -u -r1.20 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java	15 Apr 2003 18:40:07 -0000	1.20
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java	15 Apr 2003 23:36:24 -0000
@@ -295,7 +295,8 @@
 	private StringBuffer storageBuffer = null; 
 	
 	private int count = 0;
-	private static HashMap keywords = new HashMap();
+	private static HashMap cppKeywords = new HashMap();
+	private static HashMap cKeywords = new HashMap(); 
 	private static HashMap ppDirectives = new HashMap();
 
 	private Token currentToken = null;
@@ -378,18 +379,30 @@
 				if (c == '\r') {
 					c = getChar(false);
 					if (c == '\n')
+					{
 						c = getChar(false);
+					}
 				} else if (c == '\n')
+				{
+					contextStack.newLine();
 					c = getChar(false);
+					if( c == '\n')
+						contextStack.newLine(); 
+				}
 			}
+			else if( c == '\n' )
+				contextStack.newLine();
+
 		}
+		else if( c == '\n' )
+			contextStack.newLine();
+			
 		return c;
 	}
 
 	private void ungetChar(int c) throws ScannerException{
-		// Should really check whether there already is a char there
-		// If so, we should be using a buffer, instead of a single char
 		contextStack.getCurrentContext().pushUndo(c);
+		if( c == '\n' ) contextStack.recantNewline();
 		contextStack.undoRollback( lastContext );
 	}
 
@@ -544,7 +557,13 @@
 					}
 				}
 
-				Object tokenTypeObject = keywords.get(ident);
+				Object tokenTypeObject;
+				
+				if( cppNature )
+				 	tokenTypeObject = cppKeywords.get(ident);
+				else
+					tokenTypeObject = cKeywords.get(ident);
+					
 				int tokenType = Token.tIDENTIFIER;
 				if (tokenTypeObject != null)
 					tokenType = ((Integer) tokenTypeObject).intValue();
@@ -1241,85 +1260,83 @@
 	}
 
 	static {
-		keywords.put("and", new Integer(Token.t_and));
-		keywords.put("and_eq", new Integer(Token.t_and_eq));
-		keywords.put("asm", new Integer(Token.t_asm));
-		keywords.put("auto", new Integer(Token.t_auto));
-		keywords.put("bitand", new Integer(Token.t_bitand));
-		keywords.put("bitor", new Integer(Token.t_bitor));
-		keywords.put("bool", new Integer(Token.t_bool));
-		keywords.put("break", new Integer(Token.t_break));
-		keywords.put("case", new Integer(Token.t_case));
-		keywords.put("catch", new Integer(Token.t_catch));
-		keywords.put("char", new Integer(Token.t_char));
-		keywords.put("class", new Integer(Token.t_class));
-		keywords.put("compl", new Integer(Token.t_compl));
-		keywords.put("const", new Integer(Token.t_const));
-		keywords.put("const_cast", new Integer(Token.t_const_cast));
-		keywords.put("continue", new Integer(Token.t_continue));
-		keywords.put("default", new Integer(Token.t_default));
-		keywords.put("delete", new Integer(Token.t_delete));
-		keywords.put("do", new Integer(Token.t_do));
-		keywords.put("double", new Integer(Token.t_double));
-		keywords.put("dynamic_cast", new Integer(Token.t_dynamic_cast));
-		keywords.put("else", new Integer(Token.t_else));
-		keywords.put("enum", new Integer(Token.t_enum));
-		keywords.put("explicit", new Integer(Token.t_explicit));
-		keywords.put("export", new Integer(Token.t_export));
-		keywords.put("extern", new Integer(Token.t_extern));
-		keywords.put("false", new Integer(Token.t_false));
-		keywords.put("float", new Integer(Token.t_float));
-		keywords.put("for", new Integer(Token.t_for));
-		keywords.put("friend", new Integer(Token.t_friend));
-		keywords.put("goto", new Integer(Token.t_goto));
-		keywords.put("if", new Integer(Token.t_if));
-		keywords.put("inline", new Integer(Token.t_inline));
-		keywords.put("int", new Integer(Token.t_int));
-		keywords.put("long", new Integer(Token.t_long));
-		keywords.put("mutable", new Integer(Token.t_mutable));
-		keywords.put("namespace", new Integer(Token.t_namespace));
-		keywords.put("new", new Integer(Token.t_new));
-		keywords.put("not", new Integer(Token.t_not));
-		keywords.put("not_eq", new Integer(Token.t_not_eq));
-		keywords.put("operator", new Integer(Token.t_operator));
-		keywords.put("or", new Integer(Token.t_or));
-		keywords.put("or_eq", new Integer(Token.t_or_eq));
-		keywords.put("private", new Integer(Token.t_private));
-		keywords.put("protected", new Integer(Token.t_protected));
-		keywords.put("public", new Integer(Token.t_public));
-		keywords.put("register", new Integer(Token.t_register));
-		keywords.put("reinterpret_cast", new Integer(Token.t_reinterpret_cast));
-		keywords.put("return", new Integer(Token.t_return));
-		keywords.put("short", new Integer(Token.t_short));
-		keywords.put("signed", new Integer(Token.t_signed));
-		keywords.put("sizeof", new Integer(Token.t_sizeof));
-		keywords.put("static", new Integer(Token.t_static));
-		keywords.put("static_cast", new Integer(Token.t_static_cast));
-		keywords.put("struct", new Integer(Token.t_struct));
-		keywords.put("switch", new Integer(Token.t_switch));
-		keywords.put("template", new Integer(Token.t_template));
-		keywords.put("this", new Integer(Token.t_this));
-		keywords.put("throw", new Integer(Token.t_throw));
-		keywords.put("true", new Integer(Token.t_true));
-		keywords.put("try", new Integer(Token.t_try));
-		keywords.put("typedef", new Integer(Token.t_typedef));
-		keywords.put("typeid", new Integer(Token.t_typeid));
-		keywords.put("typename", new Integer(Token.t_typename));
-		keywords.put("union", new Integer(Token.t_union));
-		keywords.put("unsigned", new Integer(Token.t_unsigned));
-		keywords.put("using", new Integer(Token.t_using));
-		keywords.put("virtual", new Integer(Token.t_virtual));
-		keywords.put("void", new Integer(Token.t_void));
-		keywords.put("volatile", new Integer(Token.t_volatile));
-		keywords.put("wchar_t", new Integer(Token.t_wchar_t));
-		keywords.put("while", new Integer(Token.t_while));
-		keywords.put("xor", new Integer(Token.t_xor));
-		keywords.put("xor_eq", new Integer(Token.t_xor_eq));
+		cppKeywords.put("and", new Integer(Token.t_and));
+		cppKeywords.put("and_eq", new Integer(Token.t_and_eq));
+		cppKeywords.put("asm", new Integer(Token.t_asm));
+		cppKeywords.put("auto", new Integer(Token.t_auto));
+		cppKeywords.put("bitand", new Integer(Token.t_bitand));
+		cppKeywords.put("bitor", new Integer(Token.t_bitor));
+		cppKeywords.put("bool", new Integer(Token.t_bool));
+		cppKeywords.put("break", new Integer(Token.t_break));
+		cppKeywords.put("case", new Integer(Token.t_case));
+		cppKeywords.put("catch", new Integer(Token.t_catch));
+		cppKeywords.put("char", new Integer(Token.t_char));
+		cppKeywords.put("class", new Integer(Token.t_class));
+		cppKeywords.put("compl", new Integer(Token.t_compl));
+		cppKeywords.put("const", new Integer(Token.t_const));
+		cppKeywords.put("const_cast", new Integer(Token.t_const_cast));
+		cppKeywords.put("continue", new Integer(Token.t_continue));
+		cppKeywords.put("default", new Integer(Token.t_default));
+		cppKeywords.put("delete", new Integer(Token.t_delete));
+		cppKeywords.put("do", new Integer(Token.t_do));
+		cppKeywords.put("double", new Integer(Token.t_double));
+		cppKeywords.put("dynamic_cast", new Integer(Token.t_dynamic_cast));
+		cppKeywords.put("else", new Integer(Token.t_else));
+		cppKeywords.put("enum", new Integer(Token.t_enum));
+		cppKeywords.put("explicit", new Integer(Token.t_explicit));
+		cppKeywords.put("export", new Integer(Token.t_export));
+		cppKeywords.put("extern", new Integer(Token.t_extern));
+		cppKeywords.put("false", new Integer(Token.t_false));
+		cppKeywords.put("float", new Integer(Token.t_float));
+		cppKeywords.put("for", new Integer(Token.t_for));
+		cppKeywords.put("friend", new Integer(Token.t_friend));
+		cppKeywords.put("goto", new Integer(Token.t_goto));
+		cppKeywords.put("if", new Integer(Token.t_if));
+		cppKeywords.put("inline", new Integer(Token.t_inline));
+		cppKeywords.put("int", new Integer(Token.t_int));
+		cppKeywords.put("long", new Integer(Token.t_long));
+		cppKeywords.put("mutable", new Integer(Token.t_mutable));
+		cppKeywords.put("namespace", new Integer(Token.t_namespace));
+		cppKeywords.put("new", new Integer(Token.t_new));
+		cppKeywords.put("not", new Integer(Token.t_not));
+		cppKeywords.put("not_eq", new Integer(Token.t_not_eq));
+		cppKeywords.put("operator", new Integer(Token.t_operator));
+		cppKeywords.put("or", new Integer(Token.t_or));
+		cppKeywords.put("or_eq", new Integer(Token.t_or_eq));
+		cppKeywords.put("private", new Integer(Token.t_private));
+		cppKeywords.put("protected", new Integer(Token.t_protected));
+		cppKeywords.put("public", new Integer(Token.t_public));
+		cppKeywords.put("register", new Integer(Token.t_register));
+		cppKeywords.put("reinterpret_cast", new Integer(Token.t_reinterpret_cast));
+		cppKeywords.put("return", new Integer(Token.t_return));
+		cppKeywords.put("short", new Integer(Token.t_short));
+		cppKeywords.put("signed", new Integer(Token.t_signed));
+		cppKeywords.put("sizeof", new Integer(Token.t_sizeof));
+		cppKeywords.put("static", new Integer(Token.t_static));
+		cppKeywords.put("static_cast", new Integer(Token.t_static_cast));
+		cppKeywords.put("struct", new Integer(Token.t_struct));
+		cppKeywords.put("switch", new Integer(Token.t_switch));
+		cppKeywords.put("template", new Integer(Token.t_template));
+		cppKeywords.put("this", new Integer(Token.t_this));
+		cppKeywords.put("throw", new Integer(Token.t_throw));
+		cppKeywords.put("true", new Integer(Token.t_true));
+		cppKeywords.put("try", new Integer(Token.t_try));
+		cppKeywords.put("typedef", new Integer(Token.t_typedef));
+		cppKeywords.put("typeid", new Integer(Token.t_typeid));
+		cppKeywords.put("typename", new Integer(Token.t_typename));
+		cppKeywords.put("union", new Integer(Token.t_union));
+		cppKeywords.put("unsigned", new Integer(Token.t_unsigned));
+		cppKeywords.put("using", new Integer(Token.t_using));
+		cppKeywords.put("virtual", new Integer(Token.t_virtual));
+		cppKeywords.put("void", new Integer(Token.t_void));
+		cppKeywords.put("volatile", new Integer(Token.t_volatile));
+		cppKeywords.put("wchar_t", new Integer(Token.t_wchar_t));
+		cppKeywords.put("while", new Integer(Token.t_while));
+		cppKeywords.put("xor", new Integer(Token.t_xor));
+		cppKeywords.put("xor_eq", new Integer(Token.t_xor_eq));
 
 		ppDirectives.put("#define", new Integer(PreprocessorDirectives.DEFINE));
-		ppDirectives.put(
-			"#undef",
-			new Integer(PreprocessorDirectives.UNDEFINE));
+		ppDirectives.put("#undef",new Integer(PreprocessorDirectives.UNDEFINE));
 		ppDirectives.put("#if", new Integer(PreprocessorDirectives.IF));
 		ppDirectives.put("#ifdef", new Integer(PreprocessorDirectives.IFDEF));
 		ppDirectives.put("#ifndef", new Integer(PreprocessorDirectives.IFNDEF));
@@ -1334,6 +1351,45 @@
 		ppDirectives.put("#elif", new Integer(PreprocessorDirectives.ELIF));
 		ppDirectives.put("#", new Integer(PreprocessorDirectives.BLANK));
 
+		cKeywords.put("auto", new Integer(Token.t_auto));
+		cKeywords.put("break", new Integer(Token.t_break));
+		cKeywords.put("case", new Integer(Token.t_case));
+		cKeywords.put("char", new Integer(Token.t_char));
+		cKeywords.put("const", new Integer(Token.t_const));
+		cKeywords.put("continue", new Integer(Token.t_continue));
+		cKeywords.put("default", new Integer(Token.t_default));
+		cKeywords.put("delete", new Integer(Token.t_delete));
+		cKeywords.put("do", new Integer(Token.t_do));
+		cKeywords.put("double", new Integer(Token.t_double));
+		cKeywords.put("else", new Integer(Token.t_else));
+		cKeywords.put("enum", new Integer(Token.t_enum));
+		cKeywords.put("extern", new Integer(Token.t_extern));
+		cKeywords.put("float", new Integer(Token.t_float));
+		cKeywords.put("for", new Integer(Token.t_for));
+		cKeywords.put("goto", new Integer(Token.t_goto));
+		cKeywords.put("if", new Integer(Token.t_if));
+		cKeywords.put("inline", new Integer(Token.t_inline));
+		cKeywords.put("int", new Integer(Token.t_int));
+		cKeywords.put("long", new Integer(Token.t_long));
+		cKeywords.put("register", new Integer(Token.t_register));
+		cKeywords.put("restrict", new Integer(Token.t_restrict));
+		cKeywords.put("return", new Integer(Token.t_return));
+		cKeywords.put("short", new Integer(Token.t_short));
+		cKeywords.put("signed", new Integer(Token.t_signed));
+		cKeywords.put("sizeof", new Integer(Token.t_sizeof));
+		cKeywords.put("static", new Integer(Token.t_static));
+		cKeywords.put("struct", new Integer(Token.t_struct));
+		cKeywords.put("switch", new Integer(Token.t_switch));
+		cKeywords.put("typedef", new Integer(Token.t_typedef));
+		cKeywords.put("union", new Integer(Token.t_union));
+		cKeywords.put("unsigned", new Integer(Token.t_unsigned));
+		cKeywords.put("void", new Integer(Token.t_void));
+		cKeywords.put("volatile", new Integer(Token.t_volatile));
+		cKeywords.put("while", new Integer(Token.t_while));
+		cKeywords.put("_Bool", new Integer(Token.t__Bool));
+		cKeywords.put("_Complex", new Integer(Token.t__Complex));
+		cKeywords.put("_Imaginary", new Integer(Token.t__Imaginary));
+
 	}
 
 	static public class PreprocessorDirectives {
@@ -1380,7 +1436,7 @@
 						new StringReader(expression + ";"),
 						EXPRESSION,
 						definitions);
-				Parser parser = new Parser(trial, evaluator);
+				IParser parser = new Parser(trial, evaluator);
 				parser.expression(null); 
 				
 				expressionEvalResult = evaluator.getResult();
@@ -1541,35 +1597,41 @@
 
 			ArrayList macroReplacementTokens = new ArrayList();
 			String replacementString = getRestOfPreprocessorLine();
-			Scanner helperScanner = new Scanner();
-			helperScanner.initialize(
-				new StringReader(replacementString),
-				null);
-			helperScanner.setTokenizingMacroReplacementList( true );
-			Token t = helperScanner.nextToken(false);
-
-			try {
-				while (true) {
-					//each # preprocessing token in the replacement list shall be followed
-					//by a parameter as the next reprocessing token in the list
-					if( t.type == tPOUND ){
-						macroReplacementTokens.add( t );
-						t = helperScanner.nextToken(false);
-						int index = parameterIdentifiers.indexOf(t.image);
-						if (index == -1 ) {
-							//not found
-							if (throwExceptionOnBadPreprocessorSyntax)
-								throw new ScannerException(
-									BAD_PP + contextStack.getCurrentContext().getOffset());
-							return;
+			
+			if( ! replacementString.equals( "" ) )
+			{
+				Scanner helperScanner = new Scanner();
+				helperScanner.initialize(
+					new StringReader(replacementString),
+					null);
+				helperScanner.setTokenizingMacroReplacementList( true );
+				Token t = helperScanner.nextToken(false);
+	
+				try {
+					while (true) {
+						//each # preprocessing token in the replacement list shall be followed
+						//by a parameter as the next reprocessing token in the list
+						if( t.type == tPOUND ){
+							macroReplacementTokens.add( t );
+							t = helperScanner.nextToken(false);
+							int index = parameterIdentifiers.indexOf(t.image);
+							if (index == -1 ) {
+								//not found
+								if (throwExceptionOnBadPreprocessorSyntax)
+									throw new ScannerException(
+										BAD_PP + contextStack.getCurrentContext().getOffset());
+								return;
+							}
 						}
+						
+						macroReplacementTokens.add(t);
+						t = helperScanner.nextToken(false);
 					}
-					
-					macroReplacementTokens.add(t);
-					t = helperScanner.nextToken(false);
 				}
-			} catch (Parser.EndOfFile e) {
-				// Good
+				catch( Parser.EndOfFile eof )
+				{
+					// good
+				}
 			}
 
 			IMacroDescriptor descriptor = new MacroDescriptor();
@@ -1580,7 +1642,12 @@
 				key + "(" + parameters + ")");
 			addDefinition(key, descriptor);
 
-		} else if ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r')) {
+		}
+		else if ((c == '\n') || (c == '\r'))
+		{
+			addDefinition( key, "" ); 
+		}
+		else if ((c == ' ') || (c == '\t') ) {
 			// this is a simple definition 
 			skipOverWhitespace();
 
@@ -1805,4 +1872,20 @@
 
 		return "0";
 	}
+	
+	/**
+	 * @return
+	 */
+	public int getLineNumberForOffset(int offset) {
+		return contextStack.mapOffsetToLineNumber(offset);
+	}
+
+	private boolean cppNature = true; 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IScanner#setCppNature(boolean)
+	 */
+	public void setCppNature(boolean value) {
+		cppNature = value; 
+	}
+
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ScannerContext.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ScannerContext.java,v
retrieving revision 1.3
diff -u -r1.3 ScannerContext.java
--- parser/org/eclipse/cdt/internal/core/parser/ScannerContext.java	11 Mar 2003 02:42:47 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/ScannerContext.java	15 Apr 2003 23:36:24 -0000
@@ -104,4 +104,5 @@
 		this.kind = kind;
 	}
 
+
 }
Index: parser/org/eclipse/cdt/internal/core/parser/Token.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Token.java,v
retrieving revision 1.9
diff -u -r1.9 Token.java
--- parser/org/eclipse/cdt/internal/core/parser/Token.java	11 Apr 2003 14:42:24 -0000	1.9
+++ parser/org/eclipse/cdt/internal/core/parser/Token.java	15 Apr 2003 23:36:24 -0000
@@ -251,5 +251,9 @@
 	static public final int tFLOATINGPT = 130;
 	static public final int tLSTRING = 131;
 	static public final int tCHAR = 132;
-	static public final int tLAST = tCHAR; 
+	static public final int t__Bool = 133; 
+	static public final int t__Complex = 134; 
+	static public final int t__Imaginary = 135; 
+	static public final int t_restrict = 136; 
+	static public final int tLAST = t_restrict; 
 }
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.28
diff -u -r1.28 ChangeLog
--- ChangeLog	15 Apr 2003 18:40:05 -0000	1.28
+++ ChangeLog	15 Apr 2003 23:36:38 -0000
@@ -1,3 +1,10 @@
+2003-04-15 John Camelon
+	Added ScannerTestCase::testBug36434().
+	Added ScannerTestCase::testMultipleLines(). 
+	Added ParserTestSuite. 
+	Added LineNumberTest.
+	Updated CModelElementsTests to set the Nature of the C++ project appropriately.
+
 2003-04-15 Andrew Niefer
 	Moved ScannerFailedTest::testBug36047 to ScannerTestCase::testBug36047
 	Added ScannerFailedTest::testBug36475
Index: model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java,v
retrieving revision 1.1
diff -u -r1.1 CModelElementsTests.java
--- model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java	3 Apr 2003 15:38:26 -0000	1.1
+++ model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java	15 Apr 2003 23:36:38 -0000
@@ -17,6 +17,7 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.eclipse.cdt.core.CCProjectNature;
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICProject;
@@ -29,7 +30,10 @@
 import org.eclipse.cdt.testplugin.CProjectHelper;
 import org.eclipse.cdt.testplugin.TestPluginLauncher;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 
@@ -66,6 +70,10 @@
 				e.printStackTrace();
 			}
 		}
+		if (!fCProject.getProject().hasNature(CCProjectNature.CC_NATURE_ID)) {
+			addNatureToProject(fCProject.getProject(), CCProjectNature.CC_NATURE_ID, null);
+		}
+
 		CCorePlugin.getDefault().setUseNewParser(true);
 
 	}
@@ -109,5 +117,13 @@
 		String firstParamType = setXParamTypes[0];
 		assertEquals(firstParamType, new String("int")); 
 	}
-
+	private static void addNatureToProject(IProject proj, String natureId, IProgressMonitor monitor) throws CoreException {
+		IProjectDescription description = proj.getDescription();
+		String[] prevNatures= description.getNatureIds();
+		String[] newNatures= new String[prevNatures.length + 1];
+		System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+		newNatures[prevNatures.length]= natureId;
+		description.setNatureIds(newNatures);
+		proj.setDescription(description, monitor);
+	}
 }
Index: parser/org/eclipse/cdt/core/parser/tests/DOMTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java,v
retrieving revision 1.20
diff -u -r1.20 DOMTests.java
--- parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	14 Apr 2003 14:14:52 -0000	1.20
+++ parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	15 Apr 2003 23:36:38 -0000
@@ -39,6 +39,7 @@
 import org.eclipse.cdt.internal.core.dom.TranslationUnit;
 import org.eclipse.cdt.internal.core.dom.UsingDeclaration;
 import org.eclipse.cdt.internal.core.dom.UsingDirective;
+import org.eclipse.cdt.internal.core.parser.IParser;
 import org.eclipse.cdt.internal.core.parser.Parser;
 import org.eclipse.cdt.internal.core.parser.ParserException;
 import org.eclipse.cdt.internal.core.parser.Token;
@@ -57,7 +58,7 @@
 	
 	public TranslationUnit parse(String code, boolean quickParse ) throws Exception {
 		DOMBuilder domBuilder = new DOMBuilder();
-		Parser parser = new Parser(code, domBuilder, quickParse );
+		IParser parser = new Parser(code, domBuilder, quickParse );
 		if( ! parser.parse() ) throw new ParserException( "Parse failure" ); 
 		
 		return domBuilder.getTranslationUnit();
Index: parser/org/eclipse/cdt/core/parser/tests/ExprEvalTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ExprEvalTest.java,v
retrieving revision 1.4
diff -u -r1.4 ExprEvalTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ExprEvalTest.java	20 Mar 2003 15:13:02 -0000	1.4
+++ parser/org/eclipse/cdt/core/parser/tests/ExprEvalTest.java	15 Apr 2003 23:36:38 -0000
@@ -5,6 +5,7 @@
 import junit.framework.TestSuite;
 
 import org.eclipse.cdt.internal.core.parser.ExpressionEvaluator;
+import org.eclipse.cdt.internal.core.parser.IParser;
 import org.eclipse.cdt.internal.core.parser.Parser;
 
 public class ExprEvalTest extends TestCase {
@@ -19,7 +20,7 @@
 	
 	public void runTest(String code, int expectedValue) throws Exception {
 		ExpressionEvaluator evaluator = new ExpressionEvaluator();
-		Parser parser = new Parser(code, evaluator);
+		IParser parser = new Parser(code, evaluator);
 		parser.expression(null);
 		assertEquals(expectedValue, ((Integer)evaluator.getResult()).intValue());
 	}
Index: parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java
===================================================================
RCS file: parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java
diff -N parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java	15 Apr 2003 23:36:38 -0000
@@ -0,0 +1,151 @@
+/**********************************************************************
+ * Copyright (c) 2002,2003 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.FileInputStream;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.cdt.internal.core.dom.ClassSpecifier;
+import org.eclipse.cdt.internal.core.dom.DOMBuilder;
+import org.eclipse.cdt.internal.core.dom.IOffsetable;
+import org.eclipse.cdt.internal.core.dom.NamespaceDefinition;
+import org.eclipse.cdt.internal.core.dom.SimpleDeclaration;
+import org.eclipse.cdt.internal.core.dom.TemplateDeclaration;
+import org.eclipse.cdt.internal.core.parser.IParser;
+import org.eclipse.cdt.internal.core.parser.Parser;
+import org.eclipse.cdt.internal.core.parser.Scanner;
+import org.eclipse.cdt.internal.core.parser.Token;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * @author jcamelon
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class LineNumberTest extends TestCase {
+	
+	public LineNumberTest( String arg )
+	{
+		super( arg );
+	}
+	private InputStream fileIn;
+	 
+	protected void setUp() throws Exception {
+		String fileName =org.eclipse.core.runtime.Platform.getPlugin("org.eclipse.cdt.ui.tests").find(new Path("/")).getFile() + "parser/org/eclipse/cdt/core/parser/resources/OffsetTest.h";
+		fileIn = new FileInputStream(fileName);
+	}
+	
+	public void testLineNos() throws Exception
+	{
+		Scanner scanner = new Scanner(); 
+		Reader reader = new StringReader( "int x = 3;\n foo\nfire\nfoe ");
+		scanner.initialize( reader, "string");
+		Token t = scanner.nextToken(); 
+		assertEquals( t.getType(), Token.t_int );
+		assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
+		t = scanner.nextToken(); 
+		assertEquals( t.getImage(), "x");
+		assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
+		t = scanner.nextToken(); 
+		assertEquals( t.getType(), Token.tASSIGN );
+		assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
+		t = scanner.nextToken(); 
+		assertEquals( t.getImage(), "3" );
+		assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
+		t = scanner.nextToken(); 
+		assertEquals( t.getType(), Token.tSEMI);
+		assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
+		for( int i = 2; i < 5; ++i )
+		{ 
+			t = scanner.nextToken(); 
+			assertEquals( t.getType(), Token.tIDENTIFIER);
+			assertEquals( scanner.getLineNumberForOffset(t.getOffset()), i );
+		}
+
+		try {
+			t = scanner.nextToken();
+			fail( "EOF");
+		} 
+		catch (Parser.EndOfFile e) {
+			assertEquals( scanner.getLineNumberForOffset(29), 4 ); 
+		}
+
+	}
+	
+	public void testDOMLineNos() throws Exception
+	{
+		DOMBuilder domBuilder = new DOMBuilder();
+		IParser parser = new Parser( fileIn, domBuilder, true );  
+		if( ! parser.parse() ) fail( "Parse of file failed");
+		
+		List macros = domBuilder.getTranslationUnit().getMacros();
+		List inclusions = domBuilder.getTranslationUnit().getInclusions();
+		List declarations = domBuilder.getTranslationUnit().getDeclarations();
+		
+		assertEquals( 3, macros.size() );
+		assertEquals( 1, inclusions.size() );
+		assertEquals( declarations.size(), 4 );
+		validateLineNumbers( (IOffsetable)inclusions.get(0), 2, 2 );
+		validateLineNumbers( (IOffsetable)macros.get(0), 5, 5 );
+		validateLineNumbers( (IOffsetable)macros.get(1), 6, 6 );
+		validateLineNumbers( (IOffsetable)macros.get(2), 30, 31 );
+		
+		NamespaceDefinition namespaceDecl = (NamespaceDefinition)declarations.get(0);
+		validateLineNumbers( namespaceDecl, 8, 22 ); 
+		List namespaceMembers = namespaceDecl.getDeclarations();
+		assertEquals( namespaceMembers.size(), 1 );
+		ClassSpecifier Hello = (ClassSpecifier)((SimpleDeclaration)namespaceMembers.get(0)).getTypeSpecifier();
+		validateLineNumbers( Hello, 10, 21);
+		List classMembers = Hello.getDeclarations();
+		assertEquals( classMembers.size(), 3 );
+		for( int i = 0; i < 3; ++i )
+		{
+			SimpleDeclaration memberDeclaration = (SimpleDeclaration)Hello.getDeclarations().get(i);
+			switch( i )
+			{
+				case 0:
+					validateLineNumbers(memberDeclaration, 13, 13 );
+					break;
+				case 1:
+					validateLineNumbers(memberDeclaration, 15, 15 );
+					break;
+				case 2:
+					validateLineNumbers(memberDeclaration, 18, 20 );
+					break; 
+				default:
+					break;
+			}
+		}
+	
+		validateLineNumbers( (SimpleDeclaration)declarations.get(1), 25, 27);
+		validateLineNumbers( (TemplateDeclaration)declarations.get(2), 34, 35);
+		validateLineNumbers( (SimpleDeclaration)declarations.get(3), 38, 43);
+		
+	}
+	
+	protected void tearDown() throws Exception {
+		if( fileIn != null )	fileIn.close(); 
+	}	
+
+	protected void validateLineNumbers( IOffsetable offsetable, int top, int bottom )
+	{
+		assertNotNull( offsetable );
+		assertEquals( offsetable.getTopLine(), top );
+		assertEquals( offsetable.getBottomLine(), bottom );
+	}
+}
Index: parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java
===================================================================
RCS file: parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java
diff -N parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java	15 Apr 2003 23:36:38 -0000
@@ -0,0 +1,39 @@
+/**********************************************************************
+ * Copyright (c) 2002,2003 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 org.eclipse.cdt.core.model.tests.CModelElementsTests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author jcamelon
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ParserTestSuite extends TestCase {
+	public static Test suite() { 
+		TestSuite suite= new TestSuite(); 
+		suite.addTestSuite(BranchTrackerTest.class);
+		suite.addTestSuite(ScannerTestCase.class);
+		suite.addTestSuite(ExprEvalTest.class);
+		suite.addTestSuite(DOMTests.class);
+		suite.addTestSuite(ParserSymbolTableTest.class);
+		suite.addTestSuite(LineNumberTest.class);
+		suite.addTestSuite(CModelElementsTests.class);
+		return suite;
+	}
+
+	
+}
Index: parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java,v
retrieving revision 1.13
diff -u -r1.13 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	15 Apr 2003 18:40:05 -0000	1.13
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	15 Apr 2003 23:36:39 -0000
@@ -2,6 +2,7 @@
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.io.Writer;
 import java.util.List;
 
 import junit.framework.Test;
@@ -523,6 +524,17 @@
 		}
 	}
 
+	public void testMultipleLines() throws Exception
+	{
+		Writer code = new StringWriter(); 
+		code.write( "#define COMPLEX_MACRO 33 \\\n");
+		code.write( "	+ 44\n\nCOMPLEX_MACRO");
+		initializeScanner( code.toString() );
+		validateInteger( "33" );
+		validateToken( Token.tPLUS );
+		validateInteger( "44" );
+	}
+
 	public void testSlightlyComplexIfdefStructure()
 	{
 		try
@@ -1304,6 +1316,17 @@
 		validateEOF();
 	}
 	
+	public void testBug36434() throws Exception
+	{
+		initializeScanner( "#define X(Y)");
+		validateEOF();
+		IMacroDescriptor macro = (IMacroDescriptor)scanner.getDefinition( "X" );
+		assertNotNull( macro ); 
+		assertEquals( macro.getParameters().size(), 1 );
+		assertEquals( (String)macro.getParameters().get(0), "Y" );
+		assertEquals( macro.getTokenizedExpansion().size(), 0 );
+	}
+	
 	public void testBug36047() throws Exception
 	{
 		StringWriter writer = new StringWriter(); 
@@ -1330,4 +1353,5 @@
 		
 		validateEOF(); 
 	}
+
 }

Attachment: resources.zip
Description: Binary data


Back to the top