Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser patch - preliminary templates, scanner fixes

Core Changes
	Updated Scanner to work for Strings literals like L"this string"
	Updated Scanner to work for floating points literals.
	Updated Scanner to be more forgiving on errors in QuickScan mode.
	Got template instantiation and specialization working (w/callbacks
and DOM). 
	Updated Parser/Callbacks for handle pure virtual function
declarations.
	Added callback support for some template declarations (nested not
included).  

Test Changes
	Added testWeirdStrings() and testNumerics() to ScannerTestCase. 
	Added testTemplateSpecialization(), testTemplateDeclaration(),
testBug26467(), 
	  testTypedef() and testTemplateInstantiation() to DOMTests.

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.9
diff -u -r1.9 DOMBuilder.java
--- dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	29 Mar 2003 05:35:47 -0000	1.9
+++ dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	31 Mar 2003 16:00:53 -0000
@@ -723,4 +723,115 @@
 		ConstructorChainElementExpression exp = (ConstructorChainElementExpression)expression;
 		exp.getOwnerElement().addExpression( exp );
 	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationBegin(java.lang.Object)
+	 */
+	public Object explicitInstantiationBegin(Object container) {
+		IScope scope = (IScope)container;
+		ExplicitTemplateDeclaration etd = new ExplicitTemplateDeclaration( ExplicitTemplateDeclaration.k_instantiation ); 
+		scope.addDeclaration(etd);
+		return etd;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationEnd(java.lang.Object)
+	 */
+	public void explicitInstantiationEnd(Object instantiation) {	
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationBegin(java.lang.Object)
+	 */
+	public Object explicitSpecializationBegin(Object container) {
+		IScope scope = (IScope)container;
+		ExplicitTemplateDeclaration etd = new ExplicitTemplateDeclaration( ExplicitTemplateDeclaration.k_specialization); 
+		scope.addDeclaration(etd);
+		return etd;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationEnd(java.lang.Object)
+	 */
+	public void explicitSpecializationEnd(Object instantiation) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#declaratorPureVirtual(java.lang.Object)
+	 */
+	public void declaratorPureVirtual(Object declarator) {
+		Declarator d = (Declarator)declarator;
+		d.setPureVirtual(true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, boolean)
+	 */
+	public Object templateDeclarationBegin(Object container, boolean exported) {
+		return new TemplateDeclaration( (IScope)container, exported );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationAbort(java.lang.Object)
+	 */
+	public void templateDeclarationAbort(Object templateDecl) {
+		templateDecl = null; 
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationEnd(java.lang.Object)
+	 */
+	public void templateDeclarationEnd(Object templateDecl) {
+		TemplateDeclaration decl = (TemplateDeclaration)templateDecl;
+		decl.getOwnerScope().addDeclaration(decl);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
+	 */
+	public Object templateTypeParameterBegin(Object templDecl, Token kind) {
+		TemplateParameter.ITemplateParameterList list = (TemplateParameter.ITemplateParameterList)templDecl;
+		int k; 
+		switch( kind.getType() )
+		{
+			case Token.t_class:
+				k = TemplateParameter.k_class;
+				break;
+			case Token.t_typename:
+				k= TemplateParameter.k_typename;
+				break;
+			default:
+				k = 0;  
+		}
+		return new TemplateParameter( list, k );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterName(java.lang.Object)
+	 */
+	public void templateTypeParameterName(Object typeParm) {
+		((TemplateParameter)typeParm).setName( currName );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeInitialTypeId(java.lang.Object)
+	 */
+	public void templateTypeParameterInitialTypeId(Object typeParm) {
+		((TemplateParameter)typeParm).setTypeId( currName );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterEnd(java.lang.Object)
+	 */
+	public void templateTypeParameterEnd(Object typeParm) {
+		TemplateParameter parm = ((TemplateParameter)typeParm);
+		parm.getContainer().addTemplateParameter(parm);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterAbort(java.lang.Object)
+	 */
+	public void templateTypeParameterAbort(Object typeParm) {
+		typeParm = null; 
+	}
 }
Index: dom/org/eclipse/cdt/internal/core/dom/Declarator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java,v
retrieving revision 1.6
diff -u -r1.6 Declarator.java
--- dom/org/eclipse/cdt/internal/core/dom/Declarator.java	29 Mar 2003 05:35:47 -0000	1.6
+++ dom/org/eclipse/cdt/internal/core/dom/Declarator.java	31 Mar 2003 16:00:53 -0000
@@ -104,7 +104,8 @@
 	}
 	
 	boolean isConst = false; 
-	boolean isVolatile = false; 
+	boolean isVolatile = false;
+	boolean isPureVirtual = false; 
 	/**
 	 * @return boolean
 	 */
@@ -162,6 +163,21 @@
 	 */
 	public void setCtorChain(ConstructorChain ctorChain) {
 		this.ctorChain = ctorChain;
+	}
+
+	/**
+	 * @return boolean
+	 */
+	public boolean isPureVirtual() {
+		return isPureVirtual;
+	}
+
+	/**
+	 * Sets the isPureVirtual.
+	 * @param isPureVirtual The isPureVirtual to set
+	 */
+	public void setPureVirtual(boolean isPureVirtual) {
+		this.isPureVirtual = isPureVirtual;
 	}
 
 }
Index: dom/org/eclipse/cdt/internal/core/dom/ExplicitTemplateDeclaration.java
===================================================================
RCS file: dom/org/eclipse/cdt/internal/core/dom/ExplicitTemplateDeclaration.java
diff -N dom/org/eclipse/cdt/internal/core/dom/ExplicitTemplateDeclaration.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/cdt/internal/core/dom/ExplicitTemplateDeclaration.java	31 Mar 2003 16:00:53 -0000
@@ -0,0 +1,59 @@
+/**********************************************************************
+ * Created on Mar 29, 2003
+ *
+ * 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: 
+ * Rational Software - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.internal.core.dom;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author jcamelon
+ *
+ */
+public class ExplicitTemplateDeclaration extends Declaration implements IScope {
+
+	private final int kind;
+	
+	public final static int k_specialization = 1;
+	public final static int k_instantiation = 2; 
+
+	public ExplicitTemplateDeclaration( int kind ) 
+	{
+		this.kind = kind;
+	}
+
+
+	private List declarations = new ArrayList();
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IScope#addDeclaration(org.eclipse.cdt.internal.core.dom.Declaration)
+	 */
+	public void addDeclaration(Declaration declaration) {
+		declarations.add( declaration );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IScope#getDeclarations()
+	 */
+	public List getDeclarations() {
+		return Collections.unmodifiableList( declarations );
+	}
+
+
+	/**
+	 * @return int
+	 */
+	public int getKind() {
+		return kind;
+	}
+
+}
Index: dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java
===================================================================
RCS file: dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java
diff -N dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/cdt/internal/core/dom/TemplateDeclaration.java	31 Mar 2003 16:00:53 -0000
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * Created on Mar 30, 2003
+ *
+ * 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: 
+ * Rational Software - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.internal.core.dom;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author jcamelon
+ *
+ */
+public class TemplateDeclaration extends Declaration implements IScope, TemplateParameter.ITemplateParameterList {
+
+	private final boolean exported; 
+	private IScope ownerScope;  
+	private List declarations = new ArrayList(); 
+
+	public TemplateDeclaration( IScope ownerScope, boolean exported )
+	{
+		this.ownerScope = ownerScope;
+		this.exported = exported;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IScope#addDeclaration(org.eclipse.cdt.internal.core.dom.Declaration)
+	 */
+	public void addDeclaration(Declaration declaration) {
+		declarations.add( declaration );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.IScope#getDeclarations()
+	 */
+	public List getDeclarations() {
+		return Collections.unmodifiableList( declarations );
+	}
+
+	/**
+	 * @return boolean
+	 */
+	public boolean isExported() {
+		return exported;
+	}
+
+	/**
+	 * @return IScope
+	 */
+	public IScope getOwnerScope() {
+		return ownerScope;
+	}
+
+
+	private List templateParameters = new ArrayList(); 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.TemplateParameter.ITemplateParameterList#getTemplateParameters()
+	 */
+	public List getTemplateParameters() {
+		return Collections.unmodifiableList(templateParameters);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.dom.TemplateParameter.ITemplateParameterList#addTemplateParameter(org.eclipse.cdt.internal.core.dom.TemplateParameter)
+	 */
+	public void addTemplateParameter(TemplateParameter parm) {
+		templateParameters.add( parm );
+	}
+
+}
Index: dom/org/eclipse/cdt/internal/core/dom/TemplateParameter.java
===================================================================
RCS file: dom/org/eclipse/cdt/internal/core/dom/TemplateParameter.java
diff -N dom/org/eclipse/cdt/internal/core/dom/TemplateParameter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/cdt/internal/core/dom/TemplateParameter.java	31 Mar 2003 16:00:53 -0000
@@ -0,0 +1,89 @@
+/**********************************************************************
+ * Created on Mar 30, 2003
+ *
+ * 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: 
+ * Rational Software - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.internal.core.dom;
+
+import java.util.List;
+
+import org.eclipse.cdt.internal.core.parser.util.Name;
+
+/**
+ * @author jcamelon
+ *
+ */
+public class TemplateParameter {
+
+	public interface ITemplateParameterList {
+		public List getTemplateParameters(); 
+		public void addTemplateParameter( TemplateParameter parm ); 
+	}
+
+	private ITemplateParameterList container;
+	private final int kind; 
+	
+	public final static int k_class = 2;
+	public final static int k_typename = 3; 
+	
+	
+	public TemplateParameter( ITemplateParameterList container, int kind )
+	{
+		this.container = container;
+		this.kind = kind; 
+	}
+	
+	private Name name = null; 
+	private Name typeId = null;  
+	/**
+	 * @return ITemplateParameterList
+	 */
+	public ITemplateParameterList getContainer() {
+		return container;
+	}
+
+	/**
+	 * @return int
+	 */
+	public int getKind() {
+		return kind;
+	}
+
+	/**
+	 * @return Name
+	 */
+	public Name getName() {
+		return name;
+	}
+
+	/**
+	 * @return Name
+	 */
+	public Name getTypeId() {
+		return typeId;
+	}
+
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(Name name) {
+		this.name = name;
+	}
+
+	/**
+	 * Sets the typeId.
+	 * @param typeId The typeId to set
+	 */
+	public void setTypeId(Name typeId) {
+		this.typeId = typeId;
+	}
+
+}
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.11
diff -u -r1.11 ChangeLog
--- parser/ChangeLog	29 Mar 2003 05:35:48 -0000	1.11
+++ parser/ChangeLog	31 Mar 2003 16:00:54 -0000
@@ -1,3 +1,11 @@
+2003-03-31 John Camelon
+	Updated Scanner to work for Strings literals like L"this string"
+	Updated Scanner to work for floating points literals.
+	Updated Scanner to be more forgiving on errors in QuickScan mode.
+	Got template instantiation and specialization working (w/callbacks and DOM). 
+	Updated Parser/Callbacks for handle pure virtual function declarations.
+	Added callback support for some template declarations (not all branches).  
+
 2003-03-28 John Camelon
 	Added AccessSpecifier and ClassKind to parser.util package and refactored callbacks. 
 	Better encapsulated ExceptionSpecification in the DOM. 
Index: parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java,v
retrieving revision 1.12
diff -u -r1.12 NewModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	29 Mar 2003 05:35:48 -0000	1.12
+++ parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	31 Mar 2003 16:00:54 -0000
@@ -709,4 +709,108 @@
 		
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationBegin(java.lang.Object)
+	 */
+	public Object explicitInstantiationBegin(Object container) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationEnd(java.lang.Object)
+	 */
+	public void explicitInstantiationEnd(Object instantiation) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationBegin(java.lang.Object)
+	 */
+	public Object explicitSpecializationBegin(Object container) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationEnd(java.lang.Object)
+	 */
+	public void explicitSpecializationEnd(Object instantiation) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#declaratorPureVirtual(java.lang.Object)
+	 */
+	public void declaratorPureVirtual(Object declarator) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, boolean)
+	 */
+	public Object templateDeclarationBegin(Object container, boolean exported) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationAbort(java.lang.Object)
+	 */
+	public void templateDeclarationAbort(Object templateDecl) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationEnd(java.lang.Object)
+	 */
+	public void templateDeclarationEnd(Object templateDecl) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
+	 */
+	public Object templateTypeParameterBegin(Object templDecl, Token kind) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterName(java.lang.Object)
+	 */
+	public void templateTypeParameterName(Object typeParm) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeInitialTypeId(java.lang.Object)
+	 */
+	public void templateTypeParameterInitialTypeId(Object typeParm) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterEnd(java.lang.Object)
+	 */
+	public void templateTypeParameterEnd(Object typeParm) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterAbort(java.lang.Object)
+	 */
+	public void templateTypeParameterAbort(Object typeParm) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }
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.10
diff -u -r1.10 ExpressionEvaluator.java
--- parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java	29 Mar 2003 05:35:48 -0000	1.10
+++ parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java	31 Mar 2003 16:00:54 -0000
@@ -622,4 +622,86 @@
 	public void constructorChainElementExpressionListElementEnd(Object expression) {
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationBegin(java.lang.Object)
+	 */
+	public Object explicitInstantiationBegin(Object container) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationEnd(java.lang.Object)
+	 */
+	public void explicitInstantiationEnd(Object instantiation) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationBegin(java.lang.Object)
+	 */
+	public Object explicitSpecializationBegin(Object container) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationEnd(java.lang.Object)
+	 */
+	public void explicitSpecializationEnd(Object instantiation) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#declaratorPureVirtual(java.lang.Object)
+	 */
+	public void declaratorPureVirtual(Object declarator) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, boolean)
+	 */
+	public Object templateDeclarationBegin(Object container, boolean exported) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationAbort(java.lang.Object)
+	 */
+	public void templateDeclarationAbort(Object templateDecl) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationEnd(java.lang.Object)
+	 */
+	public void templateDeclarationEnd(Object templateDecl) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
+	 */
+	public Object templateTypeParameterBegin(Object templDecl, Token kind) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterName(java.lang.Object)
+	 */
+	public void templateTypeParameterName(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeInitialTypeId(java.lang.Object)
+	 */
+	public void templateTypeParameterInitialTypeId(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterEnd(java.lang.Object)
+	 */
+	public void templateTypeParameterEnd(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterAbort(java.lang.Object)
+	 */
+	public void templateTypeParameterAbort(Object typeParm) {
+	}
+
 }
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.9
diff -u -r1.9 IParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java	29 Mar 2003 05:35:48 -0000	1.9
+++ parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java	31 Mar 2003 16:00:55 -0000
@@ -32,7 +32,8 @@
 	
 	public Object declaratorBegin(Object container);
 	public void declaratorId(Object declarator);
-	public void declaratorAbort( Object container, Object declarator ); 
+	public void declaratorAbort( Object container, Object declarator );
+	public void declaratorPureVirtual( Object declarator );
 	public void declaratorCVModifier( Object declarator, Token modifier );
 	public void declaratorThrowsException( Object declarator ); 
 	public void declaratorThrowExceptionName( Object declarator );
@@ -115,5 +116,21 @@
 	
 	public Object	constructorChainElementExpressionListElementBegin( Object element ); 
 	public void		constructorChainElementExpressionListElementEnd( Object expression );
+	
+	public Object	explicitInstantiationBegin( Object container);
+	public void		explicitInstantiationEnd( Object instantiation ); 
+	
+	public Object	explicitSpecializationBegin( Object container );
+	public void		explicitSpecializationEnd( Object instantiation );
+
+	public Object	templateDeclarationBegin( Object container, boolean exported );
+	public void 	templateDeclarationAbort( Object templateDecl );
+	public void		templateDeclarationEnd( Object templateDecl );	
+	
+	public Object	templateTypeParameterBegin( Object templDecl, Token kind );
+	public void		templateTypeParameterName( Object typeParm );
+	public void		templateTypeParameterAbort( Object typeParm );
+	public void 	templateTypeParameterInitialTypeId( Object typeParm );
+	public void 	templateTypeParameterEnd( Object typeParm );
 	
 }
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.9
diff -u -r1.9 NullParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java	29 Mar 2003 05:35:48 -0000	1.9
+++ parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java	31 Mar 2003 16:00:55 -0000
@@ -523,4 +523,86 @@
 	public void constructorChainElementExpressionListElementEnd(Object expression) {
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationBegin(java.lang.Object)
+	 */
+	public Object explicitInstantiationBegin(Object container) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationEnd(java.lang.Object)
+	 */
+	public void explicitInstantiationEnd(Object instantiation) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationBegin(java.lang.Object)
+	 */
+	public Object explicitSpecializationBegin(Object container) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationEnd(java.lang.Object)
+	 */
+	public void explicitSpecializationEnd(Object instantiation) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#declaratorPureVirtual(java.lang.Object)
+	 */
+	public void declaratorPureVirtual(Object declarator) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, boolean)
+	 */
+	public Object templateDeclarationBegin(Object container, boolean exported) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationAbort(java.lang.Object)
+	 */
+	public void templateDeclarationAbort(Object templateDecl) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationEnd(java.lang.Object)
+	 */
+	public void templateDeclarationEnd(Object templateDecl) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
+	 */
+	public Object templateTypeParameterBegin(Object templDecl, Token kind) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterName(java.lang.Object)
+	 */
+	public void templateTypeParameterName(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeInitialTypeId(java.lang.Object)
+	 */
+	public void templateTypeParameterInitialTypeId(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterEnd(java.lang.Object)
+	 */
+	public void templateTypeParameterEnd(Object typeParm) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateTypeParameterAbort(java.lang.Object)
+	 */
+	public void templateTypeParameterAbort(Object typeParm) {
+	}
+
 }
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.15
diff -u -r1.15 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	29 Mar 2003 05:35:48 -0000	1.15
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	31 Mar 2003 16:00:55 -0000
@@ -248,6 +248,151 @@
 		}
 	}
 	
+	/*
+	 * 
+	 * template-declaration:	export? template <template-parameter-list> declaration
+	 * explicit-instantiation:	template declaration
+	 * explicit-specialization:	template <> declaration
+	 * 
+	 * template-parameter-list:	template-parameter
+	 *							template-parameter-list , template-parameter
+	 * template-parameter:		type-parameter
+	 *							parameter-declaration
+	 * type-parameter:			class identifier?
+	 *							class identifier? = type-id
+	 * 							typename identifier?
+	 * 							typename identifier? = type-id
+	 *							template < template-parameter-list > class identifier?
+	 *							template < template-parameter-list > class identifier? = id-expression
+	 * template-id:				template-name < template-argument-list?>
+	 * template-name:			identifier
+	 * template-argument-list:	template-argument
+	 *							template-argument-list , template-argument
+	 * template-argument:		assignment-expression
+	 *							type-id
+	 *							id-expression
+	 * 
+	 * @param container
+	 */
+	protected void templateDeclaration( Object container ) throws Backtrack
+	{
+		boolean export = false; 
+		if( LT(1) == Token.t_export )
+		{
+			consume( Token.t_export ); 
+			export = true; 
+		}
+		
+		consume( Token.t_template );
+		if( LT(1) != Token.tLT )
+		{
+			// explicit-instantiation
+			Object instantiation = null; 
+			try { instantiation = callback.explicitInstantiationBegin( container ); } catch( Exception e ) { }
+			declaration( instantiation );
+			try { callback.explicitInstantiationEnd( instantiation ); } catch( Exception e ) { }
+			return;
+		}
+		else
+		{
+			consume( Token.tLT );
+			if( LT(1) == Token.tGT )
+			{
+				consume( Token.tGT ); 
+				// explicit-specialization
+				Object specialization = null;
+				try{ specialization = callback.explicitSpecializationBegin( container ); } catch( Exception e ) { }
+				declaration( specialization ); 
+				try{ callback.explicitSpecializationEnd( specialization ); } catch( Exception e ) { }
+				return;
+			}
+		}
+		
+		Object templateDeclaration = null;
+		try
+		{
+			try{ templateDeclaration = callback.templateDeclarationBegin( container, export ); } catch ( Exception e ) {}
+			templateParameterList( templateDeclaration );
+			consume( Token.tGT );
+			declaration( templateDeclaration ); 
+			try{ callback.templateDeclarationEnd( templateDeclaration ); } catch( Exception e ) {}
+			
+		} catch( Backtrack bt )
+		{
+			try { callback.templateDeclarationAbort( templateDeclaration ); } catch( Exception e ) {}
+		}
+	}
+
+	protected void templateParameterList( Object templateDeclaration ) throws EndOfFile, Backtrack {
+		// if we have gotten this far then we have a true template-declaration
+		// iterate through the template parameter list
+		for ( ; ; )
+		{
+			if( LT(1) == Token.tGT ) return; 
+			Object currentTemplateParm = null;
+			if( LT(1) == Token.t_class || LT(1) == Token.t_typename )
+			{
+				try
+				{
+					try{ 
+						currentTemplateParm = callback.templateTypeParameterBegin( 
+								templateDeclaration, consume() );
+					} catch( Exception e ) {} 
+					if( LT(1) == Token.tIDENTIFIER ) // optional identifier
+					{
+						identifier(); 
+						try { callback.templateTypeParameterName( currentTemplateParm );} catch( Exception e ) {}
+						if( LT(1) == Token.tASSIGN ) // optional = type-id
+						{
+							consume( Token.tASSIGN );
+							identifier(); // type-id
+							try{ callback.templateTypeParameterInitialTypeId( currentTemplateParm ); }catch( Exception e ) {}
+						}
+					}
+					try{ callback.templateTypeParameterEnd( currentTemplateParm );	} catch( Exception e ) {}
+					
+				} catch( Backtrack bt )
+				{
+					try{ callback.templateTypeParameterAbort( currentTemplateParm ); }catch( Exception e ) {}
+					throw bt;
+				}
+			}
+			else if( LT(1) == Token.t_template )
+			{
+				try
+				{
+					consume( Token.t_template );
+					consume( Token.tLT );
+					Object newTemplateDeclaration = null;
+					templateParameterList( newTemplateDeclaration ); 
+					consume( Token.tGT ); 
+					consume( Token.t_class );
+					if( LT(1) == Token.tIDENTIFIER ) // optional identifier
+					{
+						identifier(); 
+						if( LT(1) == Token.tASSIGN ) // optional = type-id
+						{
+							consume( Token.tASSIGN );
+							// id-expression()
+						}
+					}
+				}
+				catch( Backtrack bt )
+				{
+				}
+			}
+			else if( LT(1) == Token.tCOMMA )
+			{
+				consume( Token.tCOMMA );
+				continue;
+			}
+			else
+			{
+				parameterDeclaration( templateDeclaration );
+			}
+		}
+	}
+	
 	/**
 	 * declaration
 	 * : {"asm"} asmDefinition
@@ -286,8 +431,7 @@
 				return; 
 			case Token.t_export:
 			case Token.t_template:
-				// templateDeclaration();
-				consume();
+				templateDeclaration( container );
 				return; 
 			case Token.t_extern:
 				if( LT(2) == Token.tSTRING )
@@ -575,9 +719,10 @@
 						// this is an elaborated class specifier
 						Object elab = null; 
 						try{ elab = callback.elaboratedTypeSpecifierBegin( decl, consume() );} catch( Exception e ) {} 
-						name(); 
+						className(); 
 						try{ callback.elaboratedTypeSpecifierName( elab ); } catch( Exception e ) {}
 						try{ callback.elaboratedTypeSpecifierEnd( elab );} catch( Exception e ) {}
+						encounteredTypename = true;
 						break;
 					}
 				case Token.t_enum:
@@ -612,6 +757,52 @@
 		} catch( Exception e ) {}
 	}
 	
+	
+	/* class-name: identifier | template-id
+	 * template-id: template-name < template-argument-list opt >
+	 * template-name : identifier
+	 */
+	protected void className() throws Backtrack
+	{	
+		Token first = LA(1);
+		if( LT(1)  == Token.tIDENTIFIER)
+		{
+			if( LT(2) == Token.tLT )
+			{
+				consume( Token.tIDENTIFIER );
+				consume( Token.tLT );
+				
+				// until we get all the names sorted out
+				int depth = 1;
+				Token last = null; 
+
+				while (depth > 0) {
+					last = consume();
+					switch ( last.getType()) {
+						case Token.tGT:
+							--depth;
+							break;
+						case Token.tLT:
+							++depth;
+						break;
+					}
+				}
+				
+				callback.nameBegin( first );
+				callback.nameEnd( last );
+				
+				
+			}
+			else
+			{
+				identifier();
+				return;
+			} 
+		}
+		else
+			throw backtrack;
+	}
+	
 	/**
 	 * name
 	 * : ("::")? name2 ("::" name2)*
@@ -822,7 +1013,7 @@
 								// this is most likely the definition of the constructor 
 								return declarator; 
 							}
-							
+														
 							// const-volatile marker on the method
 							if( LT(1) == Token.t_const || LT(1) == Token.t_volatile )
 							{
@@ -859,6 +1050,15 @@
 									}
 								}
 							}
+
+							// check for optional pure virtual							
+							if( LT(1) == Token.tASSIGN && LT(2) == Token.tINTEGER && LA(2).getImage().equals( "0") )
+							{
+								consume( Token.tASSIGN);
+								consume( Token.tINTEGER);
+								try{ callback.declaratorPureVirtual( declarator ); } catch( Exception e ) { }
+							}
+
 						}
 						break;
 					case Token.tLBRACKET:
@@ -1044,7 +1244,7 @@
 		
 		// class name
 		if (LT(1) == Token.tIDENTIFIER) {
-			name();
+			className();
 			try{ callback.classSpecifierName(classSpec);} catch( Exception e ){}			
 		}
 		
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.8
diff -u -r1.8 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java	24 Mar 2003 03:04:35 -0000	1.8
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java	31 Mar 2003 16:00:56 -0000
@@ -30,10 +30,6 @@
 /**
  * @author jcamelon
  *
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
  */
 
 public class Scanner implements IScanner {
@@ -345,9 +341,6 @@
 	// these are scanner configuration aspects that we perhaps want to tweak
 	// eventually, these should be configurable by the client, but for now
 	// we can just leave it internal
-	private boolean throwExceptionPPError = true;
-	private boolean throwExceptionOnRedefinition = false;
-	private boolean throwExceptionOnBadUndefinition = false; 
 	private boolean throwExceptionOnBadPreprocessorSyntax = true;
 	private boolean throwExceptionOnInclusionNotFound = true;
 	private boolean throwExceptionOnBadMacroExpansion = true;
@@ -450,7 +443,7 @@
 	{
 	
 		count++;
-
+		boolean madeMistake = false; 
 		int c = getChar();
 
 		while (c != NOCHAR) {
@@ -463,14 +456,59 @@
 			if ((c == ' ') || (c == '\r') || (c == '\t') || (c == '\n')) {
 				c = getChar();
 				continue;
+			} else if (c == '"' || ( c == 'L' && ! madeMistake ) ) {
+			
+				boolean wideString = false; 
+				if( c == 'L' )
+				{
+					int oldChar =c;
+					wideString = true;
+					c = getChar(); 
+					if( c != '"' )
+					{
+						// we have made a mistake
+						ungetChar( c );
+						c = oldChar;
+						madeMistake = true; 
+						continue;
+					}
+				} 
+				 
+				// string
+				StringBuffer buff = new StringBuffer();
+				c = getChar();
+
+				while (c != '"' && c != '\n') {
+					buff.append((char) c);
+					c = getChar();
+				}
+
+				if (c != '\n') 
+				{
+					int type = wideString ? Token.tLSTRING : Token.tSTRING;
+					return newToken(
+						type,
+						buff.toString(),
+						currentContext);
+	
+				} else {
+					if (throwExceptionOnUnboundedString)
+						throw new ScannerException(
+							"Unbounded string found at offset "
+								+ currentContext.getOffset());
+				}
+		
 			} else if (
 				((c >= 'a') && (c <= 'z'))
 					|| ((c >= 'A') && (c <= 'Z')) | (c == '_')) {
+						
+				if( madeMistake ) madeMistake = false;
 				// String buffer is slow, we need a better way such as memory mapped files
-				StringBuffer buff = new StringBuffer();
+				StringBuffer buff = new StringBuffer(); 
 				buff.append((char) c);
 
-				c = getChar();
+				c = getChar();				
+				
 				while (((c >= 'a') && (c <= 'z'))
 					|| ((c >= 'A') && (c <= 'Z'))
 					|| ((c >= '0') && (c <= '9'))
@@ -525,29 +563,7 @@
 				}
 
 				return newToken(tokenType, ident, currentContext);
-			} else if (c == '"') {
-				// string
-				StringBuffer buff = new StringBuffer();
-				c = getChar();
-
-				while (c != '"' && c != '\n') {
-					buff.append((char) c);
-					c = getChar();
-				}
-
-				if (c != '\n') {
-					return newToken(
-						Token.tSTRING,
-						buff.toString(),
-						currentContext);
-				} else {
-					if (throwExceptionOnUnboundedString)
-						throw new ScannerException(
-							"Unbounded string found at offset "
-								+ currentContext.getOffset());
-				}
-
-			} else if ((c >= '0') && (c <= '9')) {
+			} else if ((c >= '0') && (c <= '9') || c == '.' ) {
 				StringBuffer buff;
 				
 				if( pasting )
@@ -559,12 +575,20 @@
 				}
 				else
 					buff = new StringBuffer();
+				
+				
+				boolean hex = false;
+				boolean floatingPoint = ( c == '.' ) ? true : false;
+				boolean firstCharZero = ( c== '0' )? true : false; 
 					
 				buff.append((char) c);
 
 				c = getChar();
-				boolean hex = false;
+				
 				if (c == 'x') {
+					if( ! firstCharZero ) 
+						throw new ScannerException( "Invalid Hexidecimal @ offset " + currentContext.getOffset() );
+					
 					hex = true;
 					c = getChar();
 				}
@@ -575,8 +599,53 @@
 					buff.append((char) c);
 					c = getChar();
 				}
+				
+				if( c == '.' )
+				{
+					buff.append( (char)c);
+					if( floatingPoint || hex ) throw new ScannerException( "Invalid floating point @ offset " + currentContext.getOffset() );
+					floatingPoint = true;
+					c= getChar(); 
+					while ((c >= '0' && c <= '9') )
+					{
+						buff.append((char) c);
+						c = getChar();
+					}
+				}
+				
 
-				ungetChar(c);
+				if( c == 'e' || c == 'E' )
+				{
+					if( ! floatingPoint ) floatingPoint = true; 
+					// exponent type for flaoting point 
+					buff.append((char)c);
+					c = getChar(); 
+					
+					// optional + or - 
+					if( c == '+' || c == '-' )
+					{
+						buff.append( (char)c );
+						c = getChar(); 
+					}
+					
+					// digit sequence of exponent part 
+					while ((c >= '0' && c <= '9') )
+					{
+						buff.append((char) c);
+						c = getChar();
+					}
+					
+					// optional suffix 
+					if( c == 'l' || c == 'L' || c == 'f' || c == 'F' )
+					{
+						buff.append( (char)c );
+						c = getChar(); 
+					}
+					
+					
+				}
+
+				ungetChar( c );
 				
 				if( pasting )
 				{
@@ -598,8 +667,10 @@
 					}
 				}
 				
+				int tokenType = floatingPoint ? Token.tFLOATINGPT : Token.tINTEGER; 
+				
 				return newToken(
-					Token.tINTEGER,
+					tokenType,
 					buff.toString(),
 					currentContext);
 				
@@ -672,7 +743,7 @@
 							// definition 
 							String toBeUndefined = getNextIdentifier();
 							
-							if( ( definitions.remove(toBeUndefined) == null ) && throwExceptionOnBadUndefinition ) 
+							if( ( definitions.remove(toBeUndefined) == null ) && ! quickScan ) 
 								throw new ScannerException( "Attempt to #undef symbol " + toBeUndefined + " when it was never defined");
 							
 							skipOverTextUntilNewline();
@@ -764,7 +835,7 @@
 
 							String error = getRestOfPreprocessorLine();
 
-							if (throwExceptionPPError) {
+							if (!quickScan) {
 								throw new ScannerException("#error " + error);
 							}
 							c = getChar();
@@ -1385,7 +1456,7 @@
 		String key = getNextIdentifier();
 		int offset = currentContext.getOffset() - key.length() - currentContext.undoStackSize();
 
-		if (throwExceptionOnRedefinition) {
+		if (!quickScan) {
 			String checkForRedefinition = (String) definitions.get(key);
 			if (checkForRedefinition != null) {
 				throw new ScannerException(
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.4
diff -u -r1.4 Token.java
--- parser/org/eclipse/cdt/internal/core/parser/Token.java	17 Mar 2003 19:48:46 -0000	1.4
+++ parser/org/eclipse/cdt/internal/core/parser/Token.java	31 Mar 2003 16:00:56 -0000
@@ -173,6 +173,8 @@
 	static public final int t_xor = 127;
 	static public final int t_xor_eq = 128;
 	static public final int tSTRING = 129;
+	static public final int tFLOATINGPT = 130;
+	static public final int tLSTRING = 131;
 	
-	static public final int tLAST = tSTRING; 
+	static public final int tLAST = tLSTRING; 
 }
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.13
diff -u -r1.13 ChangeLog
--- ChangeLog	29 Mar 2003 05:35:50 -0000	1.13
+++ ChangeLog	31 Mar 2003 16:01:52 -0000
@@ -1,8 +1,12 @@
+2003-03-31 John Camelon
+	Added testWeirdStrings() and testNumerics() to ScannerTestCase. 
+	Added testTemplateSpecialization(), testTemplateDeclaration(), testBug26467(), 
+	  testTypedef() and testTemplateInstantiation() to DOMTests.
+
 2003-03-28 John Camelon
 	Added testConstructorChain() and testASMDefinition() to DOMTests.
 
 2003-03-27 Alain Magloire
-
 	Changes were done in the Core Model API, the hierarchy is now
 	ICModel
 		ICProject
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.9
diff -u -r1.9 DOMTests.java
--- parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	29 Mar 2003 05:35:50 -0000	1.9
+++ parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	31 Mar 2003 16:01:53 -0000
@@ -16,9 +16,11 @@
 import org.eclipse.cdt.internal.core.dom.ConstructorChainElementExpression;
 import org.eclipse.cdt.internal.core.dom.DOMBuilder;
 import org.eclipse.cdt.internal.core.dom.Declarator;
+import org.eclipse.cdt.internal.core.dom.ElaboratedTypeSpecifier;
 import org.eclipse.cdt.internal.core.dom.EnumerationSpecifier;
 import org.eclipse.cdt.internal.core.dom.EnumeratorDefinition;
 import org.eclipse.cdt.internal.core.dom.ExceptionSpecifier;
+import org.eclipse.cdt.internal.core.dom.ExplicitTemplateDeclaration;
 import org.eclipse.cdt.internal.core.dom.Expression;
 import org.eclipse.cdt.internal.core.dom.LinkageSpecification;
 import org.eclipse.cdt.internal.core.dom.NamespaceDefinition;
@@ -26,6 +28,8 @@
 import org.eclipse.cdt.internal.core.dom.ParameterDeclarationClause;
 import org.eclipse.cdt.internal.core.dom.PointerOperator;
 import org.eclipse.cdt.internal.core.dom.SimpleDeclaration;
+import org.eclipse.cdt.internal.core.dom.TemplateDeclaration;
+import org.eclipse.cdt.internal.core.dom.TemplateParameter;
 import org.eclipse.cdt.internal.core.dom.TranslationUnit;
 import org.eclipse.cdt.internal.core.dom.UsingDeclaration;
 import org.eclipse.cdt.internal.core.dom.UsingDirective;
@@ -33,6 +37,7 @@
 import org.eclipse.cdt.internal.core.parser.ParserException;
 import org.eclipse.cdt.internal.core.parser.Token;
 import org.eclipse.cdt.internal.core.parser.util.AccessSpecifier;
+import org.eclipse.cdt.internal.core.parser.util.ClassKey;
 import org.eclipse.cdt.internal.core.parser.util.DeclSpecifier;
 import org.eclipse.cdt.internal.core.parser.util.Name;
 
@@ -115,6 +120,41 @@
 		
 	}
 	
+	public void testTemplateSpecialization() throws Exception
+	{
+		TranslationUnit tu = parse( "template<> class stream<char> { /* ... */ };");
+		assertEquals( tu.getDeclarations().size(), 1 ); 
+		ExplicitTemplateDeclaration explicit = (ExplicitTemplateDeclaration)tu.getDeclarations().get( 0 );
+		assertNotNull( explicit ); 
+		assertEquals( explicit.getKind(), ExplicitTemplateDeclaration.k_specialization );
+		assertEquals( explicit.getDeclarations().size(), 1 );
+		SimpleDeclaration declaration = (SimpleDeclaration)explicit.getDeclarations().get(0);
+		assertNotNull( declaration );
+		ClassSpecifier classSpec = (ClassSpecifier)declaration.getTypeSpecifier();
+		assertNotNull( classSpec );
+		assertEquals( classSpec.getClassKey(), ClassKey.t_class );
+		assertEquals( classSpec.getName().toString(), "stream<char>" );
+		assertEquals( declaration.getDeclarators().size(), 0 );
+		assertEquals( classSpec.getDeclarations().size(), 0 );
+		
+	}
+	
+	public void testTemplateInstantiation() throws Exception
+	{
+		TranslationUnit tu = parse( "template class Array<char>;");
+		assertEquals( tu.getDeclarations().size(), 1 );
+		ExplicitTemplateDeclaration explicit = (ExplicitTemplateDeclaration)tu.getDeclarations().get( 0 );
+		assertNotNull( explicit );
+		assertEquals( explicit.getKind(), ExplicitTemplateDeclaration.k_instantiation ); 
+		assertEquals( explicit.getDeclarations().size(), 1 );
+		SimpleDeclaration declaration = (SimpleDeclaration)explicit.getDeclarations().get(0);
+		assertNotNull( declaration );
+		ElaboratedTypeSpecifier classSpec = (ElaboratedTypeSpecifier)declaration.getTypeSpecifier();
+		assertNotNull( classSpec );
+		assertEquals( classSpec.getClassKey(), ClassKey.t_class );
+		assertEquals( classSpec.getName().toString(), "Array<char>");	
+	}
+	
 	public void testEnumSpecifier() throws Exception
 	{
 		Writer code = new StringWriter(); 
@@ -146,6 +186,28 @@
 		assertEquals( enumSpecifier2.getName().toString(), "hasAName" ); 
 		
 	}
+	
+	public void testTypedef() throws Exception
+	{
+		TranslationUnit tu = parse( "typedef const struct A * const cpStructA;");
+		assertEquals( tu.getDeclarations().size(), 1 );
+		SimpleDeclaration declaration = (SimpleDeclaration)tu.getDeclarations().get(0);
+		assertTrue( declaration.getDeclSpecifier().isTypedef() );
+		assertTrue( declaration.getDeclSpecifier().isConst() );
+		ElaboratedTypeSpecifier elab = (ElaboratedTypeSpecifier) declaration.getTypeSpecifier();
+		assertEquals( elab.getClassKey(), ClassKey.t_struct ); 
+		assertEquals( elab.getName().toString(), "A" );
+		List declarators = declaration.getDeclarators(); 
+		assertEquals( declarators.size(), 1 );
+		Declarator declarator = (Declarator)declarators.get(0);
+		assertEquals( declarator.getName().toString(), "cpStructA");
+		assertEquals( declarator.getPointerOperators().size(), 1 );
+		PointerOperator po = (PointerOperator)declarator.getPointerOperators().get(0);
+		assertEquals( po.getType(), PointerOperator.t_pointer);
+		assertTrue( po.isConst() ); 
+		assertFalse( po.isVolatile());
+		
+	}
 	public void testUsingClauses() throws Exception
 	{
 		Writer code = new StringWriter();
@@ -580,12 +642,13 @@
 	public void testFunctionModifiers() throws Exception
 	{
 		Writer code = new StringWriter(); 
-		code.write( "void foo( void ) const throw ( yay, nay, we::dont::care );");
+		code.write( "virtual void foo( void ) const throw ( yay, nay, we::dont::care ) = 0;");
 		TranslationUnit translationUnit = parse( code.toString() );
 		List tudeclarations = translationUnit.getDeclarations(); 
 		assertEquals( 1, tudeclarations.size() ); 
 		SimpleDeclaration decl1 = (SimpleDeclaration)tudeclarations.get(0);
 		assertEquals( decl1.getDeclSpecifier().getType(), DeclSpecifier.t_void);
+		assertTrue( decl1.getDeclSpecifier().isVirtual() );
 		assertEquals( decl1.getDeclarators().size(), 1 );
 		Declarator declarator = (Declarator)decl1.getDeclarators().get(0);
 		assertEquals( declarator.getName().toString(), "foo");
@@ -600,6 +663,7 @@
 		assertEquals( n.toString(), "nay");
 		n = (Name)typenames.get(2);
 		assertEquals( n.toString(), "we::dont::care");
+		assertTrue( declarator.isPureVirtual() );
 	}
 
 
@@ -694,6 +758,60 @@
 		assertEquals( po5.getType(), PointerOperator.t_pointer );
 	}
 	
+	public void testBug26467() throws Exception
+	{
+		StringWriter code = new StringWriter(); 
+		code.write(	"struct foo { int fooInt; char fooChar;	};\n" );
+		code.write( "typedef struct foo fooStruct;\n" );
+		code.write( "typedef struct { int anonInt; char anonChar; } anonStruct;\n" );
+		
+		TranslationUnit tu = parse( code.toString() );
+		List tuDeclarations = tu.getDeclarations(); 
+		assertEquals( tuDeclarations.size(), 3 );
+		
+		SimpleDeclaration declaration = (SimpleDeclaration)tuDeclarations.get(0);
+		ClassSpecifier classSpec = (ClassSpecifier)declaration.getTypeSpecifier();
+		assertEquals( declaration.getDeclarators().size(), 0 );
+		assertEquals( classSpec.getClassKey(), ClassKey.t_struct);
+		assertEquals( classSpec.getName().toString(), "foo");
+		List subDeclarations = classSpec.getDeclarations();
+		assertEquals( subDeclarations.size(), 2 );
+		SimpleDeclaration subDeclaration = (SimpleDeclaration)subDeclarations.get(0);
+		assertEquals( subDeclaration.getDeclSpecifier().getType(), DeclSpecifier.t_int);
+		assertEquals( subDeclaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)subDeclaration.getDeclarators().get(0)).getName().toString(), "fooInt" ); 
+		subDeclaration = (SimpleDeclaration)subDeclarations.get(1);
+		assertEquals( subDeclaration.getDeclSpecifier().getType(), DeclSpecifier.t_char);
+		assertEquals( subDeclaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)subDeclaration.getDeclarators().get(0)).getName().toString(), "fooChar" ); 
+				
+		declaration = (SimpleDeclaration)tuDeclarations.get(1);
+		assertEquals( declaration.getDeclSpecifier().isTypedef(), true ); 
+		ElaboratedTypeSpecifier elab = (ElaboratedTypeSpecifier)declaration.getTypeSpecifier();
+		assertEquals( elab.getClassKey(), ClassKey.t_struct);
+		assertEquals( elab.getName().toString(), "foo" );
+		assertEquals( declaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)declaration.getDeclarators().get(0)).getName().toString(), "fooStruct" );
+		
+		declaration = (SimpleDeclaration)tuDeclarations.get(2);
+		assertEquals( declaration.getDeclSpecifier().isTypedef(), true ); 
+		classSpec = (ClassSpecifier) declaration.getTypeSpecifier();
+		assertEquals( classSpec.getClassKey(), ClassKey.t_struct );
+		assertNull( classSpec.getName() ); 
+		subDeclarations = classSpec.getDeclarations();
+		assertEquals( subDeclarations.size(), 2 ); 
+		subDeclaration = (SimpleDeclaration)subDeclarations.get(0);
+		assertEquals( subDeclaration.getDeclSpecifier().getType(), DeclSpecifier.t_int);
+		assertEquals( subDeclaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)subDeclaration.getDeclarators().get(0)).getName().toString(), "anonInt" ); 
+		subDeclaration = (SimpleDeclaration)subDeclarations.get(1);
+		assertEquals( subDeclaration.getDeclSpecifier().getType(), DeclSpecifier.t_char);
+		assertEquals( subDeclaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)subDeclaration.getDeclarators().get(0)).getName().toString(), "anonChar" ); 
+		assertEquals( declaration.getDeclarators().size(), 1 );
+		assertEquals( ((Declarator)declaration.getDeclarators().get(0)).getName().toString(), "anonStruct" );	
+	}
+	
 	public void testASMDefinition() throws Exception
 	{
 		TranslationUnit tu = parse( "asm( \"mov ep1 ds2\");" );
@@ -772,6 +890,35 @@
 		{
 			fail( "IOException thrown");
 		}				
+	}
+	
+	public void testTemplateDeclaration() throws Exception {
+		TranslationUnit tu = parse( "template<class T, typename Tibor = junk, class, typename> class myarray { /* ... */ };");
+		assertEquals( tu.getDeclarations().size(), 1 );
+		TemplateDeclaration declaration = (TemplateDeclaration)tu.getDeclarations().get(0);
+		assertEquals( declaration.getTemplateParameters().size(), 4 );
+		TemplateParameter parameter = (TemplateParameter)declaration.getTemplateParameters().get(0);
+		assertEquals( parameter.getKind(), TemplateParameter.k_class);
+		assertEquals( parameter.getName().toString(), "T" ); 
+		assertNull( parameter.getTypeId());
+		parameter = (TemplateParameter)declaration.getTemplateParameters().get(1);
+		assertEquals( parameter.getKind(), TemplateParameter.k_typename);
+		assertEquals( parameter.getName().toString(), "Tibor" );
+		assertEquals( parameter.getTypeId().toString(), "junk");
+		parameter = (TemplateParameter)declaration.getTemplateParameters().get(2);
+		assertEquals( parameter.getKind(), TemplateParameter.k_class);
+		assertNull( parameter.getName() );
+		assertNull( parameter.getTypeId());
+		parameter = (TemplateParameter)declaration.getTemplateParameters().get(3);
+		assertEquals( parameter.getKind(), TemplateParameter.k_typename);
+		assertNull( parameter.getName() );
+		assertNull( parameter.getTypeId());
+		assertEquals( declaration.getDeclarations().size(), 1 );
+		SimpleDeclaration myArray = (SimpleDeclaration)declaration.getDeclarations().get(0);
+		ClassSpecifier classSpec = (ClassSpecifier)myArray.getTypeSpecifier();
+		assertEquals( classSpec.getClassKey(), ClassKey.t_class ); 
+		assertEquals( classSpec.getName().toString(), "myarray");
+		assertEquals( 0, classSpec.getDeclarations().size() );
 	}
 }
 
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.6
diff -u -r1.6 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	17 Mar 2003 19:48:49 -0000	1.6
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java	31 Mar 2003 16:01:54 -0000
@@ -197,6 +197,45 @@
 		return scanner.getCount();
 	}
 
+	public void testWeirdStrings()
+	{
+		try
+		{
+			initializeScanner( "Living Life L\"LONG\"");
+			validateIdentifier( "Living" );
+			validateIdentifier( "Life" );
+			validateString("LONG", true);
+			validateEOF();
+		}
+		catch( ScannerException se )
+		{
+			fail(EXCEPTION_THROWN + se.toString());
+		}
+		
+	}
+	
+	
+	public void testNumerics()
+	{
+		try
+		{
+			initializeScanner("3.0 0.9 .5 3. 4E5 2.01E-03");
+			validateFloatingPointLiteral( "3.0");
+			validateFloatingPointLiteral( "0.9");
+			validateFloatingPointLiteral( ".5");
+			validateFloatingPointLiteral( "3."); 
+			validateFloatingPointLiteral( "4E5");
+			validateFloatingPointLiteral( "2.01E-03" );
+			validateEOF();
+		}
+		catch( ScannerException se )
+		{
+			fail(EXCEPTION_THROWN + se.toString());
+		}
+		
+	}
+	
+	
 	Scanner scanner;
 
 	/**
@@ -993,12 +1032,32 @@
 			assertTrue(false);
 		}
 	}
+	
+	public void validateFloatingPointLiteral(String expectedImage) throws ScannerException
+	{
+		try {
+			Token t= scanner.nextToken();
+			assertTrue(t.type == Token.tFLOATINGPT);
+			assertTrue(t.image.equals(expectedImage));
+		} catch (Parser.EndOfFile e) {
+			assertTrue(false);
+		}
+	}
+	
+
+	public void validateString( String expectedImage ) throws ScannerException
+	{
+		validateString( expectedImage, false );
+	}
 
-	public void validateString(String expectedImage) throws ScannerException
+	public void validateString(String expectedImage, boolean lString ) throws ScannerException
 	{
 		try {
 			Token t= scanner.nextToken();
-			assertTrue(t.type == Token.tSTRING);
+			if( lString )
+				assertTrue(t.type == Token.tLSTRING);
+			else
+				assertTrue(t.type == Token.tSTRING);
 			assertTrue(t.image.equals(expectedImage));
 		} catch (Parser.EndOfFile e) {
 			assertTrue(false);

Back to the top