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

Support for complex, imaginary and long long (bug 209049).

This commit is contained in:
Markus Schorn 2007-11-21 10:06:12 +00:00
parent 8db78a8929
commit 3a0b436262
11 changed files with 164 additions and 105 deletions

View file

@ -24,6 +24,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@ -33,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
@ -1077,4 +1079,15 @@ public class IndexBugsTests extends BaseTestCase {
} }
} }
} }
// void func_209049(long long x);
public void testGPPTypes_Bug209049() throws Exception {
StringBuffer[] contents= getContentsForTest(1);
final IIndexManager indexManager = CCorePlugin.getIndexManager();
IFile f1= TestSourceReader.createFile(fCProject.getProject(), "source.cpp", contents[0].toString());
waitForIndexer();
IIndexBinding[] bindings= fIndex.findBindings("func_209049".toCharArray(), IndexFilter.ALL, NPM);
IFunctionType ft= ((IFunction) bindings[0]).getType();
assertEquals("void (long long)", ASTTypeUtil.getType(ft));
}
} }

View file

@ -108,6 +108,7 @@ public class IndexUpdateTests extends IndexTestBase {
IProject project= cpp ? fCppProject.getProject() : fCProject.getProject(); IProject project= cpp ? fCppProject.getProject() : fCProject.getProject();
fFile= TestSourceReader.createFile(project, "file" + (cpp ? ".cpp" : ".c"), fContents[++fContentUsed].toString()); fFile= TestSourceReader.createFile(project, "file" + (cpp ? ".cpp" : ".c"), fContents[++fContentUsed].toString());
fContentUsed= 0; fContentUsed= 0;
TestSourceReader.waitUntilFileIsIndexed(fIndex, fFile, INDEXER_WAIT_TIME);
assertTrue(CCorePlugin.getIndexManager().joinIndexer(INDEXER_WAIT_TIME, NPM)); assertTrue(CCorePlugin.getIndexManager().joinIndexer(INDEXER_WAIT_TIME, NPM));
} }

View file

@ -104,7 +104,6 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
}); });
assertTrue(target.exists()); assertTrue(target.exists());
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings()); WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
assertEquals(36, wpdom.getDB().getVersion()); // faked version, remove for CDT 4.1
verifyProject1Content(wpdom); verifyProject1Content(wpdom);
String fid; String fid;

View file

@ -183,22 +183,25 @@ public class ASTTypeUtil {
} }
try { try {
if( needSpace )
result.append( SPACE );
switch (((IBasicType)type).getType()) { switch (((IBasicType)type).getType()) {
case IBasicType.t_char: case IBasicType.t_char:
if (needSpace) result.append( SPACE );
result.append(Keywords.CHAR); result.append(Keywords.CHAR);
break; break;
case IBasicType.t_double: case IBasicType.t_double:
if (needSpace) result.append( SPACE );
result.append(Keywords.DOUBLE); result.append(Keywords.DOUBLE);
break; break;
case IBasicType.t_float: case IBasicType.t_float:
if (needSpace) result.append( SPACE );
result.append(Keywords.FLOAT); result.append(Keywords.FLOAT);
break; break;
case IBasicType.t_int: case IBasicType.t_int:
if (needSpace) result.append( SPACE );
result.append(Keywords.INT); result.append(Keywords.INT);
break; break;
case IBasicType.t_void: case IBasicType.t_void:
if (needSpace) result.append( SPACE );
result.append(Keywords.VOID); result.append(Keywords.VOID);
break; break;
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -24,7 +24,10 @@ public interface ICPPBasicType extends IBasicType {
public static final int IS_SHORT = 1 << 1; public static final int IS_SHORT = 1 << 1;
public static final int IS_SIGNED = 1 << 2; public static final int IS_SIGNED = 1 << 2;
public static final int IS_UNSIGNED = 1 << 3; public static final int IS_UNSIGNED = 1 << 3;
public static final int LAST = IS_UNSIGNED; public static final int IS_COMPLEX = 1 << 4; // for gpp-types
public static final int IS_IMAGINARY = 1 << 5; // for gpp-types
public static final int IS_LONG_LONG = 1 << 6; // for gpp-types
public static final int LAST = IS_LONG_LONG;
// Extra types // Extra types
public static final int t_bool = ICPPASTSimpleDeclSpecifier.t_bool; public static final int t_bool = ICPPASTSimpleDeclSpecifier.t_bool;

View file

@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* Andrew Ferguson (Symbian) - Initial implementation * Andrew Ferguson (Symbian) - Initial implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.index; package org.eclipse.cdt.internal.core.index;
@ -53,4 +54,6 @@ public interface IIndexCPPBindingConstants {
int CPP_TYPEDEF_SPECIALIZATION= IIndexBindingConstants.LAST_CONSTANT + 37; int CPP_TYPEDEF_SPECIALIZATION= IIndexBindingConstants.LAST_CONSTANT + 37;
int CPP_TEMPLATE_TYPE_PARAMETER= IIndexBindingConstants.LAST_CONSTANT + 38; int CPP_TEMPLATE_TYPE_PARAMETER= IIndexBindingConstants.LAST_CONSTANT + 38;
int CPP_FUNCTION_TYPE= IIndexBindingConstants.LAST_CONSTANT + 39; int CPP_FUNCTION_TYPE= IIndexBindingConstants.LAST_CONSTANT + 39;
int GPPBASICTYPE = IIndexBindingConstants.LAST_CONSTANT + 40;
} }

View file

@ -50,7 +50,6 @@ import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.cdt.internal.core.pdom.db.DBProperties; import org.eclipse.cdt.internal.core.pdom.db.DBProperties;
import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.ApplyVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector; import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector;
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding; import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
@ -81,10 +80,8 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
*/ */
public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$ public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$
public static final int CURRENT_VERSION = 39; public static final int CURRENT_VERSION = 50;
public static final int MIN_SUPPORTED_VERSION= 36; public static final int MIN_SUPPORTED_VERSION= CURRENT_VERSION;
public static final int MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX= 37; // to be removed in 5.0
public static final int MIN_VERSION_TO_WRITE_MACROS_INDEX= 38; // to be removed in 5.0
/** /**
* The earliest PDOM version that the CURRENT_VERSION can be read as. For example, * The earliest PDOM version that the CURRENT_VERSION can be read as. For example,
@ -94,7 +91,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
* Ideally this would always be CURRENT_VERSION on the basis that CURRENT_VERSION is * Ideally this would always be CURRENT_VERSION on the basis that CURRENT_VERSION is
* not incrementing. * not incrementing.
*/ */
public static final int EARLIEST_FORWARD_COMPATIBLE_VERSION= 36; public static final int EARLIEST_FORWARD_COMPATIBLE_VERSION= CURRENT_VERSION;
/* /*
* PDOM internal format history * PDOM internal format history
@ -141,16 +138,14 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
* #37#- added index for nested bindings (189811), compatible with version 36 - <<CDT 4.0.1>> * #37#- added index for nested bindings (189811), compatible with version 36 - <<CDT 4.0.1>>
* 38 - added b-tree for macros (193056), compatible with version 36 and 37 * 38 - added b-tree for macros (193056), compatible with version 36 and 37
* #39#- added flag for function-style macros (208558), compatible with version 36,37,38 - <<CDT 4.0.2>> * #39#- added flag for function-style macros (208558), compatible with version 36,37,38 - <<CDT 4.0.2>>
* 40 - string optimizations, removed compatibility with prior versions.
*/ */
public static final int LINKAGES = Database.DATA_AREA; public static final int LINKAGES = Database.DATA_AREA;
public static final int FILE_INDEX = Database.DATA_AREA + 4; public static final int FILE_INDEX = Database.DATA_AREA + 4;
public static final int PROPERTIES = Database.DATA_AREA + 8; public static final int PROPERTIES = Database.DATA_AREA + 8;
public static final int HAS_NESTED_BINDING_BTREES= Database.DATA_AREA + 12; public static final int MACRO_BTREE= Database.DATA_AREA + 12;
public static final int HAS_MACRO_BTREES= Database.DATA_AREA + 13; public static final int END= Database.DATA_AREA + 16;
// 2-bytes of freedom
public static final int MACRO_BTREE= Database.DATA_AREA + 16;
public static final int END= Database.DATA_AREA + 20;
static { static {
assert END <= Database.CHUNK_SIZE; assert END <= Database.CHUNK_SIZE;
} }
@ -163,8 +158,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
private File fPath; private File fPath;
private IIndexLocationConverter locationConverter; private IIndexLocationConverter locationConverter;
private Map fPDOMLinkageFactoryCache; private Map fPDOMLinkageFactoryCache;
private boolean fHasBTreeForNestedBindings;
private boolean fHasBTreeForMacros;
private HashMap fResultCache= new HashMap(); private HashMap fResultCache= new HashMap();
@ -197,24 +190,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
int version= db.getVersion(); int version= db.getVersion();
if (version >= MIN_SUPPORTED_VERSION) { if (version >= MIN_SUPPORTED_VERSION) {
readLinkages(); readLinkages();
fHasBTreeForNestedBindings= db.getByte(HAS_NESTED_BINDING_BTREES) == 1;
fHasBTreeForMacros= db.getByte(HAS_MACRO_BTREES) == 1;
// new PDOM with version ready to write nested bindings index
if (!isPermanentlyReadOnly()) {
if (version >= MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
if (!fHasBTreeForNestedBindings) {
fHasBTreeForNestedBindings= true;
db.putByte(HAS_NESTED_BINDING_BTREES, (byte) 1);
}
}
if (version >= MIN_VERSION_TO_WRITE_MACROS_INDEX) {
if (!fHasBTreeForMacros) {
fHasBTreeForMacros= true;
db.putByte(HAS_MACRO_BTREES, (byte) 1);
}
}
}
} }
db.setLocked(lockCount != 0); db.setLocked(lockCount != 0);
} }
@ -313,10 +288,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
// Clear out the database, everything is set to zero. // Clear out the database, everything is set to zero.
db.clear(CURRENT_VERSION); db.clear(CURRENT_VERSION);
db.putByte(HAS_NESTED_BINDING_BTREES, (byte) 1);
db.putByte(HAS_MACRO_BTREES, (byte) 1);
fHasBTreeForNestedBindings= true;
fHasBTreeForMacros= true;
clearCaches(); clearCaches();
} }
@ -786,13 +757,8 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
try { try {
linkage.accept(visitor); linkage.accept(visitor);
if (!filescope) { if (!filescope) {
if (fHasBTreeForNestedBindings) {
linkage.getNestedBindingsIndex().accept(visitor); linkage.getNestedBindingsIndex().accept(visitor);
} }
else {
linkage.accept(new ApplyVisitor(linkage, visitor));
}
}
} }
catch (OperationCanceledException e) { catch (OperationCanceledException e) {
} }
@ -807,9 +773,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
} }
public IIndexMacro[] findMacros(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException { public IIndexMacro[] findMacros(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
if (!fHasBTreeForMacros) {
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
}
ArrayList result= new ArrayList(); ArrayList result= new ArrayList();
MacroCollector visitor = new MacroCollector(this, prefix, isPrefix, isCaseSensitive); MacroCollector visitor = new MacroCollector(this, prefix, isPrefix, isCaseSensitive);
visitor.setMonitor(monitor); visitor.setMonitor(monitor);

View file

@ -348,11 +348,9 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
*/ */
public void afterAddBinding(PDOMBinding pdomBinding) throws CoreException { public void afterAddBinding(PDOMBinding pdomBinding) throws CoreException {
if (pdomBinding.getParentNodeRec() != record) { if (pdomBinding.getParentNodeRec() != record) {
if (pdom.getDB().getVersion() >= PDOM.MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
getNestedBindingsIndex().insert(pdomBinding.getRecord()); getNestedBindingsIndex().insert(pdomBinding.getRecord());
} }
} }
}
/** /**
* Callback informing the linkage that a binding is about to be removed. Used to index nested bindings. * Callback informing the linkage that a binding is about to be removed. Used to index nested bindings.
@ -362,11 +360,9 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
*/ */
public void beforeRemoveBinding(PDOMBinding pdomBinding) throws CoreException { public void beforeRemoveBinding(PDOMBinding pdomBinding) throws CoreException {
if (pdomBinding.getParentNodeRec() != record) { if (pdomBinding.getParentNodeRec() != record) {
if (pdom.getDB().getVersion() >= PDOM.MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
getNestedBindingsIndex().delete(pdomBinding.getRecord()); getNestedBindingsIndex().delete(pdomBinding.getRecord());
} }
} }
}
/** /**
* Searches for the a file local scope object. If none is found depending * Searches for the a file local scope object. If none is found depending

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006 QNX Software Systems and others. * Copyright (c) 2006, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
* *
* Contributors: * Contributors:
* QNX - Initial API and implementation * QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -18,7 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.Database;
@ -36,19 +37,37 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
public static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4; public static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
protected short fFlags= -1;
public PDOMCPPBasicType(PDOM pdom, int record) { public PDOMCPPBasicType(PDOM pdom, int record) {
super(pdom, record); super(pdom, record);
} }
public PDOMCPPBasicType(PDOM pdom, PDOMNode parent, ICPPBasicType type) throws CoreException { public PDOMCPPBasicType(PDOM pdom, PDOMNode parent, ICPPBasicType type) throws CoreException {
this(pdom, parent, type, encodeFlags(type));
}
protected PDOMCPPBasicType(PDOM pdom, PDOMNode parent, ICPPBasicType type, final short flags) throws CoreException {
super(pdom, parent); super(pdom, parent);
fFlags= flags;
Database db = pdom.getDB(); Database db = pdom.getDB();
db.putShort(record + TYPE_ID, getTypeCode(type));
db.putShort(record + FLAGS, flags);
}
private short getTypeCode(ICPPBasicType type) {
short tc= IBasicType.t_unspecified;
try { try {
db.putChar(record + TYPE_ID, (char)type.getType()); tc= (short) type.getType();
} catch (DOMException e) {
}
return tc;
}
char flags = 0; protected static short encodeFlags(ICPPBasicType type) {
short flags = 0;
try {
if (type.isLong()) if (type.isLong())
flags |= IS_LONG; flags |= IS_LONG;
if (type.isShort()) if (type.isShort())
@ -57,11 +76,9 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
flags |= IS_SIGNED; flags |= IS_SIGNED;
if (type.isUnsigned()) if (type.isUnsigned())
flags |= IS_UNSIGNED; flags |= IS_UNSIGNED;
db.putChar(record + FLAGS, flags);
} catch (DOMException e) { } catch (DOMException e) {
throw new CoreException(Util.createStatus(e));
} }
return flags;
} }
protected int getRecordSize() { protected int getRecordSize() {
@ -69,12 +86,12 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
} }
public int getNodeType() { public int getNodeType() {
return PDOMCPPLinkage.CPPBASICTYPE; return IIndexCPPBindingConstants.CPPBASICTYPE;
} }
public int getType() { public int getType() {
try { try {
return pdom.getDB().getChar(record + TYPE_ID); return pdom.getDB().getShort(record + TYPE_ID);
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
return 0; return 0;
@ -87,44 +104,33 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
return null; return null;
} }
private char getFlags() throws CoreException { public int getQualifierBits() {
return pdom.getDB().getChar(record + FLAGS); if (fFlags == -1) {
try {
fFlags= pdom.getDB().getShort(record + FLAGS);
}
catch (CoreException e) {
CCorePlugin.log(e);
fFlags= 0;
}
}
return fFlags;
} }
public boolean isLong() throws DOMException { public boolean isLong() throws DOMException {
try { return (getQualifierBits() & IS_LONG) != 0;
return (getFlags() & IS_LONG) != 0;
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
}
} }
public boolean isShort() throws DOMException { public boolean isShort() throws DOMException {
try { return (getQualifierBits() & IS_SHORT) != 0;
return (getFlags() & IS_SHORT) != 0;
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
}
} }
public boolean isSigned() throws DOMException { public boolean isSigned() throws DOMException {
try { return (getQualifierBits() & IS_SIGNED) != 0;
return (getFlags() & IS_SIGNED) != 0;
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
}
} }
public boolean isUnsigned() throws DOMException { public boolean isUnsigned() throws DOMException {
try { return (getQualifierBits() & IS_UNSIGNED) != 0;
return (getFlags() & IS_UNSIGNED) != 0;
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
}
} }
public boolean isSameType(IType rhs) { public boolean isSameType(IType rhs) {
@ -158,13 +164,4 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
return null; return null;
} }
} }
public int getQualifierBits() {
try {
return getFlags();
} catch (CoreException e) {
CCorePlugin.log(e);
return 0;
}
}
} }

View file

@ -56,6 +56,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPBasicType;
import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope;
@ -589,6 +590,18 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
if (type instanceof IProblemBinding) { if (type instanceof IProblemBinding) {
return null; return null;
} }
if (type instanceof IGPPBasicType) {
IGPPBasicType gbt= (IGPPBasicType) type;
IType typeof;
try {
typeof = gbt.getTypeofType();
if (typeof != null) {
return addType(parent, typeof);
}
} catch (DOMException e) {
}
return new PDOMGPPBasicType(pdom, parent, gbt);
}
if (type instanceof ICPPBasicType) { if (type instanceof ICPPBasicType) {
return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType) type); return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType) type);
} }
@ -654,6 +667,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return new PDOMCPPNamespace(pdom, record); return new PDOMCPPNamespace(pdom, record);
case CPPNAMESPACEALIAS: case CPPNAMESPACEALIAS:
return new PDOMCPPNamespaceAlias(pdom, record); return new PDOMCPPNamespaceAlias(pdom, record);
case GPPBASICTYPE:
return new PDOMGPPBasicType(pdom, record);
case CPPBASICTYPE: case CPPBASICTYPE:
return new PDOMCPPBasicType(pdom, record); return new PDOMCPPBasicType(pdom, record);
case CPPPARAMETER: case CPPPARAMETER:

View file

@ -0,0 +1,66 @@
/*******************************************************************************
* Copyright (c) 2007 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPBasicType;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException;
class PDOMGPPBasicType extends PDOMCPPBasicType implements IGPPBasicType, IIndexType {
public PDOMGPPBasicType(PDOM pdom, int record) {
super(pdom, record);
}
public PDOMGPPBasicType(PDOM pdom, PDOMNode parent, IGPPBasicType type) throws CoreException {
super(pdom, parent, type, encodeGPPFlags(type));
}
public int getNodeType() {
return IIndexCPPBindingConstants.GPPBASICTYPE;
}
protected static short encodeGPPFlags(IGPPBasicType type) {
short flags = encodeFlags(type);
try {
if (type.isComplex())
flags |= IS_COMPLEX;
if (type.isImaginary())
flags |= IS_IMAGINARY;
if (type.isLongLong())
flags |= IS_LONG_LONG;
} catch (DOMException e) {
}
return flags;
}
public IType getTypeofType() throws DOMException {
return null;
}
public boolean isComplex() {
return (getQualifierBits() & IS_COMPLEX) != 0;
}
public boolean isImaginary() {
return (getQualifierBits() & IS_IMAGINARY) != 0;
}
public boolean isLongLong() throws DOMException {
return (getQualifierBits() & IS_LONG_LONG) != 0;
}
}