From a94839573b25744b81bcdcbff5014614a92fdd8c Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 12 Aug 2003 18:19:55 +0000 Subject: [PATCH] CORE Added Complete Parse support for ASM Definitions. Added isVolatile() to abstract declarations. Added Complte Parse support for elaborated types / forward declaration of classes. Fixed some robustness issues. TESTS Cleaned up Junit parser-related tests so that failed tests are now expected failures w/defects associated with them. Updated CompleteParseTests for forward declaration/elaborated types. Added Search/ParseTestOnSearchFiles to AutomatedSuite. Updated Search tests to workaround bug 41445. --- .../failedTests/FailedDeclaratorsTest.java | 168 +++++++++ .../model/failedTests/FailedMacroTests.java | 120 +++++++ .../FailedTranslationUnitTests.java | 57 +++ .../parser/failedTests/ASTFailedTests.java | 12 +- .../core/model/tests/CModelElementsTests.java | 1 - .../core/model/tests/DeclaratorsTests.java | 117 +----- .../cdt/core/model/tests/MacroTests.java | 71 +--- .../model/tests/TranslationUnitBaseTest.java | 150 ++++++++ .../model/tests/TranslationUnitTests.java | 160 +-------- .../parser/tests/CompleteParseASTTest.java | 37 ++ .../core/parser/tests/ParserTestSuite.java | 3 +- .../core/parser/tests/QuickParseASTTests.java | 2 +- .../resources/search/classDecl.cpp | 4 +- .../tests/ClassDeclarationPatternTests.java | 16 +- .../search/tests/ParseTestOnSearchFiles.java | 65 ++++ .../core/suite/AutomatedIntegrationSuite.java | 4 +- .../cdt/internal/core/dom/DOMBuilder.java | 2 +- core/org.eclipse.cdt.core/parser/ChangeLog | 6 + .../eclipse/cdt/core/parser/ITokenDuple.java | 3 + .../parser/ast/IASTAbstractDeclaration.java | 1 + .../core/parser/ast/IASTArrayModifier.java | 3 +- .../ast/IASTElaboratedTypeSpecifier.java | 3 +- .../cdt/core/parser/ast/IASTFactory.java | 15 +- .../core/parser/DeclarationWrapper.java | 32 +- .../cdt/internal/core/parser/Declarator.java | 2 +- .../cdt/internal/core/parser/Parser.java | 77 ++-- .../cdt/internal/core/parser/TokenDuple.java | 26 ++ .../parser/ast/ASTAbstractDeclaration.java | 13 +- .../parser/ast/ASTParameterDeclaration.java | 4 +- .../core/parser/ast/BaseASTFactory.java | 8 +- .../parser/ast/complete/ASTASMDefinition.java | 43 +-- .../ast/complete/ASTClassSpecifier.java | 7 +- .../complete/ASTElaboratedTypeSpecifier.java | 63 +++- .../ast/complete/CompleteParseASTFactory.java | 337 ++++++++++++------ .../parser/ast/quick/ASTArrayModifier.java | 2 +- .../ast/quick/ASTElaboratedTypeSpecifier.java | 8 + .../ast/quick/QuickParseASTFactory.java | 20 +- 37 files changed, 1082 insertions(+), 580 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java create mode 100644 core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedMacroTests.java create mode 100644 core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedTranslationUnitTests.java create mode 100644 core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/TranslationUnitBaseTest.java create mode 100644 core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ParseTestOnSearchFiles.java rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/{internal => }/core/parser/ast/IASTArrayModifier.java (86%) 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 new file mode 100644 index 00000000000..84c7acf406f --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedDeclaratorsTest.java @@ -0,0 +1,168 @@ +/********************************************************************** + * 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.model.failedTests; + +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; + + + +/** + * @author jcamelon + * + */ +public class FailedDeclaratorsTest extends IntegratedCModelTest +{ + // the defect to track these failures is Bug 40768 + // Problems with nested declarators + static final boolean failedTest = true; + /** + * @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest + */ + public String getSourcefileSubdir() { + return "resources/cmodel/"; + } + + /** + * @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest + */ + public String getSourcefileResource() { + return "DeclaratorsTests.cpp"; + } + + public void testDeclarators_0003() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0003"); + if( failedTest ) return; // here is the where the failure is + 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"); + if( failedTest ) return; // here is the where the failure is + 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"); + if( failedTest ) return; // here is the where the failure is + 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"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + if( failedTest ) return; // here is the where the failure is + assertEquals(decl.getTypeName(), "void()(char)"); + } + + public void testDeclarators_0012() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0012"); + assertNotNull(element); + if( failedTest ) return; // here is the where the failure is + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + assertEquals(decl.getTypeName(), "void()(char)"); + } + + public void testDeclarators_0013() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0013"); + if( failedTest ) return; // here is the where the failure is + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + assertEquals(decl.getTypeName(), "void()(char)"); + } + + public void testDeclarators_0014() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0014"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_TYPEDEF); + ITypeDef decl = (ITypeDef)element; + if( failedTest ) return; // here is the where the failure is + assertEquals(decl.getTypeName(), "void*()(char)"); + } + + public void testDeclarators_0016() throws CModelException { + ITranslationUnit tu = getTU(); + ICElement element = tu.getElement("decl_0016"); + if( failedTest ) return; // here is the where the failure is + 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"); + if( failedTest ) return; // here is the where the failure is + 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"); + if( failedTest ) return; // here is the where the failure is + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_FUNCTION); + IFunction decl = (IFunction)element; + 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"); + if( failedTest ) return; // here is the where the failure is + 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(); + ICElement element = tu.getElement("decl_0031"); + assertNotNull(element); + assertEquals(element.getElementType(), ICElement.C_VARIABLE); + IVariable decl = (IVariable)element; + if( failedTest ) return; // here is the where the failure is + assertEquals(decl.getTypeName(), "int(*)(char(*)(bool))"); + } +} diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedMacroTests.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedMacroTests.java new file mode 100644 index 00000000000..2da94397a19 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/model/failedTests/FailedMacroTests.java @@ -0,0 +1,120 @@ +/********************************************************************** + * 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.model.failedTests; + +import java.util.Stack; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.model.tests.IntegratedCModelTest; +import org.eclipse.cdt.internal.core.model.CElement; + +/** + * @author jcamelon + * + */ +public class FailedMacroTests extends IntegratedCModelTest +{ + /** + * + */ + public FailedMacroTests() + { + super(); + // TODO Auto-generated constructor stub + } + /** + * @param name + */ + public FailedMacroTests(String name) + { + super(name); + // TODO Auto-generated constructor stub + } + + /** + * @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest + */ + public String getSourcefileSubdir() { + return "resources/cmodel/"; + } + + /** + * @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest + */ + public String getSourcefileResource() { + return "MacroTests.c"; + } + + private final static boolean failedTest = true; + /* This is a list of elements in the test .c file. It will be used + * in a number of places in the tests + */ + String[] expectedStringList= {"Z", "X", "Y", + "SomeName", "", "A::BCD", "DEFA", "DB", "B::SomeName", + "PINT", "myPINT", "foobar"}; + int[] expectedOffsets={ 8,26,39,55,75,89,114,130,152,187,212,227}; + int[] expectedLengths={ 1, 1, 1, 1, 1, 8, 4, 2, 18, 4, 6, 6}; + /* This is a list of that the types of the above list of elements is + * expected to be. + */ + int[] expectedTypes= { ICElement.C_MACRO, ICElement.C_MACRO, + ICElement.C_MACRO, ICElement.C_STRUCT, + ICElement.C_STRUCT, ICElement.C_VARIABLE, ICElement.C_MACRO, + ICElement.C_MACRO, ICElement.C_VARIABLE, ICElement.C_MACRO, + ICElement.C_VARIABLE, ICElement.C_FUNCTION_DECLARATION}; + + + public void testBug40759 () throws CModelException { + ITranslationUnit myTranslationUnit = getTU(); + ICElement myElement; + Stack missing=new Stack(); + int x; + + for (x=0;x class X { X(); };"); + IASTTemplateDeclaration template = (IASTTemplateDeclaration)parse("template class X { X(); };").getDeclarations().next(); + IASTClassSpecifier classX = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)template.getOwnedDeclaration()).getTypeSpecifier(); + IASTDeclaration d = (IASTDeclaration)classX.getDeclarations().next(); + assertTrue( d instanceof IASTVariable ); // this is not right! } public void testBug39536B() throws Exception { - assertCodeFailsParse("template class X { inline X(int); };"); + assertCodeFailsParse("template class X { inline X(int); };"); } public void testBug39538() throws Exception { @@ -314,8 +318,8 @@ public class ASTFailedTests extends BaseASTTest { try { - IASTDeclaration d = assertSoleDeclaration("extern int (* import) (void) __attribute__((dllimport));"); - fail( "We should not reach this point"); + IASTVariable d = (IASTVariable)assertSoleDeclaration("extern int (* import) (void) __attribute__((dllimport));"); + assertEquals( d.getName(), "__attribute__"); // false assertion } catch( ClassCastException cce ) { diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java index 9f9d75fb76f..fc96481a3e6 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java @@ -43,7 +43,6 @@ import org.eclipse.cdt.internal.core.model.FunctionTemplate; import org.eclipse.cdt.internal.core.model.MethodTemplate; import org.eclipse.cdt.internal.core.model.StructureTemplate; import org.eclipse.cdt.internal.core.model.TranslationUnit; -import org.eclipse.cdt.internal.core.model.VariableTemplate; import org.eclipse.cdt.testplugin.CProjectHelper; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; 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 a7c7082d634..116398fe1be 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 @@ -4,18 +4,17 @@ */ package org.eclipse.cdt.core.model.tests; +import junit.framework.Test; +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 junit.framework.*; - - /** * @author bnicolle * @@ -72,15 +71,7 @@ public class DeclaratorsTests extends IntegratedCModelTest { 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(); @@ -101,60 +92,6 @@ 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_0011() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0011"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void()(char)"); - } - - public void testDeclarators_0012() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0012"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void()(char)"); - } - - public void testDeclarators_0013() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0013"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void()(char)"); - } - - public void testDeclarators_0014() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0014"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_TYPEDEF); - ITypeDef decl = (ITypeDef)element; - assertEquals(decl.getTypeName(), "void*()(char)"); - } - public void testDeclarators_0015() throws CModelException { ITranslationUnit tu = getTU(); ICElement element = tu.getElement("decl_0015"); @@ -163,50 +100,4 @@ 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_0023() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0023"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_FUNCTION); - IFunction decl = (IFunction)element; - 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)"); - } - - public void testDeclarators_0031() throws CModelException { - ITranslationUnit tu = getTU(); - ICElement element = tu.getElement("decl_0031"); - assertNotNull(element); - assertEquals(element.getElementType(), ICElement.C_VARIABLE); - IVariable decl = (IVariable)element; - assertEquals(decl.getTypeName(), "int(*)(char(*)(bool))"); - } } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/MacroTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/MacroTests.java index b449caf25cb..bbaa23e2092 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/MacroTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/MacroTests.java @@ -4,14 +4,8 @@ */ package org.eclipse.cdt.core.model.tests; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.internal.core.model.CElement; - -import junit.framework.*; - -import java.util.Stack; +import junit.framework.Test; +import junit.framework.TestSuite; /** @@ -50,64 +44,5 @@ public class MacroTests extends IntegratedCModelTest { } - /* This is a list of elements in the test .c file. It will be used - * in a number of places in the tests - */ - String[] expectedStringList= {"Z", "X", "Y", - "SomeName", "", "A::BCD", "DEFA", "DB", "B::SomeName", - "PINT", "myPINT", "foobar"}; - int[] expectedOffsets={ 8,26,39,55,75,89,114,130,152,187,212,227}; - int[] expectedLengths={ 1, 1, 1, 1, 1, 8, 4, 2, 18, 4, 6, 6}; - /* This is a list of that the types of the above list of elements is - * expected to be. - */ - int[] expectedTypes= { ICElement.C_MACRO, ICElement.C_MACRO, - ICElement.C_MACRO, ICElement.C_STRUCT, - ICElement.C_STRUCT, ICElement.C_VARIABLE, ICElement.C_MACRO, - ICElement.C_MACRO, ICElement.C_VARIABLE, ICElement.C_MACRO, - ICElement.C_VARIABLE, ICElement.C_FUNCTION_DECLARATION}; - - - public void testMacro_0001() throws CModelException { - ITranslationUnit myTranslationUnit = getTU(); - ICElement myElement; - Stack missing=new Stack(); - int x; - - for (x=0;x= length() ) return null; + Iterator i = iterator(); + int count = 0; + while( i.hasNext() ) + { + IToken r = (IToken)i.next(); + if( count == index ) + return r; + ++count; + } + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java index d10b22fc735..6c9afbfe3f9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java @@ -23,7 +23,8 @@ import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; */ public class ASTAbstractDeclaration implements IASTAbstractDeclaration { - private final List parms; + private final boolean isVolatile; + private final List parms; private final boolean isConst; private final IASTTypeSpecifier typeSpecifier; private final List pointerOperators; @@ -35,7 +36,7 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration * @param pointerOperators * @param arrayModifiers */ - public ASTAbstractDeclaration(boolean isConst, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp ) + public ASTAbstractDeclaration(boolean isConst, boolean isVolatile, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp ) { this.isConst = isConst; this.typeSpecifier = typeSpecifier; @@ -43,6 +44,7 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration this.arrayModifiers = arrayModifiers; this.parms = parameters; this.pointerOperator = pointerOp; + this.isVolatile = isVolatile; } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#isConst() @@ -86,4 +88,11 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration { return pointerOperator; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#isVolatile() + */ + public boolean isVolatile() + { + return isVolatile; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTParameterDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTParameterDeclaration.java index 1e6724ce1c0..2fe06b391b8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTParameterDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTParameterDeclaration.java @@ -34,9 +34,9 @@ public class ASTParameterDeclaration extends ASTAbstractDeclaration implements I * @param parameterName * @param initializerClause */ - public ASTParameterDeclaration(boolean isConst, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp, String parameterName, IASTInitializerClause initializerClause) + public ASTParameterDeclaration(boolean isConst, boolean isVolatile, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp, String parameterName, IASTInitializerClause initializerClause) { - super( isConst, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOp ); + super( isConst, isVolatile, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOp ); this.parameterName = parameterName; this.initializerClause = initializerClause; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java index a0fdfc57dc4..d754df9813e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/BaseASTFactory.java @@ -49,14 +49,14 @@ public class BaseASTFactory { return inclusion; } - public IASTAbstractDeclaration createAbstractDeclaration(boolean isConst, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOperator) + public IASTAbstractDeclaration createAbstractDeclaration(boolean isConst, boolean isVolatile, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOperator) { - return new ASTAbstractDeclaration( isConst, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOperator ); + return new ASTAbstractDeclaration( isConst, isVolatile, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOperator ); } - public IASTParameterDeclaration createParameterDeclaration(boolean isConst, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp, String parameterName, IASTInitializerClause initializerClause) + public IASTParameterDeclaration createParameterDeclaration(boolean isConst, boolean isVolatile, IASTTypeSpecifier typeSpecifier, List pointerOperators, List arrayModifiers, List parameters, ASTPointerOperator pointerOp, String parameterName, IASTInitializerClause initializerClause) { - return new ASTParameterDeclaration( isConst, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOp, parameterName, initializerClause ); + return new ASTParameterDeclaration( isConst, isVolatile, typeSpecifier, pointerOperators, arrayModifiers, parameters, pointerOp, parameterName, initializerClause ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTASMDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTASMDefinition.java index 7ab89bda1b7..fd4b42e6789 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTASMDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTASMDefinition.java @@ -12,87 +12,80 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; -import org.eclipse.cdt.core.parser.ast.IASTScope; +import org.eclipse.cdt.internal.core.parser.ast.Offsets; +import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; /** * @author jcamelon * */ -public class ASTASMDefinition implements IASTASMDefinition +public class ASTASMDefinition extends ASTAnonymousDeclaration implements IASTASMDefinition { + private Offsets offsets = new Offsets(); + private final String assembly; /** * */ - public ASTASMDefinition() + public ASTASMDefinition( IContainerSymbol scope, String assembly, int first, int last ) { - super(); - // TODO Auto-generated constructor stub + super( scope ); + this.assembly = assembly; + setStartingOffset(first); + setEndingOffset(last); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTASMDefinition#getBody() */ public String getBody() { - // TODO Auto-generated method stub - return null; + return assembly; } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setStartingOffset(int) */ public void setStartingOffset(int o) { - // TODO Auto-generated method stub + offsets.setStartingOffset(o); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffset(int) */ public void setEndingOffset(int o) { - // TODO Auto-generated method stub + offsets.setEndingOffset(o); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset() */ public int getStartingOffset() { - // TODO Auto-generated method stub - return 0; + return offsets.getStartingOffset(); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset() */ public int getEndingOffset() - { - // TODO Auto-generated method stub - return 0; - } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTScopedElement#getOwnerScope() - */ - public IASTScope getOwnerScope() - { - // TODO Auto-generated method stub - return null; + { + return offsets.getEndingOffset(); } + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void acceptElement(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub + requestor.acceptASMDefinition(this); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void enterScope(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void exitScope(ISourceElementRequestor requestor) { - // TODO Auto-generated method stub } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java index af37e66c049..2574d9e6c7f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTClassSpecifier.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import java.util.Iterator; +import java.util.List; import java.util.NoSuchElementException; import org.eclipse.cdt.core.parser.ISourceElementRequestor; @@ -85,11 +86,12 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier private final ASTClassKind classKind; private ASTAccessVisibility currentVisibility; private final ASTQualifiedNamedElement qualifiedName; + private final ASTReferenceStore references; /** * @param symbol */ - public ASTClassSpecifier(ISymbol symbol, ASTClassKind kind, ClassNameType type, ASTAccessVisibility access, int startingOffset, int nameOffset ) + public ASTClassSpecifier(ISymbol symbol, ASTClassKind kind, ClassNameType type, ASTAccessVisibility access, int startingOffset, int nameOffset, List references ) { super(symbol); classKind = kind; @@ -98,6 +100,7 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier setStartingOffset(startingOffset); setNameOffset(nameOffset); qualifiedName = new ASTQualifiedNamedElement( getOwnerScope(), symbol.getName() ); + this.references = new ASTReferenceStore( references ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTClassSpecifier#getClassNameType() @@ -161,13 +164,13 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier */ public void acceptElement(ISourceElementRequestor requestor) { - } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) */ public void enterScope(ISourceElementRequestor requestor) { + references.processReferences( requestor ); requestor.enterClassSpecifier(this); Iterator i = getBaseClauses(); while( i.hasNext() ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java index d708986c296..80c4b072b6d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java @@ -10,67 +10,100 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.complete; +import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTClassKind; +import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.internal.core.parser.ast.Offsets; +import org.eclipse.cdt.internal.core.parser.pst.ISymbol; /** * @author jcamelon * */ -public class ASTElaboratedTypeSpecifier implements IASTElaboratedTypeSpecifier +public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElaboratedTypeSpecifier { + private final ASTClassKind kind; + private Offsets offsets = new Offsets(); + /** - * + * @param checkSymbol + * @param kind + * @param startingOffset + * @param endOffset */ - public ASTElaboratedTypeSpecifier() + public ASTElaboratedTypeSpecifier(ISymbol checkSymbol, ASTClassKind kind, int startingOffset, int endOffset) { - super(); - // TODO Auto-generated constructor stub + super( checkSymbol ); + this.kind = kind; + setStartingOffset( startingOffset ); + setEndingOffset( endOffset ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#getName() */ public String getName() { - // TODO Auto-generated method stub - return null; + return getSymbol().getName(); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#getClassKind() */ public ASTClassKind getClassKind() { - // TODO Auto-generated method stub - return null; + return kind; + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#isResolved() + */ + public boolean isResolved() throws ASTNotImplementedException + { + return ! getSymbol().isForwardDeclaration(); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setStartingOffset(int) */ public void setStartingOffset(int o) { - // TODO Auto-generated method stub + offsets.setStartingOffset(o); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffset(int) */ public void setEndingOffset(int o) { - // TODO Auto-generated method stub + offsets.setEndingOffset( o ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset() */ public int getStartingOffset() { - // TODO Auto-generated method stub - return 0; + return offsets.getStartingOffset(); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset() */ public int getEndingOffset() { - // TODO Auto-generated method stub - return 0; + return offsets.getEndingOffset(); + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void acceptElement(ISourceElementRequestor requestor) + { + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#enterScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void enterScope(ISourceElementRequestor requestor) + { + } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) + */ + public void exitScope(ISourceElementRequestor requestor) + { } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index 539bf5ba155..7d2abccaba0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.parser.ast.ASTSemanticException; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; import org.eclipse.cdt.core.parser.ast.IASTConstructorMemberInitializer; @@ -57,7 +58,6 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type; import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParamKind; import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory; -import org.eclipse.cdt.internal.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.internal.core.parser.pst.ForewardDeclaredSymbolExtension; import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.IDerivableContainerSymbol; @@ -86,6 +86,73 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto super(); } + + protected ISymbol lookupQualifiedName( IContainerSymbol startingScope, ITokenDuple name, List references ) throws ASTSemanticException + { + ISymbol result = null; + IToken firstSymbol = null; + switch( name.length() ) + { + case 0: + throw new ASTSemanticException(); + case 1: + firstSymbol = name.getFirstToken(); + try + { + result = startingScope.lookup( firstSymbol.getImage()); + if( result != null ) + references.add( createReference( result, firstSymbol.getImage(), firstSymbol.getOffset() )); + else + throw new ASTSemanticException(); + } + catch (ParserSymbolTableException e) + { + throw new ASTSemanticException(); + } + break; + case 2: + firstSymbol = name.getFirstToken(); + if( firstSymbol.getType() != IToken.tCOLONCOLON ) + throw new ASTSemanticException(); + try + { + result = pst.getCompilationUnit().lookup( name.getLastToken().getImage() ); + references.add( createReference( result, name.getLastToken().getImage(), name.getLastToken().getOffset() )); + } + catch( ParserSymbolTableException e) + { + throw new ASTSemanticException(); + } + break; + default: + Iterator iter = name.iterator(); + firstSymbol = name.getFirstToken(); + result = startingScope; + if( firstSymbol.getType() == IToken.tCOLONCOLON ) + result = pst.getCompilationUnit(); + while( iter.hasNext() ) + { + IToken t = (IToken)iter.next(); + if( t.getType() == IToken.tCOLONCOLON ) continue; + try + { + if( t == name.getLastToken() ) + result = ((IContainerSymbol)result).qualifiedLookup( t.getImage() ); + else + result = ((IContainerSymbol)result).lookupNestedNameSpecifier( t.getImage() ); + references.add( createReference( result, t.getImage(), t.getOffset() )); + } + catch( ParserSymbolTableException pste ) + { + throw new ASTSemanticException(); + } + } + + } + return result; + } + + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createUsingDirective(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ITokenDuple, int, int) */ @@ -95,34 +162,15 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto int startingOffset, int endingOffset) throws ASTSemanticException - { - Iterator iter = duple.iterator(); - if( ! iter.hasNext() ) - throw new ASTSemanticException(); - - IContainerSymbol symbol = null; - List references = new ArrayList(); - - symbol = getScopeToSearchUpon(scope, (IToken)duple.getFirstToken(), iter ); - - while( iter.hasNext() ) - { - IToken t = (IToken)iter.next(); - if( t.getType() == IToken.tCOLONCOLON ) continue; - try - { - symbol = symbol.lookupNestedNameSpecifier( t.getImage() ); - references.add( createReference( symbol, t.getImage(), t.getOffset() )); - } - catch( ParserSymbolTableException pste ) - { - throw new ASTSemanticException(); - } - } - + { + List references = new ArrayList(); + ISymbol symbol = lookupQualifiedName( + scopeToSymbol( scope), duple, references ); + try { - ((ASTScope)scope).getContainerSymbol().addUsingDirective( symbol ); - } catch (ParserSymbolTableException pste) { + ((ASTScope)scope).getContainerSymbol().addUsingDirective( (IContainerSymbol)symbol ); + } catch (ParserSymbolTableException pste) { + throw new ASTSemanticException(); } IASTUsingDirective astUD = new ASTUsingDirective( scopeToSymbol(scope), ((IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration()), startingOffset, endingOffset, references ); @@ -164,30 +212,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto int endingOffset) throws ASTSemanticException { List references = new ArrayList(); - Iterator iter = name.iterator(); - - if( ! iter.hasNext() ) - throw new ASTSemanticException(); - - ISymbol symbol = getScopeToSearchUpon( scope, name.getFirstToken(), iter ); - - while( iter.hasNext() ) - { - IToken t = (IToken)iter.next(); - if( t.getType() == IToken.tCOLONCOLON ) continue; - try - { - if( t != name.getLastToken() ) - symbol = ((IContainerSymbol)symbol).lookupNestedNameSpecifier( t.getImage() ); - else - symbol = ((IContainerSymbol)symbol).lookup( t.getImage() ); - } - catch (ParserSymbolTableException e) - { - throw new ASTSemanticException(); - } - references.add( createReference( symbol, t.getImage(), t.getOffset() ) ); - } + ISymbol symbol = lookupQualifiedName( scopeToSymbol(scope), name, references ); try { @@ -209,8 +234,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto int first, int last) { - // TODO Fix This - return new ASTASMDefinition(); + + return new ASTASMDefinition( scopeToSymbol(scope), assembly, first, last ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createNamespaceDefinition(org.eclipse.cdt.core.parser.ast.IASTScope, java.lang.String, int, int) @@ -221,20 +246,22 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto int startingOffset, int nameOffset) throws ASTSemanticException { - // first we look up the symbol in the PST see if it already exists - // if not we create it - // TODO : handle the anonymous case IContainerSymbol pstScope = scopeToSymbol(scope); ISymbol namespaceSymbol = null; - try - { - namespaceSymbol = pstScope.lookup( identifier ); - } - catch (ParserSymbolTableException e) - { - throw new ASTSemanticException(); - } + + + if( ! identifier.equals( "" ) ) + { + try + { + namespaceSymbol = pstScope.qualifiedLookup( identifier ); + } + catch (ParserSymbolTableException e) + { + throw new ASTSemanticException(); + } + } if( namespaceSymbol != null ) { @@ -244,14 +271,20 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto else { namespaceSymbol = pst.newContainerSymbol( identifier, TypeInfo.t_namespace ); - try - { - pstScope.addSymbol( namespaceSymbol ); - } - catch (ParserSymbolTableException e1) - { - // not overloading, should never happen - } + if( identifier.equals( "" ) ) + namespaceSymbol.setContainingSymbol( pstScope ); + else + { + + try + { + pstScope.addSymbol( namespaceSymbol ); + } + catch (ParserSymbolTableException e1) + { + // not overloading, should never happen + } + } } ASTNamespaceDefinition namespaceDef = new ASTNamespaceDefinition( namespaceSymbol, startingOffset, nameOffset ); @@ -327,39 +360,62 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto */ public IASTClassSpecifier createClassSpecifier( IASTScope scope, - String name, + ITokenDuple name, ASTClassKind kind, ClassNameType type, ASTAccessVisibility access, int startingOffset, int nameOffset) throws ASTSemanticException { - IContainerSymbol containerSymbol = scopeToSymbol(scope); - TypeInfo.eType pstType = null; + IContainerSymbol currentScopeSymbol = scopeToSymbol(scope); + TypeInfo.eType pstType = classKindToTypeInfo(kind); + List references = new ArrayList(); + IToken lastToken = name.getLastToken(); + if( name.length() != 1 ) // qualified name + { + ITokenDuple containerSymbolName = + name.getSubrange( 0, name.length() - 3 ); // -1 for index, -2 for last hop of qualified name + currentScopeSymbol = (IContainerSymbol)lookupQualifiedName( currentScopeSymbol, + containerSymbolName, references); + if( currentScopeSymbol == null ) + throw new ASTSemanticException(); + } - if( kind == ASTClassKind.CLASS ) - pstType = TypeInfo.t_class; - else if( kind == ASTClassKind.STRUCT ) - pstType = TypeInfo.t_struct; - else if( kind == ASTClassKind.UNION ) - pstType = TypeInfo.t_union; - else - throw new ASTSemanticException(); - - IDerivableContainerSymbol classSymbol = pst.newDerivableContainerSymbol( name, pstType ); + ISymbol classSymbol = null; try { - containerSymbol.addSymbol( classSymbol ); + classSymbol = currentScopeSymbol.qualifiedLookup(lastToken.getImage()); } catch (ParserSymbolTableException e) { - throw new ASTSemanticException(); + throw new ASTSemanticException(); } - ASTClassSpecifier classSpecifier = new ASTClassSpecifier( classSymbol, kind, type, access, startingOffset, nameOffset ); + if( classSymbol != null && ! classSymbol.isForwardDeclaration() ) + throw new ASTSemanticException(); + + if( classSymbol != null && classSymbol.getType() != pstType ) + throw new ASTSemanticException(); + + + IDerivableContainerSymbol newSymbol = pst.newDerivableContainerSymbol( lastToken.getImage(), pstType ); + + try + { + currentScopeSymbol.addSymbol( newSymbol ); + } + catch (ParserSymbolTableException e2) + { + throw new ASTSemanticException(); + } + + if( classSymbol != null ) + classSymbol.setTypeSymbol( newSymbol ); + + ASTClassSpecifier classSpecifier = new ASTClassSpecifier( newSymbol, kind, type, access, startingOffset, nameOffset, references ); try { - attachSymbolExtension(classSymbol, classSpecifier ); + attachSymbolExtension(newSymbol, classSpecifier ); } catch (ExtensionException e1) { @@ -368,6 +424,22 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto return classSpecifier; } + protected TypeInfo.eType classKindToTypeInfo(ASTClassKind kind) + throws ASTSemanticException + { + TypeInfo.eType pstType = null; + + if( kind == ASTClassKind.CLASS ) + pstType = TypeInfo.t_class; + else if( kind == ASTClassKind.STRUCT ) + pstType = TypeInfo.t_struct; + else if( kind == ASTClassKind.UNION ) + pstType = TypeInfo.t_union; + else + throw new ASTSemanticException(); + return pstType; + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#addBaseSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier, boolean, org.eclipse.cdt.core.parser.ast.ASTAccessVisibility, java.lang.String) @@ -467,18 +539,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto throw new ASTSemanticException(); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createElaboratedTypeSpecifier(org.eclipse.cdt.core.parser.ast.ASTClassKind, java.lang.String, int, int) - */ - public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier( - ASTClassKind elaboratedClassKind, - String typeName, - int startingOffset, - int endOffset) - { - //TODO FIX THIS - return new ASTElaboratedTypeSpecifier(); - } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createEnumerationSpecifier(org.eclipse.cdt.core.parser.ast.IASTScope, java.lang.String, int, int) */ @@ -1016,8 +1076,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto protected ISymbol cloneSimpleTypeSymbol( String name, IASTAbstractDeclaration abstractDeclaration, - List references) + List references) throws ASTSemanticException { + if( abstractDeclaration.getTypeSpecifier() == null ) + throw new ASTSemanticException(); ISymbol newSymbol = null; ISymbol symbolToBeCloned = null; if( abstractDeclaration.getTypeSpecifier() instanceof ASTSimpleTypeSpecifier ) @@ -1029,6 +1091,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto { symbolToBeCloned = ((ASTClassSpecifier)abstractDeclaration.getTypeSpecifier()).getSymbol(); } + else if( abstractDeclaration.getTypeSpecifier() instanceof ASTElaboratedTypeSpecifier ) + { + symbolToBeCloned = ((ASTElaboratedTypeSpecifier)abstractDeclaration.getTypeSpecifier()).getSymbol(); + } newSymbol = (ISymbol) symbolToBeCloned.clone(); newSymbol.setName( name ); @@ -1070,8 +1136,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } catch (ParserSymbolTableException e) { - // TODO Auto-generated catch block + throw new ASTSemanticException(); } + ASTField field = new ASTField( newSymbol, abstractDeclaration, initializerClause, bitfieldExpression, startingOffset, nameOffset, references, visibility ); try { @@ -1145,6 +1212,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto ISymbol newSymbol = pst.newSymbol( name, TypeInfo.t_type); newSymbol.getTypeInfo().setBit( true,TypeInfo.isTypedef ); + List references = new ArrayList(); if( mapping.getTypeSpecifier() instanceof ASTSimpleTypeSpecifier ) { @@ -1184,5 +1252,66 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } + public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(IASTScope scope, ASTClassKind kind, ITokenDuple name, int startingOffset, int endOffset, boolean isForewardDecl) throws ASTSemanticException + { + IContainerSymbol currentScopeSymbol = scopeToSymbol(scope); + TypeInfo.eType pstType = classKindToTypeInfo(kind); + List references = new ArrayList(); + IToken lastToken = name.getLastToken(); + if( name.length() != 1 ) // qualified name + { + ITokenDuple containerSymbolName = + name.getSubrange( 0, name.length() - 3 ); // -1 for index, -2 for last hop of qualified name + currentScopeSymbol = (IContainerSymbol)lookupQualifiedName( currentScopeSymbol, + containerSymbolName, references); + if( currentScopeSymbol == null ) + throw new ASTSemanticException(); + } + + ISymbol checkSymbol = null; + try + { + checkSymbol = currentScopeSymbol.qualifiedLookup(lastToken.getImage()); + } + catch (ParserSymbolTableException e) + { + throw new ASTSemanticException(); + } + + + if( isForewardDecl ) + { + if( checkSymbol == null ) + { + + checkSymbol = pst.newDerivableContainerSymbol( lastToken.getImage(), pstType ); + checkSymbol.setIsForwardDeclaration( true ); + try + { + currentScopeSymbol.addSymbol( checkSymbol ); + } + catch (ParserSymbolTableException e1) + { + throw new ASTSemanticException(); + } + + ASTElaboratedTypeSpecifier elab = + new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, endOffset ); + + try + { + attachSymbolExtension( checkSymbol, elab ); + } + catch (ExtensionException e2) + { + throw new ASTSemanticException(); + } + } + } + + + return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration(); + } + protected ParserSymbolTable pst = new ParserSymbolTable(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java index 8058426a2df..df65183361b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTArrayModifier.java @@ -10,8 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.quick; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTExpression; -import org.eclipse.cdt.internal.core.parser.ast.IASTArrayModifier; /** * @author jcamelon diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTElaboratedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTElaboratedTypeSpecifier.java index 04503ca80a9..419626f54b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTElaboratedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTElaboratedTypeSpecifier.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.parser.ast.quick; import org.eclipse.cdt.core.parser.ast.ASTClassKind; +import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.internal.core.parser.ast.Offsets; @@ -80,4 +81,11 @@ public class ASTElaboratedTypeSpecifier implements IASTElaboratedTypeSpecifier { return offsets.getEndingOffset(); } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#isResolved() + */ + public boolean isResolved() throws ASTNotImplementedException + { + throw new ASTNotImplementedException(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java index 36fa6a8a9fa..5cee802e6fa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.parser.ast.ASTSemanticException; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTArrayModifier; import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; @@ -53,9 +54,9 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescripto import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type; import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory; -import org.eclipse.cdt.internal.core.parser.ast.IASTArrayModifier; /** + * @author jcamelon * */ @@ -112,8 +113,8 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createClassSpecifier(org.eclipse.cdt.core.parser.ast.IASTScope, java.lang.String, org.eclipse.cdt.core.parser.ast.ClassKind, org.eclipse.cdt.core.parser.ast.ClassNameType, org.eclipse.cdt.core.parser.ast.AccessVisibility, org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration) */ - public IASTClassSpecifier createClassSpecifier(IASTScope scope, String name, ASTClassKind kind, ClassNameType type, ASTAccessVisibility access, int startingOffset, int nameOffset) throws ASTSemanticException { - IASTClassSpecifier spec = new ASTClassSpecifier( scope, name, kind, type, access ); + public IASTClassSpecifier createClassSpecifier(IASTScope scope, ITokenDuple name, ASTClassKind kind, ClassNameType type, ASTAccessVisibility access, int startingOffset, int nameOffset) throws ASTSemanticException { + IASTClassSpecifier spec = new ASTClassSpecifier( scope, name == null ? "" : name.toString() , kind, type, access ); spec.setStartingOffset( startingOffset ); spec.setNameOffset( nameOffset ); return spec; @@ -127,14 +128,6 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory ((IASTQClassSpecifier)astClassSpec).addBaseClass(baseSpecifier); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createElaboratedTypeSpecifier(org.eclipse.cdt.core.parser.ast.ClassKind, java.lang.String, int, int) - */ - public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(ASTClassKind elaboratedClassKind, String typeName, int startingOffset, int endOffset) - { - return new ASTElaboratedTypeSpecifier( elaboratedClassKind, typeName, startingOffset, endOffset ); - } - /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createEnumerationSpecifier(java.lang.String, int) */ @@ -285,5 +278,8 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory return new ASTAbstractTypeSpecifierDeclaration( scope, typeSpecifier, template, startingOffset, endingOffset ); } - + public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(IASTScope scope, ASTClassKind elaboratedClassKind, ITokenDuple typeName, int startingOffset, int endOffset, boolean isForewardDecl) + { + return new ASTElaboratedTypeSpecifier( elaboratedClassKind, typeName.toString(), startingOffset, endOffset ); + } }