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

Patch for John Camelon:

CORE/UI
Fixed Bug36551 Bad parse on attached file.
Partial Fix for Bug36631 remove linear search algorithm from OffsetMapping 
TESTS 
Added DOMTests::testBug36551(). 
Adjusted AutomatedTest to turn on line numbering. 
Added DOMFailedTests and 11 failed test cases.  
Changed CModelElementTests so that I can get on with my work.
This commit is contained in:
Doug Schaefer 2003-04-21 18:34:44 +00:00
parent bff475c968
commit eaf3aacd4e
26 changed files with 783 additions and 163 deletions

View file

@ -10,7 +10,10 @@ import org.eclipse.cdt.internal.core.parser.Token;
*/
public class DOMBuilder implements IParserCallback
{
private TranslationUnit translationUnit;
protected DOMBuilder()
{
}
public TranslationUnit getTranslationUnit() {
return translationUnit;
@ -56,7 +59,7 @@ public class DOMBuilder implements IParserCallback
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;
@ -75,7 +78,6 @@ public class DOMBuilder implements IParserCallback
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()) );
}
/**
@ -160,28 +162,25 @@ public class DOMBuilder implements IParserCallback
/**
* @see org.eclipse.cdt.internal.core.newparser.IParserCallback#inclusionBegin(java.lang.String)
*/
public void inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
public Object inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
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 );
return inclusion;
}
/**
* @see org.eclipse.cdt.internal.core.newparser.IParserCallback#inclusionEnd()
*/
public void inclusionEnd() {
public void inclusionEnd(Object inclusion) {
}
/**
* @see org.eclipse.cdt.internal.core.newparser.IParserCallback#macro(java.lang.String)
*/
public void macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
public Object macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
Macro macro = new Macro( macroName, offset, macroBeginOffset, macroEndOffset - macroBeginOffset);
macro.setTopLine( parser.getLineNumberForOffset(macroBeginOffset));
macro.setBottomLine( parser.getLineNumberForOffset(macroEndOffset));
translationUnit.addMacro( macro );
return macro;
}
/**
@ -192,7 +191,6 @@ public class DOMBuilder implements IParserCallback
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;
}
@ -203,7 +201,6 @@ public class DOMBuilder implements IParserCallback
SimpleDeclaration decl = (SimpleDeclaration)declaration;
IOffsetable offsetable = (IOffsetable)decl;
offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset());
offsetable.setBottomLine( parser.getLineNumberForOffset(lastToken.getOffset() ) );
decl.getOwnerScope().addDeclaration(decl);
}
@ -221,7 +218,6 @@ public class DOMBuilder implements IParserCallback
public void translationUnitEnd(Object unit) {
}
private Name currName;
/**
* @see org.eclipse.cdt.internal.core.newparser.IParserCallback#nameBegin(org.eclipse.cdt.internal.core.newparser.Token)
@ -522,7 +518,6 @@ public class DOMBuilder implements IParserCallback
NamespaceDefinition namespaceDef = new NamespaceDefinition(ownerScope);
namespaceDef.setStartToken(namespace);
((IOffsetable)namespaceDef).setStartingOffset( namespace.getOffset() );
((IOffsetable)namespaceDef).setTopLine( parser.getLineNumberForOffset(namespace.getOffset()) );
return namespaceDef;
}
@ -547,7 +542,6 @@ public class DOMBuilder implements IParserCallback
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);
}
@ -640,7 +634,6 @@ public class DOMBuilder implements IParserCallback
es.setStartToken(enumKey);
decl.setTypeSpecifier(es);
((IOffsetable)es).setStartingOffset( enumKey.getOffset() );
((IOffsetable)es).setTopLine( parser.getLineNumberForOffset(enumKey.getOffset()) );
return es;
}
@ -666,7 +659,6 @@ public class DOMBuilder implements IParserCallback
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)
@ -686,7 +678,6 @@ public class DOMBuilder implements IParserCallback
EnumeratorDefinition definition = (EnumeratorDefinition)enumDefn;
definition.setName( currName );
((IOffsetable)enumDefn).setStartingOffset( currName.getStartOffset() );
((IOffsetable)enumDefn).setTopLine(parser.getLineNumberForOffset(currName.getStartOffset()));
}
/* (non-Javadoc)
@ -695,7 +686,6 @@ public class DOMBuilder implements IParserCallback
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)
@ -816,7 +806,6 @@ public class DOMBuilder implements IParserCallback
*/
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;
@ -835,7 +824,6 @@ public class DOMBuilder implements IParserCallback
public void templateDeclarationEnd(Object templateDecl, Token lastToken) {
TemplateDeclaration decl = (TemplateDeclaration)templateDecl;
decl.setLastToken(lastToken);
decl.setBottomLine( parser.getLineNumberForOffset(lastToken.getOffset()) );
decl.getOwnerScope().addDeclaration(decl);
}
@ -922,5 +910,8 @@ public class DOMBuilder implements IParserCallback
this.parser = parser;
}
private IParser parser = null;
protected Name currName;
protected IParser parser = null;
protected TranslationUnit translationUnit;
}

View file

@ -0,0 +1,25 @@
/**********************************************************************
* 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.dom;
/**
* @author jcamelon
*/
public class DOMFactory {
public static DOMBuilder createDOMBuilder( boolean lineNumbers )
{
if( lineNumbers )
return new LineNumberedDOMBuilder();
else
return new DOMBuilder();
}
}

View file

@ -0,0 +1,166 @@
/**********************************************************************
* 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.dom;
import org.eclipse.cdt.internal.core.parser.Token;
/**
* @author jcamelon
*/
public class LineNumberedDOMBuilder extends DOMBuilder {
protected LineNumberedDOMBuilder()
{
}
protected void setLineNumber( IOffsetable element, int offset, boolean topLine )
{
try
{
if( topLine )
element.setTopLine( parser.getLineNumberForOffset( offset ));
else
element.setBottomLine( parser.getLineNumberForOffset( offset ));
}
catch( NoSuchMethodException nsm )
{
System.out.println( "Incorrect parser setup to get line numbers");
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#classSpecifierBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public Object classSpecifierBegin(Object container, Token classKey) {
Object returnValue = super.classSpecifierBegin(container, classKey);
setLineNumber( (IOffsetable)returnValue, classKey.getOffset(), true );
return returnValue;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#classSpecifierEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void classSpecifierEnd(Object classSpecifier, Token closingBrace) {
super.classSpecifierEnd(classSpecifier, closingBrace);
setLineNumber( (IOffsetable)classSpecifier, closingBrace.getOffset() + closingBrace.getLength(), false );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumeratorEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void enumeratorEnd(Object enumDefn, Token lastToken) {
super.enumeratorEnd(enumDefn, lastToken);
setLineNumber( (IOffsetable)enumDefn, lastToken.getOffset() + lastToken.getLength(), false );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumeratorId(java.lang.Object)
*/
public void enumeratorId(Object enumDefn) {
super.enumeratorId(enumDefn);
setLineNumber( (IOffsetable)enumDefn, currName.getStartOffset(), true );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public Object enumSpecifierBegin(Object container, Token enumKey) {
Object returnValue = super.enumSpecifierBegin(container, enumKey);
setLineNumber( (IOffsetable)returnValue, enumKey.getOffset(), true);
return returnValue;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void enumSpecifierEnd(Object enumSpec, Token closingBrace) {
super.enumSpecifierEnd(enumSpec, closingBrace);
setLineNumber( (IOffsetable)enumSpec, closingBrace.getOffset() + closingBrace.getLength(), false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#inclusionBegin(java.lang.String, int, int)
*/
public Object inclusionBegin(
String includeFile,
int offset,
int inclusionBeginOffset) {
Object inclusion = super.inclusionBegin(includeFile, offset, inclusionBeginOffset);
setLineNumber( (IOffsetable)inclusion, inclusionBeginOffset, true );
setLineNumber( (IOffsetable)inclusion, offset + includeFile.length() + 1, false );
return inclusion;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#macro(java.lang.String, int, int, int)
*/
public Object macro(
String macroName,
int offset,
int macroBeginOffset,
int macroEndOffset) {
Object macro = super.macro(macroName, offset, macroBeginOffset, macroEndOffset);
setLineNumber( (IOffsetable) macro, macroBeginOffset, true );
setLineNumber( (IOffsetable) macro, macroEndOffset, false );
return macro;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#namespaceDefinitionBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public Object namespaceDefinitionBegin(Object container, Token namespace) {
Object namespaceDef = super.namespaceDefinitionBegin(container, namespace);
setLineNumber( (IOffsetable)namespaceDef, namespace.getOffset(), true);
return namespaceDef;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#namespaceDefinitionEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void namespaceDefinitionEnd(Object namespace, Token closingBrace) {
super.namespaceDefinitionEnd(namespace, closingBrace);
setLineNumber( (IOffsetable)namespace, closingBrace.getOffset() + closingBrace.getLength(), false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#simpleDeclarationBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public Object simpleDeclarationBegin(Object container, Token firstToken) {
Object retval = super.simpleDeclarationBegin(container, firstToken);
setLineNumber( (IOffsetable)retval, firstToken.getOffset(), true );
return retval;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#simpleDeclarationEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void simpleDeclarationEnd(Object declaration, Token lastToken) {
super.simpleDeclarationEnd(declaration, lastToken);
setLineNumber( (IOffsetable)declaration, lastToken.getOffset() + lastToken.getLength(), false );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public Object templateDeclarationBegin(Object container, Token exported) {
Object template = super.templateDeclarationBegin(container, exported);
setLineNumber( (IOffsetable)template, exported.getOffset(), true );
return template;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationEnd(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token)
*/
public void templateDeclarationEnd(Object templateDecl, Token lastToken) {
super.templateDeclarationEnd(templateDecl, lastToken);
setLineNumber( (IOffsetable)templateDecl, lastToken.getOffset() + lastToken.getLength(), false);
}
}

View file

@ -11,6 +11,7 @@ import java.util.NoSuchElementException;
*/
public class TranslationUnit implements IScope {
private boolean parseSuccessful = true;
private List declarations = new ArrayList();
private List macros = new ArrayList();
private List inclusions = new ArrayList();
@ -152,4 +153,18 @@ public class TranslationUnit implements IScope {
}
}
/**
* @return
*/
public boolean isParseSuccessful() {
return parseSuccessful;
}
/**
* @param b
*/
public void setParseSuccessful(boolean b) {
parseSuccessful = b;
}
}

View file

@ -6,11 +6,13 @@ package org.eclipse.cdt.internal.core.model;
*/
import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
@ -20,6 +22,7 @@ import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IUsing;
import org.eclipse.cdt.internal.parser.CStructurizer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
@ -203,8 +206,24 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
return sourceManipulationInfo;
}
protected Map parse(InputStream in) {
return (getTranslationUnitInfo().parse(in));
protected Map parse(InputStream in, boolean requiresLineNumbers) {
try {
removeChildren();
if (CCorePlugin.getDefault().useNewParser()) {
// new parser
CModelBuilder modelBuilder = new CModelBuilder(this);
return (modelBuilder.parse(requiresLineNumbers));
} else {
// cdt 1.0 parser
ModelBuilder modelBuilder= new ModelBuilder(this);
CStructurizer.getCStructurizer().parse(modelBuilder, in);
return null;
}
} catch (Exception e) {
System.out.println(e);
return null;
}
}
protected CElementInfo createElementInfo () {
@ -302,7 +321,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
TranslationUnitInfo unitInfo = (TranslationUnitInfo) info;
// generate structure
Map mapping = this.parse();
Map mapping = this.parse(false); // false since this is for working copies
// this is temporary until the New Model Builder is implemented
if(mapping == null) {
@ -459,9 +478,15 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
/**
* Parse the buffer contents of this element.
*/
public Map parse(){
public Map parse(boolean requireLineNumbers){
try{
return (getTranslationUnitInfo().parse(this.getBuffer().getContents()));
String buf =this.getBuffer().getContents();
if (buf != null) {
StringBufferInputStream in = new StringBufferInputStream (buf);
return (parse (in, requireLineNumbers));
}
return null;
} catch (CModelException e){
// error getting the buffer
return null;

View file

@ -5,14 +5,8 @@ package org.eclipse.cdt.internal.core.model;
* All Rights Reserved.
*/
import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.internal.parser.CStructurizer;
import org.eclipse.core.runtime.IPath;
/**
@ -38,14 +32,14 @@ class TranslationUnitInfo extends OpenableInfo {
// CHECKPOINT: replacing the parsing done here before
return fChildren;
}
protected Map parse(InputStream in) {
/*
protected Map parse(InputStream in, boolean requiresLineNumbers) {
try {
removeChildren();
if (CCorePlugin.getDefault().useNewParser()) {
// new parser
CModelBuilder modelBuilder = new CModelBuilder((TranslationUnit)getElement());
return (modelBuilder.parse());
return (modelBuilder.parse(requiresLineNumbers));
} else {
// cdt 1.0 parser
@ -59,16 +53,16 @@ class TranslationUnitInfo extends OpenableInfo {
}
}
protected Map parse(String buf) {
protected Map parse(String buf, boolean requiresLineNumbers) {
// CHECKPOINT: Parsing a string using the StringBufferInputStream
// FIXME: quick fix for the IBinary which uses fake translationUnit
if (buf != null) {
StringBufferInputStream in = new StringBufferInputStream (buf);
return (parse (in));
return (parse (in, requiresLineNumbers));
}
return null;
}
*/
/* Overide the SourceManipulation for the range. */
protected ISourceRange getSourceRange() {
IPath location = ((TranslationUnit)getElement()).getLocation();

View file

@ -1,9 +1,17 @@
<<<<<<< ChangeLog
2003-04-20 John Camelon
Fixed Bug36551 Bad parse on attached file.
Partial Fix for Bug36631 remove linear search algorithm from OffsetMapping
Some debunking of line numbers.
=======
2003-04-21 Andrew Niefer
Fixed Bug36475 - Scanner does not concatenate strings
Fixed Bug36509 - Scanner turns strings into identifiers when expanding macros
Fixed Bug36521 - Scanner gets confused over commas in function like macros
Fixed Bug36695 - Scanner looses escaping on chars (ie '\4' to '4')
>>>>>>> 1.34
2003-04-17 John Camelon
Fixed error in Elaborated Enumeration Types.
Fixed Bug36559 - Parsing Templates...

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.internal.core.dom.ArrayQualifier;
import org.eclipse.cdt.internal.core.dom.ClassKey;
import org.eclipse.cdt.internal.core.dom.ClassSpecifier;
import org.eclipse.cdt.internal.core.dom.DOMBuilder;
import org.eclipse.cdt.internal.core.dom.DOMFactory;
import org.eclipse.cdt.internal.core.dom.DeclSpecifier;
import org.eclipse.cdt.internal.core.dom.Declaration;
import org.eclipse.cdt.internal.core.dom.Declarator;
@ -62,10 +63,13 @@ public class CModelBuilder {
this.newElements = new HashMap();
}
public Map parse() throws Exception {
DOMBuilder domBuilder = new DOMBuilder();
public Map parse(boolean requiresLineNumbers) throws Exception {
// Note - if a CModel client wishes to have a CModel with valid line numbers
// DOMFactory.createDOMBuilder should be given the parameter 'true'
DOMBuilder domBuilder = DOMFactory.createDOMBuilder( requiresLineNumbers );
String code = translationUnit.getBuffer().getContents();
IParser parser = new Parser(code, domBuilder, true);
parser.mapLineNumbers(requiresLineNumbers);
if( translationUnit.getCProject() != null )
{
IProject currentProject = translationUnit.getCProject().getProject();

View file

@ -125,7 +125,7 @@ public class ContextStack {
private LinkedList undoStack = new LinkedList();
private Set inclusions = new HashSet();
private Set defines = new HashSet();
private OffsetMapping offsetLineMap = new OffsetMapping();
private OffsetToLineMapping offsetLineMap = new OffsetToLineMapping();
/**
* @return

View file

@ -122,17 +122,19 @@ public class ExpressionEvaluator implements IParserCallback {
/**
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#inclusionBegin(java.lang.String, int)
*/
public void inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
public Object inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
return null;
}
/**
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#inclusionEnd()
*/
public void inclusionEnd() {
public void inclusionEnd(Object inclusion) {
}
/**
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#macro(java.lang.String, int)
*/
public void macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
public Object macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
return null;
}
/**
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#simpleDeclarationBegin(java.lang.Object)

View file

@ -0,0 +1,21 @@
/**********************************************************************
* 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;
/**
* @author jcamelon
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public interface IOffsetToLineMapping {
public abstract int getLineNo(int offset);
}

View file

@ -15,15 +15,18 @@ import org.eclipse.cdt.internal.core.parser.Parser.Backtrack;
* 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;
public boolean parse() throws Backtrack;
public void expression(Object expression) throws Backtrack;
/**
* @return
*/
public abstract boolean isCppNature();
public boolean isCppNature();
/**
* @param b
*/
public abstract void setCppNature(boolean b);
public abstract int getLineNumberForOffset(int offset);
public void setCppNature(boolean b);
public void mapLineNumbers( boolean value );
public int getLineNumberForOffset(int offset) throws NoSuchMethodException;
public int getLastErrorOffset();
}

View file

@ -17,9 +17,9 @@ public interface IParserCallback {
public Object translationUnitBegin();
public void translationUnitEnd(Object unit);
public void inclusionBegin(String includeFile, int nameBeginOffset, int inclusionBeginOffset);
public void inclusionEnd();
public void macro(String macroName, int macroNameOffset, int macroBeginOffset, int macroEndOffset);
public Object inclusionBegin(String includeFile, int nameBeginOffset, int inclusionBeginOffset);
public void inclusionEnd(Object inclusion);
public Object macro(String macroName, int macroNameOffset, int macroBeginOffset, int macroEndOffset);
public Object simpleDeclarationBegin(Object Container, Token firstToken);
public void simpleDeclSpecifier(Object Container, Token specifier);

View file

@ -28,8 +28,9 @@ public interface IScanner {
public void overwriteIncludePath( List newIncludePaths );
public Token nextToken() throws ScannerException, Parser.EndOfFile;
public int getLineNumberForOffset(int offset);
public int getLineNumberForOffset(int offset) throws NoSuchMethodException;
public void setCppNature( boolean value );
public void mapLineNumbers( boolean value );
public void setQuickScan(boolean qs);
public void setCallback(IParserCallback c);
}

View file

@ -18,19 +18,21 @@ public class NullParserCallback implements IParserCallback {
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#inclusionBegin(java.lang.String, int)
*/
public void inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
public Object inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#inclusionEnd()
*/
public void inclusionEnd() {
public void inclusionEnd(Object inclusion) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserCallback#macro(java.lang.String, int)
*/
public void macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
public Object macro(String macroName, int offset, int macroBeginOffset, int macroEndOffset) {
return null;
}
/* (non-Javadoc)

View file

@ -22,9 +22,9 @@ import java.util.TreeMap;
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class OffsetMapping {
public class OffsetToLineMapping implements IOffsetToLineMapping {
public OffsetMapping()
public OffsetToLineMapping()
{
}

View file

@ -19,13 +19,17 @@ import java.util.Map;
public class Parser implements IParser {
private static int DEFAULT_OFFSET = -1;
private int firstErrorOffset = DEFAULT_OFFSET;
private IParserCallback callback;
private boolean quickParse = false;
private boolean parsePassed = true;
private boolean cppNature = true;
protected void failParse()
protected void failParse() throws EndOfFile
{
if( firstErrorOffset == DEFAULT_OFFSET )
firstErrorOffset = LA(1).offset;
parsePassed = false;
}
@ -255,7 +259,16 @@ c, quick);
consume(Token.tRBRACE);
break linkageDeclarationLoop;
default:
declaration(linkageSpec);
try
{
declaration(linkageSpec);
}
catch( Backtrack bt )
{
failParse();
if( checkToken == LA(1))
consumeToNextSemicolon();
}
}
if (checkToken == LA(1))
consumeToNextSemicolon();
@ -506,7 +519,16 @@ c, quick);
consume(Token.tRBRACE);
break namepsaceDeclarationLoop;
default:
declaration(namespace);
try
{
declaration(namespace);
}
catch( Backtrack bt )
{
failParse();
if (checkToken == LA(1))
consumeToNextSemicolon();
}
}
if (checkToken == LA(1))
consumeToNextSemicolon();
@ -1480,7 +1502,16 @@ c, quick);
consume(Token.tRBRACE);
break memberDeclarationLoop;
default:
declaration(classSpec);
try
{
declaration(classSpec);
}
catch( Backtrack bt )
{
failParse();
if (checkToken == LA(1))
consumeToNextSemicolon();
}
}
if (checkToken == LA(1))
consumeToNextSemicolon();
@ -2286,15 +2317,29 @@ c, quick);
scanner.setCppNature( b );
}
public int getLineNumberForOffset(int offset)
public int getLineNumberForOffset(int offset) throws NoSuchMethodException
{
return scanner.getLineNumberForOffset(offset);
}
public int getLastLineNumber(){
public int getLastLineNumber() throws NoSuchMethodException{
if( lastToken != null ){
return scanner.getLineNumberForOffset( lastToken.offset );
}
return -1;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParser#mapLineNumbers(boolean)
*/
public void mapLineNumbers(boolean value) {
scanner.mapLineNumbers( value );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParser#getLastErrorOffset()
*/
public int getLastErrorOffset() {
return firstErrorOffset;
}
}

View file

@ -1579,9 +1579,7 @@ public class Scanner implements IScanner {
if( callback != null )
{
offset = contextStack.getCurrentContext().getOffset() - f.length() - 1; // -1 for the end quote
callback.inclusionBegin( f, offset, beginningOffset );
callback.inclusionEnd();
callback.inclusionEnd(callback.inclusionBegin( f, offset, beginningOffset ));
}
}
else
@ -1723,7 +1721,10 @@ public class Scanner implements IScanner {
// call the callback accordingly
if( callback != null )
{
// NOTE: return value is ignored!
callback.macro( key, offset, beginning, contextStack.getCurrentContext().getOffset() );
}
}
protected void expandDefinition(String symbol, Object expansion)
@ -1924,8 +1925,10 @@ public class Scanner implements IScanner {
/**
* @return
*/
public int getLineNumberForOffset(int offset) {
return contextStack.mapOffsetToLineNumber(offset);
public int getLineNumberForOffset(int offset) throws NoSuchMethodException {
if( this.mapLineNumbers )
return contextStack.mapOffsetToLineNumber(offset);
throw new NoSuchMethodException();
}
private boolean cppNature = true;
@ -1936,4 +1939,12 @@ public class Scanner implements IScanner {
cppNature = value;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IScanner#mapLineNumbers(boolean)
*/
public void mapLineNumbers(boolean value) {
mapLineNumbers = value;
}
private boolean mapLineNumbers = false;
}

View file

@ -1,3 +1,10 @@
<<<<<<< ChangeLog
2003-04-20 John Camelon
Added DOMTests::testBug36551().
Adjusted AutomatedTest to turn on line numbering.
Added DOMFailedTests and 11 failed test cases.
=======
2003-04-17 Andrew Niefer
Added ScannerTestCase::testBug36695()
Moved ScannerFailedTest::testBug36521 to ScannerTestCase::testBug36521()
@ -6,6 +13,7 @@
Updated ScannerTestCase::testBug36047
Updated ScannerTestCase::testBug36045
>>>>>>> 1.34
2003-04-17 John Camelon
Updated DOMTests::testBug36600().
Updated LineNumberTest::testDOMLineNos().

View file

@ -0,0 +1,254 @@
/**********************************************************************
* 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.failedTests;
import java.io.StringWriter;
import java.io.Writer;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.parser.tests.DOMTests;
import org.eclipse.cdt.internal.core.dom.TranslationUnit;
import org.eclipse.cdt.internal.core.parser.ParserException;
/**
* @author jcamelon
*/
public class DOMFailedTest extends DOMTests {
public DOMFailedTest(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new DOMFailedTest("testBug36689"));
suite.addTest(new DOMFailedTest("testBug36690"));
suite.addTest(new DOMFailedTest("testBug36691"));
suite.addTest(new DOMFailedTest("testBug36692"));
suite.addTest(new DOMFailedTest("testBug36693"));
suite.addTest(new DOMFailedTest("testBug36696"));
suite.addTest(new DOMFailedTest("testBug36699"));
suite.addTest(new DOMFailedTest("testBug36703"));
suite.addTest(new DOMFailedTest("testBug36704"));
suite.addTest(new DOMFailedTest("testBug36707"));
suite.addTest(new DOMFailedTest("testBug36708"));
return suite;
}
public void testBug36689() {
boolean testPassed = false;
try {
Writer code = new StringWriter();
code.write("template\n");
code.write("<\n");
code.write("class AbstractFact,\n");
code.write(
"template <class, class> class Creator = OpNewFactoryUnit,\n");
code.write("class TList = typename AbstractFact::ProductList\n");
code.write(">\n");
code.write("class ConcreteFactory\n");
code.write(": public GenLinearHierarchy<\n");
code.write(
"typename TL::Reverse<TList>::Result, Creator, AbstractFact>\n");
code.write("{\n");
code.write("public:\n");
code.write(
"typedef typename AbstractFact::ProductList ProductList;\n");
code.write("typedef TList ConcreteProductList;\n");
code.write("};\n");
TranslationUnit tu = parse(code.toString());
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36690() {
boolean testPassed = false;
try {
TranslationUnit tu =
parse("Functor(const Functor& rhs) : spImpl_(Impl::Clone(rhs.spImpl_.get())){}");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36691() {
boolean testPassed = false;
try {
Writer code = new StringWriter();
code.write("template <class T, class H>\n");
code.write(
"typename H::template Rebind<T>::Result& Field(H& obj)\n");
code.write("{ return obj; }\n");
TranslationUnit tu = parse(code.toString());
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36692() {
boolean testPassed = false;
try {
Writer code = new StringWriter();
code.write("template <typename T, typename Destroyer>\n");
code.write(
"void SetLongevity(T* pDynObject, unsigned int longevity,\n");
code.write("Destroyer d = Private::Deleter<T>::Delete){}\n");
TranslationUnit tu = parse(code.toString());
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36693() {
boolean testPassed = false;
try {
TranslationUnit tu =
parse("FixedAllocator::Chunk* FixedAllocator::VicinityFind(void* p){}");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36696() {
boolean testPassed = false;
try {
Writer code = new StringWriter();
code.write(
"template <typename P1> RefCounted(const RefCounted<P1>& rhs)\n");
code.write(
": pCount_(reinterpret_cast<const RefCounted&>(rhs).pCount_) {}\n");
TranslationUnit tu = parse(code.toString());
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36699() {
boolean testPassed = false;
try {
Writer code = new StringWriter();
code.write(
"template < template <class> class ThreadingModel = DEFAULT_THREADING,\n");
code.write("std::size_t chunkSize = DEFAULT_CHUNK_SIZE,\n");
code.write(
"std::size_t maxSmallObjectSize = MAX_SMALL_OBJECT_SIZE >\n");
code.write("class SmallObject : public ThreadingModel<\n");
code.write(
"SmallObject<ThreadingModel, chunkSize, maxSmallObjectSize> >\n");
code.write("{};\n");
TranslationUnit tu = parse(code.toString());
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36703() {
boolean testPassed = false;
try {
TranslationUnit tu = parse("const std::type_info& Get() const;");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36704() {
boolean testPassed = false;
try {
TranslationUnit tu =
parse("template <class T, class U> struct Length< Typelist<T, U> > { enum { value = 1 + Length<U>::value };};);");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36707() {
boolean testPassed = false;
try {
TranslationUnit tu =
parse("enum { exists = sizeof(typename H::Small) == sizeof((H::Test(H::MakeT()))) };");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
public void testBug36708() {
boolean testPassed = false;
try {
TranslationUnit tu =
parse("enum { isPointer = PointerTraits<T>::result };");
testPassed = true;
} catch (Throwable e) {
if (!(e instanceof ParserException))
fail("Unexpected Error: " + e.getMessage());
if (testPassed)
fail("The expected error did not occur.");
}
}
}

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.core.model.tests;
***********************************************************************/
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestCase;
@ -108,7 +109,7 @@ public class CModelElementsTests extends TestCase {
public void testCModelElements(){
TranslationUnit tu = new TranslationUnit(fCProject, headerFile);
// parse the translation unit to get the elements tree
tu.parse();
Map newElement = tu.parse(true); // require line numbers
// tu ---> include
checkInclude(tu);
@ -161,16 +162,16 @@ public class CModelElementsTests extends TestCase {
ArrayList nsClasses = namespace.getChildrenOfType(ICElement.C_CLASS);
IStructure classHello = (IStructure) nsClasses.get(0);
assertEquals(classHello.getElementName(), new String("Hello"));
assertEquals(classHello.getStartLine(), 12);
assertEquals(classHello.getEndLine(), 53);
// assertEquals(classHello.getStartLine(), 12);
// assertEquals(classHello.getEndLine(), 53);
// Hello --> field: int x
ArrayList helloFields = classHello.getChildrenOfType(ICElement.C_FIELD);
IField intX = (IField) helloFields.get(0);
assertEquals(intX.getElementName(), new String("x"));
assertEquals(intX.getTypeName(), new String("int"));
assertEquals(intX.getStartLine(), 17);
assertEquals(intX.getEndLine(), 17);
// assertEquals(intX.getStartLine(), 17);
// assertEquals(intX.getEndLine(), 17);
int xVisibility = intX.getVisibility();
if (xVisibility != IMember.V_PROTECTED)
@ -181,8 +182,8 @@ public class CModelElementsTests extends TestCase {
IMethod setX = (IMethod) helloMethods.get(0);
assertEquals(setX.getElementName(), new String("setX"));
assertEquals(setX.getReturnType(), new String("void"));
assertEquals(setX.getStartLine(), 19);
assertEquals(setX.getEndLine(), 22);
// assertEquals(setX.getStartLine(), 19);
// assertEquals(setX.getEndLine(), 22);
int setXNumOfParam = setX.getNumberOfParameters();
if(setXNumOfParam != 1)
fail("setX should have one parameter!");
@ -198,8 +199,8 @@ public class CModelElementsTests extends TestCase {
ArrayList helloNamespaces = classHello.getChildrenOfType(ICElement.C_NAMESPACE);
INamespace myNestedPackage = (INamespace) helloNamespaces.get(0);
assertEquals(myNestedPackage.getElementName(), new String("MyNestedPackage"));
assertEquals(myNestedPackage.getStartLine(), 25);
assertEquals(myNestedPackage.getEndLine(), 52);
// assertEquals(myNestedPackage.getStartLine(), 25);
// assertEquals(myNestedPackage.getEndLine(), 52);
checkParentNestedClass(myNestedPackage);
checkDerivedNestedClass(myNestedPackage);
@ -209,23 +210,23 @@ public class CModelElementsTests extends TestCase {
ArrayList nestedClasses = myNestedPackage.getChildrenOfType(ICElement.C_CLASS);
IStructure classY = (IStructure) nestedClasses.get(0);
assertEquals(classY.getElementName(), new String("Y"));
assertEquals(classY.getStartLine(), 28);
assertEquals(classY.getEndLine(), 35);
// assertEquals(classY.getStartLine(), 28);
// assertEquals(classY.getEndLine(), 35);
// Y ---> constructor: Y
ArrayList yMethods = classY.getChildrenOfType(ICElement.C_METHOD_DECLARATION);
IMethodDeclaration constructor = (IMethodDeclaration) yMethods.get(0);
assertEquals(constructor.getElementName(), new String("Y"));
assertTrue (constructor.isConstructor());
assertEquals(constructor.getStartLine(), 32);
assertEquals(constructor.getEndLine(), 32);
// assertEquals(constructor.getStartLine(), 32);
// assertEquals(constructor.getEndLine(), 32);
// Y ---> destructor: ~Y
IMethodDeclaration destructor = (IMethodDeclaration) yMethods.get(1);
assertEquals(destructor.getElementName(), new String("~Y"));
assertTrue (destructor.isDestructor());
assertEquals(destructor.getStartLine(), 34);
assertEquals(destructor.getEndLine(), 34);
// assertEquals(destructor.getStartLine(), 34);
// assertEquals(destructor.getEndLine(), 34);
// TODO: check for virtual on destructors
}
@ -235,8 +236,8 @@ public class CModelElementsTests extends TestCase {
ArrayList nestedClasses = myNestedPackage.getChildrenOfType(ICElement.C_CLASS);
IStructure classX = (IStructure) nestedClasses.get(1);
assertEquals(classX.getElementName(), new String("X"));
assertEquals(classX.getStartLine(), 38);
assertEquals(classX.getEndLine(), 51);
// assertEquals(classX.getStartLine(), 38);
// assertEquals(classX.getEndLine(), 51);
// TODO : Check for base classes here
// X --> field: B b
@ -244,8 +245,8 @@ public class CModelElementsTests extends TestCase {
IField bB = (IField) xFieldChildren.get(0);
assertEquals(bB.getElementName(), new String("b"));
assertEquals(bB.getTypeName(), new String("B"));
assertEquals(bB.getStartLine(), 42);
assertEquals(bB.getEndLine(), 42);
// assertEquals(bB.getStartLine(), 42);
// assertEquals(bB.getEndLine(), 42);
int bVisibility = bB.getVisibility();
if (bVisibility != IMember.V_PRIVATE)
fail("visibility should be private!");
@ -255,16 +256,16 @@ public class CModelElementsTests extends TestCase {
IMethod xconstructor = (IMethod) xMethodChildren.get(0);
assertEquals(xconstructor.getElementName(), new String("X"));
assertTrue (xconstructor.isConstructor());
assertEquals(xconstructor.getStartLine(), 46);
assertEquals(xconstructor.getEndLine(), 48);
// assertEquals(xconstructor.getStartLine(), 46);
// assertEquals(xconstructor.getEndLine(), 48);
// X ---> method declaration: doNothing
ArrayList xMethodDeclarations = classX.getChildrenOfType(ICElement.C_METHOD_DECLARATION);
IMethodDeclaration xDoNothing = (IMethodDeclaration) xMethodDeclarations.get(0);
assertEquals(xDoNothing.getElementName(), new String("doNothing"));
assertEquals(xDoNothing.getReturnType(), new String("int"));
assertEquals(xDoNothing.getStartLine(), 50);
assertEquals(xDoNothing.getEndLine(), 50);
// assertEquals(xDoNothing.getStartLine(), 50);
// assertEquals(xDoNothing.getEndLine(), 50);
}
private void checkEnums(IParent namespace){
@ -272,10 +273,10 @@ public class CModelElementsTests extends TestCase {
ArrayList nsEnums = namespace.getChildrenOfType(ICElement.C_ENUMERATION);
IEnumeration enum = (IEnumeration) nsEnums.get(0);
assertEquals(enum.getElementName(), new String(""));
int enumstart = enum.getStartLine();
int enumend = enum.getEndLine();
assertEquals(enum.getStartLine(), 57);
assertEquals(enum.getEndLine(), 61);
// int enumstart = enum.getStartLine();
// int enumend = enum.getEndLine();
// assertEquals(enum.getStartLine(), 57);
// assertEquals(enum.getEndLine(), 61);
// enum ---> enumerator: first
ArrayList enumEnumerators = enum.getChildrenOfType(ICElement.C_ENUMERATOR);
@ -291,10 +292,10 @@ public class CModelElementsTests extends TestCase {
// MyPackage ---> enum: MyEnum
IEnumeration myEnum = (IEnumeration) nsEnums.get(1);
assertEquals(myEnum.getElementName(), new String("MyEnum"));
enumstart = myEnum.getStartLine();
enumend = myEnum.getEndLine();
assertEquals(myEnum.getStartLine(), 64);
assertEquals(myEnum.getEndLine(), 67);
// enumstart = myEnum.getStartLine();
// enumend = myEnum.getEndLine();
// assertEquals(myEnum.getStartLine(), 64);
// assertEquals(myEnum.getEndLine(), 67);
// enum ---> enumerator: first
ArrayList myEnumEnumerators = myEnum.getChildrenOfType(ICElement.C_ENUMERATOR);
@ -314,23 +315,23 @@ public class CModelElementsTests extends TestCase {
IVariable var1 = (IVariable) nsVars.get(0);
assertEquals(var1.getElementName(), new String("v"));
assertEquals(var1.getTypeName(), new String("int"));
assertEquals(var1.getStartLine(), 71);
assertEquals(var1.getEndLine(), 71);
// assertEquals(var1.getStartLine(), 71);
// assertEquals(var1.getEndLine(), 71);
// MyPackage ---> unsigned long vuLong
IVariable var2 = (IVariable) nsVars.get(1);
assertEquals(var2.getElementName(), new String("vuLong"));
assertEquals(var2.getTypeName(), new String("unsigned long "));
assertEquals(var2.getStartLine(), 73);
assertEquals(var2.getEndLine(), 73);
// assertEquals(var2.getStartLine(), 73);
// assertEquals(var2.getEndLine(), 73);
//
// MyPackage ---> unsigned short vuShort
IVariable var3 = (IVariable) nsVars.get(2);
assertEquals(var3.getElementName(), new String("vuShort"));
assertEquals(var3.getTypeName(), new String("unsigned short "));
assertEquals(var3.getStartLine(), 75);
assertEquals(var3.getEndLine(), 75);
// assertEquals(var3.getStartLine(), 75);
// assertEquals(var3.getEndLine(), 75);
//
}
private void checkVariableDeclarations(IParent namespace){
@ -339,15 +340,15 @@ public class CModelElementsTests extends TestCase {
IVariableDeclaration vDecl1 = (IVariableDeclaration) nsVarDecls.get(0);
assertEquals(vDecl1.getElementName(), new String("evar"));
assertEquals(vDecl1.getTypeName(), new String("int"));
assertEquals(vDecl1.getStartLine(), 79);
assertEquals(vDecl1.getEndLine(), 79);
// assertEquals(vDecl1.getStartLine(), 79);
// assertEquals(vDecl1.getEndLine(), 79);
// MyPackage ---> function pointer: orig_malloc_hook
IVariableDeclaration vDecl2 = (IVariableDeclaration) nsVarDecls.get(1);
assertEquals(vDecl2.getElementName(), new String("orig_malloc_hook"));
assertEquals(vDecl2.getTypeName(), new String ("void*(*)(const char*, int, size_t)"));
assertEquals(vDecl2.getStartLine(), 81);
assertEquals(vDecl2.getEndLine(), 81);
// assertEquals(vDecl2.getStartLine(), 81);
// assertEquals(vDecl2.getEndLine(), 81);
}
private void checkFunctions(IParent namespace){
@ -356,15 +357,15 @@ public class CModelElementsTests extends TestCase {
IFunctionDeclaration f1 = (IFunctionDeclaration) nsFunctionDeclarations.get(0);
assertEquals(f1.getElementName(), new String("foo"));
assertEquals(f1.getReturnType(), new String("void"));
assertEquals(f1.getStartLine(), 85);
assertEquals(f1.getEndLine(), 85);
// assertEquals(f1.getStartLine(), 85);
// assertEquals(f1.getEndLine(), 85);
// MyPackage ---> function: char* foo(int&, char**)
IFunctionDeclaration f2 = (IFunctionDeclaration) nsFunctionDeclarations.get(1);
assertEquals(f2.getElementName(), new String("foo"));
assertEquals(f2.getReturnType(), new String("char*"));
assertEquals(f2.getStartLine(), 87);
assertEquals(f2.getEndLine(), 88);
// assertEquals(f2.getStartLine(), 87);
// assertEquals(f2.getEndLine(), 88);
int fooNumOfParam = f2.getNumberOfParameters();
if(fooNumOfParam != 2)
fail("foo should have two parameter!");
@ -377,8 +378,8 @@ public class CModelElementsTests extends TestCase {
IFunction f3 = (IFunction) nsFunctions.get(0);
assertEquals(f3.getElementName(), new String("boo"));
assertEquals(f3.getReturnType(), new String("void"));
assertEquals(f3.getStartLine(), 90);
assertEquals(f3.getEndLine(), 92);
// assertEquals(f3.getStartLine(), 90);
// assertEquals(f3.getEndLine(), 92);
}
private void checkStructs(IParent namespace){
@ -386,14 +387,14 @@ public class CModelElementsTests extends TestCase {
ArrayList nsStructs = namespace.getChildrenOfType(ICElement.C_STRUCT);
IStructure struct1 = (IStructure) nsStructs.get(0);
assertEquals(struct1.getElementName(), new String ("MyStruct"));
assertEquals(struct1.getStartLine(), 95);
assertEquals(struct1.getEndLine(), 97);
// assertEquals(struct1.getStartLine(), 95);
// assertEquals(struct1.getEndLine(), 97);
ArrayList struct1Fields = struct1.getChildrenOfType(ICElement.C_FIELD);
IField field1 = (IField) struct1Fields.get(0);
assertEquals(field1.getElementName(), new String("sint"));
assertEquals(field1.getTypeName(), new String("int"));
assertEquals(field1.getStartLine(), 96);
assertEquals(field1.getEndLine(), 96);
// assertEquals(field1.getStartLine(), 96);
// assertEquals(field1.getEndLine(), 96);
if(field1.getVisibility() != IMember.V_PUBLIC)
fail("field visibility should be public!");
@ -401,14 +402,14 @@ public class CModelElementsTests extends TestCase {
// struct no name
IStructure struct2 = (IStructure) nsStructs.get(1);
assertEquals(struct2.getElementName(), new String (""));
assertEquals(struct2.getStartLine(), 101);
assertEquals(struct2.getEndLine(), 103);
// assertEquals(struct2.getStartLine(), 101);
// assertEquals(struct2.getEndLine(), 103);
ArrayList struct2Fields = struct2.getChildrenOfType(ICElement.C_FIELD);
IField field2 = (IField) struct2Fields.get(0);
assertEquals(field2.getElementName(), new String("ss"));
assertEquals(field2.getTypeName(), new String("int"));
assertEquals(field2.getStartLine(), 102);
assertEquals(field2.getEndLine(), 102);
// assertEquals(field2.getStartLine(), 102);
// assertEquals(field2.getEndLine(), 102);
if(field2.getVisibility() != IMember.V_PUBLIC)
fail("field visibility should be public!");
@ -417,26 +418,26 @@ public class CModelElementsTests extends TestCase {
ITypeDef td1 = (ITypeDef) nsTypeDefs.get(0);
assertEquals(td1.getElementName(), new String ("myStruct"));
assertEquals(td1.getTypeName(), new String ("struct MyStruct"));
assertEquals(td1.getStartLine(), 99);
assertEquals(td1.getEndLine(), 99);
// assertEquals(td1.getStartLine(), 99);
// assertEquals(td1.getEndLine(), 99);
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
assertEquals(td2.getElementName(), new String ("myTypedef"));
assertEquals(td2.getTypeName(), new String (""));
assertEquals(td2.getStartLine(), 101);
assertEquals(td2.getEndLine(), 103);
// assertEquals(td2.getStartLine(), 101);
// assertEquals(td2.getEndLine(), 103);
// union
ArrayList nsUnions = namespace.getChildrenOfType(ICElement.C_UNION);
IStructure u0 = (IStructure) nsUnions.get(0);
assertEquals(u0.getElementName(), new String("U"));
assertEquals(u0.getStartLine(), 105);
assertEquals(u0.getEndLine(), 107);
// assertEquals(u0.getStartLine(), 105);
// assertEquals(u0.getEndLine(), 107);
ArrayList u0Fields = u0.getChildrenOfType(ICElement.C_FIELD);
IField field3 = (IField) u0Fields.get(0);
assertEquals(field3.getElementName(), new String("U1"));
assertEquals(field3.getTypeName(), new String("int"));
assertEquals(field3.getStartLine(), 106);
assertEquals(field3.getEndLine(), 106);
// assertEquals(field3.getStartLine(), 106);
// assertEquals(field3.getEndLine(), 106);
if(field3.getVisibility() != IMember.V_PUBLIC)
fail("field visibility should be public!");
}
@ -447,20 +448,20 @@ public class CModelElementsTests extends TestCase {
FunctionTemplate ft = (FunctionTemplate)functionTemplates.get(0);
assertEquals(ft.getElementName(), new String("aTemplatedFunction"));
assertEquals(ft.getTemplateSignature(), new String("aTemplatedFunction<A, B>(B) : A"));
assertEquals(ft.getStartLine(), 112);
assertEquals(ft.getEndLine(), 112);
// assertEquals(ft.getStartLine(), 112);
// assertEquals(ft.getEndLine(), 112);
// template method
ArrayList nsClasses = namespace.getChildrenOfType(ICElement.C_CLASS);
IStructure enclosingClass = (IStructure) nsClasses.get(1);
assertEquals(enclosingClass.getStartLine(), 114);
assertEquals(enclosingClass.getEndLine(), 118);
// assertEquals(enclosingClass.getStartLine(), 114);
// assertEquals(enclosingClass.getEndLine(), 118);
ArrayList methodTemplates = enclosingClass.getChildrenOfType(ICElement.C_TEMPLATE_METHOD);
MethodTemplate mt = (MethodTemplate)methodTemplates.get(0);
assertEquals(mt.getElementName(), new String("aTemplatedMethod"));
assertEquals(mt.getTemplateSignature(), new String("aTemplatedMethod<A, B>(B) : A"));
assertEquals(mt.getStartLine(), 117);
assertEquals(mt.getEndLine(), 117);
// assertEquals(mt.getStartLine(), 117);
// assertEquals(mt.getEndLine(), 117);
assertEquals(mt.getVisibility(), IMember.V_PUBLIC);
// template class
@ -468,8 +469,8 @@ public class CModelElementsTests extends TestCase {
ClassTemplate ct = (ClassTemplate)classTemplates.get(0);
assertEquals(ct.getElementName(), new String("myarray"));
assertEquals(ct.getTemplateSignature(), new String("myarray<T, Tibor>"));
assertEquals(ct.getStartLine(), 120);
assertEquals(ct.getEndLine(), 120);
// assertEquals(ct.getStartLine(), 120);
// assertEquals(ct.getEndLine(), 120);
}
private void checkArrays(IParent tu){
@ -478,16 +479,16 @@ public class CModelElementsTests extends TestCase {
IVariable arrayVar = (IVariable) variables.get(0);
assertEquals(arrayVar.getElementName(), new String("myArray"));
assertEquals(arrayVar.getTypeName(), new String("int[][]"));
assertEquals(arrayVar.getStartLine(), 125);
assertEquals(arrayVar.getEndLine(), 125);
// assertEquals(arrayVar.getStartLine(), 125);
// assertEquals(arrayVar.getEndLine(), 125);
// array parameter in function main
ArrayList functions = tu.getChildrenOfType(ICElement.C_FUNCTION);
IFunction mainFunction = (IFunction) functions.get(0);
assertEquals(mainFunction.getElementName(), new String("main"));
assertEquals(mainFunction.getReturnType(), new String("int"));
assertEquals(mainFunction.getStartLine(), 126);
assertEquals(mainFunction.getEndLine(), 128);
// assertEquals(mainFunction.getStartLine(), 126);
// assertEquals(mainFunction.getEndLine(), 128);
int NumOfParam = mainFunction.getNumberOfParameters();
if(NumOfParam != 2)
fail("main should have two parameter!");

View file

@ -26,6 +26,7 @@ import java.util.StringTokenizer;
import org.eclipse.core.runtime.Path;
import org.eclipse.cdt.internal.core.parser.IParser;
import org.eclipse.cdt.internal.core.parser.IParserCallback;
import org.eclipse.cdt.internal.core.parser.NullParserCallback;
import org.eclipse.cdt.internal.core.parser.Parser;
@ -52,7 +53,7 @@ public class AutomatedTest extends TestCase {
assertNotNull( fileList );
File file = null;
Parser parser = null;
IParser parser = null;
try{
file = (File)fileList.removeFirst();
@ -65,6 +66,7 @@ public class AutomatedTest extends TestCase {
parser = new Parser( stream, nullCallback, true);
parser.setCppNature( cppNature );
parser.mapLineNumbers(true);
assertTrue( parser.parse() );
}
@ -73,10 +75,10 @@ public class AutomatedTest extends TestCase {
String output = null;
if( e instanceof AssertionFailedError ){
output = file.getCanonicalPath() + ": Parse failed on line ";
output += parser.getLastLineNumber() + "\n";
output += parser.getLineNumberForOffset(parser.getLastErrorOffset()) + "\n";
} else {
output = file.getCanonicalPath() + ": " + e.getClass().toString();
output += " on line " + parser.getLastLineNumber() + "\n";
output += " on line " + parser.getLineNumberForOffset(parser.getLastErrorOffset()) + "\n";
}
if( report != null ){
report.write( output.getBytes() );

View file

@ -17,6 +17,7 @@ import org.eclipse.cdt.internal.core.dom.ConstructorChain;
import org.eclipse.cdt.internal.core.dom.ConstructorChainElement;
import org.eclipse.cdt.internal.core.dom.ConstructorChainElementExpression;
import org.eclipse.cdt.internal.core.dom.DOMBuilder;
import org.eclipse.cdt.internal.core.dom.DOMFactory;
import org.eclipse.cdt.internal.core.dom.DeclSpecifier;
import org.eclipse.cdt.internal.core.dom.Declarator;
import org.eclipse.cdt.internal.core.dom.ElaboratedTypeSpecifier;
@ -53,13 +54,15 @@ public class DOMTests extends TestCase {
public TranslationUnit parse( String code ) throws Exception
{
return parse( code, false );
return parse( code, false, true );
}
public TranslationUnit parse(String code, boolean quickParse ) throws Exception {
DOMBuilder domBuilder = new DOMBuilder();
public TranslationUnit parse(String code, boolean quickParse, boolean throwOnError ) throws Exception {
DOMBuilder domBuilder = DOMFactory.createDOMBuilder(false);
IParser parser = new Parser(code, domBuilder, quickParse );
if( ! parser.parse() ) throw new ParserException( "Parse failure" );
if( ! parser.parse() )
if( throwOnError ) throw new ParserException( "Parse failure" );
else domBuilder.getTranslationUnit().setParseSuccessful( false );
return domBuilder.getTranslationUnit();
}
@ -697,7 +700,7 @@ public class DOMTests extends TestCase {
public void testElaboratedParms() throws Exception
{
TranslationUnit tu = parse( "int x( struct A myA ) { /* junk */ }", true);
TranslationUnit tu = parse( "int x( struct A myA ) { /* junk */ }", true, true);
assertEquals( tu.getDeclarations().size(), 1 );
SimpleDeclaration declaration = (SimpleDeclaration)tu.getDeclarations().get(0);
assertEquals( declaration.getDeclSpecifier().getType(), DeclSpecifier.t_int );
@ -720,7 +723,7 @@ public class DOMTests extends TestCase {
{
Writer code = new StringWriter();
code.write( "#include <stdio.h>\n#define DEF VALUE\n");
TranslationUnit tu = parse( code.toString(), true );
TranslationUnit tu = parse( code.toString(), true, true );
assertEquals( tu.getInclusions().size(), 1 );
Inclusion i = (Inclusion)tu.getInclusions().get(0);
assertEquals( i.getName(), "stdio.h");
@ -1150,7 +1153,7 @@ public class DOMTests extends TestCase {
public void testBug36288() throws Exception
{
TranslationUnit tu = parse( "int foo() {}\nlong foo2(){}", true);
TranslationUnit tu = parse( "int foo() {}\nlong foo2(){}", true, true);
assertEquals( tu.getDeclarations().size(), 2 );
for( int i = 0; i < 2; ++i )
{
@ -1229,7 +1232,7 @@ public class DOMTests extends TestCase {
public void testBug36237() throws Exception
{
TranslationUnit tu = parse( "A::A():B( (char *)0 ){}", true );
TranslationUnit tu = parse( "A::A():B( (char *)0 ){}", true, true );
assertEquals( tu.getDeclarations().size(), 1 );
}
@ -1423,5 +1426,40 @@ public class DOMTests extends TestCase {
assertEquals( ((ClassSpecifier)classB.getTypeSpecifier()).getDeclarations().size(), 0 );
}
public void testBug36551() throws Exception
{
Writer code = new StringWriter();
code.write( "class TextFrame {\n" );
code.write( "BAD_MACRO()\n");
code.write( "};");
TranslationUnit tu = parse( code.toString(), true, false );
assertFalse( tu.isParseSuccessful() );
assertEquals( tu.getDeclarations().size(), 1 );
SimpleDeclaration d = (SimpleDeclaration)tu.getDeclarations().get(0);
assertEquals( d.getDeclarators().size(), 0 );
ClassSpecifier classSpec = (ClassSpecifier)d.getTypeSpecifier();
assertEquals( classSpec.getClassKey(), ClassKey.t_class );
assertEquals( classSpec.getName().toString(), "TextFrame");
assertEquals( classSpec.getDeclarations().size(), 0 );
code = new StringWriter();
code.write( "namespace X { class A }");
tu = parse( code.toString(), true, false );
assertFalse( tu.isParseSuccessful() );
assertEquals( tu.getDeclarations().size(), 1 );
NamespaceDefinition nd = (NamespaceDefinition)tu.getDeclarations().get(0);
assertEquals( nd.getDeclarations().size(), 0 );
assertEquals( nd.getName().toString(), "X");
code = new StringWriter();
code.write( "extern \"C\" { JUNK }" );
tu = parse( code.toString(), true, false );
assertFalse( tu.isParseSuccessful() );
assertEquals( tu.getDeclarations().size(), 1 );
LinkageSpecification ls = (LinkageSpecification)tu.getDeclarations().get(0);
assertEquals( ls.getDeclarations().size(), 0);
assertEquals( ls.getLanguageLinkage(), "C" );
}
}

View file

@ -21,6 +21,7 @@ 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.DOMFactory;
import org.eclipse.cdt.internal.core.dom.EnumerationSpecifier;
import org.eclipse.cdt.internal.core.dom.IOffsetable;
import org.eclipse.cdt.internal.core.dom.NamespaceDefinition;
@ -56,6 +57,7 @@ public class LineNumberTest extends TestCase {
Scanner scanner = new Scanner();
Reader reader = new StringReader( "int x = 3;\n foo\nfire\nfoe ");
scanner.initialize( reader, "string");
scanner.mapLineNumbers(true);
Token t = scanner.nextToken();
assertEquals( t.getType(), Token.t_int );
assertEquals( scanner.getLineNumberForOffset(t.getOffset()), 1 );
@ -90,8 +92,9 @@ public class LineNumberTest extends TestCase {
public void testDOMLineNos() throws Exception
{
DOMBuilder domBuilder = new DOMBuilder();
IParser parser = new Parser( fileIn, domBuilder, true );
DOMBuilder domBuilder = DOMFactory.createDOMBuilder( true );
IParser parser = new Parser( fileIn, domBuilder, true );
parser.mapLineNumbers(true);
if( ! parser.parse() ) fail( "Parse of file failed");
List macros = domBuilder.getTranslationUnit().getMacros();

View file

@ -51,7 +51,7 @@ public class CFileElementWorkingCopy extends WorkingCopy {
if (doc != null) {
DocumentInputStream dis= new DocumentInputStream(doc);
try {
parse(dis);
parse(dis, false); // we do not believe we require line numbers
} finally {
try { dis.close(); } catch (IOException e) {}
}

View file

@ -19,6 +19,7 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.internal.core.dom.ClassKey;
import org.eclipse.cdt.internal.core.dom.ClassSpecifier;
import org.eclipse.cdt.internal.core.dom.DOMBuilder;
import org.eclipse.cdt.internal.core.dom.DOMFactory;
import org.eclipse.cdt.internal.core.dom.Declaration;
import org.eclipse.cdt.internal.core.dom.Declarator;
import org.eclipse.cdt.internal.core.dom.EnumerationSpecifier;
@ -54,7 +55,7 @@ public class ComparatorModelBuilder {
}
public void parse() {
DOMBuilder domBuilder = new DOMBuilder();
DOMBuilder domBuilder = DOMFactory.createDOMBuilder(false);
try {
Parser parser = new Parser(code, domBuilder, true);