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

Fix for 164619, interaction between cpp name resolution and index.

This commit is contained in:
Markus Schorn 2006-12-06 10:41:32 +00:00
parent ea0d728a40
commit c44d3fa59d
76 changed files with 1523 additions and 867 deletions

View file

@ -80,7 +80,7 @@ public class IndexListenerTest extends BaseTestCase {
if (state[0]+state[1] < 2) {
mutex.wait(8000);
if (state[0]+state[1] < 2) {
mutex.wait(2000);
mutex.wait(5000);
}
}
assertEquals(1, state[0]);
@ -114,7 +114,7 @@ public class IndexListenerTest extends BaseTestCase {
IFile file= TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;");
synchronized (mutex) {
mutex.wait(2000);
mutex.wait(8000);
}
assertEquals(1, projects.size());
assertTrue(projects.contains(fProject1));

View file

@ -123,28 +123,23 @@ public class CPPFunctionTests extends PDOMTestBase {
assertDefinitionCount(pdom, "forwardDeclaration", 1);
}
public void _testVoidFunction() throws Exception {
// Type information not yet stored in PDOM.
public void testVoidFunction() throws Exception {
assertReturnType(pdom, "voidCPPFunction", IBasicType.t_void);
}
public void _testIntFunction() throws Exception {
// Type information not yet stored in PDOM.
public void testIntFunction() throws Exception {
assertReturnType(pdom, "intCPPFunction", IBasicType.t_int);
}
public void _testDoubleFunction() throws Exception {
// Type information not yet stored in PDOM.
public void testDoubleFunction() throws Exception {
assertReturnType(pdom, "doubleCPPFunction", IBasicType.t_double);
}
public void _testCharFunction() throws Exception {
// Type information not yet stored in PDOM.
public void testCharFunction() throws Exception {
assertReturnType(pdom, "charCPPFunction", IBasicType.t_char);
}
public void _testFloatFunction() throws Exception {
// Type information not yet stored in PDOM.
public void testFloatFunction() throws Exception {
assertReturnType(pdom, "floatCPPFunction", IBasicType.t_float);
}

View file

@ -81,7 +81,8 @@ public abstract class IndexBindingResolutionTestBase extends PDOMTestBase {
protected IBinding getBindingFromASTName(String section, int len) {
IASTName[] names= ast.getLanguage().getSelectedNames(ast, testData[1].indexOf(section), len);
assertEquals("<>1 name found for \""+section+"\"", 1, names.length);
assertNotNull("No binding for "+names[0].getRawSignature(), names[0].resolveBinding());
IBinding binding = names[0].resolveBinding();
assertNotNull("No binding for "+names[0].getRawSignature(), binding);
assertFalse("Binding is a ProblemBinding for name "+names[0].getRawSignature(), IProblemBinding.class.isAssignableFrom(names[0].resolveBinding().getClass()));
return names[0].resolveBinding();
}

View file

@ -55,7 +55,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// long * CS::* autsch;
// C * CS::* method(CS **);
// };
// // referencing file
// #include "header.h"
// void references() {
@ -73,6 +73,32 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
IBinding b3 = getBindingFromASTName("cs)->*cp->a", 2);
IBinding b4 = getBindingFromASTName("autsch = lp", 6);
IBinding b5 = getBindingFromASTName("ouch;", 4);
}
// // header file
// class C {
// public:
// int field;
// struct CS { long* l; C *method(CS **); };
// CS cs;
// CS **cspp;
// long * CS::* ouch;
// long * CS::* autsch;
// C * CS::* method(CS **);
// };
// // referencing file
// #include "header.h"
// void references() {
// C *cp = new C();
// long l = 5, *lp;
// lp = &l;
// cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch;
// &(cp->cs)->*cp->autsch = lp = &(cp->cs)->*cp->ouch;
// cp->cs.*method(cp->cspp);/*1*/ &(cp->cs)->*method(cp->cspp);/*2*/
// }
public void _testPointerToMemberFields_2() throws IOException {
// fails with AST parser, only (the header is empty)
IBinding b6 = getBindingFromASTName("method(cp->cspp);/*1*/", 6);
IBinding b7 = getBindingFromASTName("method(cp->cspp);/*2*/", 6);
}
@ -367,10 +393,10 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// void m1() { e1 = ER1; }
// static void m2() { e2 = ER2; }
// };
public void _testEnumeratorInClassScope() {
public void testEnumeratorInClassScope() {
IBinding b0 = getBindingFromASTName("E e1", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 1);
IBinding b2 = getBindingFromASTName("ER2; }", 1);
IBinding b1 = getBindingFromASTName("ER1; }", 3);
IBinding b2 = getBindingFromASTName("ER2; }", 3);
}
// // header content
@ -426,7 +452,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// #include "header.h"
// void ref() { foo(); }
public void _testFunctionDefaultArguments() {
public void testFunctionDefaultArguments() {
IBinding b0 = getBindingFromASTName("foo();", 3);
}
@ -442,7 +468,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// d.foo(4); // also calls long version (int version is hidden)
// // aftodo - does this test make sense?
// }
public void _testMethodHidingInInheritance() {
public void testMethodHidingInInheritance() {
IBinding b0 = getBindingFromASTName("d; /*d*/", 1);
IBinding b1 = getBindingFromASTName("foo(55L);", 3);
IBinding b2 = getBindingFromASTName("foo(4);", 3);
@ -493,7 +519,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
////reference content
//void references() {
// a[0]->i/*0*/++; (*a[0]).i/*1*/++; // IASTArraySubscriptExpression
// /* not applicable */ ?? // IASTBinaryExpression
// /* not applicable ?? */ // IASTBinaryExpression
// ((S*)sp)->i/*3*/++; ((S)s).i/*4*/++; //aftodo-valid? // IASTCastExpression
// (true ? sp : sp)->i/*5*/++; (true ? s : s).i/*6*/++; // IASTConditionalExpression
// (sp,sp)->i/*7*/++; (s,s).i/*8*/++; // IASTExpressionList
@ -507,7 +533,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// /* not applicable */ // ICPPASTDeleteExpression
// (new S())->i/*18*/++; // ICPPASTNewExpression
//}
public void _testFieldReference() {
public void testFieldReference() {
IBinding b0 = getBindingFromASTName("i/*0*/", 1);
IBinding b1 = getBindingFromASTName("i/*1*/", 1);
// IBinding b2 = getBindingFromASTName(ast, "i/*2*/", 1);
@ -559,6 +585,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas
// // foo/*p*/(MADE_UP_SYMBOL); // ICPPASTTypenameExprssion
// }
public void _testExpressionKindForFunctionCalls() {
// depends on bug 164470 because resolution takes place during parse.
IBinding b0 = getBindingFromASTName("foo/*a*/", 3);
IBinding b0a = getBindingFromASTName("cp[1]", 2);
// assertCompositeTypeParam(0, ICPPClassType.k_class, b0, "C");

View file

@ -125,7 +125,7 @@ public class PDOMSearchTest extends PDOMTestBase {
/** result #1 * */
ICPPClassType class1 = (ICPPClassType) class1s[0];
assertEquals("Class1", getBindingQualifiedName(pdom.getLinkages()[0].adaptBinding(class1)));
IBinding[] methods = class1.getMethods();
IBinding[] methods = class1.getDeclaredMethods();
assertEquals(0, methods.length);
/** result #2 * */
@ -135,7 +135,7 @@ public class PDOMSearchTest extends PDOMTestBase {
/* Members in this class */
// methods
methods = class2.getMethods();
methods = class2.getDeclaredMethods();
assertEquals(2, methods.length);
assertEquals("Class1", methods[0].getName());
assertEquals("~Class1", methods[1].getName());
@ -159,7 +159,7 @@ public class PDOMSearchTest extends PDOMTestBase {
/** result #4 * */
ICPPClassType class4 = (ICPPClassType) class1s[3];
assertEquals("namespace1::namespace2::Class1", getBindingQualifiedName(pdom.getLinkages()[0].adaptBinding(class4)));
methods = class4.getMethods();
methods = class4.getDeclaredMethods();
assertEquals(0, methods.length);
/* Search for "Class2" */
@ -173,7 +173,7 @@ public class PDOMSearchTest extends PDOMTestBase {
/** result #1 * */
ICPPClassType cls1 = (ICPPClassType) class2s[0];
assertEquals("Class2", getBindingQualifiedName(pdom.getLinkages()[0].adaptBinding(cls1)));
methods = cls1.getMethods();
methods = cls1.getDeclaredMethods();
assertEquals(3, methods.length);
assertEquals("Class2", methods[0].getName());
assertEquals("~Class2", methods[1].getName());
@ -223,7 +223,7 @@ public class PDOMSearchTest extends PDOMTestBase {
public void testMethods() throws Exception {
IBinding[] methods = pdom.findBindings(Pattern.compile("~Class2"), false, INDEX_FILTER,NULL_MONITOR);
IBinding[] methods = pdom.findBindings(Pattern.compile("~Class2"), false, INDEX_FILTER, NULL_MONITOR);
assertEquals(1, methods.length);
assertTrue(methods[0] instanceof ICPPMethod);
assertEquals("Class2::~Class2", getBindingQualifiedName(pdom.getLinkages()[0].adaptBinding(methods[0])));

View file

@ -76,7 +76,7 @@ public class TypesTests extends PDOMTestBase {
IBinding [] As = pdom.findBindings(Pattern.compile("A"), false, new IndexFilter(), new NullProgressMonitor());
assertEquals(1, As.length);
ICPPClassType A = (ICPPClassType)As[0];
ICPPMethod[] Amethods = A.getMethods();
ICPPMethod[] Amethods = A.getDeclaredMethods();
assertEquals(1, Amethods.length);
ICPPMethod f = Amethods[0];
assertEquals("f", f.getName());

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
@ -128,5 +129,8 @@ public interface IProblemBinding extends IBinding, IScope, IType {
public static final int SEMANTIC_MEMBER_DECLARATION_NOT_FOUND = 0x00D;
public static final int LAST_PROBLEM = SEMANTIC_MEMBER_DECLARATION_NOT_FOUND;
public static final int SEMANTIC_RECURSION_IN_LOOKUP = 0x00E;
public static final int LAST_PROBLEM = SEMANTIC_RECURSION_IN_LOOKUP;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Dec 10, 2004
@ -19,8 +20,20 @@ import org.eclipse.cdt.core.dom.ast.IBasicType;
* @author aniefer
*/
public interface ICPPBasicType extends IBasicType {
public static final int IS_LONG = 1;
public static final int IS_SHORT = 1 << 1;
public static final int IS_SIGNED = 1 << 2;
public static final int IS_UNSIGNED = 1 << 3;
public static final int LAST = IS_UNSIGNED;
// Extra types
public static final int t_bool = ICPPASTSimpleDeclSpecifier.t_bool;
public static final int t_wchar_t = ICPPASTSimpleDeclSpecifier.t_wchar_t;
/**
* @return a combination of qualifiers.
* @since 4.0
*/
public int getQualifierBits();
}

View file

@ -31,4 +31,10 @@ public interface ICPPMethod extends ICPPFunction, ICPPMember {
* returns true if its name starts with '~'
*/
public boolean isDestructor() throws DOMException;
/**
* Returns whether this is an implicit method (constructor, assignment operator, etc.)
* @since 4.0
*/
public boolean isImplicit();
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,13 +7,13 @@
*
* Contributors:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Apr 20, 2005
*/
package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IParameter;
/**
@ -23,8 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter;
public interface ICPPParameter extends IParameter, ICPPVariable {
/**
* the default value of this parameter or null if there is none.
* @return
* if there is a default value or not.
*/
public IASTInitializer getDefaultValue();
public boolean hasDefaultValue();
}

View file

@ -14,6 +14,7 @@ package org.eclipse.cdt.core.index;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.core.runtime.CoreException;
@ -222,6 +223,24 @@ public interface IIndex {
*/
public IIndexBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
/**
* Searches the global scope for all bindings of a given name and linkage.
* In case a binding exists in multiple projects, no duplicate bindings are returned.
* @param linkage the linkage to be searched
* @param name a simple (unqualified) name.
* @return an array of bindings
*/
public IBinding[] findInGlobalScope(ILinkage linkage, char[] name);
/**
* Searches the given namespace for all bindings of a given name.
* In case a binding exists in multiple projects, no duplicate bindings are returned.
* @param nsbinding the namespace to be searched.
* @param name a simple (unqualified) name.
* @return an array of bindings
*/
public IBinding[] findInNamespace(IBinding nsbinding, char[] name);
/**
* Searches for all names that resolve to the given binding. You can limit the result to references, declarations
* or definitions, or a combination of those.

View file

@ -12,7 +12,6 @@
package org.eclipse.cdt.core.index;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.core.runtime.CoreException;
/**
* Represents the semantics of a name in the index.
@ -30,10 +29,10 @@ import org.eclipse.core.runtime.CoreException;
* @since 4.0
*/
public interface IIndexBinding extends IBinding {
IIndexBinding[] EMPTY_INDEX_BINDING_ARRAY = new IIndexBinding[0];
/**
* Returns the enclosing binding. May return <code>null</code>. To give an example, for a member function
* the parent binding would be the class defining the member.
* @throws CoreException
* Returns the qualified name of this binding as array of strings.
*/
IIndexBinding getParentBinding() throws CoreException;
String[] getQualifiedName();
}

View file

@ -28,16 +28,6 @@ import org.eclipse.cdt.core.dom.ILinkage;
public class IndexFilter {
public static final IndexFilter ALL = new IndexFilter();
/**
* Returns whether or not to include objects of the given linkage in the query.
* @see IIndex#findBindings(java.util.regex.Pattern, boolean, IndexFilter, org.eclipse.core.runtime.IProgressMonitor)
* @param linkage a linkage to be tested
* @return whether to include objects of the given linkage in the query.
*/
public boolean acceptLinkage(ILinkage linkage) {
return true;
}
/**
* Get an IndexFilter that filters out bindings from linkages other than that
* specified
@ -51,4 +41,24 @@ public class IndexFilter {
}
};
}
/**
* Returns whether or not to include objects of the given linkage in the query.
* @see IIndex#findBindings(java.util.regex.Pattern, boolean, IndexFilter, org.eclipse.core.runtime.IProgressMonitor)
* @param linkage a linkage to be tested
* @return whether to include objects of the given linkage in the query.
*/
public boolean acceptLinkage(ILinkage linkage) {
return true;
}
/**
* Returns whether or not to include implicit methods in the query.
* @see IIndex#findBindings(java.util.regex.Pattern, boolean, IndexFilter, org.eclipse.core.runtime.IProgressMonitor)
* @return whether or not to include implicit methods in the query.
* @since 4.0
*/
public boolean acceptImplicitMethods() {
return false;
}
}

View file

@ -52,7 +52,19 @@ public class CharArrayUtils {
return true;
}
public static final boolean equals(char[][] strarr1, char[][] strarr2) {
if (strarr1.length != strarr2.length) {
return false;
}
for (int i = 0; i < strarr2.length; i++) {
if (!equals(strarr1[i], strarr2[i])) {
return false;
}
}
return true;
}
/**
* Implements a lexicographical comparator for char arrays. Comparison is done
* on a per char basis, not a code-point basis.

View file

@ -14,13 +14,13 @@ package org.eclipse.cdt.internal.core.dom.parser;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTBuiltinSymbolProvider;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -265,15 +265,15 @@ public class GCCBuiltinSymbolProvider implements IASTBuiltinSymbolProvider {
cpp_float = new CPPBasicType(IBasicType.t_float, 0);
cpp_float_complex = new GPPBasicType(IBasicType.t_float, GPPBasicType.IS_COMPLEX, null);
cpp_int = new CPPBasicType(IBasicType.t_int, 0);
cpp_long_int = new CPPBasicType(IBasicType.t_int, CPPBasicType.IS_LONG);
cpp_long_double = new CPPBasicType(IBasicType.t_double, CPPBasicType.IS_LONG);
cpp_long_double_complex = new GPPBasicType(IBasicType.t_double, CPPBasicType.IS_LONG | GPPBasicType.IS_COMPLEX, null);
cpp_long_int = new CPPBasicType(IBasicType.t_int, ICPPBasicType.IS_LONG);
cpp_long_double = new CPPBasicType(IBasicType.t_double, ICPPBasicType.IS_LONG);
cpp_long_double_complex = new GPPBasicType(IBasicType.t_double, ICPPBasicType.IS_LONG | GPPBasicType.IS_COMPLEX, null);
cpp_long_long_int = new CPPBasicType(IBasicType.t_int, GPPBasicType.IS_LONGLONG);
cpp_signed_long_int = new CPPBasicType(IBasicType.t_int, CPPBasicType.IS_LONG | CPPBasicType.IS_SIGNED);
cpp_signed_long_int = new CPPBasicType(IBasicType.t_int, ICPPBasicType.IS_LONG | ICPPBasicType.IS_SIGNED);
cpp_unsigned_int = new CPPBasicType(IBasicType.t_int, CPPBasicType.IS_UNSIGNED);
cpp_unsigned_long = new CPPBasicType(IBasicType.t_int, CPPBasicType.IS_UNSIGNED | CPPBasicType.IS_LONG);
cpp_unsigned_long_long = new GPPBasicType(IBasicType.t_int, CPPBasicType.IS_UNSIGNED | GPPBasicType.IS_LONGLONG, null);
cpp_unsigned_int = new CPPBasicType(IBasicType.t_int, ICPPBasicType.IS_UNSIGNED);
cpp_unsigned_long = new CPPBasicType(IBasicType.t_int, ICPPBasicType.IS_UNSIGNED | ICPPBasicType.IS_LONG);
cpp_unsigned_long_long = new GPPBasicType(IBasicType.t_int, ICPPBasicType.IS_UNSIGNED | GPPBasicType.IS_LONGLONG, null);
cpp_size_t = cpp_unsigned_long; // assumed unsigned long int
cpp_va_list = new CPPFunctionType( cpp_char_p, new IType[0]); // assumed: char * va_list();
@ -2416,11 +2416,8 @@ public class GCCBuiltinSymbolProvider implements IASTBuiltinSymbolProvider {
return null;
}
/**
* return false
*/
public IASTInitializer getDefaultValue() {
return null;
public boolean hasDefaultValue() {
return false;
}
/**

View file

@ -67,6 +67,7 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
errorMessages[SEMANTIC_INVALID_REDEFINITION - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.invalidRedefinition"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_REDECLARATION - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.invalidRedeclaration"); //$NON-NLS-1$
errorMessages[SEMANTIC_BAD_SCOPE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.badScope"); //$NON-NLS-1$
errorMessages[SEMANTIC_RECURSION_IN_LOOKUP - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.recursionInResolution"); //$NON-NLS-1$
errorMessages[SEMANTIC_MEMBER_DECLARATION_NOT_FOUND - 1]= ParserMessages.getString("ASTProblemFactory.error.semantic.dom.memberDeclNotFound"); //$NON-NLS-1$
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICBasicType;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author dsteffle
@ -116,7 +118,7 @@ public class CBasicType implements ICBasicType {
public boolean isSameType(IType obj) {
if( obj == this )
return true;
if( obj instanceof ITypedef )
if( obj instanceof ITypedef || obj instanceof IIndexType)
return obj.isSameType( this );
if (!(obj instanceof CBasicType)) return false;

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.core.runtime.PlatformObject;
/**
@ -154,7 +155,7 @@ public class CEnumeration extends PlatformObject implements IEnumeration {
public boolean isSameType( IType type ) {
if( type == this )
return true;
if( type instanceof ITypedef )
if( type instanceof ITypedef || type instanceof IIndexType)
return type.isSameType( this );
return false;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.c.ICPointerType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author dsteffle
@ -80,7 +82,7 @@ public class CQualifiedPointerType implements ICPointerType, ITypeContainer {
public boolean isSameType( IType type ) {
if( type == this )
return true;
if( type instanceof ITypedef )
if( type instanceof ITypedef || type instanceof IIndexType)
return type.isSameType( this );
if( type instanceof CQualifiedPointerType ){

View file

@ -36,6 +36,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.core.runtime.PlatformObject;
/**
@ -257,7 +258,7 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
public boolean isSameType( IType type ) {
if( type == this )
return true;
if( type instanceof ITypedef )
if( type instanceof ITypedef || type instanceof IIndexType)
return type.isSameType( this );
return false;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -15,18 +16,32 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
/**
* @author jcamelon
*/
public class CPPASTName extends CPPASTNode implements IASTName {
private final static class RecursionResolvingBinding extends ProblemBinding {
public RecursionResolvingBinding() {
super(null, IProblemBinding.SEMANTIC_RECURSION_IN_LOOKUP, CharArrayUtils.EMPTY);
}
public RecursionResolvingBinding(IASTName node) {
super(node, IProblemBinding.SEMANTIC_RECURSION_IN_LOOKUP, node.toCharArray());
}
}
private char[] name;
private char[] name;
private static final char[] EMPTY_CHAR_ARRAY = {};
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private static final int MAX_RESOLUTION_DEPTH = 3;
private IBinding binding = null;
private int fResolutionDepth= 0;
/**
* @param name
@ -48,9 +63,14 @@ public class CPPASTName extends CPPASTNode implements IASTName {
* @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding()
*/
public IBinding resolveBinding() {
if (binding == null)
binding = CPPVisitor.createBinding(this);
if (binding == null) {
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
binding= new RecursionResolvingBinding(this);
}
else {
binding = CPPVisitor.createBinding(this);
}
}
return binding;
}
@ -60,6 +80,7 @@ public class CPPASTName extends CPPASTNode implements IASTName {
public void setBinding(IBinding binding) {
this.binding = binding;
fResolutionDepth= 0;
}
public IBinding getBinding() {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Dec 10, 2004
@ -18,16 +19,12 @@ import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
*/
public class CPPBasicType implements ICPPBasicType {
public static final int IS_LONG = 1;
public static final int IS_SHORT = 1 << 1;
public static final int IS_SIGNED = 1 << 2;
public static final int IS_UNSIGNED = 1 << 3;
protected static final int LAST = IS_UNSIGNED;
protected int qualifierBits = 0;
protected int type;
@ -53,7 +50,7 @@ public class CPPBasicType implements ICPPBasicType {
if( object == this )
return true;
if( object instanceof ITypedef )
if( object instanceof ITypedef || object instanceof IIndexType)
return object.isSameType( this );
if( !(object instanceof CPPBasicType) )
@ -127,4 +124,8 @@ public class CPPBasicType implements ICPPBasicType {
public void setValue( IASTExpression val ){
value = val;
}
public int getQualifierBits() {
return qualifierBits;
}
}

View file

@ -58,6 +58,7 @@ import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.core.runtime.PlatformObject;
/**
@ -778,8 +779,8 @@ public class CPPClassType extends PlatformObject implements ICPPClassType, ICPPI
public boolean isSameType( IType type ) {
if( type == this )
return true;
if( type instanceof ITypedef )
return ((ITypedef)type).isSameType( this );
if( type instanceof ITypedef || type instanceof IIndexType)
return type.isSameType( this );
return false;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
@ -27,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.core.runtime.PlatformObject;
/**
@ -186,8 +188,8 @@ public class CPPEnumeration extends PlatformObject implements IEnumeration, ICPP
public boolean isSameType( IType type ) {
if( type == this )
return true;
if( type instanceof ITypedef )
return ((ITypedef)type).isSameType( this );
if( type instanceof ITypedef || type instanceof IIndexType)
return type.isSameType( this );
return false;
}

View file

@ -177,7 +177,9 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
IScope scope = getScope();
try {
IASTNode node = ASTInternal.getPhysicalNodeOfScope(scope);
tu = node.getTranslationUnit();
if (node != null) {
tu = node.getTranslationUnit();
}
} catch ( DOMException e ) {
}
}

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IType;
@ -87,6 +88,9 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
IType [] params = ftype.getParameterTypes();
ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(getScope());
if (compSpec == null) {
return null;
}
IASTDeclaration [] members = compSpec.getMembers();
for( int i = 0; i < members.length; i++ ){
IASTDeclarator dtor = null;
@ -113,21 +117,28 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
{
IFunctionType t = (IFunctionType) CPPVisitor.createType( dtor );
IType [] ps = t.getParameterTypes();
boolean ok= false;
if( ps.length == params.length ){
int idx = 0;
for( ; idx < ps.length && ps[idx] != null; idx++ ){
if( !ps[idx].isSameType(params[idx]) )
break;
}
if( idx == ps.length ){
name.setBinding( this );
if( member instanceof IASTSimpleDeclaration )
addDeclaration( dtor );
else if( member instanceof IASTFunctionDefinition )
addDefinition( dtor );
return members[i];
ok= idx == ps.length;
}
else if (ps.length == 0) {
if (params.length == 1) {
IType t1= params[0];
ok = (t1 instanceof IBasicType) && ((IBasicType) t1).getType() == IBasicType.t_void;
}
}
if (ok) {
name.setBinding( this );
if( member instanceof IASTSimpleDeclaration )
addDeclaration( dtor );
else if( member instanceof IASTFunctionDefinition )
addDefinition( dtor );
return members[i];
}
}
dtor = ( di > -1 && ++ di < ds.length ) ? ds[di] : null;
@ -146,4 +157,12 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
return n[0] == '~';
return false;
}
public boolean isImplicit() {
try {
return getPrimaryDeclaration() == null;
} catch (DOMException e) {
}
return true;
}
}

View file

@ -64,6 +64,9 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
return false;
}
public boolean isImplicit() {
return ((ICPPMethod)getBinding()).isImplicit();
}
}
public static class CPPMethodProblem extends CPPFunctionProblem implements ICPPMethod {
@ -98,6 +101,10 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
return false;
}
public boolean isImplicit() {
return false;
}
}
public CPPMethod( ICPPASTFunctionDeclarator declarator ){
@ -121,25 +128,27 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
ICPPClassScope scope = (ICPPClassScope) getScope();
ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(scope);
IASTDeclaration [] members = compSpec.getMembers();
for( int i = 0; i < members.length; i++ ){
if( members[i] instanceof IASTSimpleDeclaration ){
IASTDeclarator [] dtors = ((IASTSimpleDeclaration)members[i]).getDeclarators();
for( int j = 0; j < dtors.length; j++ ){
IASTName name = dtors[j].getName();
if (compSpec != null) {
IASTDeclaration [] members = compSpec.getMembers();
for( int i = 0; i < members.length; i++ ){
if( members[i] instanceof IASTSimpleDeclaration ){
IASTDeclarator [] dtors = ((IASTSimpleDeclaration)members[i]).getDeclarators();
for( int j = 0; j < dtors.length; j++ ){
IASTName name = dtors[j].getName();
if( CharArrayUtils.equals( name.toCharArray(), myName ) &&
name.resolveBinding() == this )
{
return members[i];
}
}
} else if( members[i] instanceof IASTFunctionDefinition ){
IASTName name = ((IASTFunctionDefinition) members[i]).getDeclarator().getName();
if( CharArrayUtils.equals( name.toCharArray(), myName ) &&
name.resolveBinding() == this )
name.resolveBinding() == this )
{
return members[i];
}
}
} else if( members[i] instanceof IASTFunctionDefinition ){
IASTName name = ((IASTFunctionDefinition) members[i]).getDeclarator().getName();
if( CharArrayUtils.equals( name.toCharArray(), myName ) &&
name.resolveBinding() == this )
{
return members[i];
}
}
}
return null;
@ -278,4 +287,8 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
return false;
}
public boolean isImplicit() {
return false;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Mar 29, 2005
@ -65,4 +66,8 @@ public class CPPMethodInstance extends CPPFunctionInstance implements ICPPMethod
return false;
}
public boolean isImplicit() {
return false;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,7 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* /
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Apr 29, 2005
@ -82,4 +82,8 @@ public class CPPMethodSpecialization extends CPPFunctionSpecialization
return false;
}
public boolean isImplicit() {
return false;
}
}

View file

@ -151,4 +151,8 @@ public class CPPMethodTemplate extends CPPFunctionTemplate implements
return false;
}
public boolean isImplicit() {
return false;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,7 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* /
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Apr 29, 2005
@ -65,4 +65,8 @@ public class CPPMethodTemplateSpecialization extends
return false;
}
public boolean isImplicit() {
return false;
}
}

View file

@ -60,8 +60,8 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
public boolean isMutable() {
return false;
}
public IASTInitializer getDefaultValue() {
return ((ICPPParameter)getBinding()).getDefaultValue();
public boolean hasDefaultValue() {
return ((ICPPParameter)getBinding()).hasDefaultValue();
}
}
@ -276,6 +276,10 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
return null;
}
public boolean hasDefaultValue() {
return getDefaultValue() != null;
}
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Mar 29, 2005
@ -14,7 +15,6 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
@ -87,8 +87,8 @@ public class CPPParameterSpecialization extends CPPSpecialization implements ICP
return false;
}
public IASTInitializer getDefaultValue() {
return getParameter().getDefaultValue();
public boolean hasDefaultValue() {
return getParameter().hasDefaultValue();
}
public ICPPDelegate createDelegate(IASTName name) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* Copyright (c) 2005, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Feb 11, 2005
@ -17,10 +18,12 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
@ -39,6 +42,11 @@ public class CPPPointerToMemberType extends CPPPointerType implements
}
public boolean isSameType( IType o ){
if( o == this )
return true;
if( o instanceof ITypedef || o instanceof IIndexType)
return o.isSameType( this );
if( !super.isSameType( o ) )
return false;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
* Created on Dec 10, 2004
@ -18,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
@ -62,8 +64,8 @@ public class CPPPointerType implements IPointerType, ITypeContainer {
public boolean isSameType( IType o ){
if( o == this )
return true;
if( o instanceof ITypedef )
return ((ITypedef)o).isSameType( this );
if( o instanceof ITypedef || o instanceof IIndexType)
return o.isSameType( this );
if( !( o instanceof CPPPointerType ) )
return false;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
@ -18,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
@ -34,7 +36,7 @@ public class CPPQualifierType implements IQualifierType, ITypeContainer {
}
public boolean isSameType( IType o ){
if( o instanceof ITypedef )
if( o instanceof ITypedef || o instanceof IIndexType)
return o.isSameType( this );
if( !( o instanceof CPPQualifierType ) )
return false;

View file

@ -14,10 +14,10 @@
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
@ -28,9 +28,9 @@ import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.ObjectSet;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.core.runtime.CoreException;
/**
* @author aniefer
@ -84,6 +84,30 @@ abstract public class CPPScope implements ICPPScope, IASTInternalScope {
}
public IBinding getBinding(IASTName name, boolean forceResolve) throws DOMException {
IBinding binding= getBindingInAST(name, forceResolve);
if (binding == null) {
IIndex index = name.getTranslationUnit().getIndex();
if (index != null) {
// Try looking this up in the PDOM
if (physicalNode instanceof IASTTranslationUnit) {
IBinding[] bindings= index.findInGlobalScope(Linkage.CPP_LINKAGE, name.toCharArray());
binding= CPPSemantics.resolveAmbiguities(name, bindings);
}
else if (physicalNode instanceof ICPPASTNamespaceDefinition) {
ICPPASTNamespaceDefinition nsdef = (ICPPASTNamespaceDefinition)physicalNode;
IASTName nsname = nsdef.getName();
IBinding nsbinding= nsname.resolveBinding();
if (nsbinding != null) {
IBinding[] bindings= index.findInNamespace(nsbinding, name.toCharArray());
binding= CPPSemantics.resolveAmbiguities(name, bindings);
}
}
}
}
return binding;
}
public IBinding getBindingInAST(IASTName name, boolean forceResolve) throws DOMException {
char [] c = name.toCharArray();
//can't look up bindings that don't have a name
if( c.length == 0 )
@ -127,27 +151,10 @@ abstract public class CPPScope implements ICPPScope, IASTInternalScope {
return binding;
}
return (IBinding) obj;
} else {
IIndex index = name.getTranslationUnit().getIndex();
if (index != null) {
// Try looking this up in the PDOM
if (physicalNode instanceof ICPPASTNamespaceDefinition) {
ICPPASTNamespaceDefinition nsdef = (ICPPASTNamespaceDefinition)physicalNode;
IASTName nsname = nsdef.getName();
IBinding nsbinding= null;
try {
nsbinding = index.findBinding(nsname);
} catch (CoreException e) {
CCorePlugin.log(e);
}
if (nsbinding instanceof ICPPScope)
return ((ICPPScope)nsbinding).getBinding(name, forceResolve);
}
}
}
return null;
}
return null;
}
private boolean isfull = false;
public void setFullyCached( boolean full ){
isfull = full;

View file

@ -14,7 +14,6 @@
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
@ -117,7 +116,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
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.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
@ -128,8 +127,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.core.runtime.CoreException;
/**
* @author aniefer
@ -750,24 +747,12 @@ public class CPPSemantics {
addDefinition( binding, data.astName );
}
}
if( binding == null || binding instanceof IProblemBinding ){
// Let's try the pdom
IIndex index = name.getTranslationUnit().getIndex();
if (index != null) {
try {
binding = index.findBinding(name);
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
// If we're still null...
if (binding == null) {
if( name instanceof ICPPASTQualifiedName && data.forDefinition() )
binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND, data.name() );
else
binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.name() );
}
// If we're still null...
if (binding == null) {
if( name instanceof ICPPASTQualifiedName && data.forDefinition() )
binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND, data.name() );
else
binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.name() );
}
return binding;
}
@ -1033,14 +1018,21 @@ public class CPPSemantics {
mergeResults( data, binding, true );
}
} else {
IBinding b= null;
if (!data.prefixLookup && data.astName != null ) {
IBinding b = scope.getBinding( data.astName, false );
if (b instanceof CPPImplicitFunction || b instanceof CPPImplicitTypedef
|| b instanceof PDOMBinding)
// TODO the PDOMBinding thing is a kludge
b= scope.getBinding( data.astName, false );
if (b instanceof CPPImplicitFunction || b instanceof CPPImplicitTypedef)
mergeResults( data, b, true );
}
mergeResults( data, lookupInScope( data, scope, blockItem ), true );
IASTName[] inScope = lookupInScope( data, scope, blockItem );
if (inScope != null) {
mergeResults( data, inScope, true );
}
else if (b instanceof IIndexBinding) {
// since the ast did not come up with a binding, use what
// we have found in the index.
mergeResults(data, b, true);
}
}
if( (!data.hasResults() || data.prefixLookup) && scope instanceof ICPPNamespaceScope ){
@ -1101,7 +1093,11 @@ public class CPPSemantics {
node = blockItem;
ICPPScope parentScope = (ICPPScope) scope.getParent();
if( parentScope instanceof ICPPTemplateScope ){
// the index cannot return the translation unit as parent scope
if (parentScope == null && scope instanceof IIndexBinding) {
parentScope= (ICPPScope) node.getTranslationUnit().getScope();
}
else if( parentScope instanceof ICPPTemplateScope ){
IASTNode parent = node.getParent();
while( parent != null && !(parent instanceof ICPPASTTemplateDeclaration) ){
node = parent;
@ -1804,7 +1800,7 @@ public class CPPSemantics {
}
}
static protected IBinding resolveAmbiguities( IASTName name, Object[] bindings ){
public static IBinding resolveAmbiguities( IASTName name, Object[] bindings ){
bindings = ArrayUtil.trim( Object.class, bindings );
if( bindings == null || bindings.length == 0 )
return null;
@ -1908,6 +1904,7 @@ public class CPPSemantics {
IBinding obj = null;
IBinding temp = null;
ObjectSet fns = ObjectSet.EMPTY_SET;
boolean fnsFromAST= false;
ObjectSet templateFns = ObjectSet.EMPTY_SET;
Object [] items = (Object[]) data.foundItems;
@ -1938,6 +1935,28 @@ public class CPPSemantics {
mergeResults( data, bindings, false );
items = (Object[]) data.foundItems;
continue;
} else if( temp instanceof IFunction ){
if( temp instanceof ICPPTemplateDefinition ){
if( templateFns == ObjectSet.EMPTY_SET )
templateFns = new ObjectSet(2);
templateFns.put( temp );
} else {
if( fns == ObjectSet.EMPTY_SET )
fns = new ObjectSet(2);
if (temp instanceof IIndexBinding) {
// accept bindings from index only, in case we have none in the AST
if (!fnsFromAST) {
fns.put(temp);
}
}
else {
if (!fnsFromAST) {
fns.clear();
fnsFromAST= true;
}
fns.put( temp );
}
}
} else if( temp instanceof IType ){
if( type == null ){
type = temp;
@ -1954,25 +1973,25 @@ public class CPPSemantics {
} else if( type != temp && !((IType)type).isSameType( (IType) temp )) {
return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
} else if( temp instanceof IFunction ){
if( temp instanceof ICPPTemplateDefinition ){
if( templateFns == ObjectSet.EMPTY_SET )
templateFns = new ObjectSet(2);
templateFns.put( temp );
} else {
if( fns == ObjectSet.EMPTY_SET )
fns = new ObjectSet(2);
fns.put( temp );
}
} else {
if( obj == null )
if( obj == null)
obj = temp;
else if( (temp instanceof ICPPDelegate && ((ICPPDelegate)temp).getBinding() == obj) ||
(obj instanceof ICPPDelegate && ((ICPPDelegate)obj).getBinding() == temp) )
{
else if ( obj == temp ||
(temp instanceof ICPPDelegate && ((ICPPDelegate)temp).getBinding() == obj) ||
(obj instanceof ICPPDelegate && ((ICPPDelegate)obj).getBinding() == temp)) {
//ok, delegates are synonyms
} else if( obj != temp ){
return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
else {
// ignore index stuff in case we have bindings from the ast
boolean ibobj= obj instanceof IIndexBinding;
boolean ibtemp= temp instanceof IIndexBinding;
// blame it on the index
if (ibobj != ibtemp) {
if (ibobj)
obj= temp;
}
else
return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
}
}
@ -2050,6 +2069,10 @@ public class CPPSemantics {
int size = functions.length;
for( int i = 0; i < size && functions[i] != null; i++ ){
function = (IFunction) functions[i];
if (function instanceof IProblemBinding) {
functions[i]= null;
continue;
}
num = function.getParameters().length;
//if there are m arguments in the list, all candidate functions having m parameters
@ -2087,7 +2110,7 @@ public class CPPSemantics {
else {
IParameter [] params = function.getParameters();
for( int j = num - 1; j >= numParameters; j-- ){
if( ((ICPPParameter)params[j]).getDefaultValue() == null ){
if( !((ICPPParameter)params[j]).hasDefaultValue()){
functions[i] = null;
break;
}

View file

@ -392,7 +392,7 @@ public class CPPVisitor {
try {
if( name.toCharArray().length > 0 && scope != null ) //can't lookup anonymous things
binding = scope.getBinding( name, false );
if( binding == null || !(binding instanceof ICPPClassType) ){
if( !(binding instanceof ICPPInternalBinding) || !(binding instanceof ICPPClassType)){
if( template )
binding = new CPPClassTemplate( name );
else
@ -400,14 +400,11 @@ public class CPPVisitor {
if( scope != null )
ASTInternal.addName( scope, compType.getName() );
} else {
if( binding instanceof ICPPInternalBinding ){
ICPPInternalBinding internal = (ICPPInternalBinding) binding;
if( internal.getDefinition() == null )
internal.addDefinition( compType );
else
binding = new ProblemBinding( name, IProblemBinding.SEMANTIC_INVALID_REDEFINITION, name.toCharArray() );
}
ICPPInternalBinding internal = (ICPPInternalBinding) binding;
if( internal.getDefinition() == null )
internal.addDefinition( compType );
else
binding = new ProblemBinding( name, IProblemBinding.SEMANTIC_INVALID_REDEFINITION, name.toCharArray() );
}
} catch ( DOMException e ) {
binding = e.getProblem();
@ -421,7 +418,7 @@ public class CPPVisitor {
IBinding binding;
try {
binding = scope.getBinding( namespaceDef.getName(), false );
if( binding == null || binding instanceof IProblemBinding ){
if( !(binding instanceof ICPPInternalBinding) || binding instanceof IProblemBinding ){
binding = new CPPNamespace( namespaceDef );
ASTInternal.addName( scope, namespaceDef.getName() );
}
@ -532,21 +529,23 @@ public class CPPVisitor {
return CPPTemplates.createBinding( param );
}
} else if( simpleDecl != null && simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){
if( binding != null && binding instanceof ITypedef ){
if( binding instanceof ICPPInternalBinding && binding instanceof ITypedef ){
try {
IType t1 = ((ITypedef)binding).getType();
IType t2 = createType( declarator );
if( t1 != null && t2 != null && t1.isSameType( t2 ) ){
((ICPPInternalBinding)binding).addDeclaration( name );
ICPPInternalBinding internal = (ICPPInternalBinding) binding;
internal.addDeclaration(name);
return binding;
}
} catch ( DOMException e1 ) {
return e1.getProblem();
}
return new ProblemBinding( name, IProblemBinding.SEMANTIC_INVALID_REDECLARATION, name.toCharArray() );
}
binding = new CPPTypedef( name );
} else if( declarator instanceof ICPPASTFunctionDeclarator ){
if( binding != null && binding instanceof IFunction ){
if( binding instanceof ICPPInternalBinding && binding instanceof IFunction ){
IFunction function = (IFunction) binding;
if( CPPSemantics.isSameFunction( function, declarator ) ){
ICPPInternalBinding internal = (ICPPInternalBinding) function;
@ -554,7 +553,7 @@ public class CPPVisitor {
internal.addDeclaration( name );
else {
if( internal.getDefinition() == null )
((ICPPInternalBinding)function).addDefinition( name );
internal.addDefinition( name );
else {
IASTNode def = internal.getDefinition();
if( def instanceof IASTDeclarator )
@ -1588,10 +1587,10 @@ public class CPPVisitor {
name = ((IASTEnumerationSpecifier)declSpec).getName();
} else if( declSpec instanceof ICPPASTSimpleDeclSpecifier ){
ICPPASTSimpleDeclSpecifier spec = (ICPPASTSimpleDeclSpecifier) declSpec;
int bits = ( spec.isLong() ? CPPBasicType.IS_LONG : 0 ) |
( spec.isShort() ? CPPBasicType.IS_SHORT : 0 ) |
( spec.isSigned() ? CPPBasicType.IS_SIGNED: 0 ) |
( spec.isUnsigned() ? CPPBasicType.IS_UNSIGNED : 0 );
int bits = ( spec.isLong() ? ICPPBasicType.IS_LONG : 0 ) |
( spec.isShort() ? ICPPBasicType.IS_SHORT : 0 ) |
( spec.isSigned() ? ICPPBasicType.IS_SIGNED: 0 ) |
( spec.isUnsigned() ? ICPPBasicType.IS_UNSIGNED : 0 );
if( spec instanceof IGPPASTSimpleDeclSpecifier ){
IGPPASTSimpleDeclSpecifier gspec = (IGPPASTSimpleDeclSpecifier) spec;
if( gspec.getTypeofExpression() != null ){
@ -1606,9 +1605,7 @@ public class CPPVisitor {
}
if( name != null ){
IBinding binding = name.resolveBinding();
if( binding instanceof IType )
type = (IType) binding;
else if( binding instanceof ICPPConstructor ){
if( binding instanceof ICPPConstructor ){
try {
ICPPClassScope scope = (ICPPClassScope) binding.getScope();
type = scope.getClassType();
@ -1616,6 +1613,8 @@ public class CPPVisitor {
} catch (DOMException e) {
type = e.getProblem();
}
} else if( binding instanceof IType ) {
type = (IType) binding;
} else if( binding instanceof ICPPTemplateNonTypeParameter ){
//TODO workaround... is there anything better?
try {
@ -1831,7 +1830,7 @@ public class CPPVisitor {
}
} catch (DOMException e) {
}
return new CPPBasicType( IBasicType.t_int, CPPBasicType.IS_LONG | CPPBasicType.IS_UNSIGNED );
return new CPPBasicType( IBasicType.t_int, ICPPBasicType.IS_LONG | ICPPBasicType.IS_UNSIGNED );
}
IType type = getExpressionType(((IASTUnaryExpression)expression).getOperand() );
@ -1886,7 +1885,7 @@ public class CPPVisitor {
}
} catch (DOMException e) {
}
return new CPPBasicType( IBasicType.t_int, CPPBasicType.IS_LONG | CPPBasicType.IS_UNSIGNED );
return new CPPBasicType( IBasicType.t_int, ICPPBasicType.IS_LONG | ICPPBasicType.IS_UNSIGNED );
}
return createType( typeidExp.getTypeId() );
} else if( expression instanceof IASTArraySubscriptExpression ){

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
@ -15,8 +16,10 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPPointerToMemberType;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
@ -55,8 +58,14 @@ public class GPPPointerToMemberType extends CPPPointerToMemberType implements
}
public boolean isSameType( IType o ){
if (o==this) {
return true;
}
if (o instanceof ITypedef || o instanceof IIndexType) {
return o.isSameType(this);
}
if( !super.isSameType( o ) ) return false;
if( o instanceof IGPPPointerToMemberType ){
return (isRestrict == ((IGPPPointerToMemberType) o).isRestrict());
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* Copyright (c) 2004, 2006 IBM Corporation 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
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
/*
@ -15,8 +16,10 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTPointer;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPPointerType;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
* @author aniefer
@ -67,6 +70,13 @@ public class GPPPointerType extends CPPPointerType implements IGPPPointerType {
}
public boolean isSameType( IType o ){
if (o==this) {
return true;
}
if (o instanceof ITypedef || o instanceof IIndexType) {
return o.isSameType(this);
}
if( !super.isSameType( o ) ) return false;
if( o instanceof IGPPPointerType ){

View file

@ -20,6 +20,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
@ -324,4 +326,46 @@ public class CIndex implements IIndex {
}
return result;
}
public IBinding[] findInGlobalScope(ILinkage linkage, char[] name) {
ArrayList result= new ArrayList();
for (int i = 0; i < fFragments.length; i++) {
try {
IBinding[] part = fFragments[i].findInGlobalScope(linkage, name);
for (int j = 0; j < part.length; j++) {
IBinding binding = part[j];
if (binding instanceof IIndexBinding) {
result.add(binding);
}
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
if (!result.isEmpty()) {
return (IIndexBinding[]) result.toArray(new IIndexBinding[result.size()]);
}
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
public IBinding[] findInNamespace(IBinding nsbinding, char[] name) {
ArrayList result= new ArrayList();
for (int i = 0; i < fFragments.length; i++) {
try {
IBinding[] part = fFragments[i].findInNamespace(nsbinding, name);
for (int j = 0; j < part.length; j++) {
IBinding binding = part[j];
if (binding instanceof IIndexBinding) {
result.add(binding);
}
}
if (!result.isEmpty()) {
return (IIndexBinding[]) result.toArray(new IIndexBinding[result.size()]);
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndex;
@ -96,4 +97,12 @@ final public class EmptyCIndex implements IIndex {
public IIndexBinding adaptBinding(IBinding binding) throws CoreException {
return null;
}
public IBinding[] findInGlobalScope(ILinkage linkage, char[] name) {
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
public IBinding[] findInNamespace(IBinding nsbinding, char[] name) {
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndex;
@ -133,5 +134,13 @@ public interface IIndexFragment {
*/
long getLastWriteAccess();
/**
* Returns all bindings with the given name in the given linkage
*/
IBinding[] findInGlobalScope(ILinkage linkage, char[] name) throws CoreException;
/**
* Returns all bindings with the given name in the given namespace
*/
IBinding[] findInNamespace(IBinding nsbinding, char[] name) throws CoreException;
}

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.index;
import org.eclipse.cdt.core.dom.ast.IType;
/**
* Interface for types stored in the index
* @since 4.0
*/
public interface IIndexType extends IType {
}

View file

@ -1,5 +1,5 @@
###############################################################################
# Copyright (c) 2005 IBM Corporation and others.
# Copyright (c) 2005, 2006 IBM Corporation 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
@ -82,5 +82,6 @@ ASTProblemFactory.error.semantic.dom.knrParameterDeclarationNotFound=A declarati
ASTProblemFactory.error.semantic.dom.labelStatementNotFound=A label statement was not found for the name {0}
ASTProblemFactory.error.semantic.dom.invalidRedefinition=Invalid redefinition of the name {0}
ASTProblemFactory.error.semantic.dom.invalidRedeclaration=Invalid redeclaration of the name {0}
ASTProblemFactory.error.semantic.dom.recursionInResolution=Recursion while looking up ''{0}''
ASTProblemFactory.error.semantic.dom.badScope=A scope could not be created to represent the name {0}
ASTProblemFactory.error.semantic.dom.memberDeclNotFound=A declaration could not be found for this member definition: {0}

View file

@ -30,8 +30,8 @@ import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter;
@ -52,6 +52,8 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPMethod;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPNamespace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.PlatformObject;
@ -66,7 +68,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
private Database db;
public static final int VERSION = 18;
public static final int VERSION = 20;
// 0 - the beginning of it all
// 1 - first change to kick off upgrades
// 2 - added file inclusions
@ -87,6 +89,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
// 17 - use single linked list for names in file, adds a link to enclosing defintion name.
// 18 - distinction between c-unions and c-structs.
// 19 - alter representation of paths in the pdom (162172)
// 20 - add pointer to member types, array types, return types for functions
public static final int LINKAGES = Database.DATA_AREA;
public static final int FILE_INDEX = Database.DATA_AREA + 4;
@ -96,7 +99,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
private Map fLinkageIDCache = new HashMap();
private File fPath;
private IIndexLocationConverter locationConverter;
public PDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException {
// Load up the database
fPath= dbPath;
@ -249,11 +252,13 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
private List bindings = new ArrayList();
private boolean isFullyQualified;
private BitSet matchesUpToLevel;
private boolean acceptImplicitMethods;
public BindingFinder(Pattern[] pattern, boolean isFullyQualified, IProgressMonitor monitor) {
public BindingFinder(Pattern[] pattern, boolean isFullyQualified, boolean acceptImplicitMethods, IProgressMonitor monitor) {
this.pattern = pattern;
this.monitor = monitor;
this.isFullyQualified= isFullyQualified;
this.acceptImplicitMethods= acceptImplicitMethods;
matchesUpToLevel= new BitSet();
matchesUpToLevel.set(0);
matchStack.add(matchesUpToLevel);
@ -270,7 +275,10 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
// check if we have a complete match.
final int lastIdx = pattern.length-1;
if (matchesUpToLevel.get(lastIdx) && pattern[lastIdx].matcher(name).matches()) {
bindings.add(binding);
if (acceptImplicitMethods || !(binding instanceof PDOMCPPMethod) ||
!((PDOMCPPMethod)binding).isImplicit()) {
bindings.add(binding);
}
}
// check if we have a partial match
@ -331,7 +339,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
}
public IIndexFragmentBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
BindingFinder finder = new BindingFinder(pattern, isFullyQualified, monitor);
BindingFinder finder = new BindingFinder(pattern, isFullyQualified, filter.acceptImplicitMethods(), monitor);
for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) {
PDOMLinkage linkage = (PDOMLinkage) iter.next();
if (filter.acceptLinkage(linkage)) {
@ -580,4 +588,20 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
public File getPath() {
return fPath;
}
public IBinding[] findInGlobalScope(ILinkage linkage, char[] name) throws CoreException {
PDOMLinkage pdomLinkage= adaptLinkage(linkage);
if (pdomLinkage != null) {
return pdomLinkage.findInGlobalScope(name);
}
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
public IBinding[] findInNamespace(IBinding nsbinding, char[] name) throws CoreException {
IIndexProxyBinding ns= adaptBinding(nsbinding);
if (ns instanceof PDOMCPPNamespace) {
return ((PDOMCPPNamespace) ns).find(new String(name));
}
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
}

View file

@ -25,8 +25,8 @@ import org.eclipse.cdt.core.dom.IPDOM;
import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.index.IIndexChangeListener;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexChangeListener;
import org.eclipse.cdt.core.index.IIndexerStateListener;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElementDelta;
@ -47,7 +47,6 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
@ -104,7 +103,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
* Stores mapping from pdom to project, used to serialize\ creation of new pdoms.
*/
private Map fProjectToPDOM= new HashMap();
private Map fLocationToCProject= new HashMap();
private Map fFileToProject= new HashMap();
private ListenerList fChangeListeners= new ListenerList();
private ListenerList fStateListeners= new ListenerList();
@ -155,19 +154,19 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
}
String dbName= rproject.getPersistentProperty(dbNameProperty);
IPath dbPath= null;
File dbFile= null;
if (dbName != null) {
dbPath= CCorePlugin.getDefault().getStateLocation().append(dbName);
ICProject currentCOwner= (ICProject) fLocationToCProject.get(dbPath);
dbFile= CCorePlugin.getDefault().getStateLocation().append(dbName).toFile();
ICProject currentCOwner= (ICProject) fFileToProject.get(dbFile);
if (currentCOwner != null) {
IProject currentOwner= currentCOwner.getProject();
if (currentOwner.exists()) {
dbName= null;
dbPath= null;
dbFile= null;
}
else {
pdom= (WritablePDOM) fProjectToPDOM.remove(currentOwner);
fLocationToCProject.remove(dbPath);
fFileToProject.remove(dbFile);
}
}
}
@ -176,14 +175,14 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
if (dbName == null) {
dbName= getDefaultName(project);
rproject.setPersistentProperty(dbNameProperty, dbName);
dbPath= CCorePlugin.getDefault().getStateLocation().append(dbName);
dbFile= CCorePlugin.getDefault().getStateLocation().append(dbName).toFile();
}
pdom = new WritablePDOM(new File(dbPath.toOSString()), new PDOMProjectIndexLocationConverter(rproject));
pdom = new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject));
pdom.addListener(this);
}
fLocationToCProject.put(dbPath, project);
fFileToProject.put(dbFile, project);
fProjectToPDOM.put(rproject, pdom);
return pdom;
}
@ -626,7 +625,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
ICProject project;
synchronized (fProjectToPDOM) {
project = (ICProject) fLocationToCProject.get(pdom.getPath());
project = (ICProject) fFileToProject.get(pdom.getPath());
}
if (project != null) {

View file

@ -0,0 +1,98 @@
/*******************************************************************************
* 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.core.runtime.CoreException;
public class PDOMArrayType extends PDOMNode implements IIndexType, IArrayType, ITypeContainer {
private static final int TYPE = PDOMNode.RECORD_SIZE;
private static final int RECORD_SIZE= TYPE+4;
public PDOMArrayType(PDOM pdom, int record) {
super(pdom, record);
}
public PDOMArrayType(PDOM pdom, PDOMNode parent, IArrayType type) throws CoreException {
super(pdom, parent);
Database db = pdom.getDB();
try {
PDOMNode targetTypeNode = getLinkageImpl().addType(this, type.getType());
if (targetTypeNode != null) {
int typeRec = targetTypeNode.getRecord();
db.putInt(record + TYPE, typeRec);
}
} catch (DOMException e) {
CCorePlugin.log(e);
}
}
protected int getRecordSize() {
return RECORD_SIZE;
}
public int getNodeType() {
return PDOMLinkage.ARRAY_TYPE;
}
public IASTExpression getArraySizeExpression() throws DOMException {
return null;
}
public IType getType() throws DOMException {
try {
PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
return node instanceof IType ? (IType)node : null;
} catch (CoreException e) {
CCorePlugin.log(e);
return null;
}
}
public boolean isSameType(IType type) {
if( type instanceof ITypedef )
return ((ITypedef)type).isSameType( this );
if( !( type instanceof IArrayType ))
return false;
try {
IType type1= this.getType();
if( type1 == null )
return false;
IArrayType rhs = (IArrayType) type;
return type1.isSameType( rhs.getType() );
} catch (DOMException e) {
}
return false;
}
public void setType(IType type) {
throw new PDOMNotImplementedError();
}
public Object clone() {
throw new PDOMNotImplementedError();
}
}

View file

@ -12,6 +12,9 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.DOMException;
@ -214,4 +217,21 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
return null;
}
}
final public String[] getQualifiedName() {
List result = new ArrayList();
try {
PDOMNode node = this;
while (node != null) {
if (node instanceof PDOMBinding) {
result.add(0, ((PDOMBinding)node).getName());
}
node = node.getParentNode();
}
return (String[]) result.toArray(new String[result.size()]);
} catch(CoreException ce) {
CCorePlugin.log(ce);
return null;
}
}
}

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IQualifierType;
@ -58,7 +59,8 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
// node types
protected static final int LINKAGE = 0; // special one for myself
static final int POINTER_TYPE = 1;
static final int QUALIFIER_TYPE = 2;
static final int ARRAY_TYPE = 2;
static final int QUALIFIER_TYPE = 3;
protected static final int LAST_NODE_TYPE = QUALIFIER_TYPE;
@ -132,6 +134,8 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
switch (PDOMNode.getNodeType(pdom, record)) {
case POINTER_TYPE:
return new PDOMPointerType(pdom, record);
case ARRAY_TYPE:
return new PDOMArrayType(pdom, record);
case QUALIFIER_TYPE:
return new PDOMQualifierType(pdom, record);
}
@ -143,6 +147,8 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
if (type instanceof IPointerType)
node = new PDOMPointerType(pdom, parent, (IPointerType)type);
else if (type instanceof IArrayType)
node= new PDOMArrayType(pdom, parent, (IArrayType) type);
else if (type instanceof IQualifierType)
node = new PDOMQualifierType(pdom, parent, (IQualifierType)type);
else
@ -180,11 +186,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
}
if (scope instanceof IIndexBinding) {
IIndexBinding parent= ((IIndexBinding) scope).getParentBinding();
if (parent == null) {
return this;
}
return adaptBinding(parent);
return adaptBinding((IBinding) scope);
}
// the scope is from the ast
@ -217,4 +219,11 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
}
public abstract int getBindingType(IBinding binding);
public IBinding[] findInGlobalScope(char[] name) throws CoreException {
FindBindingsInBTree visitor= new FindBindingsInBTree(this, name);
getIndex().accept(visitor);
return visitor.getBinding();
}
}

View file

@ -17,8 +17,10 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.core.runtime.CoreException;
@ -27,12 +29,12 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer
*/
public class PDOMPointerType extends PDOMNode implements IPointerType,
ITypeContainer {
ITypeContainer, IIndexType {
private static final int FLAGS = PDOMNode.RECORD_SIZE + 0; // byte
private static final int TYPE = PDOMNode.RECORD_SIZE + 1;
private static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 5;
protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 5;
private static final int CONST = 0x1;
private static final int VOLATILE = 0x2;
@ -81,7 +83,7 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
return pdom.getDB().getByte(record + FLAGS);
}
public IType getType() throws DOMException {
public IType getType() {
try {
PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
return node instanceof IType ? (IType)node : null;
@ -91,7 +93,7 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
}
}
public boolean isConst() throws DOMException {
public boolean isConst() {
try {
return (getFlags() & CONST) != 0;
} catch (CoreException e) {
@ -100,7 +102,7 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
}
}
public boolean isVolatile() throws DOMException {
public boolean isVolatile() {
try {
return (getFlags() & VOLATILE) != 0;
} catch (CoreException e) {
@ -110,7 +112,23 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
}
public boolean isSameType(IType type) {
return equals(type);
if( type instanceof ITypedef )
return ((ITypedef)type).isSameType( this );
if( !( type instanceof IPointerType ))
return false;
IPointerType rhs = (IPointerType) type;
try {
if (isConst() == rhs.isConst() && isVolatile() == rhs.isVolatile()) {
IType type1= getType();
if (type1 != null) {
return type1.isSameType(rhs.getType());
}
}
} catch (DOMException e) {
}
return false;
}
public void setType(IType type) {

View file

@ -17,8 +17,10 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.core.runtime.CoreException;
@ -28,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
*
*/
public class PDOMQualifierType extends PDOMNode implements IQualifierType,
ITypeContainer {
ITypeContainer, IIndexType {
private static final int FLAGS = PDOMNode.RECORD_SIZE;
private static final int TYPE = PDOMNode.RECORD_SIZE + 1;
@ -111,7 +113,18 @@ public class PDOMQualifierType extends PDOMNode implements IQualifierType,
}
public boolean isSameType(IType type) {
return equals(type);
if( type instanceof ITypedef )
return type.isSameType( this );
if( !( type instanceof IQualifierType ) )
return false;
IQualifierType pt = (IQualifierType) type;
try {
if( isConst() == pt.isConst() && isVolatile() == pt.isVolatile() )
return type.isSameType( pt.getType() );
} catch (DOMException e) {
}
return false;
}
public void setType(IType type) {

View file

@ -8,6 +8,7 @@
* Contributors:
* QNX - Initial API and implementation
* Andrew Ferguson (Symbian)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.c;
@ -16,8 +17,10 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICBasicType;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -27,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer
*
*/
class PDOMCBasicType extends PDOMNode implements ICBasicType {
class PDOMCBasicType extends PDOMNode implements ICBasicType, IIndexType {
public static final int TYPE_ID = PDOMNode.RECORD_SIZE + 0; // short
public static final int FLAGS = PDOMNode.RECORD_SIZE + 2; // short
@ -77,7 +80,7 @@ class PDOMCBasicType extends PDOMNode implements ICBasicType {
return PDOMCLinkage.CBASICTYPE;
}
public int getType() throws DOMException {
public int getType() {
try {
return pdom.getDB().getChar(record + TYPE_ID);
} catch (CoreException e) {
@ -101,9 +104,31 @@ class PDOMCBasicType extends PDOMNode implements ICBasicType {
public boolean isComplex() { return flagSet(IS_COMPLEX); }
public boolean isSameType(IType type) {
// TODO something fancier
return equals(type);
public boolean isSameType(IType rhs) {
if( rhs instanceof ITypedef )
return rhs.isSameType( this );
if( !(rhs instanceof ICBasicType))
return false;
ICBasicType rhs1= (ICBasicType) rhs;
int type;
try {
type = this.getType();
if (type == -1 || type != rhs1.getType())
return false;
return (rhs1.getType() == this.getType()
&& rhs1.isLong() == this.isLong()
&& rhs1.isShort() == this.isShort()
&& rhs1.isSigned() == this.isSigned()
&& rhs1.isUnsigned() == this.isUnsigned()
&& rhs1.isLongLong() == this.isLongLong()
&& rhs1.isComplex() == this.isComplex()
&& rhs1.isImaginary() == this.isImaginary());
} catch (DOMException e) {
return false;
}
}
public Object clone() {

View file

@ -7,6 +7,7 @@
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.c;
@ -17,6 +18,8 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -26,7 +29,7 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*/
class PDOMCEnumeration extends PDOMBinding implements IEnumeration {
class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType {
private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0;
@ -87,7 +90,26 @@ class PDOMCEnumeration extends PDOMBinding implements IEnumeration {
}
public boolean isSameType(IType type) {
throw new PDOMNotImplementedError();
if (type instanceof PDOMNode) {
PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM()) {
return node.getRecord() == getRecord();
}
}
if (type instanceof ITypedef) {
return type.isSameType(this);
}
if (type instanceof IEnumeration) {
IEnumeration etype= (IEnumeration) type;
try {
return getDBName().equals(etype.getNameCharArray());
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
return false;
}
public Object clone() {

View file

@ -248,4 +248,8 @@ class PDOMCLinkage extends PDOMLinkage {
public IBTreeComparator getIndexComparator() {
return new FindBinding.DefaultBindingBTreeComparator(getPDOM());
}
public IBinding findInGlobalScope(String filePath, IASTName name) throws CoreException {
return null;
}
}

View file

@ -26,8 +26,10 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
@ -41,7 +43,7 @@ import org.eclipse.core.runtime.Status;
* @author Doug Schaefer
*
*/
public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCompositeTypeScope, IPDOMMemberOwner {
public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCompositeTypeScope, IPDOMMemberOwner, IIndexType {
private static final int MEMBERLIST = PDOMBinding.RECORD_SIZE;
private static final int KEY = MEMBERLIST + 4; // byte
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8;
@ -152,11 +154,26 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom
}
public boolean isSameType(IType type) {
if (equals(type))
return true;
else
// TODO - see if it matches
return false;
if (type instanceof PDOMNode) {
PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM()) {
return node.getRecord() == getRecord();
}
}
if (type instanceof ITypedef) {
return type.isSameType(this);
}
if (type instanceof ICompositeType) {
ICompositeType etype= (ICompositeType) type;
try {
return getDBName().equals(etype.getNameCharArray());
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
return false;
}
protected int getRecordSize() {

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -26,7 +27,7 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*/
class PDOMCTypedef extends PDOMBinding implements ITypedef, ITypeContainer {
class PDOMCTypedef extends PDOMBinding implements ITypedef, ITypeContainer, IIndexType {
private static final int TYPE = PDOMBinding.RECORD_SIZE + 0;
@ -70,19 +71,15 @@ class PDOMCTypedef extends PDOMBinding implements ITypedef, ITypeContainer {
public boolean isSameType(IType type) {
try {
if (type instanceof PDOMBinding)
return record == ((PDOMBinding)type).getRecord();
IType myrtype = getType();
if (myrtype == null)
return false;
if (type instanceof ITypedef) {
IType rtype = ((ITypedef)type).getType();
return rtype != null ? myrtype.isSameType(rtype) : false;
type= ((ITypedef)type).getType();
}
return myrtype.isSameType(type);
} catch (DOMException e) {
CCorePlugin.log(e);
}
return false;
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
@ -31,6 +32,9 @@ public class PDOMCPPAnnotation {
// byte of annotations.
public static final int VIRTUAL_OFFSET = 0;
public static final int DESTRUCTOR_OFFSET = 1;
public static final int IMPLICIT_METHOD_OFFSET = 2;
public static final int EXPLICIT_CONSTRUCTOR_OFFSET = 3;
public static final int MAX_EXTRA_OFFSET= EXPLICIT_CONSTRUCTOR_OFFSET;
/**
* Encodes storage class specifiers and other annotation, including
@ -69,6 +73,13 @@ public class PDOMCPPAnnotation {
ICPPMethod method = (ICPPMethod) binding;
modifiers |= (method.isVirtual() ? 1 : 0) << VIRTUAL_OFFSET;
modifiers |= (method.isDestructor() ? 1 : 0) << DESTRUCTOR_OFFSET;
modifiers |= (method.isImplicit() ? 1 : 0) << IMPLICIT_METHOD_OFFSET;
}
if (binding instanceof ICPPConstructor) {
ICPPConstructor constructor= (ICPPConstructor) binding;
if (constructor.isExplicit()) {
modifiers |= (1 << EXPLICIT_CONSTRUCTOR_OFFSET);
}
}
return modifiers;
}

View file

@ -14,9 +14,12 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -26,18 +29,13 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer
*
*/
class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType {
class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType, IIndexType {
public static final int TYPE_ID = PDOMNode.RECORD_SIZE + 0; // short
public static final int FLAGS = PDOMNode.RECORD_SIZE + 2; // short
public static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
public static final int IS_LONG = 0x1;
public static final int IS_SHORT = 0x2;
public static final int IS_UNSIGNED = 0x4;
public static final int IS_SIGNED = 0x8;
public PDOMCPPBasicType(PDOM pdom, int record) {
super(pdom, record);
}
@ -74,7 +72,7 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType {
return PDOMCPPLinkage.CPPBASICTYPE;
}
public int getType() throws DOMException {
public int getType() {
try {
return pdom.getDB().getChar(record + TYPE_ID);
} catch (CoreException e) {
@ -129,9 +127,28 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType {
}
}
public boolean isSameType(IType type) {
// TODO something fancier
return equals(type);
public boolean isSameType(IType rhs) {
if( rhs instanceof ITypedef )
return rhs.isSameType( this );
if( !(rhs instanceof ICPPBasicType))
return false;
ICPPBasicType rhs1= (ICPPBasicType) rhs;
int type;
try {
type = this.getType();
if (type == -1 || type != rhs1.getType())
return false;
if( type == IBasicType.t_int ){
//signed int and int are equivalent
return (this.getQualifierBits() & ~ICPPBasicType.IS_SIGNED ) == (rhs1.getQualifierBits() & ~ICPPBasicType.IS_SIGNED );
}
return (this.getQualifierBits() == rhs1.getQualifierBits() );
} catch (DOMException e) {
return false;
}
}
public Object clone() {
@ -141,5 +158,13 @@ class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType {
return null;
}
}
public int getQualifierBits() {
try {
return getFlags();
} catch (CoreException e) {
CCorePlugin.log(e);
return 0;
}
}
}

View file

@ -7,13 +7,11 @@
*
* Contributors:
* Symbian - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
@ -33,23 +31,22 @@ abstract public class PDOMCPPBinding extends PDOMBinding implements ICPPBinding
public PDOMCPPBinding(PDOM pdom, PDOMNode parent, char[] name) throws CoreException {
super(pdom, parent, name);
}
// TODO: performance?
final public String[] getQualifiedName() throws DOMException {
List result = new ArrayList();
protected boolean hasQualifiedName(char[][] qname, int idx) {
try {
PDOMNode node = this;
while (node != null) {
if (node instanceof PDOMBinding) {
result.add(0, ((PDOMBinding)node).getName());
if (getDBName().equals(qname[idx])) {
PDOMNode parent= getParentNode();
if (--idx < 0) {
return parent == null;
}
if (parent instanceof PDOMCPPBinding) {
return ((PDOMCPPBinding) parent).hasQualifiedName(qname, idx);
}
node = node.getParentNode();
}
return (String[]) result.toArray(new String[result.size()]);
} catch(CoreException ce) {
CCorePlugin.log(ce);
return null;
} catch (CoreException e) {
CCorePlugin.log(e);
}
return false;
}
// TODO: performance?

View file

@ -23,34 +23,28 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
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.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexProxyBinding;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException;
/**
@ -61,7 +55,7 @@ import org.eclipse.core.runtime.CoreException;
* aftodo - contract get Methods/Fields not honoured?
*/
class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
ICPPClassScope, IPDOMMemberOwner {
ICPPClassScope, IPDOMMemberOwner, IIndexType {
private static final int FIRSTBASE = PDOMCPPBinding.RECORD_SIZE + 0;
private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 4; // byte
@ -70,7 +64,7 @@ ICPPClassScope, IPDOMMemberOwner {
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12;
public PDOMCPPClassType(PDOM pdom, PDOMNode parent, ICPPClassType classType)
throws CoreException {
throws CoreException {
super(pdom, parent, classType.getName().toCharArray());
try {
@ -115,23 +109,29 @@ ICPPClassScope, IPDOMMemberOwner {
}
public boolean isSameType(IType type) {
if (type instanceof PDOMBinding) {
return record == ((PDOMBinding)type).getRecord();
} else if (type instanceof ICPPClassType) {
try {
IIndexProxyBinding pdomType = pdom.adaptBinding((ICPPClassType)type);
if (pdomType == null)
return false;
else if (pdomType instanceof PDOMBinding)
return record == ((PDOMBinding)pdomType).getRecord();
else
throw new PDOMNotImplementedError();
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
if (type instanceof PDOMNode) {
PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM()) {
return node.getRecord() == getRecord();
}
} else
return false;
}
if (type instanceof ITypedef) {
return type.isSameType(this);
}
if (type instanceof ICPPClassType && !(type instanceof ProblemBinding)) {
ICPPClassType ctype= (ICPPClassType) type;
try {
if (ctype.getKey() == getKey()) {
char[][] qname= ctype.getQualifiedNameCharArray();
return hasQualifiedName(qname, qname.length-1);
}
} catch (DOMException e) {
CCorePlugin.log(e);
}
}
return false;
}
public ICPPBase[] getBases() throws DOMException {
@ -154,17 +154,24 @@ ICPPClassScope, IPDOMMemberOwner {
list.accept(visitor);
}
private static class GetMethods implements IPDOMVisitor {
private static class MethodCollector implements IPDOMVisitor {
private final List methods;
public GetMethods(List methods) {
this.methods = methods;
private final boolean acceptImplicit;
private final boolean acceptAll;
public MethodCollector(List methods, boolean acceptImplicit) {
this(methods, acceptImplicit, true);
}
public GetMethods() {
this.methods = new ArrayList();
public MethodCollector(List methods, boolean acceptImplicit, boolean acceptExplicit) {
this.methods = methods == null ? new ArrayList() : methods;
this.acceptImplicit= acceptImplicit;
this.acceptAll= acceptImplicit && acceptExplicit;
}
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof ICPPMethod)
methods.add(node);
if (node instanceof ICPPMethod) {
if (acceptAll || ((ICPPMethod) node).isImplicit() == acceptImplicit) {
methods.add(node);
}
}
return false; // don't visit the method
}
public void leave(IPDOMNode node) throws CoreException {
@ -176,7 +183,27 @@ ICPPClassScope, IPDOMMemberOwner {
public ICPPMethod[] getDeclaredMethods() throws DOMException {
try {
GetMethods methods = new GetMethods();
MethodCollector methods = new MethodCollector(null, false);
accept(methods);
return methods.getMethods();
} catch (CoreException e) {
return new ICPPMethod[0];
}
}
public ICPPMethod[] getMethods() throws DOMException {
try {
MethodCollector methods = new MethodCollector(null, true);
accept(methods);
return methods.getMethods();
} catch (CoreException e) {
return new ICPPMethod[0];
}
}
public ICPPMethod[] getImplicitMethods() {
try {
MethodCollector methods = new MethodCollector(null, true, false);
accept(methods);
return methods.getMethods();
} catch (CoreException e) {
@ -190,7 +217,7 @@ ICPPClassScope, IPDOMMemberOwner {
visited.add(this);
// Get my members
GetMethods myMethods = new GetMethods(methods);
MethodCollector myMethods = new MethodCollector(methods, false, true);
accept(myMethods);
// Visit my base classes
@ -216,13 +243,8 @@ ICPPClassScope, IPDOMMemberOwner {
return new ICPPMethod[0];
}
}
public ICPPMethod[] getMethods() throws DOMException {
// TODO Should really include implicit methods too
return getDeclaredMethods();
}
private static class GetFields implements IPDOMVisitor {
private static class FieldCollector implements IPDOMVisitor {
private List fields = new ArrayList();
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof IField)
@ -238,7 +260,7 @@ ICPPClassScope, IPDOMMemberOwner {
public IField[] getFields() throws DOMException {
try {
GetFields visitor = new GetFields();
FieldCollector visitor = new FieldCollector();
accept(visitor);
return visitor.getFields();
} catch (CoreException e) {
@ -247,9 +269,7 @@ ICPPClassScope, IPDOMMemberOwner {
}
}
private static class GetNestedClasses implements IPDOMVisitor {
private static class NestedClassCollector implements IPDOMVisitor {
private List nestedClasses = new ArrayList();
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof ICPPClassType)
@ -265,7 +285,7 @@ ICPPClassScope, IPDOMMemberOwner {
public ICPPClassType[] getNestedClasses() throws DOMException {
try {
GetNestedClasses visitor = new GetNestedClasses();
NestedClassCollector visitor = new NestedClassCollector();
accept(visitor);
return visitor.getNestedClasses();
} catch (CoreException e) {
@ -303,114 +323,75 @@ ICPPClassScope, IPDOMMemberOwner {
addMember(member);
}
public ICPPConstructor[] getConstructors() throws DOMException {
// TODO
return new ICPPConstructor[0];
private static class ConstructorCollector implements IPDOMVisitor {
private List fConstructors = new ArrayList();
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof ICPPConstructor)
fConstructors.add(node);
return false;
}
public void leave(IPDOMNode node) throws CoreException {
}
public ICPPConstructor[] getConstructors() {
return (ICPPConstructor[])fConstructors.toArray(new ICPPConstructor[fConstructors.size()]);
}
}
public boolean isFullyCached() throws DOMException {return true;}
public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
IASTNode parent = name.getParent();
public ICPPConstructor[] getConstructors() throws DOMException {
ConstructorCollector visitor= new ConstructorCollector();
try {
if (name instanceof ICPPASTQualifiedName) {
IASTName lastName = ((ICPPASTQualifiedName)name).getLastName();
return lastName != null ? lastName.resolveBinding() : null;
}
if (parent instanceof ICPPASTQualifiedName) {
IASTName[] names = ((ICPPASTQualifiedName)parent).getNames();
int index = ArrayUtil.indexOf(names, name);
if (index == names.length - 1) { // tip of qn
parent = parent.getParent();
} else {
{ // bail out if this is not the outerscope of the name being resolved
if(index==-1) {
throw new PDOMNotImplementedError();
} else {
if(index>0) {
// make sure we're the class they're talking about
PDOMBinding binding = (PDOMBinding) pdom.findBinding(names[index-1]);
if(!equals(binding)) {
return null;
}
} else {
// ok - just search us and return null if there is nothing in here
}
}
}
// aftodo - do we even need specify the type - we should
// expect only one name here anyway?
return searchCurrentScope(name.toCharArray(), new int[] {
PDOMCPPLinkage.CPPCLASSTYPE,
PDOMCPPLinkage.CPPMETHOD,
PDOMCPPLinkage.CPPFIELD,
PDOMCPPLinkage.CPPENUMERATION,
PDOMCPPLinkage.CPPENUMERATOR
});
}
}
IASTNode eParent = parent.getParent();
if (parent instanceof IASTIdExpression) {
return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPENUMERATOR);
} else if(eParent instanceof IASTFunctionCallExpression) {
if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) {
return searchCurrentScopeForFunction((IASTFunctionCallExpression)eParent, name);
} else if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.PARAMETERS)) {
if(parent instanceof IASTFieldReference) {
return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPFIELD);
}
}
} else if(name.getPropertyInParent().equals(IASTFieldReference.FIELD_NAME)) {
return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPFIELD);
} else if (parent instanceof IASTNamedTypeSpecifier) {
return searchCurrentScope(name.toCharArray(), new int[] {
PDOMCPPLinkage.CPPCLASSTYPE,
PDOMCPPLinkage.CPPENUMERATION,
PDOMCPPLinkage.CPPTYPEDEF
});
}
} catch(CoreException e) {
accept(visitor);
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
return visitor.getConstructors();
}
private PDOMBinding searchCurrentScopeForFunction(IASTFunctionCallExpression fce, IASTName name) throws CoreException {
try {
IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression());
if(types!=null) {
return CPPFindBinding.findBinding(this, getPDOM(), name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION, types);
public boolean isFullyCached() {
return true;
}
private static class BindingCollector implements IPDOMVisitor {
private List fBindings = new ArrayList();
private char[] fName;
public BindingCollector(char[] name) {
fName= name;
}
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof PDOMNamedNode && node instanceof IBinding) {
PDOMNamedNode nn= (PDOMNamedNode) node;
if (nn.getDBName().equals(fName)) {
fBindings.add(node);
}
}
} catch(DOMException de) {
CCorePlugin.log(de);
return false;
}
public void leave(IPDOMNode node) throws CoreException {
}
public IBinding[] getBindings() {
return (IBinding[])fBindings.toArray(new IBinding[fBindings.size()]);
}
}
public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
try {
BindingCollector visitor= new BindingCollector(name.toCharArray());
accept(visitor);
return CPPSemantics.resolveAmbiguities(name, visitor.getBindings());
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
private IBinding searchCurrentScope(char[] name, int[] constants) throws CoreException {
IBinding result = null;
for(int i=0; result==null && i<constants.length; i++)
result = searchCurrentScope(name, constants[i]);
return result;
}
private IBinding searchCurrentScope(char[] name, int constant) throws CoreException {
return FindBinding.findBinding(this, getPDOM(), name, new int [] {constant});
}
// Not implemented
public Object clone() {fail();return null;}
public IField findField(String name) throws DOMException {fail();return null;}
public IBinding[] getFriends() throws DOMException {fail();return null;}
public ICPPMethod[] getImplicitMethods() {fail(); return null;}
public IBinding[] find(String name) throws DOMException {fail();return null;}
public ICPPField[] getDeclaredFields() throws DOMException {fail();return null;}

View file

@ -0,0 +1,37 @@
/*******************************************************************************
* 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:
* 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.cpp.ICPPConstructor;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException;
public class PDOMCPPConstructor extends PDOMCPPMethod implements ICPPConstructor {
public PDOMCPPConstructor(PDOM pdom, PDOMNode parent, ICPPConstructor method) throws CoreException {
super(pdom, parent, method);
}
public PDOMCPPConstructor(PDOM pdom, int record) {
super(pdom, record);
}
public boolean isExplicit() throws DOMException {
return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.EXPLICIT_CONSTRUCTOR_OFFSET);
}
public int getNodeType() {
return PDOMCPPLinkage.CPP_CONSTRUCTOR;
}
}

View file

@ -7,6 +7,7 @@
*
* Contributors:
* QNX - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -17,8 +18,9 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.internal.core.index.IIndexProxyBinding;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -28,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*/
class PDOMCPPEnumeration extends PDOMCPPBinding implements IEnumeration, ICPPBinding {
class PDOMCPPEnumeration extends PDOMCPPBinding implements IEnumeration, IIndexType, ICPPBinding {
private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0;
@ -89,23 +91,34 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IEnumeration, ICPPBin
}
public boolean isSameType(IType type) {
if (type instanceof PDOMBinding)
return record == ((PDOMBinding)type).getRecord();
else if (type instanceof IEnumeration) {
try {
IIndexProxyBinding pdomType = pdom.adaptBinding((IEnumeration)type);
if (pdomType == null)
return false;
else if (pdomType instanceof PDOMBinding)
return record == ((PDOMBinding)pdomType).getRecord();
else
throw new PDOMNotImplementedError();
} catch (CoreException e) {
CCorePlugin.log(e);
return false;
if (type instanceof PDOMNode) {
PDOMNode node= (PDOMNode) type;
if (node.getPDOM() == getPDOM()) {
return node.getRecord() == getRecord();
}
} else
return false;
}
if (type instanceof ITypedef) {
return type.isSameType(this);
}
try {
if (type instanceof IEnumeration) {
if (type instanceof ICPPBinding) {
ICPPBinding etype= (ICPPBinding) type;
char[][] qname = etype.getQualifiedNameCharArray();
return hasQualifiedName(qname, qname.length-1);
}
else if (type instanceof PDOMCPPEnumeration) {
PDOMCPPEnumeration etype= (PDOMCPPEnumeration) type;
char[][] qname= etype.getQualifiedNameCharArray();
return hasQualifiedName(qname, qname.length-1);
}
}
} catch (DOMException e) {
CCorePlugin.log(e);
}
return false;
}
public Object clone() {

View file

@ -8,6 +8,7 @@
* Contributors:
* QNX - Initial API and implementation
* IBM Corporation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -21,9 +22,11 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
@ -36,7 +39,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer
*
*/
class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFunctionType {
class PDOMCPPFunction extends PDOMCPPBinding implements IIndexType, ICPPFunction, ICPPFunctionType {
/**
* Offset of total number of function parameters (relative to the
@ -49,22 +52,28 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
* the beginning of the record).
*/
private static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4;
/**
* Offset of hash of parameter information to allow fast comparison
*/
private static final int SIGNATURE_MEMENTO = PDOMBinding.RECORD_SIZE + 8;
/**
* Offset for return type of this function (relative to
* the beginning of the record).
*/
private static final int RETURN_TYPE = PDOMBinding.RECORD_SIZE + 12;
/**
* Offset of annotation information (relative to the beginning of the
* record).
*/
protected static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 12; // byte
protected static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 16; // byte
/**
* The size in bytes of a PDOMCPPFunction record in the database.
*/
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 13;
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 17;
public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function) throws CoreException {
super(pdom, parent, function.getNameCharArray());
@ -72,6 +81,14 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
Database db = pdom.getDB();
IBinding binding = function;
try {
IType rt= function.getType().getReturnType();
if (rt != null) {
PDOMNode typeNode = getLinkageImpl().addType(this, rt);
if (typeNode != null) {
db.putInt(record + RETURN_TYPE, typeNode.getRecord());
}
}
IParameter[] params = function.getParameters();
db.putInt(record + NUM_PARAMS, params.length);
@ -189,8 +206,15 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
}
public IType getReturnType() throws DOMException {
try {
PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + RETURN_TYPE));
if (node instanceof IType) {
return (IType) node;
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
// TODO throw new PDOMNotImplementedError();
}
public boolean isConst() {
@ -205,13 +229,48 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
return false;
}
public boolean isSameType(IType type) {
if (type instanceof PDOMCPPFunction) {
return record == ((PDOMCPPFunction)type).getRecord();
} else {
// TODO check the other type for matching name, params
return false;
public boolean isSameType(IType type) {
if (type instanceof ITypedef) {
return type.isSameType(this);
}
try {
if (type instanceof ICPPFunctionType) {
ICPPFunctionType ft = (ICPPFunctionType) type;
IType rt1= getReturnType();
IType rt2= ft.getReturnType();
if (rt1 != rt2) {
if (rt1 == null || !rt1.isSameType(rt2)) {
return false;
}
}
IType[] params1= getParameterTypes();
IType[] params2= ft.getParameterTypes();
if( params1.length == 1 && params2.length == 0 ){
if( !(params1[0] instanceof IBasicType) || ((IBasicType)params1[0]).getType() != IBasicType.t_void )
return false;
} else if( params2.length == 1 && params1.length == 0 ){
if( !(params2[0] instanceof IBasicType) || ((IBasicType)params2[0]).getType() != IBasicType.t_void )
return false;
} else if( params1.length != params2.length ){
return false;
} else {
for( int i = 0; i < params1.length; i++ ){
if (params1[i] == null || ! params1[i].isSameType( params2[i] ) )
return false;
}
}
if( isConst() != ft.isConst() || isVolatile() != ft.isVolatile() )
return false;
return true;
}
return false;
} catch (DOMException e) {
}
return false;
}
public Object clone() {
@ -223,10 +282,9 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
if(types[0] instanceof IBasicType) {
if(((IBasicType)types[0]).getType()==IBasicType.t_void) {
types = new IType[0];
}
}
}
}
StringBuffer result = new StringBuffer();
result.append('(');
for(int i=0; i<types.length; i++) {

View file

@ -18,18 +18,13 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
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.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
@ -37,38 +32,34 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
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.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.Util;
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.CPPImplicitMethod;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException;
/**
@ -109,6 +100,9 @@ public class PDOMCPPLinkage extends PDOMLinkage {
public static final int CPPENUMERATION = PDOMLinkage.LAST_NODE_TYPE + 10;
public static final int CPPENUMERATOR = PDOMLinkage.LAST_NODE_TYPE + 11;
public static final int CPPTYPEDEF = PDOMLinkage.LAST_NODE_TYPE + 12;
public static final int CPP_POINTER_TO_MEMBER_TYPE= PDOMLinkage.LAST_NODE_TYPE + 13;
public static final int CPP_CONSTRUCTOR= PDOMLinkage.LAST_NODE_TYPE + 14;
public static final int CPP_REFERENCE_TYPE= PDOMLinkage.LAST_NODE_TYPE + 15;
public ILanguage getLanguage() {
return new GPPLanguage();
@ -140,74 +134,96 @@ public class PDOMCPPLinkage extends PDOMLinkage {
PDOMNode parent = getAdaptedParent(binding);
if (parent == null)
return null;
if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding);
else if (binding instanceof ICPPVariable && !(binding.getScope() instanceof CPPBlockScope)) {
if (!(binding.getScope() instanceof CPPBlockScope)) {
ICPPVariable var= (ICPPVariable) binding;
if (!var.isStatic()) { // bug 161216
pdomBinding = new PDOMCPPVariable(pdom, parent, var);
}
}
} else if (parent instanceof PDOMCPPClassType && binding instanceof ICPPMethod) {
pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding);
} else if (binding instanceof CPPImplicitMethod && parent instanceof PDOMCPPClassType) {
if(!name.isReference()) {
//because we got the implicit method off of an IASTName that is not a reference,
//it is no longer completly implicit and it should be treated as a normal method.
pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding);
}
} else if (binding instanceof ICPPFunction) {
ICPPFunction func= (ICPPFunction) binding;
if (!func.isStatic()) { // bug 161216
pdomBinding = new PDOMCPPFunction(pdom, parent, func);
}
} else if (binding instanceof ICPPClassType) {
pdomBinding = new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding);
} else if (binding instanceof ICPPNamespaceAlias) {
pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, (ICPPNamespaceAlias) binding);
} else if (binding instanceof ICPPNamespace) {
pdomBinding = new PDOMCPPNamespace(pdom, parent, (ICPPNamespace) binding);
} else if (binding instanceof IEnumeration) {
pdomBinding = new PDOMCPPEnumeration(pdom, parent, (IEnumeration) binding);
} else if (binding instanceof IEnumerator) {
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
if (pdomEnumeration instanceof PDOMCPPEnumeration)
pdomBinding = new PDOMCPPEnumerator(pdom, parent, (IEnumerator) binding,
(PDOMCPPEnumeration)pdomEnumeration);
} else if (binding instanceof ITypedef) {
pdomBinding = new PDOMCPPTypedef(pdom, parent, name, (ITypedef)binding);
}
if(pdomBinding!=null) {
parent.addChild(pdomBinding);
}
pdomBinding = addBinding(parent, binding);
}
} catch(DOMException e) {
throw new CoreException(Util.createStatus(e));
}
// final processing
if (pdomBinding != null) {
// Check if is a base specifier
if (pdomBinding instanceof ICPPClassType && name.getParent() instanceof ICPPASTBaseSpecifier) {
ICPPASTBaseSpecifier baseNode = (ICPPASTBaseSpecifier)name.getParent();
ICPPASTCompositeTypeSpecifier ownerNode = (ICPPASTCompositeTypeSpecifier)baseNode.getParent();
IBinding ownerBinding = adaptBinding(ownerNode.getName().resolveBinding());
if (ownerBinding != null && ownerBinding instanceof PDOMCPPClassType) {
PDOMCPPClassType ownerClass = (PDOMCPPClassType)ownerBinding;
PDOMCPPBase pdomBase = new PDOMCPPBase(pdom, (PDOMCPPClassType)pdomBinding,
baseNode.isVirtual(), baseNode.getVisibility());
ownerClass.addBase(pdomBase);
}
if (pdomBinding instanceof PDOMCPPClassType) {
PDOMCPPClassType pdomClassType= (PDOMCPPClassType) pdomBinding;
IASTNode baseNode= name.getParent();
if (baseNode instanceof ICPPASTBaseSpecifier)
addBaseClasses(pdomClassType, (ICPPASTBaseSpecifier) baseNode);
if (binding instanceof ICPPClassType && name.isDefinition()) {
addImplicitMethods(pdomClassType, (ICPPClassType) binding);
}
}
return pdomBinding;
}
private void addBaseClasses(PDOMCPPClassType pdomBinding, ICPPASTBaseSpecifier baseNode) throws CoreException {
ICPPASTCompositeTypeSpecifier ownerNode = (ICPPASTCompositeTypeSpecifier)baseNode.getParent();
IBinding ownerBinding = adaptBinding(ownerNode.getName().resolveBinding());
if (ownerBinding != null && ownerBinding instanceof PDOMCPPClassType) {
PDOMCPPClassType ownerClass = (PDOMCPPClassType)ownerBinding;
PDOMCPPBase pdomBase = new PDOMCPPBase(pdom, pdomBinding,
baseNode.isVirtual(), baseNode.getVisibility());
ownerClass.addBase(pdomBase);
}
}
private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
PDOMBinding pdomBinding= null;
if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding);
else if (binding instanceof ICPPVariable && !(binding.getScope() instanceof CPPBlockScope)) {
if (!(binding.getScope() instanceof CPPBlockScope)) {
ICPPVariable var= (ICPPVariable) binding;
if (!var.isStatic()) { // bug 161216
pdomBinding = new PDOMCPPVariable(pdom, parent, var);
}
}
} else if (binding instanceof ICPPConstructor && parent instanceof PDOMCPPClassType) {
pdomBinding = new PDOMCPPConstructor(pdom, parent, (ICPPConstructor)binding);
} else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) {
pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding);
} else if (binding instanceof ICPPFunction) {
ICPPFunction func= (ICPPFunction) binding;
if (!func.isStatic()) { // bug 161216
pdomBinding = new PDOMCPPFunction(pdom, parent, func);
}
} else if (binding instanceof ICPPClassType) {
pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding);
} else if (binding instanceof ICPPNamespaceAlias) {
pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, (ICPPNamespaceAlias) binding);
} else if (binding instanceof ICPPNamespace) {
pdomBinding = new PDOMCPPNamespace(pdom, parent, (ICPPNamespace) binding);
} else if (binding instanceof IEnumeration) {
pdomBinding = new PDOMCPPEnumeration(pdom, parent, (IEnumeration) binding);
} else if (binding instanceof IEnumerator) {
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
if (pdomEnumeration instanceof PDOMCPPEnumeration)
pdomBinding = new PDOMCPPEnumerator(pdom, parent, (IEnumerator) binding,
(PDOMCPPEnumeration)pdomEnumeration);
} else if (binding instanceof ITypedef) {
pdomBinding = new PDOMCPPTypedef(pdom, parent, (ITypedef)binding);
}
if(pdomBinding!=null) {
parent.addChild(pdomBinding);
}
return pdomBinding;
}
private void addImplicitMethods(PDOMCPPClassType type, ICPPClassType binding) throws CoreException {
try {
IScope scope = binding.getCompositeScope();
if (scope instanceof ICPPClassScope) {
ICPPMethod[] implicit= ((ICPPClassScope) scope).getImplicitMethods();
for (int i = 0; i < implicit.length; i++) {
ICPPMethod method = implicit[i];
addBinding(type, method);
}
}
} catch (DOMException e) {
CCorePlugin.log(e);
}
}
public int getBindingType(IBinding binding) {
if (binding instanceof ICPPTemplateDefinition)
// this must be before class type
@ -217,6 +233,9 @@ public class PDOMCPPLinkage extends PDOMLinkage {
return CPPFIELD;
else if (binding instanceof ICPPVariable)
return CPPVARIABLE;
else if (binding instanceof ICPPConstructor)
// before methods
return CPP_CONSTRUCTOR;
else if (binding instanceof ICPPMethod)
// this must be before functions
return CPPMETHOD;
@ -268,134 +287,13 @@ public class PDOMCPPLinkage extends PDOMLinkage {
}
public PDOMBinding resolveBinding(IASTName name) throws CoreException {
try {
return _resolveBinding(name);
} catch(DOMException e) {
throw new CoreException(Util.createStatus(e));
IBinding binding= name.resolveBinding();
if (binding != null) {
return adaptBinding(binding);
}
}
private PDOMBinding _resolveBinding(IASTName name) throws CoreException, DOMException {
IBinding origBinding = name.getBinding();
if (origBinding != null)
return adaptBinding(origBinding);
if (name instanceof ICPPASTQualifiedName) {
IASTName[] names = ((ICPPASTQualifiedName)name).getNames();
if (names.length == 1)
return resolveBinding(names[0]);
IASTName lastName = names[names.length - 1];
PDOMBinding nsBinding = adaptBinding(names[names.length - 2].resolveBinding());
// aftodo - namespace aliases?
if (nsBinding instanceof IScope) {
return (PDOMBinding) ((IScope)nsBinding).getBinding(lastName, true);
}
}
IASTNode parent = name.getParent();
if (parent instanceof ICPPASTQualifiedName) {
ICPPASTQualifiedName qualName = (ICPPASTQualifiedName)parent;
IASTName lastName = qualName.getLastName();
if (name != lastName) {
return resolveInQualifiedName(name);
} else {
// Drop down to the rest of the resolution procedure
// with the parent of the qualified name
parent = parent.getParent();
}
}
if (parent instanceof IASTIdExpression) {
// reference
IASTNode eParent = parent.getParent();
if (eParent instanceof IASTFunctionCallExpression) {
if (parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) {
return resolveFunctionCall(
(IASTFunctionCallExpression) eParent,
(IASTIdExpression) parent, name);
} else if (parent.getPropertyInParent().equals(IASTFunctionCallExpression.PARAMETERS)) {
int desiredType = (name.getParent() instanceof ICPPASTQualifiedName
&& ((ICPPASTQualifiedName) name.getParent()).getLastName() != name)
? CPPNAMESPACE : CPPVARIABLE;
return searchCurrentScope(name.toCharArray(), desiredType);
}
} else {
// if the address of me is taken, and assigned to something,
// find out the type of the thing I'm assigned to
if (eParent instanceof IASTUnaryExpression) {
IASTUnaryExpression unaryExp = (IASTUnaryExpression) eParent;
if (unaryExp.getOperator() == IASTUnaryExpression.op_amper) {
IASTNode epParent = eParent.getParent();
if (epParent instanceof IASTBinaryExpression) {
if (((IASTBinaryExpression) epParent).getOperator() == IASTBinaryExpression.op_assign) {
IASTExpression left = ((IASTBinaryExpression) epParent).getOperand1();
IType type = CPPSemantics.getUltimateType(left.getExpressionType(), false);
if (type instanceof IFunctionType) {
return CPPFindBinding.findBinding(getIndex(),
getPDOM(),
name.toCharArray(),
CPPFUNCTION,
((IFunctionType) type).getParameterTypes()
);
}
}
}
}
}
return searchCurrentScope(name.toCharArray(), new int[]{
CPPVARIABLE,
CPPENUMERATOR
});
}
} else if (parent instanceof IASTNamedTypeSpecifier) {
return searchCurrentScope(name.toCharArray(), new int[] {
CPPCLASSTYPE,
CPPENUMERATION,
CPPTYPEDEF
});
} else if (parent instanceof ICPPASTNamespaceAlias) {
return searchCurrentScope(name.toCharArray(), CPPNAMESPACE);
} else if(parent instanceof ICPPASTFieldReference) {
ICPPASTFieldReference ref = (ICPPASTFieldReference) parent;
IASTExpression exp = ref.getFieldOwner();
if(exp instanceof IASTIdExpression) {
IASTIdExpression fieldOwner = (IASTIdExpression) exp;
IASTNode eParent = parent.getParent();
if (eParent instanceof IASTFunctionCallExpression &&
parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) {
if(name.getPropertyInParent().equals(IASTFieldReference.FIELD_NAME)) {
return resolveFunctionCall((IASTFunctionCallExpression) eParent, fieldOwner, name);
}
} else {
IBinding fieldOwnerBinding = fieldOwner.getName().getBinding();
if(fieldOwnerBinding instanceof ICPPVariable) {
IType type = ((ICPPVariable)fieldOwnerBinding).getType();
if(type instanceof ICompositeType) {
PDOMBinding pdomFOB = adaptBinding( (ICompositeType) type);
return FindBinding.findBinding(pdomFOB, getPDOM(), name.toCharArray(), new int [] {PDOMCPPLinkage.CPPFIELD});
}
}
}
}
} else if(parent instanceof ICPPASTBaseSpecifier) {
return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE);
}
return null;
}
private PDOMBinding searchCurrentScope(char[] name, int[] constants) throws CoreException {
PDOMBinding result = null;
for(int i=0; result==null && i<constants.length; i++)
result = searchCurrentScope(name, constants[i]);
return result;
}
private PDOMBinding searchCurrentScope(char[] name, int constant) throws CoreException {
return FindBinding.findBinding(getIndex(), getPDOM(), name, new int [] {constant});
}
/**
* Read type information from the AST or null if the types could not be determined
* @param paramExp the parameter expression to get types for (null indicates void function/method)
@ -498,43 +396,6 @@ public class PDOMCPPLinkage extends PDOMLinkage {
return null;
}
private PDOMBinding resolveInQualifiedName(IASTName name) throws CoreException {
ICPPASTQualifiedName qualName = (ICPPASTQualifiedName)name.getParent();
// Must be a namespace or a class
IASTName[] names = qualName.getNames();
int index = ArrayUtil.indexOf(names, name);
if(index!=-1) {
if (index == 0) {
// we are at the root
return FindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), new int[]{
CPPNAMESPACE, CPPCLASSTYPE, CPPNAMESPACEALIAS
});
} else {
try {
PDOMBinding binding = adaptBinding(names[index-1].getBinding());
if(binding instanceof PDOMCPPClassType) {
// TODO - a test case for this..
return (PDOMBinding) ((PDOMCPPClassType)binding).getBinding(name, true);
} else if(binding instanceof PDOMCPPNamespaceAlias) {
PDOMCPPNamespace pns = (PDOMCPPNamespace) ((PDOMCPPNamespaceAlias) binding).getBinding();
return (PDOMBinding) ((ICPPNamespaceScope) pns).getBinding(name, true);
} else if(binding instanceof PDOMCPPNamespace) {
return (PDOMBinding) ((ICPPNamespaceScope)binding).getBinding(name, true);
} else {
throw new PDOMNotImplementedError(); // aftodo - again I think we can't get here
}
} catch(DOMException de) {
throw new CoreException(CCorePlugin.createStatus(de.getMessage())); // aftodo
}
}
} else {
// aftodo - I don't believe this can happen..
// didn't find our name here, weird...
return null;
}
}
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
if (type instanceof ICPPBasicType) {
return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType)type);
@ -550,7 +411,10 @@ public class PDOMCPPLinkage extends PDOMLinkage {
if (binding != null) {
return binding;
}
} else if (type instanceof ICPPPointerToMemberType) {
return new PDOMCPPPointerToMemberType(pdom, parent, (ICPPPointerToMemberType)type);
}
return super.addType(parent, type);
}
@ -567,6 +431,8 @@ public class PDOMCPPLinkage extends PDOMLinkage {
return new PDOMCPPClassType(pdom, record);
case CPPFIELD:
return new PDOMCPPField(pdom, record);
case CPP_CONSTRUCTOR:
return new PDOMCPPConstructor(pdom, record);
case CPPMETHOD:
return new PDOMCPPMethod(pdom, record);
case CPPNAMESPACE:
@ -581,6 +447,11 @@ public class PDOMCPPLinkage extends PDOMLinkage {
return new PDOMCPPEnumerator(pdom, record);
case CPPTYPEDEF:
return new PDOMCPPTypedef(pdom, record);
case CPP_POINTER_TO_MEMBER_TYPE:
return new PDOMCPPPointerToMemberType(pdom, record);
case CPP_REFERENCE_TYPE:
return new PDOMCPPReferenceType(pdom, record);
default:
return super.getNode(record);
}

View file

@ -9,6 +9,7 @@
* QNX - Initial API and implementation
* IBM Corporation
* Andrew Ferguson (Symbian)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -22,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -33,13 +35,13 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer
*
*/
class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod, ICPPFunctionType {
public class PDOMCPPMethod extends PDOMCPPFunction implements IIndexType, ICPPMethod, ICPPFunctionType {
/**
* Offset of remaining annotation information (relative to the beginning of
* the record).
*/
private static final int ANNOTATION1 = PDOMCPPFunction.RECORD_SIZE; // byte
protected static final int ANNOTATION1 = PDOMCPPFunction.RECORD_SIZE; // byte
/**
* The size in bytes of a PDOMCPPMethod record in the database.
@ -49,7 +51,7 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod, ICPPFunctionT
/**
* The bit offset of CV qualifier flags within ANNOTATION1.
*/
private static final int CV_OFFSET = 2;
private static final int CV_OFFSET = PDOMCPPAnnotation.MAX_EXTRA_OFFSET + 1;
public PDOMCPPMethod(PDOM pdom, PDOMNode parent, ICPPMethod method) throws CoreException {
super(pdom, parent, method);
@ -91,6 +93,10 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod, ICPPFunctionT
throw new PDOMNotImplementedError();
}
public boolean isImplicit() {
return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.IMPLICIT_METHOD_OFFSET);
}
public IScope getFunctionScope() throws DOMException {
throw new PDOMNotImplementedError();
}
@ -144,12 +150,7 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod, ICPPFunctionT
return getBit(getByte(record + ANNOTATION1), PDOMCAnnotation.VOLATILE_OFFSET + CV_OFFSET);
}
public boolean isSameType(IType type) {
if (type == this)
return true;
if (type instanceof PDOMCPPMethod)
return getRecord() == ((PDOMCPPMethod) type).getRecordSize();
// TODO further analysis to compare with DOM objects
return false;
public boolean isSameType(IType type) {
return super.isSameType(type);
}
}

View file

@ -16,33 +16,26 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
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.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.BTree;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingsInBTree;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*
*/
class PDOMCPPNamespace extends PDOMCPPBinding
implements ICPPNamespace, ICPPNamespaceScope {
public class PDOMCPPNamespace extends PDOMCPPBinding implements ICPPNamespace, ICPPNamespaceScope {
private static final int INDEX_OFFSET = PDOMBinding.RECORD_SIZE + 0;
@ -99,117 +92,30 @@ implements ICPPNamespace, ICPPNamespaceScope {
return new IASTNode[0];
}
// mstodo this method currently does not get called, we could try to remove it.
// an alternative an appropriate method in CPPSemantics. This implementation is not
// correct for sure.
public IBinding[] find(String name) throws DOMException {
public IBinding[] find(String name) {
try {
FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray());
getIndex().accept(visitor);
return visitor.getBinding();
} catch (CoreException e) {
CCorePlugin.log(e);
return new IBinding[0];
}
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
}
public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
IASTNode parent = name.getParent();
try {
if (name instanceof ICPPASTQualifiedName) {
IASTName lastName = ((ICPPASTQualifiedName)name).getLastName();
return lastName != null ? lastName.resolveBinding() : null;
}
FindBindingsInBTree visitor= new FindBindingsInBTree(getLinkageImpl(), name.toCharArray());
getIndex().accept(visitor);
if (parent instanceof ICPPASTQualifiedName) {
IASTName[] names = ((ICPPASTQualifiedName)parent).getNames();
int index = ArrayUtil.indexOf(names, name);
if (index == names.length - 1) { // tip of qn
parent = parent.getParent();
} else {
{ // bail out if this is not the outerscope of the name being resolved
if(index==-1) {
throw new PDOMNotImplementedError();
} else {
if(index>0) {
// make sure we're the namespace they're talking about
PDOMBinding binding = (PDOMBinding) pdom.findBinding(names[index-1]); // index == 0 ?
if(binding instanceof PDOMCPPNamespaceAlias) {
// aftodo - this needs a review - do we want to assign to binding
// or just check against this?
binding = (PDOMBinding) ((PDOMCPPNamespaceAlias) binding).getBinding();
}
if(!equals(binding)) {
return null;
}
} else {
// ok - just search us and return null if there is nothing in here
}
}
}
// aftodo - do we even need specify the type - we should
// expect only one name here anyway?
return searchCurrentScope(name.toCharArray(), new int[] {
PDOMCPPLinkage.CPPCLASSTYPE,
PDOMCPPLinkage.CPPNAMESPACE,
PDOMCPPLinkage.CPPFUNCTION,
PDOMCPPLinkage.CPPVARIABLE,
PDOMCPPLinkage.CPPENUMERATION,
PDOMCPPLinkage.CPPENUMERATOR
});
}
}
IASTNode eParent = parent.getParent();
if (parent instanceof IASTIdExpression) {
if (eParent instanceof IASTFunctionCallExpression) {
if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) {
return searchCurrentScopeForFunction((IASTFunctionCallExpression)eParent, name);
}
} else {
int desiredType = ((name.getParent() instanceof ICPPASTQualifiedName)
&& ((ICPPASTQualifiedName)name.getParent()).getLastName() != name)
? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE;
IBinding result = searchCurrentScope(name.toCharArray(), new int[] {desiredType});
if(result!=null)
return result;
return searchCurrentScope(name.toCharArray(), new int[] {PDOMCPPLinkage.CPPTYPEDEF});
}
} else if (parent instanceof IASTNamedTypeSpecifier) {
return searchCurrentScope(name.toCharArray(), new int[] {
PDOMCPPLinkage.CPPCLASSTYPE,
PDOMCPPLinkage.CPPENUMERATION,
PDOMCPPLinkage.CPPTYPEDEF
});
}
IBinding[] bindings= visitor.getBinding();
return CPPSemantics.resolveAmbiguities(name, bindings);
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
private PDOMBinding searchCurrentScopeForFunction(IASTFunctionCallExpression fce, IASTName name) throws CoreException {
try {
IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression());
if(types!=null) {
return CPPFindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION, types);
}
} catch(DOMException de) {
CCorePlugin.log(de);
}
return null;
}
private PDOMBinding searchCurrentScope(char[] name, int[] constants) throws CoreException {
return FindBinding.findBinding(getIndex(), getPDOM(), name, constants);
}
public boolean isFullyCached() throws DOMException {
return true;
}

View file

@ -15,11 +15,11 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
@ -33,7 +33,7 @@ import org.eclipse.core.runtime.CoreException;
*
* @author Doug Schaefer
*/
class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter {
/**
* Offset of pointer to the next parameter (relative to the
@ -46,11 +46,20 @@ class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
* (relative to the beginning of the record).
*/
private static final int TYPE = PDOMNamedNode.RECORD_SIZE + 4;
/**
* Offset of flags
* (relative to the beginning of the record).
*/
private static final int FLAGS = PDOMNamedNode.RECORD_SIZE + 8;
/**
* The size in bytes of a PDOMCPPParameter record in the database.
*/
protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 8;
protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 9;
private static final byte FLAG_DEFAULT_VALUE = 0x1;
public PDOMCPPParameter(PDOM pdom, int record) {
super(pdom, record);
@ -63,6 +72,8 @@ class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
Database db = pdom.getDB();
db.putInt(record + NEXT_PARAM, 0);
byte flags= encodeFlags(param);
db.putByte(record + FLAGS, flags);
try {
IType type = param.getType();
@ -77,6 +88,15 @@ class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
}
}
private byte encodeFlags(IParameter param) {
byte flags= 0;
if (param instanceof ICPPParameter &&
((ICPPParameter) param).hasDefaultValue()) {
flags |= FLAG_DEFAULT_VALUE;
}
return flags;
}
protected int getRecordSize() {
return RECORD_SIZE;
}
@ -95,11 +115,6 @@ class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
return rec != 0 ? new PDOMCPPParameter(pdom, rec) : null;
}
public IASTInitializer getDefaultValue() {
return null;
// TODO throw new PDOMNotImplementedError();
}
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
@ -165,4 +180,18 @@ class PDOMCPPParameter extends PDOMNamedNode implements IParameter {
return new char[0];
}
}
public boolean hasDefaultValue() {
return hasFlag(FLAG_DEFAULT_VALUE, false);
}
private boolean hasFlag(byte flag, boolean defValue) {
try {
byte myflags= pdom.getDB().getByte(record + FLAGS);
return (myflags & flag) == flag;
} catch (CoreException e) {
CCorePlugin.log(e);
}
return defValue;
}
}

View file

@ -0,0 +1,69 @@
/*******************************************************************************
* 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMPointerType;
import org.eclipse.core.runtime.CoreException;
public class PDOMCPPPointerToMemberType extends PDOMPointerType
implements ICPPPointerToMemberType, IIndexType {
private static final int TYPE = PDOMPointerType.RECORD_SIZE;
private static final int RECORD_SIZE= TYPE+4;
public PDOMCPPPointerToMemberType(PDOM pdom, int record) {
super(pdom, record);
}
public PDOMCPPPointerToMemberType(PDOM pdom, PDOMNode parent, ICPPPointerToMemberType type) throws CoreException {
super(pdom, parent, type);
Database db = pdom.getDB();
// type
ICPPClassType ct = type.getMemberOfClass();
int typeRec = 0;
if (ct != null) {
PDOMNode targetTypeNode = getLinkageImpl().addType(this, ct);
if (targetTypeNode != null)
typeRec = targetTypeNode.getRecord();
}
db.putInt(record + TYPE, typeRec);
}
protected int getRecordSize() {
return RECORD_SIZE;
}
public int getNodeType() {
return PDOMCPPLinkage.CPP_POINTER_TO_MEMBER_TYPE;
}
public ICPPClassType getMemberOfClass() {
try {
int rec;
rec = pdom.getDB().getInt(record + TYPE);
if (rec != 0) {
return new PDOMCPPClassType(pdom, rec);
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
}

View file

@ -0,0 +1,108 @@
/*******************************************************************************
* 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException;
public class PDOMCPPReferenceType extends PDOMNode implements ICPPReferenceType,
ITypeContainer, IIndexType {
private static final int TYPE = PDOMNode.RECORD_SIZE + 0;
protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
public PDOMCPPReferenceType(PDOM pdom, int record) {
super(pdom, record);
}
public PDOMCPPReferenceType(PDOM pdom, PDOMNode parent, ICPPReferenceType type) throws CoreException {
super(pdom, parent);
Database db = pdom.getDB();
try {
// type
IType targetType = type.getType();
int typeRec = 0;
if (type != null) {
PDOMNode targetTypeNode = getLinkageImpl().addType(this, targetType);
if (targetTypeNode != null)
typeRec = targetTypeNode.getRecord();
}
db.putInt(record + TYPE, typeRec);
} catch (DOMException e) {
throw new CoreException(Util.createStatus(e));
}
}
protected int getRecordSize() {
return RECORD_SIZE;
}
public int getNodeType() {
return PDOMCPPLinkage.CPP_REFERENCE_TYPE;
}
public IType getType() {
try {
PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
return node instanceof IType ? (IType)node : null;
} catch (CoreException e) {
CCorePlugin.log(e);
return null;
}
}
public boolean isSameType(IType type) {
if( type instanceof ITypedef )
return type.isSameType(this);
if( !( type instanceof ICPPReferenceType ))
return false;
ICPPReferenceType rhs = (ICPPReferenceType) type;
try {
IType type1= getType();
if (type1 != null) {
return type1.isSameType(rhs.getType());
}
} catch (DOMException e) {
}
return false;
}
public void setType(IType type) {
throw new PDOMNotImplementedError();
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
CCorePlugin.log(e);
return null;
}
}
}

View file

@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -26,15 +26,15 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*/
class PDOMCPPTypedef extends PDOMCPPBinding implements ITypedef, ITypeContainer {
class PDOMCPPTypedef extends PDOMCPPBinding implements ITypedef, ITypeContainer, IIndexType {
private static final int TYPE = PDOMBinding.RECORD_SIZE + 0;
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4;
public PDOMCPPTypedef(PDOM pdom, PDOMNode parent, IASTName name, ITypedef typedef)
public PDOMCPPTypedef(PDOM pdom, PDOMNode parent, ITypedef typedef)
throws CoreException {
super(pdom, parent, name.toCharArray());
super(pdom, parent, typedef.getNameCharArray());
try {
IType type = typedef.getType();
PDOMNode typeNode = parent.getLinkageImpl().addType(this, type);
@ -57,7 +57,7 @@ class PDOMCPPTypedef extends PDOMCPPBinding implements ITypedef, ITypeContainer
return PDOMCPPLinkage.CPPTYPEDEF;
}
public IType getType() throws DOMException {
public IType getType() {
try {
PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
return node instanceof IType ? (IType)node : null;
@ -67,28 +67,19 @@ class PDOMCPPTypedef extends PDOMCPPBinding implements ITypedef, ITypeContainer
}
}
public boolean isSameType(IType o) {
if( o == this )
return true;
if( o instanceof ITypedef )
try {
IType t = getType();
if( t != null )
return t.isSameType( ((ITypedef)o).getType());
return false;
} catch ( DOMException e ) {
return false;
}
try {
IType t = getType();
if( t != null )
return t.isSameType( o );
} catch(DOMException de) {
CCorePlugin.log(de);
}
return false;
public boolean isSameType(IType type) {
try {
IType myrtype = getType();
if (myrtype == null)
return false;
if (type instanceof ITypedef) {
type= ((ITypedef)type).getType();
}
return myrtype.isSameType(type);
} catch (DOMException e) {
}
return false;
}
public Object clone() { fail(); return null; }

View file

@ -374,7 +374,7 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask {
IIndexFileLocation path = orderedPaths[i];
if (path != null) {
if (fTrace) {
System.out.println("Indexer: adding " + path); //$NON-NLS-1$
System.out.println("Indexer: adding " + path.getURI()); //$NON-NLS-1$
}
IIndexFile file= addToIndex(index, path, symbolMap);
if (postAddToIndex(path, file)) {

View file

@ -440,7 +440,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
checkTreeNode(tree, 0, 2, "ns::func()");
}
public void _testNamespacePart2_156519() throws Exception {
public void testNamespacePart2_156519() throws Exception {
String content = readTaggedComment("testNamespace");
IFile file= createFile(getProject(), "testNamespace.cpp", content);
waitForIndexer(fIndex, file, MAX_TIME_INDEXER);

View file

@ -30,11 +30,9 @@ import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.core.CCoreInternals;
public class ResolveBindingTests extends BaseUITestCase {
private static final int WAIT_FOR_INDEXER = 5000;
private static final int WAIT_FOR_INDEXER = 8000;
private ICProject fCProject;
private IIndex fIndex;
@ -48,8 +46,7 @@ public class ResolveBindingTests extends BaseUITestCase {
protected void setUp() throws Exception {
super.setUp();
fCProject= CProjectHelper.createCProject("ResolveBindingTests", "bin", IPDOMManager.ID_NO_INDEXER);
CCoreInternals.getPDOMManager().reindex(fCProject);
fCProject= CProjectHelper.createCCProject("ResolveBindingTests", "bin", IPDOMManager.ID_FAST_INDEXER);
fIndex= CCorePlugin.getIndexManager().getIndex(fCProject);
}
@ -151,7 +148,7 @@ public class ResolveBindingTests extends BaseUITestCase {
// m.method(); // r2
// n->method(); // r3
// }
public void _testMethodBinding_158735() throws Exception {
public void testMethodBinding_158735() throws Exception {
String content = readTaggedComment("testMethods.h");
IFile hfile= createFile(fCProject.getProject(), "testMethods.h", content);
content = readTaggedComment("testMethods.cpp");

View file

@ -441,11 +441,13 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
*/
private static String getBindingQualifiedName(IIndexBinding binding) throws CoreException
{
StringBuffer buf = new StringBuffer(binding.getName());
binding= binding.getParentBinding();
while (binding != null) {
buf.insert(0, binding.getName() + "::"); //$NON-NLS-1$
binding= binding.getParentBinding();
StringBuffer buf = new StringBuffer();
String[] qname= binding.getQualifiedName();
for (int i = 0; i < qname.length; i++) {
if (i>0) {
buf.append("::"); //$NON-NLS-1$
}
buf.append(qname[i]);
}
return buf.toString();
}