[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] ignore my last patch, this one is better
|
Title: ignore my last patch, this one is better
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.
JohnC
<<cdt-ui-tests-patch.txt>> <<cdt-core-patch.txt>> <<cdt-ui-patch.txt>>
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.33
diff -u -r1.33 ChangeLog
--- ChangeLog 17 Apr 2003 18:59:18 -0000 1.33
+++ ChangeLog 21 Apr 2003 15:05:23 -0000
@@ -1,3 +1,8 @@
+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 John Camelon
Updated DOMTests::testBug36600().
Updated LineNumberTest::testDOMLineNos().
Index: failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java
===================================================================
RCS file: failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java
diff -N failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ failures/org/eclipse/cdt/core/parser/failedTests/DOMFailedTest.java 21 Apr 2003 15:05:23 -0000
@@ -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.");
+ }
+ }
+
+}
Index: parser/org/eclipse/cdt/core/parser/tests/AutomatedTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/AutomatedTest.java,v
retrieving revision 1.2
diff -u -r1.2 AutomatedTest.java
--- parser/org/eclipse/cdt/core/parser/tests/AutomatedTest.java 17 Apr 2003 18:59:18 -0000 1.2
+++ parser/org/eclipse/cdt/core/parser/tests/AutomatedTest.java 21 Apr 2003 15:05:23 -0000
@@ -26,6 +26,7 @@
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 @@
assertNotNull( fileList );
File file = null;
- Parser parser = null;
+ IParser parser = null;
try{
file = (File)fileList.removeFirst();
@@ -65,6 +66,7 @@
parser = new Parser( stream, nullCallback, true);
parser.setCppNature( cppNature );
+ parser.mapLineNumbers(true);
assertTrue( parser.parse() );
}
@@ -73,10 +75,10 @@
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() );
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.23
diff -u -r1.23 DOMTests.java
--- parser/org/eclipse/cdt/core/parser/tests/DOMTests.java 17 Apr 2003 18:59:18 -0000 1.23
+++ parser/org/eclipse/cdt/core/parser/tests/DOMTests.java 21 Apr 2003 15:05:23 -0000
@@ -17,6 +17,7 @@
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 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 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 @@
{
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 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 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 );
}
@@ -1422,6 +1425,41 @@
assertEquals( ((ClassSpecifier)classB.getTypeSpecifier()).getClassKey(), ClassKey.t_class );
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" );
}
}
Index: parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java,v
retrieving revision 1.3
diff -u -r1.3 LineNumberTest.java
--- parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java 17 Apr 2003 18:59:18 -0000 1.3
+++ parser/org/eclipse/cdt/core/parser/tests/LineNumberTest.java 21 Apr 2003 15:05:23 -0000
@@ -21,6 +21,7 @@
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 @@
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 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();
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.25
diff -u -r1.25 DOMBuilder.java
--- dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java 17 Apr 2003 18:59:16 -0000 1.25
+++ dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java 21 Apr 2003 15:03:11 -0000
@@ -10,7 +10,10 @@
*/
public class DOMBuilder implements IParserCallback
{
- private TranslationUnit translationUnit;
+
+ protected DOMBuilder()
+ {
+ }
public TranslationUnit getTranslationUnit() {
return translationUnit;
@@ -56,7 +59,7 @@
ClassSpecifier classSpecifier = new ClassSpecifier(kind, decl);
classSpecifier.setVisibility( visibility );
classSpecifier.setStartingOffset( classKey.getOffset() );
- classSpecifier.setTopLine( parser.getLineNumberForOffset(classKey.getOffset()) );
+
classSpecifier.setClassKeyToken( classKey );
decl.setTypeSpecifier(classSpecifier);
return classSpecifier;
@@ -75,7 +78,6 @@
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 @@
/**
* @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 @@
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 @@
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 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 @@
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 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 @@
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 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 @@
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 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 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 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 @@
this.parser = parser;
}
- private IParser parser = null;
+ protected Name currName;
+ protected IParser parser = null;
+ protected TranslationUnit translationUnit;
+
}
Index: dom/org/eclipse/cdt/internal/core/dom/DOMFactory.java
===================================================================
RCS file: dom/org/eclipse/cdt/internal/core/dom/DOMFactory.java
diff -N dom/org/eclipse/cdt/internal/core/dom/DOMFactory.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/cdt/internal/core/dom/DOMFactory.java 21 Apr 2003 15:03:11 -0000
@@ -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();
+ }
+}
Index: dom/org/eclipse/cdt/internal/core/dom/LineNumberedDOMBuilder.java
===================================================================
RCS file: dom/org/eclipse/cdt/internal/core/dom/LineNumberedDOMBuilder.java
diff -N dom/org/eclipse/cdt/internal/core/dom/LineNumberedDOMBuilder.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dom/org/eclipse/cdt/internal/core/dom/LineNumberedDOMBuilder.java 21 Apr 2003 15:03:11 -0000
@@ -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);
+ }
+
+}
Index: dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java,v
retrieving revision 1.8
diff -u -r1.8 TranslationUnit.java
--- dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java 14 Apr 2003 14:14:50 -0000 1.8
+++ dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java 21 Apr 2003 15:03:11 -0000
@@ -11,6 +11,7 @@
*/
public class TranslationUnit implements IScope {
+ private boolean parseSuccessful = true;
private List declarations = new ArrayList();
private List macros = new ArrayList();
private List inclusions = new ArrayList();
@@ -150,6 +151,20 @@
public void remove() {
throw new UnsupportedOperationException( "OffsetableIterator is a const iterator");
}
+ }
+
+ /**
+ * @return
+ */
+ public boolean isParseSuccessful() {
+ return parseSuccessful;
+ }
+
+ /**
+ * @param b
+ */
+ public void setParseSuccessful(boolean b) {
+ parseSuccessful = b;
}
}
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.33
diff -u -r1.33 ChangeLog
--- parser/ChangeLog 17 Apr 2003 18:59:16 -0000 1.33
+++ parser/ChangeLog 21 Apr 2003 15:03:11 -0000
@@ -1,3 +1,7 @@
+2003-04-20 John Camelon
+ Fixed Bug36551 Bad parse on attached file.
+ Partial Fix for Bug36631 remove linear search algorithm from OffsetMapping
+
2003-04-17 John Camelon
Fixed error in Elaborated Enumeration Types.
Fixed Bug36559 - Parsing Templates...
Index: parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java,v
retrieving revision 1.15
diff -u -r1.15 CModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java 17 Apr 2003 18:34:47 -0000 1.15
+++ parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java 21 Apr 2003 15:03:11 -0000
@@ -28,6 +28,7 @@
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;
@@ -63,7 +64,9 @@
}
public Map parse() throws Exception {
- DOMBuilder domBuilder = new DOMBuilder();
+ // 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( false );
String code = translationUnit.getBuffer().getContents();
IParser parser = new Parser(code, domBuilder, true);
if( translationUnit.getCProject() != null )
Index: parser/org/eclipse/cdt/internal/core/parser/ContextStack.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ContextStack.java,v
retrieving revision 1.2
diff -u -r1.2 ContextStack.java
--- parser/org/eclipse/cdt/internal/core/parser/ContextStack.java 16 Apr 2003 12:30:46 -0000 1.2
+++ parser/org/eclipse/cdt/internal/core/parser/ContextStack.java 21 Apr 2003 15:03:11 -0000
@@ -125,7 +125,7 @@
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
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.20
diff -u -r1.20 ExpressionEvaluator.java
--- parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java 16 Apr 2003 12:30:46 -0000 1.20
+++ parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java 21 Apr 2003 15:03:11 -0000
@@ -122,17 +122,19 @@
/**
* @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)
Index: parser/org/eclipse/cdt/internal/core/parser/IOffsetToLineMapping.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/IOffsetToLineMapping.java
diff -N parser/org/eclipse/cdt/internal/core/parser/IOffsetToLineMapping.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/internal/core/parser/IOffsetToLineMapping.java 21 Apr 2003 15:03:12 -0000
@@ -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);
+}
\ No newline at end of file
Index: parser/org/eclipse/cdt/internal/core/parser/IParser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParser.java,v
retrieving revision 1.1
diff -u -r1.1 IParser.java
--- parser/org/eclipse/cdt/internal/core/parser/IParser.java 16 Apr 2003 12:30:46 -0000 1.1
+++ parser/org/eclipse/cdt/internal/core/parser/IParser.java 21 Apr 2003 15:03:12 -0000
@@ -15,15 +15,18 @@
* 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();
+
}
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.19
diff -u -r1.19 IParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java 16 Apr 2003 12:30:46 -0000 1.19
+++ parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java 21 Apr 2003 15:03:12 -0000
@@ -17,9 +17,9 @@
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);
Index: parser/org/eclipse/cdt/internal/core/parser/IScanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IScanner.java,v
retrieving revision 1.6
diff -u -r1.6 IScanner.java
--- parser/org/eclipse/cdt/internal/core/parser/IScanner.java 16 Apr 2003 12:30:46 -0000 1.6
+++ parser/org/eclipse/cdt/internal/core/parser/IScanner.java 21 Apr 2003 15:03:12 -0000
@@ -28,8 +28,9 @@
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);
}
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.19
diff -u -r1.19 NullParserCallback.java
--- parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java 16 Apr 2003 12:30:46 -0000 1.19
+++ parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java 21 Apr 2003 15:03:12 -0000
@@ -18,19 +18,21 @@
/* (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)
Index: parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
diff -N parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java
--- parser/org/eclipse/cdt/internal/core/parser/OffsetMapping.java 16 Apr 2003 12:30:46 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,75 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002,2003 Rational Software Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- *
- * Contributors:
- * IBM Rational Software - Initial API and implementation
-***********************************************************************/
-package org.eclipse.cdt.internal.core.parser;
-
-import java.util.Iterator;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-
-
-/**
- * @author jcamelon
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class OffsetMapping {
-
- public OffsetMapping()
- {
- }
-
- public void newLine( int offset )
- {
- lastOffset = offset;
- store.put( new Integer( offset ), new Integer( ++lineCounter ) );
- }
-
- public void recantLastNewLine()
- {
- if( store.remove( new Integer( lastOffset ) ) != null )
- {
- --lineCounter;
- lastOffset = -1;
- }
- }
-
- public int getLineNo( int offset )
- {
- Iterator iter = store.keySet().iterator();
- int first = -1, second = -1;
- if( ! iter.hasNext() ) return 1;
- first = ((Integer)iter.next()).intValue();
- if( ( offset <= first ) || ! iter.hasNext() )
- return ((Integer)store.get( new Integer( first ))).intValue();
-
- while( true )
- {
- second = ((Integer)iter.next()).intValue();
- if( offset > first && offset <= second )
- return ((Integer)store.get( new Integer( second ))).intValue();
- if( ! iter.hasNext() ) break;
- first = second;
- }
-
- return lineCounter;
- }
-
- public int getCurrentLineNumber()
- {
- return lineCounter;
- }
-
- private int lineCounter = 1;
- private int lastOffset = -1;
- private SortedMap store = new TreeMap();
-}
Index: parser/org/eclipse/cdt/internal/core/parser/OffsetToLineMapping.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/OffsetToLineMapping.java
diff -N parser/org/eclipse/cdt/internal/core/parser/OffsetToLineMapping.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ parser/org/eclipse/cdt/internal/core/parser/OffsetToLineMapping.java 21 Apr 2003 15:03:12 -0000
@@ -0,0 +1,75 @@
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.internal.core.parser;
+
+import java.util.Iterator;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+
+
+/**
+ * @author jcamelon
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class OffsetToLineMapping implements IOffsetToLineMapping {
+
+ public OffsetToLineMapping()
+ {
+ }
+
+ public void newLine( int offset )
+ {
+ lastOffset = offset;
+ store.put( new Integer( offset ), new Integer( ++lineCounter ) );
+ }
+
+ public void recantLastNewLine()
+ {
+ if( store.remove( new Integer( lastOffset ) ) != null )
+ {
+ --lineCounter;
+ lastOffset = -1;
+ }
+ }
+
+ public int getLineNo( int offset )
+ {
+ Iterator iter = store.keySet().iterator();
+ int first = -1, second = -1;
+ if( ! iter.hasNext() ) return 1;
+ first = ((Integer)iter.next()).intValue();
+ if( ( offset <= first ) || ! iter.hasNext() )
+ return ((Integer)store.get( new Integer( first ))).intValue();
+
+ while( true )
+ {
+ second = ((Integer)iter.next()).intValue();
+ if( offset > first && offset <= second )
+ return ((Integer)store.get( new Integer( second ))).intValue();
+ if( ! iter.hasNext() ) break;
+ first = second;
+ }
+
+ return lineCounter;
+ }
+
+ public int getCurrentLineNumber()
+ {
+ return lineCounter;
+ }
+
+ private int lineCounter = 1;
+ private int lastOffset = -1;
+ private SortedMap store = new TreeMap();
+}
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.34
diff -u -r1.34 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java 17 Apr 2003 18:59:16 -0000 1.34
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java 21 Apr 2003 15:03:12 -0000
@@ -19,13 +19,17 @@
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 @@
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 @@
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 @@
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 @@
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;
}
}
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.21
diff -u -r1.21 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java 16 Apr 2003 12:30:46 -0000 1.21
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java 21 Apr 2003 15:03:13 -0000
@@ -1543,9 +1543,7 @@
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
@@ -1687,7 +1685,10 @@
// 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)
@@ -1876,8 +1877,10 @@
/**
* @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;
@@ -1888,4 +1891,12 @@
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;
}
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/ChangeLog,v
retrieving revision 1.93
diff -u -r1.93 ChangeLog
--- ChangeLog 17 Apr 2003 16:56:13 -0000 1.93
+++ ChangeLog 21 Apr 2003 15:05:12 -0000
@@ -1,3 +1,8 @@
+2003-04-20 John Camelon
+ Partial Fix for Bug36631 remove linear search algorithm from OffsetMapping
+ * src/org/eclipse/cdt/internal/ui/compare/ComparatorModelBuilder.java:
+ parse() was updated to use DOMFactory::createDOMBuilder() rather than constructor.
+
2003-04-17 Alain Magloire
Bug 36584
Index: src/org/eclipse/cdt/internal/ui/compare/ComparatorModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/compare/ComparatorModelBuilder.java,v
retrieving revision 1.1
diff -u -r1.1 ComparatorModelBuilder.java
--- src/org/eclipse/cdt/internal/ui/compare/ComparatorModelBuilder.java 14 Apr 2003 17:31:07 -0000 1.1
+++ src/org/eclipse/cdt/internal/ui/compare/ComparatorModelBuilder.java 21 Apr 2003 15:05:13 -0000
@@ -19,6 +19,7 @@
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 void parse() {
- DOMBuilder domBuilder = new DOMBuilder();
+ DOMBuilder domBuilder = DOMFactory.createDOMBuilder(false);
try {
Parser parser = new Parser(code, domBuilder, true);