From 9bcb71d8969ba9c248c4297b5891ae364c2ef2a1 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 4 Apr 2007 09:36:32 +0000 Subject: [PATCH] Fixes parsing of 'void (proto) ();' --- .../failedTests/FailedDeclaratorsTest.java | 76 +------------------ .../core/model/tests/DeclaratorsTests.java | 69 ++++++++++++++++- .../internal/core/model/ASTStringUtil.java | 18 ++++- .../internal/core/model/CModelBuilder2.java | 14 +++- .../internal/core/dom/parser/c/CVisitor.java | 21 ++++- .../core/dom/parser/cpp/CPPVisitor.java | 27 +++++-- 6 files changed, 133 insertions(+), 92 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java index a9be78633a1..519503e0b76 100644 --- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java @@ -16,10 +16,8 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IFunction; -import org.eclipse.cdt.core.model.IFunctionDeclaration; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITypeDef; -import org.eclipse.cdt.core.model.IVariable; import org.eclipse.cdt.core.model.tests.IntegratedCModelTest; import org.eclipse.cdt.core.tests.FailingTest; @@ -57,58 +55,14 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest */ public static Test suite() { TestSuite suite= new TestSuite("FailedDeclaratorsTest"); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0002"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0003"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0006"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0007"), 40768)); suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0011"), 40768)); suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0013"), 40768)); suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0014"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0016"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0017"), 40768)); suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0023"), 40768)); - suite.addTest(new FailingTest(new FailedDeclaratorsTest("testDeclarators_0024"), 40768)); return suite; } - public void testDeclarators_0002() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0002"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION); - IFunctionDeclaration decl = (IFunctionDeclaration)element; - assertEquals(decl.getSignature(), "decl_0002(char)"); - assertEquals(decl.getReturnType(), "void"); - } - - public void testDeclarators_0003() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0003"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION); - IFunctionDeclaration decl = (IFunctionDeclaration)element; - assertEquals(decl.getSignature(), "decl_0003(char)"); - assertEquals(decl.getReturnType(), "void"); - } - - public void testDeclarators_0006() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0006"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_VARIABLE); - IVariable decl = (IVariable)element; - assertEquals(decl.getTypeName(), "void(*)(char)"); - } - public void testDeclarators_0007() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0007"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_VARIABLE); - IVariable decl = (IVariable)element; - assertEquals(decl.getTypeName(), "void(*)(char)"); - } - public void testDeclarators_0011() throws CModelException { ITranslationUnit tu = getTU(); ICElement element = tu.getElement("decl_0011"); @@ -144,25 +98,7 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest ITypeDef decl = (ITypeDef)element; assertEquals(decl.getTypeName(), "void*()(char)"); } - - public void testDeclarators_0016() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0016"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void(*)(char)"); - } - - public void testDeclarators_0017() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0017"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void(*)(char)"); - } - + public void testDeclarators_0023() throws CModelException { ITranslationUnit tu = getTU(); ICElement element = tu.getElement("decl_0023"); @@ -172,14 +108,4 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest assertEquals(decl.getSignature(), "decl_0023(int)"); assertEquals(decl.getReturnType(), "void(*(*))(char)"); } - - public void testDeclarators_0024() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0024"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_VARIABLE); - IVariable decl = (IVariable)element; - assertEquals(decl.getTypeName(), "void(*(*(*)(int))(float))(char)"); - } - } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/DeclaratorsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/DeclaratorsTests.java index 89d34546bee..29c57fe3937 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/DeclaratorsTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/DeclaratorsTests.java @@ -71,6 +71,26 @@ public class DeclaratorsTests extends IntegratedCModelTest { assertEquals(decl.getReturnType(), "void"); } + public void testDeclarators_0002() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0002"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION); + IFunctionDeclaration decl = (IFunctionDeclaration)element; + assertEquals(decl.getSignature(), "decl_0002(char)"); + assertEquals(decl.getReturnType(), "void"); + } + + public void testDeclarators_0003() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0003"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION); + IFunctionDeclaration decl = (IFunctionDeclaration)element; + assertEquals(decl.getSignature(), "decl_0003(char)"); + assertEquals(decl.getReturnType(), "void"); + } + public void testDeclarators_0004() throws CModelException { ITranslationUnit tu = getTU(); ICElement element = tu.getElement("decl_0004"); @@ -90,6 +110,25 @@ public class DeclaratorsTests extends IntegratedCModelTest { assertEquals(decl.getTypeName(), "void(*)(char)"); } + public void testDeclarators_0006() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0006"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_VARIABLE); + IVariable decl = (IVariable)element; + assertEquals(decl.getTypeName(), "void(*)(char)"); + } + + public void testDeclarators_0007() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0007"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_VARIABLE); + IVariable decl = (IVariable)element; + assertEquals(decl.getTypeName(), "void(*)(char)"); + } + + public void testDeclarators_0015() throws CModelException { ITranslationUnit tu = getTU(); ICElement element = tu.getElement("decl_0015"); @@ -98,6 +137,33 @@ public class DeclaratorsTests extends IntegratedCModelTest { ITypeDef decl = (ITypeDef)element; assertEquals(decl.getTypeName(), "void(*)(char)"); } + + public void testDeclarators_0016() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0016"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + assertEquals(decl.getTypeName(), "void(*)(char)"); + } + + public void testDeclarators_0017() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0017"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + assertEquals(decl.getTypeName(), "void(*)(char)"); + } + + public void testDeclarators_0024() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0024"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_VARIABLE); + IVariable decl = (IVariable)element; + assertEquals(decl.getTypeName(), "void(*(*(*)(int))(float))(char)"); + } public void testDeclarators_0031() throws CModelException { ITranslationUnit tu = getTU(); @@ -106,6 +172,5 @@ public class DeclaratorsTests extends IntegratedCModelTest { assertEquals(element.getElementType(), ICElement.C_VARIABLE); IVariable decl = (IVariable)element; assertEquals(decl.getTypeName(), "int(*)(char(*)(bool))"); - } - + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ASTStringUtil.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ASTStringUtil.java index 2991d92b829..18c8e1f6589 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ASTStringUtil.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ASTStringUtil.java @@ -236,10 +236,20 @@ public class ASTStringUtil { } final IASTDeclarator nestedDeclarator= declarator.getNestedDeclarator(); if (nestedDeclarator != null) { - buffer.append(Keywords.cpLPAREN); - appendDeclaratorString(buffer, nestedDeclarator, addParams); - trimRight(buffer); - buffer.append(Keywords.cpRPAREN); + StringBuffer tmp= new StringBuffer(); + appendDeclaratorString(tmp, nestedDeclarator, addParams); + trimRight(tmp); + final int tmpLength= tmp.length(); + if (tmpLength > 0) { + if (tmp.charAt(0) != Keywords.cpLPAREN[0] || tmp.charAt(tmpLength-1) != Keywords.cpRPAREN[0]) { + buffer.append(Keywords.cpLPAREN); + buffer.append(tmp); + buffer.append(Keywords.cpRPAREN); + } + else { + buffer.append(tmp); + } + } } if (!addParams) { return buffer; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java index 07fdf383434..5dbeb4e9fb3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java @@ -574,14 +574,24 @@ public class CModelBuilder2 implements IContributedModelBuilder { return createTypeDef(parent, declSpecifier, declarator); } if (declarator != null) { - IASTDeclarator nestedDeclarator= declarator.getNestedDeclarator(); - if (nestedDeclarator == null && declarator instanceof IASTFunctionDeclarator) { + if (declarator instanceof IASTFunctionDeclarator && !hasNestedPointerOperators(declarator)) { return createFunctionDeclaration(parent, declSpecifier, (IASTFunctionDeclarator)declarator, isTemplate); } } return createVariable(parent, declSpecifier, declarator, isTemplate); } + private boolean hasNestedPointerOperators(IASTDeclarator declarator) { + declarator= declarator.getNestedDeclarator(); + while (declarator != null) { + if (declarator.getPointerOperators().length > 0) { + return true; + } + declarator= declarator.getNestedDeclarator(); + } + return false; + } + private void createNamespace(Parent parent, ICPPASTNamespaceDefinition declaration) throws CModelException, DOMException{ // create element final String type= Keywords.NAMESPACE; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 8768b76f324..57322fe6a5f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -831,6 +831,21 @@ public class CVisitor { while( declarator.getNestedDeclarator() != null ) declarator = declarator.getNestedDeclarator(); + IASTFunctionDeclarator funcDeclarator= null; + IASTNode node= declarator; + do { + if (node instanceof IASTFunctionDeclarator) { + funcDeclarator= (IASTFunctionDeclarator) node; + break; + } + if (((IASTDeclarator) node).getPointerOperators().length > 0 || + node.getPropertyInParent() != IASTDeclarator.NESTED_DECLARATOR) { + break; + } + node= node.getParent(); + } + while (node instanceof IASTDeclarator); + ICScope scope = (ICScope) getContainingScope( parent ); ASTNodeProperty prop = parent.getPropertyInParent(); @@ -865,19 +880,19 @@ public class CVisitor { } } catch (DOMException e) { } - } else if( declarator instanceof IASTFunctionDeclarator ){ + } else if( funcDeclarator != null ){ if( binding != null ) { if( binding instanceof IFunction ){ IFunction function = (IFunction) binding; if( function instanceof CFunction ) - ((CFunction)function).addDeclarator( (IASTFunctionDeclarator) declarator ); + ((CFunction)function).addDeclarator( funcDeclarator ); return function; } binding = new ProblemBinding( name, IProblemBinding.SEMANTIC_INVALID_OVERLOAD, name.toCharArray() ); } else if( parent instanceof IASTSimpleDeclaration && ((IASTSimpleDeclaration) parent).getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef) binding = new CTypedef( name ); else - binding = new CFunction( (IASTFunctionDeclarator) declarator ); + binding = new CFunction( funcDeclarator ); } else if( parent instanceof IASTSimpleDeclaration ){ IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) parent; if( simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 1c41c4ab752..5f323422d44 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -469,6 +469,21 @@ public class CPPVisitor { while( declarator.getNestedDeclarator() != null ) declarator = declarator.getNestedDeclarator(); + IASTFunctionDeclarator funcDeclarator= null; + IASTNode node= declarator; + do { + if (node instanceof IASTFunctionDeclarator) { + funcDeclarator= (IASTFunctionDeclarator) node; + break; + } + if (((IASTDeclarator) node).getPointerOperators().length > 0 || + node.getPropertyInParent() != IASTDeclarator.NESTED_DECLARATOR) { + break; + } + node= node.getParent(); + } + while (node instanceof IASTDeclarator); + IASTName name = declarator.getName(); if( name instanceof ICPPASTQualifiedName ){ IASTName [] ns = ((ICPPASTQualifiedName)name).getNames(); @@ -549,10 +564,10 @@ public class CPPVisitor { return new ProblemBinding( name, IProblemBinding.SEMANTIC_INVALID_REDECLARATION, name.toCharArray() ); } binding = new CPPTypedef( name ); - } else if( declarator instanceof ICPPASTFunctionDeclarator ){ + } else if( funcDeclarator != null ){ if( binding instanceof ICPPInternalBinding && binding instanceof IFunction ){ IFunction function = (IFunction) binding; - if( CPPSemantics.isSameFunction( function, declarator ) ){ + if( CPPSemantics.isSameFunction( function, funcDeclarator ) ){ ICPPInternalBinding internal = (ICPPInternalBinding) function; if( parent instanceof IASTSimpleDeclaration ) internal.addDeclaration( name ); @@ -587,15 +602,15 @@ public class CPPVisitor { } if( scope instanceof ICPPClassScope ){ - if( isConstructor( scope, declarator) ) + if( isConstructor( scope, funcDeclarator) ) binding = template ? (ICPPConstructor) new CPPConstructorTemplate( name ) - : new CPPConstructor( (ICPPASTFunctionDeclarator) declarator ); + : new CPPConstructor( (ICPPASTFunctionDeclarator) funcDeclarator ); else binding = template ? (ICPPMethod) new CPPMethodTemplate( name ) - : new CPPMethod( (ICPPASTFunctionDeclarator) declarator ); + : new CPPMethod( (ICPPASTFunctionDeclarator) funcDeclarator ); } else { binding = template ? (ICPPFunction) new CPPFunctionTemplate( name ) - : new CPPFunction( (ICPPASTFunctionDeclarator) declarator ); + : new CPPFunction( (ICPPASTFunctionDeclarator) funcDeclarator ); } } else if( parent instanceof IASTSimpleDeclaration ){ IType t1 = null, t2 = null;