From d4a162996481d7f5a06801cccdfbc2c26f3f48b2 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 10 Jun 2003 14:41:42 +0000 Subject: [PATCH] Patch for Victor Mozgin. This patch enables parsing of conversion operators. Fixes PR 38657 and the rest of PR 36769. --- .../eclipse/cdt/internal/core/dom/Name.java | 3 +- core/org.eclipse.cdt.core/parser/ChangeLog | 4 + .../cdt/internal/core/parser/Parser.java | 77 +++++++++++++------ core/org.eclipse.cdt.ui.tests/ChangeLog | 5 ++ .../parser/failedTests/ACEFailedTest.java | 42 ---------- .../cdt/core/parser/tests/DOMTests.java | 42 +++++++++- .../core/suite/AutomatedIntegrationSuite.java | 1 - 7 files changed, 103 insertions(+), 71 deletions(-) delete mode 100644 core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/ACEFailedTest.java diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Name.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Name.java index f3d379d4da3..dafaf932a1d 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Name.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Name.java @@ -43,7 +43,8 @@ public class Name { while (t != nameEnd) { t = t.getNext(); - buffer.append( t.getImage() ); + buffer.append( t.getImage() ); + if (t.getType() == Token.t_operator) buffer.append( " " ); } return buffer.toString(); diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index 18243db167f..197d15036b6 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -1,3 +1,7 @@ +2003-06-09 Victor Mozgin + Fixed for conversion operator declarations. + This fixes PR 36769 (finally) and PR 38657. + 2003-06-09 Victor Mozgin Fixed Bug 36932 - RTS: Parser fails on "new" in ctor initializer Improved handling of new-expressions: placements, arrays and diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 5bc212befcf..361237e7eee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -927,11 +927,11 @@ c, quickParse); } /** - * @param flags input flags that are used to make our decision - * @return whether or not this looks like a constructor (true or false) - * @throws EndOfFile we could encounter EOF while looking ahead + * @param flags input flags that are used to make our decision + * @return whether or not this looks like a constructor (true or false) + * @throws EndOfFile we could encounter EOF while looking ahead */ - private boolean lookAheadForConstructor( Flags flags ) throws EndOfFile + private boolean lookAheadForConstructorOrConversion( Flags flags ) throws EndOfFile { if (flags.isForParameterDeclaration()) return false; if (LT(2) == Token.tLPAREN && flags.isForConstructor()) return true; @@ -958,14 +958,27 @@ c, quickParse); } } - return - (LT(posTokenAfterTemplateParameters) == Token.tCOLONCOLON) - && - ( - LA(posTokenAfterTemplateParameters+1).getImage().equals( LA(1).getImage() ) || - LT(posTokenAfterTemplateParameters+1) == Token.tCOMPL - ) - ; + // for constructors + return + ( + ( + (LT(posTokenAfterTemplateParameters) == Token.tCOLONCOLON) + && + ( + LA(posTokenAfterTemplateParameters+1).getImage().equals( LA(1).getImage() ) || + LT(posTokenAfterTemplateParameters+1) == Token.tCOMPL + ) + ) + || + ( + // for conversion operators + (LT(posTokenAfterTemplateParameters) == Token.tCOLONCOLON) + && + ( + LT(posTokenAfterTemplateParameters+1) == Token.t_operator + ) + ) + ); } /** @@ -1080,7 +1093,7 @@ c, quickParse); return; if( parm && flags.haveEncounteredTypename() ) return; - if ( lookAheadForConstructor( flags ) ) + if ( lookAheadForConstructorOrConversion( flags ) ) return; if ( lookAheadForDeclarator( flags ) ) return; @@ -1480,11 +1493,18 @@ c, quickParse); } else { - // temporary - while( LT(1) != Token.tLPAREN ) - { - toSend = consume(); - } + // must be a conversion function + typeId(); + toSend = lastToken; + try { + // this ptrOp doesn't belong to the declarator, + // it's just a part of the name + ptrOperator(null); + toSend = lastToken; + } catch (Backtrack b) {} + + // In case we'll need better error recovery + // while( LT(1) != Token.tLPAREN ) { toSend = consume(); } } try{ @@ -1545,13 +1565,20 @@ c, quickParse); } else - { - // temporary - while( LT(1) != Token.tLPAREN ) - { - end = consume(); - } - } + { + // must be a conversion function + typeId(); + end = lastToken; + try { + // this ptrOp doesn't belong to the declarator, + // it's just a part of the name + ptrOperator(null); + end = lastToken; + } catch (Backtrack b) {} + + // In case we'll need better error recovery + // while( LT(1) != Token.tLPAREN ) { toSend = consume(); } + } try{ callback.nameBegin( start ); diff --git a/core/org.eclipse.cdt.ui.tests/ChangeLog b/core/org.eclipse.cdt.ui.tests/ChangeLog index 6b396031e45..d7baec39b3f 100644 --- a/core/org.eclipse.cdt.ui.tests/ChangeLog +++ b/core/org.eclipse.cdt.ui.tests/ChangeLog @@ -1,3 +1,8 @@ +2003-06-09 Victor Mozgin + Moved testBug36769() from ACEFailedTest.java to DOMTests.java. + Removed ACEFailedTest.java as it is empty now. + Added DOMTests.testBug36769B(). + 2003-06-09 Victor Mozgin Moved testBug36932() from DOMFailedTest.java to DOMTests.java. Added DOMTests.testBug36932B() and DOMTests.testBug36932C(). diff --git a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/ACEFailedTest.java b/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/ACEFailedTest.java deleted file mode 100644 index 8c0230275bd..00000000000 --- a/core/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/ACEFailedTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003 IBM 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 Corp. - Rational Software - initial implementation - ******************************************************************************/ -package org.eclipse.cdt.core.parser.failedTests; - -import java.io.StringWriter; -import java.io.Writer; - -import org.eclipse.cdt.core.parser.tests.BaseDOMTest; - - -/** - * @author aniefer - * - * To change the template for this generated type comment go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ -public class ACEFailedTest extends BaseDOMTest { - - /** - * @param arg - */ - public ACEFailedTest(String arg) { - super(arg); - } - - public void testBug36769() throws Exception { - Writer code = new StringWriter(); - code.write("template cls::operator op &() const {}\n"); - code.write("template cls::cls() {}\n"); - code.write("template cls::~cls() {}\n"); - - failTest( code.toString()); - } -} diff --git a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java index 60163b22ebc..27937038b1b 100644 --- a/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java +++ b/core/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java @@ -1178,7 +1178,7 @@ public class DOMTests extends BaseDOMTest { PointerOperator po = (PointerOperator)functionDeclarator.getPointerOperators().get(0); assertEquals( po.getType(), PointerOperator.t_reference ); assertFalse( po.isConst() || po.isVolatile() ); - assertEquals( functionDeclarator.getName().toString(), "A::operator="); + assertEquals( functionDeclarator.getName().toString(), "A::operator ="); assertEquals( functionDeclarator.getParms().getDeclarations().size(), 1 ); ParameterDeclaration parameterDeclaration = (ParameterDeclaration)functionDeclarator.getParms().getDeclarations().get(0); assertEquals( parameterDeclaration.getDeclSpecifier().getType(), DeclSpecifier.t_type ); @@ -2042,5 +2042,43 @@ public class DOMTests extends BaseDOMTest { parse("X::X( ) : var( new (P) (A)[B] ) {}"); parse("X::X( ) : var( new (P) (A)[B][C][D] ) {}"); } -} + + public void testBug36769A() throws Exception { + Writer code = new StringWriter(); + code.write("template cls::operator op &() const {}\n"); + code.write("template cls::cls() {}\n"); + code.write("template cls::~cls() {}\n"); + + parse( code.toString()); + } + + public void testBug36769B() throws Exception { + parse("class X { operator int(); } \n"); + parse("class X { operator int*(); } \n"); + parse("class X { operator int&(); } \n"); + parse("class X { operator A(); } \n"); + parse("class X { operator A*(); } \n"); + parse("class X { operator A&(); } \n"); + + parse("X::operator int() { } \n"); + parse("X::operator int*() { } \n"); + parse("X::operator int&() { } \n"); + parse("X::operator A() { } \n"); + parse("X::operator A*() { } \n"); + parse("X::operator A&() { } \n"); + + parse("template class X { operator int(); } \n"); + parse("template class X { operator int*(); } \n"); + parse("template class X { operator int&(); } \n"); + parse("template class X { operator A(); } \n"); + parse("template class X { operator A*(); } \n"); + parse("template class X { operator A&(); } \n"); + parse("template X::operator int() { } \n"); + parse("template X::operator int*() { } \n"); + parse("template X::operator int&() { } \n"); + parse("template X::operator A() { } \n"); + parse("template X::operator A*() { } \n"); + parse("template X::operator A&() { } \n"); + } +} diff --git a/core/org.eclipse.cdt.ui.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java b/core/org.eclipse.cdt.ui.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java index 398b4956daa..e0e521c4564 100644 --- a/core/org.eclipse.cdt.ui.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java +++ b/core/org.eclipse.cdt.ui.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java @@ -77,7 +77,6 @@ public class AutomatedIntegrationSuite extends TestSuite implements TestListener suite.addTest(suite.new GenerateReport("testStartFailedTests")); // Add all failed tests - suite.addTestSuite(ACEFailedTest.class); suite.addTestSuite(DOMFailedTest.class); suite.addTestSuite(LokiFailures.class); suite.addTestSuite(STLFailedTests.class);