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

Fix for bug 161913 - Migrate CModelBuilder to use DOM AST

This commit is contained in:
Anton Leherbauer 2006-11-30 13:30:42 +00:00
parent 02d3378c25
commit cb6c40b03b
21 changed files with 2308 additions and 265 deletions

View file

@ -10,6 +10,9 @@
*******************************************************************************/
package org.eclipse.cdt.core.model.failedTests;
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;
@ -18,6 +21,7 @@ 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;
@ -28,8 +32,11 @@ import org.eclipse.cdt.core.model.tests.IntegratedCModelTest;
public class FailedDeclaratorsTest extends IntegratedCModelTest
{
// the defect to track these failures is Bug 40768
// Problems with nested declarators
static final boolean failedTest = true;
private FailedDeclaratorsTest(String name) {
super(name);
}
/**
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
@ -43,22 +50,50 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
public String getSourcefileResource() {
return "DeclaratorsTests.cpp";
}
/**
* @returns a test suite named after this class
* containing all its public members named "test*"
*/
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");
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");
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");
if( failedTest ) return; // here is the where the failure is
assertNotNull(element);
assertEquals(element.getElementType(), ICElement.C_VARIABLE);
IVariable decl = (IVariable)element;
@ -66,14 +101,13 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
}
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)");
}
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();
@ -81,7 +115,6 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
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)");
}
@ -89,7 +122,6 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
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)");
@ -98,7 +130,6 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
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;
@ -111,14 +142,12 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
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;
@ -128,7 +157,6 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
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;
@ -136,33 +164,22 @@ public class FailedDeclaratorsTest extends IntegratedCModelTest
}
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)");
}
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");
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_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;
if( failedTest ) return; // here is the where the failure is
assertEquals(decl.getTypeName(), "int(*)(char(*)(bool))");
}
}

View file

@ -53,7 +53,7 @@ public class FailedMacroTests extends IntegratedCModelTest
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
public String getSourcefileResource() {
return "MacroTests.c";
return "MacroTests.cpp";
}
private final static boolean failedTest = true;

View file

@ -13,6 +13,8 @@ package org.eclipse.cdt.core.model.tests;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.failedTests.FailedDeclaratorsTest;
/**
*
@ -41,6 +43,7 @@ public class AllCoreTests {
suite.addTest(ArchiveTests.suite());
suite.addTest(TranslationUnitTests.suite());
suite.addTest(DeclaratorsTests.suite());
suite.addTest(FailedDeclaratorsTest.suite());
suite.addTest(CPathEntryTest.suite());
return suite;

View file

@ -329,7 +329,7 @@ public class CModelElementsTests extends TestCase {
IVariable vDecl2 = (IVariable) nsVars.get(3);
assertEquals(vDecl2.getElementName(), new String("orig_malloc_hook"));
checkElementOffset(vDecl2);
assertEquals(vDecl2.getTypeName(), new String ("void*(*)(const char*, int, size_t)"));
assertEquals(vDecl2.getTypeName(), new String ("void*(*)(const char*, int, int)"));
checkLineNumbers(vDecl2, 81, 81);
}
@ -416,7 +416,7 @@ public class CModelElementsTests extends TestCase {
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
assertEquals(td2.getElementName(), new String ("myTypedef"));
checkElementOffset(td2);
assertEquals(td2.getTypeName(), new String (""));
assertEquals(td2.getTypeName(), new String ("struct"));
checkLineNumbers(td2, 101, 103);
// union

View file

@ -71,18 +71,6 @@ 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_0004() throws CModelException {
ITranslationUnit tu = getTU();
ICElement element = tu.getElement("decl_0004");
@ -103,11 +91,21 @@ public class DeclaratorsTests extends IntegratedCModelTest {
}
public void testDeclarators_0015() throws CModelException {
ITranslationUnit tu = getTU();
ICElement element = tu.getElement("decl_0015");
assertNotNull(element);
assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
ITypeDef decl = (ITypeDef)element;
assertEquals(decl.getTypeName(), "void(*)(char)");
ITranslationUnit tu = getTU();
ICElement element = tu.getElement("decl_0015");
assertNotNull(element);
assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
ITypeDef decl = (ITypeDef)element;
assertEquals(decl.getTypeName(), "void(*)(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))");
}
}

View file

@ -44,7 +44,7 @@ public class IStructureTests extends IntegratedCModelTest {
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
public String getSourcefileResource() {
return "IStructure.c";
return "IStructure.cpp";
}
/**

View file

@ -14,12 +14,19 @@
*/
package org.eclipse.cdt.core.model.tests;
import org.eclipse.cdt.core.model.*;
import junit.framework.*;
import java.util.ArrayList;
import java.util.List;
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.IStructure;
import org.eclipse.cdt.core.model.ITemplate;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IVariable;
/**
@ -143,9 +150,30 @@ public class ITemplateTests extends IntegratedCModelTest {
{
// Check the template function
List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION);
// actually, none of the two are function templates, but method templates
String[] myExpectedValues = {
// "nonVector<T>::first",
"Foo::fum",
};
assertEquals(myExpectedValues.length, arrayElements.size());
// This test is no correct there is no guaranty on the order
// for this particular case
for(int i=0; i<myExpectedValues.length; i++) {
ICElement celement = (ICElement) arrayElements.get(i);
ITemplate myITemplate = (ITemplate)celement;
assertNotNull( "Failed on "+i, myITemplate);
assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName());
}
}
{
// Check the template method
List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD);
// actually, both of the two are method templates, but Foo is not resolved
// to a cpp class
String[] myExpectedValues = {
"nonVector<T>::first",
"Foo::fum",
// "Foo::fum",
};
assertEquals(myExpectedValues.length, arrayElements.size());
// This test is no correct there is no guaranty on the order
@ -198,21 +226,20 @@ public class ITemplateTests extends IntegratedCModelTest {
// assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName());
// }
}
/*
// TEMPLATE_VARIABLE moved to failed tests
{
ArrayList arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE);
List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE);
String[] myExpectedValues = {
"default_alloc_template<threads,inst>::S_start_free"
};
assertEquals(myExpectedValues.length, arrayElements.size());
for(int i=0; i<myExpectedValues.length; i++) {
ITemplate myITemplate = (ITemplate) arrayElements.get(i);
IVariable myITemplate = (IVariable) arrayElements.get(i);
assertNotNull( "Failed on "+i, myITemplate);
assertEquals("Failed on "+i, myExpectedValues[i], myITemplate.getElementName());
}
}
*/ }
}
public void testGetNumberOfTemplateParameters() throws CModelException
@ -224,13 +251,12 @@ public class ITemplateTests extends IntegratedCModelTest {
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) );
arrayElements.addAll( getTemplateMethods(tu) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION ) );
// TEMPLATE_VARIABLE moved to failed tests
//arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
int[] myExpectedNumbers = {
// 3,1,3,1,1,3
3,1,3,1,1,1,1,1/*,2*/
3,1,3,1,1,1,1,1,2
};
assertEquals(myExpectedNumbers.length, arrayElements.size());
for(int i=0; i<myExpectedNumbers.length; i++) {
@ -248,10 +274,10 @@ public class ITemplateTests extends IntegratedCModelTest {
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) );
arrayElements.addAll( getTemplateMethods(tu) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION ) );
// TEMPLATE_VARIABLE moved to failed tests
//arrayElements.addAll( tu.getChildrenOfType(ICElement.C_VARIABLE_TEMPLATE ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
String[][] myExpectedValues = {
//"Map"
@ -270,9 +296,8 @@ public class ITemplateTests extends IntegratedCModelTest {
{"Bar"},
//"IsGreaterThan"
{"X"},
/*
//"default_alloc_template::S_start_free"
{"bool", "int"},*/
{"bool", "int"},
};
assertEquals(myExpectedValues.length, arrayElements.size());
for(int i=0; i<myExpectedValues.length; i++) {
@ -294,10 +319,11 @@ public class ITemplateTests extends IntegratedCModelTest {
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) );
arrayElements.addAll( getTemplateMethods(tu) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION ) );
// TEMPLATE_VARIABLE moved to failed tests
//arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
String[] myExpectedValues = {
"Map<Key, Value, SortAlgorithm>",
@ -305,11 +331,11 @@ public class ITemplateTests extends IntegratedCModelTest {
"ArrayOverlay<X, Y, int=16>",
"fum<Bar>(int) : void",
"scrum<int>(void) : void", // TODO: deduce the rules of () versus (void), compare below.
"nonVector<T>::first<T>() : const T&", // TODO: where should <T> be?
"nonVector<T>::first<T>() const : const T&", // TODO: where should <T> be?
"Foo::fum<Bar>(int) : void",
// TODO: shouldn't signature indicate const function as well?
"IsGreaterThan<X>(X, X) : bool",
/*"default_alloc_template<threads,inst>::S_start_free<bool, int> : char*",*/
"default_alloc_template<threads,inst>::S_start_free<bool, int> : char*",
};
assertEquals(myExpectedValues.length, arrayElements.size());
for(int i=0; i<myExpectedValues.length; i++) {

View file

@ -42,6 +42,7 @@ public abstract class IntegratedCModelTest extends TestCase {
private IFile sourceFile;
private NullProgressMonitor monitor;
private boolean structuralParse = false;
private boolean fUseNewModelBuilder= true;
/**
*
@ -91,16 +92,14 @@ public abstract class IntegratedCModelTest extends TestCase {
protected ITranslationUnit getTU() throws CModelException {
ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(sourceFile);
if(isStructuralParse()) {
CCorePlugin.getDefault().setStructuralParseMode(true);
} else {
CCorePlugin.getDefault().setStructuralParseMode(false);
}
CCorePlugin.getDefault().setUseNewModelBuilder(useNewModelBuilder());
CCorePlugin.getDefault().setStructuralParseMode(isStructuralParse());
// parse the translation unit to get the elements tree
// Force the parsing now to do this in the right ParseMode.
tu.close();
tu.open(new NullProgressMonitor());
CCorePlugin.getDefault().setStructuralParseMode(false);
CCorePlugin.getDefault().setUseNewModelBuilder(false);
return tu;
}
/**
@ -115,4 +114,20 @@ public abstract class IntegratedCModelTest extends TestCase {
public void setStructuralParse(boolean structuralParse) {
this.structuralParse = structuralParse;
}
/**
* @return whether to use the new model builder or not
*/
public boolean useNewModelBuilder() {
return fUseNewModelBuilder;
}
/**
* Set whether to use the new model builder.
* @param useNewModelBuilder
*/
public TestCase setUseNewModelBuilder(boolean useNewModelBuilder) {
fUseNewModelBuilder = useNewModelBuilder;
return this;
}
}

View file

@ -41,7 +41,7 @@ public class MacroTests extends IntegratedCModelTest {
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
public String getSourcefileResource() {
return "MacroTests.c";
return "MacroTests.cpp";
}
/**

View file

@ -421,7 +421,7 @@ public class StructuralCModelElementsTests extends TestCase {
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
assertEquals(td2.getElementName(), new String ("myTypedef")); //$NON-NLS-1$
checkElementOffset(td2);
assertEquals(td2.getTypeName(), new String ("")); //$NON-NLS-1$
assertEquals(td2.getTypeName(), new String ("struct")); //$NON-NLS-1$
checkLineNumbers(td2, 101, 103);
// union

View file

@ -94,13 +94,13 @@ public class StructuralTemplateTests extends ITemplateTests {
// Function declarations in Quick Parse mode
// are considered Method Declarations in Structural parse mode
List arrayElements = getTemplateMethods(tu);
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION));
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD));
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION));
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION));
String[] myExpectedValues = {
"fum",
"scrum",
"nonVector::first",
"nonVector<T>::first",
"Foo::fum",
"IsGreaterThan",
};
@ -153,8 +153,8 @@ public class StructuralTemplateTests extends ITemplateTests {
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) );
arrayElements.addAll( getTemplateMethods(tu) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD));
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION));
// TEMPLATE_VARIABLE moved to failed tests
//arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
@ -203,8 +203,8 @@ public class StructuralTemplateTests extends ITemplateTests {
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) );
arrayElements.addAll( getTemplateMethods(tu) );
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD));
arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) );
arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION));
// TEMPLATE_VARIABLE moved to failed tests
//arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) );
@ -215,8 +215,7 @@ public class StructuralTemplateTests extends ITemplateTests {
"ArrayOverlay<X, Y, int=16>",
"fum<Bar>(int) : void",
"scrum<int>(void) : void", // TODO: deduce the rules of () versus (void), compare below.
// TODO: shouldn't signature indicate const function as well?
"nonVector::first<T>() : const T&", // TODO: where should <T> be?
"nonVector<T>::first<T>() const : const T&", // TODO: where should <T> be?
"Foo::fum<Bar>(int) : void",
"IsGreaterThan<X>(X, X) : bool",
/*"default_alloc_template<threads,inst>::S_start_free<bool, int> : char*",*/

View file

@ -1,88 +1,90 @@
// IStructure
struct testStruct1 {
char m_field1;
char* m_field2;
unsigned char m_field3;
int m_field4;
unsigned m_field5;
void* m_field6;
void method1();
struct testStruct1 method2( char* in_field2, int in_field4 ) {}
// this is very C++:
testStruct1( char* in_field2, int in_field4 ) {}
~testStruct1() {}
};
struct testStruct2 {
};
struct testStruct3 {
} aTestStruct3;
// no semicolon, parser should recover
struct testStruct4NoSemicolon {
}
// forward declaration
struct testStruct5;
// variable declaration using predefined struct.
struct testStruct6 aTestStruct6;
struct {
int x;
} testAnonymousStructObject1;
struct {
int x;
} testAnonymousStructObject2= {1};
// to resync the parser if necessary
struct testStruct7 {
};
// an inner struct
struct testStruct8 {
struct testStruct9Inner {
int x;
};
struct testStruct10Inner {
int y;
struct testStruct11Inner {
int z;
};
};
};
union testUnion1 {
char m_field1;
char* m_field2;
unsigned char m_field3;
int m_field4;
unsigned m_field5;
void* m_field6;
};
class testClass1 {
};
class testClass2NoSemicolon {
}
class testClass3 {
};
class testClass4Abstract {
void aNonVirtual();
virtual void aVirtual();
virtual void aPureVirtual()=0;
};
class testClass5
: public testClass1, protected testClass3, private testClass4Abstract {
};
// to resync the parser if necessary
class testClass6 {
};
// IStructure
struct testStruct1 {
char m_field1;
char* m_field2;
unsigned char m_field3;
int m_field4;
unsigned m_field5;
void* m_field6;
void method1();
struct testStruct1 method2( char* in_field2, int in_field4 ) {}
// this is very C++:
testStruct1( char* in_field2, int in_field4 ) {}
~testStruct1() {}
};
struct testStruct2 {
};
struct testStruct3 {
} aTestStruct3;
// no semicolon, parser should recover
struct testStruct4NoSemicolon {
}
// forward declaration
struct testStruct5;
// variable declaration using predefined struct.
struct testStruct6 aTestStruct6;
struct {
int x;
} testAnonymousStructObject1;
struct {
int x;
} testAnonymousStructObject2= {1};
// to resync the parser if necessary
struct testStruct7 {
};
// an inner struct
struct testStruct8 {
struct testStruct9Inner {
int x;
};
struct testStruct10Inner {
int y;
struct testStruct11Inner {
int z;
};
};
};
union testUnion1 {
char m_field1;
char* m_field2;
unsigned char m_field3;
int m_field4;
unsigned m_field5;
void* m_field6;
};
class testClass1 {
};
class testClass2NoSemicolon {
}
class catchTheSyntaxError;
class testClass3 {
};
class testClass4Abstract {
void aNonVirtual();
virtual void aVirtual();
virtual void aPureVirtual()=0;
};
class testClass5
: public testClass1, protected testClass3, private testClass4Abstract {
};
// to resync the parser if necessary
class testClass6 {
};

View file

@ -1,24 +1,24 @@
#define Z struct
#define X Z
#define Y SomeName
X Y
{
};
X{
};
int A :: BCD = 1;
#define DEFA B
#define DB( x ) x
int DEFA :: DB(Y) = 1;
#define PINT const int *
PINT myPINT;
PINT foobar( void );
#define Z struct
#define X Z
#define Y SomeName
X Y
{
};
X{
};
int A :: BCD = 1;
#define DEFA B
#define DB( x ) x
int DEFA :: DB(Y) = 1;
#define PINT const int *
PINT myPINT;
PINT foobar( void );

View file

@ -0,0 +1,697 @@
/*******************************************************************************
* Copyright (c) 2006 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializerList;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointer;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer;
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypenameExpression;
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTPointer;
import org.eclipse.cdt.core.parser.Keywords;
/**
* This is a utility class to help convert AST elements to Strings.
*
* @see org.eclipse.cdt.core.dom.ast.ASTSignatureUtil
* @see org.eclipse.cdt.core.dom.ast.ASTTypeUtil
*/
public class ASTStringUtil {
private static final String COMMA_SPACE= ", "; //$NON-NLS-1$
private static final String[] EMPTY_STRING_ARRAY= new String[0];
/**
* Return the qualified name if the given <code>IASTName</code>
* is an <code>ICPPASTQualifiedName</code>, otherwise a simple name is returned.
*
* @param name
* @return a (possibly) qualified name
*/
public static String getQualifiedName(IASTName name) {
return appendQualifiedNameString(new StringBuffer(), name).toString();
}
/**
* Return the non-qualified name.
*
* @param name
* @return a non-qualified name
*/
public static String getSimpleName(IASTName name) {
return appendSimpleNameString(new StringBuffer(), name).toString();
}
/**
* Compute a signature string with parameters, without initializers.
*
* @param declarator
* @return the type string
* @see ASTSignatureUtil#getSignature(IASTDeclarator)
*/
public static String getSignatureString(IASTDeclarator declarator) {
return trimRight(appendSignatureString(new StringBuffer(), declarator)).toString();
}
/**
* Compute a signature string including parameters, but without initializers.
*
* @param declSpecifier
* @param declarator
* @return the signature string
*/
public static String getSignatureString(IASTDeclSpecifier declSpecifier, IASTDeclarator declarator) {
final StringBuffer buffer= new StringBuffer();
appendDeclarationString(buffer, declSpecifier, declarator, true);
return trimRight(buffer).toString();
}
/**
* Compute a (return-)type string without parameters and initializers.
*
* @param declSpecifier
* @param declarator
* @return the type string
*/
public static String getTypeString(IASTDeclSpecifier declSpecifier, IASTDeclarator declarator) {
final StringBuffer buffer= new StringBuffer();
appendDeclarationString(buffer, declSpecifier, declarator, false);
return trimRight(buffer).toString();
}
/**
* Get the signatures of the function parameter declarations.
*
* @param functionDeclarator
* @return the parameter signature array
*
* @see ASTSignatureUtil#getParameterSignatureArray(IASTDeclarator)
*/
public static String[] getParameterSignatureArray(IASTFunctionDeclarator functionDeclarator) {
if (functionDeclarator instanceof IASTStandardFunctionDeclarator) {
final IASTStandardFunctionDeclarator standardFunctionDecl= (IASTStandardFunctionDeclarator)functionDeclarator;
final IASTParameterDeclaration[] parameters= standardFunctionDecl.getParameters();
final boolean takesVarArgs= standardFunctionDecl.takesVarArgs();
final String[] parameterStrings= new String[parameters.length + (takesVarArgs ? 1 : 0)];
int i;
for (i=0; i < parameters.length; ++i) {
parameterStrings[i]= getParameterSignatureString(parameters[i]);
}
if (takesVarArgs) {
parameterStrings[i]= new String(Keywords.cpELLIPSIS);
}
return parameterStrings;
} else if (functionDeclarator instanceof ICASTKnRFunctionDeclarator) {
final ICASTKnRFunctionDeclarator knrDeclarator= (ICASTKnRFunctionDeclarator)functionDeclarator;
final IASTName[] names= knrDeclarator.getParameterNames();
final String[] result= new String[names.length];
for(int i=0; i<names.length; i++) {
if (names[i] != null) {
final IASTDeclarator declaratorForParameterName= knrDeclarator.getDeclaratorForParameterName(names[i]);
if( declaratorForParameterName != null )
result[i]= getSignatureString(declaratorForParameterName);
}
}
return result;
}
return EMPTY_STRING_ARRAY;
}
/**
* Convert the given template parameters into a string array.
*
* @param templateParams
* @return a string array of template parameters
*/
public static String[] getTemplateParameterArray(ICPPASTTemplateParameter[] templateParams){
final String[] parameterTypes= new String[templateParams.length];
for (int i= 0; i < templateParams.length; i++) {
final StringBuffer paramType= new StringBuffer();
final ICPPASTTemplateParameter parameter= templateParams[i];
appendTemplateParameterString(paramType, parameter);
parameterTypes[i]= trimRight(paramType).toString();
}
return parameterTypes;
}
private static String getParameterSignatureString(IASTParameterDeclaration parameterDeclaration) {
return trimRight(appendParameterDeclarationString(new StringBuffer(), parameterDeclaration)).toString();
}
private static StringBuffer appendSignatureString(StringBuffer buffer, IASTDeclarator declarator) {
// get the declaration node
IASTNode node= declarator.getParent();
while(node instanceof IASTDeclarator ){
declarator= (IASTDeclarator)node;
node= node.getParent();
}
// get the declSpec
final IASTDeclSpecifier declSpec;
if(node instanceof IASTParameterDeclaration)
declSpec= ((IASTParameterDeclaration) node).getDeclSpecifier();
else if(node instanceof IASTSimpleDeclaration)
declSpec= ((IASTSimpleDeclaration)node).getDeclSpecifier();
else if(node instanceof IASTFunctionDefinition)
declSpec= ((IASTFunctionDefinition)node).getDeclSpecifier();
else if(node instanceof IASTTypeId)
declSpec= ((IASTTypeId)node).getDeclSpecifier();
else
declSpec= null;
return appendDeclarationString(buffer, declSpec, declarator, true);
}
private static StringBuffer appendDeclarationString(StringBuffer buffer, IASTDeclSpecifier declSpecifier, IASTDeclarator declarator, boolean addParams) {
if (declSpecifier != null) {
appendDeclSpecifierString(buffer, declSpecifier);
trimRight(buffer);
}
appendDeclaratorString(buffer, declarator, addParams);
return buffer;
}
private static StringBuffer appendDeclaratorString(StringBuffer buffer, IASTDeclarator declarator, boolean addParams) {
if (declarator == null) {
return buffer;
}
appendPointerOperatorsString(buffer, declarator.getPointerOperators());
if (declarator instanceof IASTArrayDeclarator) {
appendArrayQualifiersString(buffer, (IASTArrayDeclarator)declarator);
}
final IASTDeclarator nestedDeclarator= declarator.getNestedDeclarator();
if (nestedDeclarator != null) {
buffer.append(Keywords.cpLPAREN);
appendDeclaratorString(buffer, nestedDeclarator, addParams);
trimRight(buffer);
buffer.append(Keywords.cpRPAREN);
}
if (!addParams) {
return buffer;
}
if (declarator instanceof IASTFunctionDeclarator) {
final IASTFunctionDeclarator functionDecl= (IASTFunctionDeclarator)declarator;
appendParameterSignatureString(buffer, functionDecl);
if (declarator instanceof ICPPASTFunctionDeclarator) {
final ICPPASTFunctionDeclarator cppFunctionDecl= (ICPPASTFunctionDeclarator)declarator;
if (cppFunctionDecl.isConst()) {
buffer.append(Keywords.CONST).append(' ');
}
if (cppFunctionDecl.isVolatile()) {
buffer.append(Keywords.VOLATILE).append(' ');
}
if (cppFunctionDecl.isPureVirtual()) {
buffer.append("=0 "); //$NON-NLS-1$
}
final IASTTypeId[] exceptionTypeIds= cppFunctionDecl.getExceptionSpecification();
if (exceptionTypeIds.length > 0) {
buffer.append(Keywords.THROW).append(' ');
for (int i= 0; i < exceptionTypeIds.length; i++) {
if (i > 0) {
buffer.append(COMMA_SPACE);
}
appendTypeIdString(buffer, exceptionTypeIds[i]);
}
}
if (declarator instanceof ICPPASTFunctionTryBlockDeclarator) {
assert false : "TODO: handle "+ declarator.getClass().getName(); //$NON-NLS-1$
}
}
} else if (declarator instanceof IASTFieldDeclarator) {
final IASTFieldDeclarator fieldDeclarator= (IASTFieldDeclarator)declarator;
final IASTExpression bitFieldSize= fieldDeclarator.getBitFieldSize();
if (bitFieldSize != null) {
buffer.append(Keywords.cpCOLON);
appendExpressionString(buffer, bitFieldSize);
}
} else {
// assert false : "TODO: handle "+ declarator.getClass().getName(); //$NON-NLS-1$
}
return buffer;
}
private static StringBuffer appendInitializerString(StringBuffer buffer, IASTInitializer initializer) {
if (initializer instanceof IASTInitializerExpression) {
final IASTInitializerExpression initializerExpression= (IASTInitializerExpression)initializer;
buffer.append(Keywords.cpASSIGN);
appendExpressionString(buffer, initializerExpression.getExpression());
} else if (initializer instanceof IASTInitializerList) {
final IASTInitializerList initializerList= (IASTInitializerList)initializer;
final IASTInitializer[] initializers= initializerList.getInitializers();
buffer.append(Keywords.cpASSIGN);
buffer.append(Keywords.cpLBRACE);
for (int i= 0; i < initializers.length; i++) {
if (i > 0) {
buffer.append(COMMA_SPACE);
}
appendInitializerString(buffer, initializers[i]);
}
trimRight(buffer);
buffer.append(Keywords.cpRBRACE);
} else if (initializer instanceof ICASTDesignatedInitializer) {
//TODO handle ICASTDesignatedInitializer?
// final ICASTDesignatedInitializer designatedInitializer= (ICASTDesignatedInitializer)initializer;
// final ICASTDesignator[] designator= designatedInitializer.getDesignators();
} else if (initializer instanceof ICPPASTConstructorInitializer) {
final ICPPASTConstructorInitializer constructorInitializer= (ICPPASTConstructorInitializer)initializer;
final IASTExpression expression= constructorInitializer.getExpression();
buffer.append(Keywords.cpLPAREN);
appendExpressionString(buffer, expression);
trimRight(buffer);
buffer.append(Keywords.cpRPAREN);
} else if (initializer != null) {
assert false : "TODO: handle "+ initializer.getClass().getName(); //$NON-NLS-1$
}
return buffer;
}
private static StringBuffer appendTypeIdString(StringBuffer buffer, IASTTypeId typeId) {
appendDeclSpecifierString(buffer, typeId.getDeclSpecifier());
appendDeclaratorString(buffer, typeId.getAbstractDeclarator(), true);
return buffer;
}
private static StringBuffer trimRight(StringBuffer buffer) {
int length= buffer.length();
while (length > 0 && buffer.charAt(length - 1) == ' ') {
--length;
}
buffer.setLength(length);
return buffer;
}
private static StringBuffer appendArrayQualifiersString(StringBuffer buffer, IASTArrayDeclarator declarator) {
final IASTArrayModifier[] modifiers= declarator.getArrayModifiers();
for (int i= 0; i < modifiers.length; i++) {
buffer.append(Keywords.cpLBRACKET).append(Keywords.cpRBRACKET);
}
return buffer;
}
private static StringBuffer appendPointerOperatorsString(StringBuffer buffer, IASTPointerOperator[] pointerOperators) {
for (int i= 0; i < pointerOperators.length; i++) {
final IASTPointerOperator pointerOperator= pointerOperators[i];
if (pointerOperator instanceof IASTPointer) {
final IASTPointer pointer= (IASTPointer)pointerOperator;
if (pointer instanceof ICPPASTPointerToMember) {
final ICPPASTPointerToMember pointerToMember= (ICPPASTPointerToMember)pointer;
appendQualifiedNameString(buffer, pointerToMember.getName());
}
buffer.append(Keywords.cpSTAR);
if (pointer.isConst()) {
buffer.append(' ').append(Keywords.CONST);
}
if (pointer.isVolatile()) {
buffer.append(' ').append(Keywords.VOLATILE);
}
if (pointerOperator instanceof ICASTPointer) {
final ICASTPointer cPointer= (ICASTPointer)pointerOperator;
if (cPointer.isRestrict()) {
buffer.append(' ').append(Keywords.RESTRICT);
}
} else if (pointerOperator instanceof IGPPASTPointer) {
final IGPPASTPointer gppPointer= (IGPPASTPointer)pointerOperator;
if (gppPointer.isRestrict()) {
buffer.append(' ').append(Keywords.RESTRICT);
}
}
} else if (pointerOperator instanceof ICPPASTReferenceOperator) {
buffer.append(Keywords.cpAMPER);
}
}
return buffer;
}
private static StringBuffer appendParameterSignatureString(StringBuffer buffer, IASTFunctionDeclarator functionDeclarator) {
if (functionDeclarator instanceof IASTStandardFunctionDeclarator) {
final IASTStandardFunctionDeclarator standardFunctionDecl= (IASTStandardFunctionDeclarator)functionDeclarator;
final IASTParameterDeclaration[] parameters= standardFunctionDecl.getParameters();
final boolean takesVarArgs= standardFunctionDecl.takesVarArgs();
buffer.append(Keywords.cpLPAREN);
for (int i= 0; i < parameters.length; i++) {
if (i > 0) {
buffer.append(COMMA_SPACE);
}
appendParameterDeclarationString(buffer, parameters[i]);
}
if (takesVarArgs) {
if (parameters.length > 0) {
buffer.append(COMMA_SPACE);
}
buffer.append(Keywords.cpELLIPSIS);
}
trimRight(buffer);
buffer.append(Keywords.cpRPAREN);
} else if (functionDeclarator instanceof ICASTKnRFunctionDeclarator) {
final ICASTKnRFunctionDeclarator knrDeclarator= (ICASTKnRFunctionDeclarator)functionDeclarator;
final IASTName[] names= knrDeclarator.getParameterNames();
for(int i=0; i<names.length; i++) {
if (i > 0) {
buffer.append(COMMA_SPACE);
}
if (names[i] != null) {
final IASTDeclarator declaratorForParameterName= knrDeclarator.getDeclaratorForParameterName(names[i]);
if(declaratorForParameterName != null) {
appendSignatureString(buffer, declaratorForParameterName);
}
}
}
}
return buffer;
}
private static StringBuffer appendParameterDeclarationString(StringBuffer buffer, IASTParameterDeclaration parameter) {
final IASTDeclSpecifier declSpecifier= parameter.getDeclSpecifier();
if (declSpecifier != null) {
appendDeclSpecifierString(buffer, declSpecifier);
trimRight(buffer);
}
final IASTDeclarator declarator= parameter.getDeclarator();
if (declarator != null) {
appendDeclaratorString(buffer, declarator, true);
appendInitializerString(buffer, declarator.getInitializer());
}
return buffer;
}
private static StringBuffer appendDeclSpecifierString(StringBuffer buffer, IASTDeclSpecifier declSpecifier) {
if (declSpecifier.isConst()) {
buffer.append(Keywords.CONST).append(' ');
}
if (declSpecifier.isVolatile()) {
buffer.append(Keywords.VOLATILE).append(' ');
}
// if (declSpecifier.isInline()) {
// buffer.append(Keywords.INLINE).append(' ');
// }
if (declSpecifier instanceof ICASTDeclSpecifier) {
final ICASTDeclSpecifier cDeclSpec= (ICASTDeclSpecifier)declSpecifier;
if (cDeclSpec.isRestrict()) {
buffer.append(Keywords.RESTRICT).append(' ');
}
} else if (declSpecifier instanceof ICPPASTDeclSpecifier) {
final ICPPASTDeclSpecifier cppDeclSpec= (ICPPASTDeclSpecifier)declSpecifier;
if (cppDeclSpec.isFriend()) {
buffer.append(Keywords.FRIEND).append(' ');
}
if (cppDeclSpec.isVirtual()) {
buffer.append(Keywords.VIRTUAL).append(' ');
}
if (cppDeclSpec.isExplicit()) {
buffer.append(Keywords.EXPLICIT).append(' ');
}
if (declSpecifier instanceof IGPPASTDeclSpecifier) {
final IGPPASTDeclSpecifier gppDeclSpec= (IGPPASTDeclSpecifier)declSpecifier;
if (gppDeclSpec.isRestrict()) {
buffer.append(Keywords.RESTRICT).append(' ');
}
}
}
// storage class
// final int storageClass= declSpecifier.getStorageClass();
// switch (storageClass) {
// case IASTDeclSpecifier.sc_typedef:
// buffer.append(Keywords.TYPEDEF).append(' ');
// break;
// case IASTDeclSpecifier.sc_extern:
// buffer.append(Keywords.EXTERN).append(' ');
// break;
// case IASTDeclSpecifier.sc_static:
// buffer.append(Keywords.STATIC).append(' ');
// break;
// case IASTDeclSpecifier.sc_auto:
// buffer.append(Keywords.AUTO).append(' ');
// break;
// case IASTDeclSpecifier.sc_register:
// buffer.append(Keywords.REGISTER).append(' ');
// break;
// case ICPPASTDeclSpecifier.sc_mutable:
// buffer.append(Keywords.MUTABLE).append(' ');
// break;
// }
if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
final int key= ((IASTCompositeTypeSpecifier)declSpecifier).getKey();
switch (key) {
case IASTCompositeTypeSpecifier.k_struct:
buffer.append(Keywords.STRUCT).append(' ');
break;
case IASTCompositeTypeSpecifier.k_union:
buffer.append(Keywords.UNION).append(' ');
break;
case ICPPASTCompositeTypeSpecifier.k_class:
buffer.append(Keywords.CLASS).append(' ');
break;
default:
}
} else if (declSpecifier instanceof IASTElaboratedTypeSpecifier) {
final IASTElaboratedTypeSpecifier elaboratedTypeSpec= (IASTElaboratedTypeSpecifier)declSpecifier;
switch (elaboratedTypeSpec.getKind()) {
case IASTElaboratedTypeSpecifier.k_enum:
buffer.append(Keywords.ENUM).append(' ');
break;
case IASTElaboratedTypeSpecifier.k_struct:
buffer.append(Keywords.STRUCT).append(' ');
break;
case IASTElaboratedTypeSpecifier.k_union:
buffer.append(Keywords.UNION).append(' ');
break;
case ICPPASTElaboratedTypeSpecifier.k_class:
buffer.append(Keywords.CLASS).append(' ');
break;
default:
assert false;
}
appendQualifiedNameString(buffer, elaboratedTypeSpec.getName());
} else if (declSpecifier instanceof IASTEnumerationSpecifier) {
final IASTEnumerationSpecifier enumerationSpec= (IASTEnumerationSpecifier)declSpecifier;
appendQualifiedNameString(buffer, enumerationSpec.getName());
} else if (declSpecifier instanceof IASTSimpleDeclSpecifier) {
final IASTSimpleDeclSpecifier simpleDeclSpec= (IASTSimpleDeclSpecifier)declSpecifier;
if (simpleDeclSpec.isSigned()) {
buffer.append(Keywords.SIGNED).append(' ');
}
if (simpleDeclSpec.isUnsigned()) {
buffer.append(Keywords.UNSIGNED).append(' ');
}
if (simpleDeclSpec.isShort()) {
buffer.append(Keywords.SHORT).append(' ');
}
if (simpleDeclSpec.isLong()) {
buffer.append(Keywords.LONG).append(' ');
}
if (simpleDeclSpec instanceof ICASTSimpleDeclSpecifier) {
final ICASTSimpleDeclSpecifier cSimpleDeclSpec= (ICASTSimpleDeclSpecifier)simpleDeclSpec;
if (cSimpleDeclSpec.isLongLong()) {
buffer.append(Keywords.LONG_LONG).append(' ');
}
if (cSimpleDeclSpec.isComplex()) {
buffer.append(Keywords._COMPLEX).append(' ');
}
if (cSimpleDeclSpec.isImaginary()) {
buffer.append(Keywords._IMAGINARY).append(' ');
}
switch (simpleDeclSpec.getType()) {
case ICASTSimpleDeclSpecifier.t_Bool:
buffer.append(Keywords._BOOL).append(' ');
break;
}
}
switch (simpleDeclSpec.getType()) {
case IASTSimpleDeclSpecifier.t_void:
buffer.append(Keywords.VOID).append(' ');
break;
case IASTSimpleDeclSpecifier.t_char:
buffer.append(Keywords.CHAR).append(' ');
break;
case IASTSimpleDeclSpecifier.t_int:
buffer.append(Keywords.INT).append(' ');
break;
case IASTSimpleDeclSpecifier.t_float:
buffer.append(Keywords.FLOAT).append(' ');
break;
case IASTSimpleDeclSpecifier.t_double:
buffer.append(Keywords.DOUBLE).append(' ');
break;
case ICPPASTSimpleDeclSpecifier.t_bool:
buffer.append(Keywords.BOOL).append(' ');
break;
case ICPPASTSimpleDeclSpecifier.t_wchar_t:
buffer.append(Keywords.WCHAR_T).append(' ');
break;
default:
}
} else if (declSpecifier instanceof IASTNamedTypeSpecifier) {
final IASTNamedTypeSpecifier namedTypeSpec= (IASTNamedTypeSpecifier)declSpecifier;
appendQualifiedNameString(buffer, namedTypeSpec.getName());
}
return buffer;
}
private static StringBuffer appendQualifiedNameString(StringBuffer buffer, IASTName name) {
return appendNameString(buffer, name, true);
}
private static StringBuffer appendSimpleNameString(StringBuffer buffer, IASTName name) {
return appendNameString(buffer, name, false);
}
private static StringBuffer appendNameString(StringBuffer buffer, IASTName name, boolean qualified) {
if (name instanceof ICPPASTQualifiedName) {
final ICPPASTQualifiedName qualifiedName= (ICPPASTQualifiedName)name;
if (qualified) {
final IASTName[] names= qualifiedName.getNames();
for (int i= 0; i < names.length; i++) {
if (i > 0) {
buffer.append(Keywords.cpCOLONCOLON);
}
appendQualifiedNameString(buffer, names[i]);
}
} else {
buffer.append(qualifiedName.getLastName());
}
} else if (name instanceof ICPPASTTemplateId) {
final ICPPASTTemplateId templateId= (ICPPASTTemplateId)name;
appendQualifiedNameString(buffer, templateId.getTemplateName());
final IASTNode[] templateArguments= templateId.getTemplateArguments();
buffer.append(Keywords.cpLT);
for (int i= 0; i < templateArguments.length; i++) {
if (i > 0) {
buffer.append(Keywords.cpCOMMA);
}
final IASTNode argument= templateArguments[i];
if (argument instanceof IASTTypeId) {
appendTypeIdString(buffer, (IASTTypeId)argument);
} else if (argument instanceof IASTExpression) {
final IASTExpression expression= (IASTExpression)argument;
appendExpressionString(buffer, expression);
}
}
buffer.append(Keywords.cpGT);
} else if (name != null) {
buffer.append(name.toCharArray());
}
return buffer;
}
private static StringBuffer appendExpressionString(StringBuffer buffer, IASTExpression expression) {
if (expression instanceof IASTIdExpression) {
final IASTIdExpression idExpression= (IASTIdExpression)expression;
appendQualifiedNameString(buffer, idExpression.getName());
} else if (expression instanceof IASTExpressionList) {
final IASTExpressionList expressionList= (IASTExpressionList)expression;
final IASTExpression[] expressions= expressionList.getExpressions();
for (int i= 0; i < expressions.length; i++) {
if (i > 0) {
buffer.append(COMMA_SPACE);
}
appendExpressionString(buffer, expressions[i]);
}
} else if (expression instanceof ICPPASTTypenameExpression) {
final ICPPASTTypenameExpression typenameExpression= (ICPPASTTypenameExpression)expression;
buffer.append(Keywords.TYPENAME).append(' ');
appendQualifiedNameString(buffer, typenameExpression.getName());
final IASTExpression initialValue= typenameExpression.getInitialValue();
if (initialValue != null) {
buffer.append(Keywords.cpASSIGN);
appendExpressionString(buffer, initialValue);
}
} else if (expression instanceof IASTLiteralExpression) {
buffer.append(ASTSignatureUtil.getExpressionString(expression));
} else if (expression != null) {
buffer.append(ASTSignatureUtil.getExpressionString(expression));
}
return buffer;
}
private static StringBuffer appendTemplateParameterString(StringBuffer buffer, ICPPASTTemplateParameter parameter){
if (parameter instanceof ICPPASTParameterDeclaration) {
appendParameterDeclarationString(buffer, (ICPPASTParameterDeclaration)parameter);
} else if (parameter instanceof ICPPASTSimpleTypeTemplateParameter) {
final ICPPASTSimpleTypeTemplateParameter simpletypeParameter= (ICPPASTSimpleTypeTemplateParameter)parameter;
final IASTName name= simpletypeParameter.getName();
if (name != null) {
appendSimpleNameString(buffer, name);
} else {
final int type= simpletypeParameter.getParameterType();
switch (type) {
case ICPPASTSimpleTypeTemplateParameter.st_class:
buffer.append(Keywords.CLASS);
break;
case ICPPASTSimpleTypeTemplateParameter.st_typename:
buffer.append(Keywords.TYPENAME);
break;
}
}
} else if (parameter instanceof ICPPASTTemplatedTypeTemplateParameter) {
final ICPPASTTemplatedTypeTemplateParameter templatedTypeParameter= (ICPPASTTemplatedTypeTemplateParameter)parameter;
final ICPPASTTemplateParameter[] subParameters= templatedTypeParameter.getTemplateParameters();
buffer.append(Keywords.TEMPLATE).append(Keywords.cpLT);
for (int i= 0; i < subParameters.length; i++) {
final ICPPASTTemplateParameter templateParameter= subParameters[i];
if (i > 0) {
buffer.append(COMMA_SPACE);
}
appendTemplateParameterString(buffer, templateParameter);
}
trimRight(buffer);
buffer.append(Keywords.cpGT);
}
return buffer;
}
}

View file

@ -69,6 +69,10 @@ class CElementInfo {
}
}
List internalGetChildren() {
return fChildren;
}
/**
* Returns <code>true</code> if this child is in my children collection

View file

@ -183,7 +183,7 @@ public class CModelBuilder {
language,
ParserUtil.getParserLogService() );
} catch(ParserFactoryError pfe) {
throw new ParserException( CCorePlugin.getResourceString("CModelBuilder.Parser_Construction_Failure")); //$NON-NLS-1$
throw new ParserException( ""); //$NON-NLS-1$
}
// call parse
if (problemRequestor != null) {
@ -194,7 +194,7 @@ public class CModelBuilder {
problemRequestor.endReporting();
}
if( (!hasNoErrors) && throwExceptionOnError )
throw new ParserException(CCorePlugin.getResourceString("CModelBuilder.Parse_Failure")); //$NON-NLS-1$
throw new ParserException(""); //$NON-NLS-1$
return quickParseCallback.getCompilationUnit();
}
@ -207,7 +207,11 @@ public class CModelBuilder {
Util.debugLog( "Parse Exception in CModelBuilder", IDebugLogConstants.MODEL ); //$NON-NLS-1$
//e.printStackTrace();
}
Util.debugLog("CModel parsing: "+ ( System.currentTimeMillis() - startTime ) + "ms", IDebugLogConstants.MODEL); //$NON-NLS-1$ //$NON-NLS-2$
Util.debugLog("CModelBuilder: parsing " //$NON-NLS-1$
+ translationUnit.getElementName()
+ " mode="+ (quickParseMode ? "quick " : "structural ") //$NON-NLS-1$ //$NON-NLS-2$
+ " time="+ ( System.currentTimeMillis() - startTime ) + "ms", //$NON-NLS-1$ //$NON-NLS-2$
IDebugLogConstants.MODEL, false);
startTime = System.currentTimeMillis();
try {
@ -217,11 +221,14 @@ public class CModelBuilder {
} catch( NullPointerException npe ) {
Util.debugLog( "NullPointer exception in CModelBuilder", IDebugLogConstants.MODEL); //$NON-NLS-1$
}
// For the debuglog to take place, you have to call
// Util.setDebugging(true);
// Or set debug to true in the core plugin preference
Util.debugLog("CModel building: "+ ( System.currentTimeMillis() - startTime ) + "ms", IDebugLogConstants.MODEL); //$NON-NLS-1$ //$NON-NLS-2$
Util.debugLog("CModelBuilder: building " //$NON-NLS-1$
+"children="+ translationUnit.getElementInfo().internalGetChildren().size() //$NON-NLS-1$
+" time="+ (System.currentTimeMillis() - startTime) + "ms", //$NON-NLS-1$ //$NON-NLS-2$
IDebugLogConstants.MODEL, false);
return this.newElements;
}
@ -303,7 +310,7 @@ public class CModelBuilder {
private void generateModelElements (Parent parent, IASTAbstractTypeSpecifierDeclaration abstractDeclaration) throws CModelException, ASTNotImplementedException
{
// IASTAbstractTypeSpecifierDeclaration
CElement element = createAbstractElement(parent, abstractDeclaration, false, true);
createAbstractElement(parent, abstractDeclaration, false, true);
}
private void generateModelElements (Parent parent, IASTTemplateDeclaration templateDeclaration) throws CModelException, ASTNotImplementedException
@ -320,7 +327,7 @@ public class CModelBuilder {
// set the template parameters
StructureTemplate classTemplate = (StructureTemplate) element;
classTemplate.setTemplateParameterTypes(parameterTypes);
} else if (element instanceof StructureTemplate) {
} else if (element instanceof StructureTemplateDeclaration) {
// set the template parameters
StructureTemplateDeclaration classTemplate = (StructureTemplateDeclaration) element;
classTemplate.setTemplateParameterTypes(parameterTypes);
@ -335,7 +342,7 @@ public class CModelBuilder {
// set the template parameters
StructureTemplate classTemplate = (StructureTemplate) element;
classTemplate.setTemplateParameterTypes(parameterTypes);
} else if (element instanceof StructureTemplate) {
} else if (element instanceof StructureTemplateDeclaration) {
// set the template parameters
StructureTemplateDeclaration classTemplate = (StructureTemplateDeclaration) element;
classTemplate.setTemplateParameterTypes(parameterTypes);
@ -377,9 +384,9 @@ public class CModelBuilder {
private void generateModelElements (Parent parent, IASTTypedefDeclaration declaration) throws CModelException, ASTNotImplementedException
{
TypeDef typeDef = createTypeDef(parent, declaration);
createTypeDef(parent, declaration);
IASTAbstractDeclaration abstractDeclaration = declaration.getAbstractDeclarator();
CElement element = createAbstractElement(parent, abstractDeclaration, false, true);
createAbstractElement(parent, abstractDeclaration, false, true);
}
private CElement createClassSpecifierElement(Parent parent, IASTClassSpecifier classSpecifier, boolean isTemplate)throws ASTNotImplementedException, CModelException{
@ -634,7 +641,7 @@ public class CModelBuilder {
}
IASTAbstractDeclaration abstractDeclaration = varDeclaration.getAbstractDeclaration();
CElement abstractElement = createAbstractElement (parent, abstractDeclaration , isTemplate, false);
createAbstractElement (parent, abstractDeclaration , isTemplate, false);
VariableDeclaration element = null;
if(varDeclaration instanceof IASTField){

View file

@ -392,28 +392,18 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
return (WorkingCopy) perFactoryWorkingCopies.get(this);
}
/**
* To be removed with the new model builder in place
* @param newElements
* @param element
/*
* @see org.eclipse.cdt.internal.core.model.Openable#isOpen()
*/
private void getNewElements(Map mapping, CElement element) {
Object info = null;
try {
info = element.getElementInfo();
} catch (CModelException e) {
}
if (info != null) {
if (element instanceof IParent) {
ICElement[] children = ((CElementInfo) info).getChildren();
int size = children.length;
for (int i = 0; i < size; ++i) {
CElement child = (CElement) children[i];
getNewElements(mapping, child);
}
}
}
mapping.put(element, info);
public synchronized boolean isOpen() {
return super.isOpen();
}
/*
* @see org.eclipse.cdt.internal.core.model.CElement#getElementInfo(org.eclipse.core.runtime.IProgressMonitor)
*/
public synchronized CElementInfo getElementInfo(IProgressMonitor monitor) throws CModelException {
return super.getElementInfo(monitor);
}
/* (non-Javadoc)
@ -582,13 +572,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
return buffer;
}
/*
* @see org.eclipse.cdt.core.model.ITranslationUnit#parse()
*/
public Map parse() {
Map map = new HashMap();
try {
getNewElements(map, this);
} catch (Exception e) {
}
return map;
throw new UnsupportedOperationException("Deprecated method"); //$NON-NLS-1$
}
/**
@ -609,8 +597,12 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
*/
private void parseUsingCModelBuilder(Map newElements, boolean quickParseMode) {
try {
CModelBuilder modelBuilder = new CModelBuilder(this, newElements);
modelBuilder.parse(quickParseMode);
boolean useNewModelBuilder= CCorePlugin.getDefault().useNewModelBuilder();
if (useNewModelBuilder) {
new CModelBuilder2(this).parse(quickParseMode);
} else {
new CModelBuilder(this, newElements).parse(quickParseMode);
}
} catch (Exception e) {
// use the debug log for this exception.
Util.debugLog( "Exception in CModelBuilder", IDebugLogConstants.MODEL); //$NON-NLS-1$
@ -748,10 +740,16 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
}
/*
* @see org.eclipse.cdt.core.model.ITranslationUnit#getAST()
*/
public IASTTranslationUnit getAST() throws CoreException {
return getAST(null, 0);
}
/*
* @see org.eclipse.cdt.core.model.ITranslationUnit#getAST(org.eclipse.cdt.core.index.IIndex, int)
*/
public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException {
ICodeReaderFactory codeReaderFactory;
if (index != null && (style & (ITranslationUnit.AST_SKIP_INDEXED_HEADERS | ITranslationUnit.AST_SKIP_ALL_HEADERS)) != 0) {

View file

@ -82,6 +82,7 @@ public class CCorePlugin extends Plugin {
public final static String DEFAULT_BINARY_PARSER_SIMPLE_ID = "ELF"; //$NON-NLS-1$
public final static String DEFAULT_BINARY_PARSER_UNIQ_ID = PLUGIN_ID + "." + DEFAULT_BINARY_PARSER_SIMPLE_ID; //$NON-NLS-1$
public final static String PREF_USE_STRUCTURAL_PARSE_MODE = "useStructualParseMode"; //$NON-NLS-1$
public final static String PREF_USE_NEW_MODEL_BUILDER = "useNewModelBuilder"; //$NON-NLS-1$
public static final String INDEXER_SIMPLE_ID = "CIndexer"; //$NON-NLS-1$
public static final String INDEXER_UNIQ_ID = PLUGIN_ID + "." + INDEXER_SIMPLE_ID; //$NON-NLS-1$
@ -318,7 +319,7 @@ public class CCorePlugin extends Plugin {
cdtLog = new CDTLogWriter(CCorePlugin.getDefault().getStateLocation().append(".log").toFile()); //$NON-NLS-1$
//Set debug tracing options
CCorePlugin.getDefault().configurePluginDebugOptions();
configurePluginDebugOptions();
fDescriptorManager.startup();
@ -332,6 +333,8 @@ public class CCorePlugin extends Plugin {
// Set the default for using the structual parse mode to build the CModel
getPluginPreferences().setDefault(PREF_USE_STRUCTURAL_PARSE_MODE, false);
// Set the default for using the new model builder to build the CModel
getPluginPreferences().setDefault(PREF_USE_NEW_MODEL_BUILDER, true);
PositionTrackerManager.getInstance().install();
}
@ -986,6 +989,16 @@ public class CCorePlugin extends Plugin {
return getPluginPreferences().getBoolean(PREF_USE_STRUCTURAL_PARSE_MODE);
}
// Preference to turn on/off the use of the new model builder to build the CModel
public void setUseNewModelBuilder(boolean useNewModelBuilder) {
getPluginPreferences().setValue(PREF_USE_NEW_MODEL_BUILDER, useNewModelBuilder);
savePluginPreferences();
}
public boolean useNewModelBuilder() {
return getPluginPreferences().getBoolean(PREF_USE_NEW_MODEL_BUILDER);
}
public CDOM getDOM() {
return CDOM.getInstance();
}

View file

@ -647,12 +647,12 @@
class="org.eclipse.cdt.internal.ui.preferences.IndexerPreferencePage"
id="org.eclipse.cdt.ui.preferences.IndexerPreferencePage"
name="%indexerPrefName"/>
<!--page
<page
name="%WorkInProgress.name"
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
class="org.eclipse.cdt.internal.ui.preferences.WorkInProgressPreferencePage"
id="org.eclipse.cdt.ui.preferneces.WorkInProgressPreferencePage">
</page-->
</page>
</extension>
<extension
point="org.eclipse.ui.editorActions">

View file

@ -28,6 +28,7 @@ import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.ui.CUIPlugin;
/**
@ -83,7 +84,8 @@ public class WorkInProgressPreferencePage extends PreferencePage implements IWor
result.setLayout(layout);
// Add your controls here
addCheckBox(result, "Use new model builder", CCorePlugin.PREF_USE_NEW_MODEL_BUILDER); //$NON-NLS-1$
applyDialogFont(result);
return result;
}
@ -155,12 +157,15 @@ public class WorkInProgressPreferencePage extends PreferencePage implements IWor
String key= (String) text.getData();
store.setValue(key, text.getText());
}
CCorePlugin.getDefault().setUseNewModelBuilder(store.getBoolean(CCorePlugin.PREF_USE_NEW_MODEL_BUILDER));
CUIPlugin.getDefault().savePluginPreferences();
return super.performOk();
}
public static void initDefaults(IPreferenceStore store) {
// Initialize your defaults here
boolean coreDefault= CCorePlugin.getDefault().getPluginPreferences().getDefaultBoolean(CCorePlugin.PREF_USE_NEW_MODEL_BUILDER);
store.setDefault(CCorePlugin.PREF_USE_NEW_MODEL_BUILDER, coreDefault);
CCorePlugin.getDefault().setUseNewModelBuilder(store.getBoolean(CCorePlugin.PREF_USE_NEW_MODEL_BUILDER));
}
}