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:
parent
02d3378c25
commit
cb6c40b03b
21 changed files with 2308 additions and 265 deletions
|
@ -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))");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*",*/
|
||||
|
|
|
@ -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 {
|
||||
};
|
|
@ -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 );
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -69,6 +69,10 @@ class CElementInfo {
|
|||
}
|
||||
}
|
||||
|
||||
List internalGetChildren() {
|
||||
return fChildren;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns <code>true</code> if this child is in my children collection
|
||||
|
|
|
@ -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){
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue