mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix for bug 203385.
This commit is contained in:
parent
ceb1b0efad
commit
b44d607a4f
8 changed files with 210 additions and 67 deletions
|
@ -157,7 +157,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
|
|
||||||
// b::A aa;
|
// b::A aa;
|
||||||
// b::B bb;
|
// b::B bb;
|
||||||
public void _testUsingTypeDirective_177917_2() {
|
public void testUsingTypeDirective_177917_2() {
|
||||||
IBinding b0= getBindingFromASTName("A aa", 1);
|
IBinding b0= getBindingFromASTName("A aa", 1);
|
||||||
IBinding b1= getBindingFromASTName("B bb", 1);
|
IBinding b1= getBindingFromASTName("B bb", 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,5 +55,5 @@ public interface IIndexCPPBindingConstants {
|
||||||
int CPP_TEMPLATE_TYPE_PARAMETER= IIndexBindingConstants.LAST_CONSTANT + 38;
|
int CPP_TEMPLATE_TYPE_PARAMETER= IIndexBindingConstants.LAST_CONSTANT + 38;
|
||||||
int CPP_FUNCTION_TYPE= IIndexBindingConstants.LAST_CONSTANT + 39;
|
int CPP_FUNCTION_TYPE= IIndexBindingConstants.LAST_CONSTANT + 39;
|
||||||
int GPPBASICTYPE = IIndexBindingConstants.LAST_CONSTANT + 40;
|
int GPPBASICTYPE = IIndexBindingConstants.LAST_CONSTANT + 40;
|
||||||
|
int CPP_USING_DECLARATION= IIndexBindingConstants.LAST_CONSTANT + 41;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,30 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IQualifierType;
|
||||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
import org.eclipse.cdt.core.dom.ast.cpp.*;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
|
||||||
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.ICPPDeferredTemplateInstance;
|
|
||||||
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.ICPPFunctionTemplate;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
|
|
||||||
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.ICPPParameter;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||||
import org.eclipse.cdt.internal.core.index.CIndex;
|
import org.eclipse.cdt.internal.core.index.CIndex;
|
||||||
|
@ -253,6 +230,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC
|
||||||
} else if(binding instanceof ICPPNamespace) {
|
} else if(binding instanceof ICPPNamespace) {
|
||||||
ICPPNamespace[] ns = getNamespaces(binding);
|
ICPPNamespace[] ns = getNamespaces(binding);
|
||||||
result = ns.length == 0 ? null : new CompositeCPPNamespace(this, ns);
|
result = ns.length == 0 ? null : new CompositeCPPNamespace(this, ns);
|
||||||
|
} else if (binding instanceof ICPPUsingDeclaration) {
|
||||||
|
result = new CompositeCPPUsingDeclaration(this, (ICPPUsingDeclaration) binding);
|
||||||
} else if(binding instanceof IEnumeration) {
|
} else if(binding instanceof IEnumeration) {
|
||||||
IEnumeration def = (IEnumeration) findOneDefinition(binding);
|
IEnumeration def = (IEnumeration) findOneDefinition(binding);
|
||||||
result = def == null ? null : new CompositeCPPEnumeration(this, def);
|
result = def == null ? null : new CompositeCPPEnumeration(this, def);
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Google, 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:
|
||||||
|
* Sergey Prigogin (Google) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.index.composite.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.ICPPDelegate;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
||||||
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDelegateCreator;
|
||||||
|
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||||
|
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
||||||
|
|
||||||
|
class CompositeCPPUsingDeclaration extends CompositeCPPBinding implements ICPPUsingDeclaration {
|
||||||
|
public CompositeCPPUsingDeclaration(ICompositesFactory cf, ICPPUsingDeclaration using) {
|
||||||
|
super(cf, using);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] getMemberBindings() throws DOMException {
|
||||||
|
fail(); return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPDelegate[] getDelegates() throws DOMException {
|
||||||
|
ICPPDelegate[] delegates = ((ICPPUsingDeclaration) rbinding).getDelegates();
|
||||||
|
ICPPDelegate[] composites = new ICPPDelegate[delegates.length];
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; i < delegates.length; i++) {
|
||||||
|
IBinding binding = delegates[i].getBinding();
|
||||||
|
if (binding instanceof IIndexFragmentBinding) {
|
||||||
|
binding = cf.getCompositeBinding((IIndexFragmentBinding) binding);
|
||||||
|
if (binding instanceof ICPPDelegateCreator) {
|
||||||
|
composites[j++] = ((ICPPDelegateCreator) binding).createDelegate(new CPPASTName(getNameCharArray()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ICPPDelegate[]) ArrayUtil.trim(ICPPDelegate.class, composites);
|
||||||
|
}
|
||||||
|
}
|
|
@ -35,12 +35,14 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
||||||
|
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.ICPPNamespaceScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
||||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||||
import org.eclipse.cdt.internal.core.Util;
|
import org.eclipse.cdt.internal.core.Util;
|
||||||
|
@ -129,8 +131,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
public void accept(final IPDOMVisitor visitor) throws CoreException {
|
public void accept(final IPDOMVisitor visitor) throws CoreException {
|
||||||
if (visitor instanceof IBTreeVisitor) {
|
if (visitor instanceof IBTreeVisitor) {
|
||||||
getIndex().accept((IBTreeVisitor) visitor);
|
getIndex().accept((IBTreeVisitor) visitor);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
getIndex().accept(new IBTreeVisitor() {
|
getIndex().accept(new IBTreeVisitor() {
|
||||||
public int compare(int record) throws CoreException {
|
public int compare(int record) throws CoreException {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -257,8 +258,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
IBinding scopeBinding = null;
|
IBinding scopeBinding = null;
|
||||||
if (binding instanceof ICPPTemplateInstance) {
|
if (binding instanceof ICPPTemplateInstance) {
|
||||||
scopeBinding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
|
scopeBinding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
IScope scope = binding.getScope();
|
IScope scope = binding.getScope();
|
||||||
if (scope == null) {
|
if (scope == null) {
|
||||||
if (binding instanceof ICPPDeferredTemplateInstance) {
|
if (binding instanceof ICPPDeferredTemplateInstance) {
|
||||||
|
@ -288,8 +288,8 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(scope instanceof IIndexScope) {
|
if (scope instanceof IIndexScope) {
|
||||||
if(scope instanceof CompositeScope) { // we special case for performance
|
if (scope instanceof CompositeScope) { // we special case for performance
|
||||||
return adaptBinding(((CompositeScope)scope).getRawScopeBinding());
|
return adaptBinding(((CompositeScope)scope).getRawScopeBinding());
|
||||||
} else {
|
} else {
|
||||||
return adaptBinding(((IIndexScope) scope).getScopeBinding());
|
return adaptBinding(((IIndexScope) scope).getScopeBinding());
|
||||||
|
@ -315,15 +315,12 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope);
|
IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope);
|
||||||
if (scopeNode instanceof IASTCompoundStatement) {
|
if (scopeNode instanceof IASTCompoundStatement) {
|
||||||
return null;
|
return null;
|
||||||
}
|
} else if (scopeNode instanceof IASTTranslationUnit) {
|
||||||
else if (scopeNode instanceof IASTTranslationUnit) {
|
|
||||||
return this;
|
return this;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (scope instanceof ICPPClassScope) {
|
if (scope instanceof ICPPClassScope) {
|
||||||
scopeBinding = ((ICPPClassScope)scope).getClassType();
|
scopeBinding = ((ICPPClassScope)scope).getClassType();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
IName scopeName = scope.getScopeName();
|
IName scopeName = scope.getScopeName();
|
||||||
if (scopeName instanceof IASTName) {
|
if (scopeName instanceof IASTName) {
|
||||||
scopeBinding = ((IASTName) scopeName).resolveBinding();
|
scopeBinding = ((IASTName) scopeName).resolveBinding();
|
||||||
|
@ -341,8 +338,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
if (scopePDOMBinding != null)
|
if (scopePDOMBinding != null)
|
||||||
return scopePDOMBinding;
|
return scopePDOMBinding;
|
||||||
}
|
}
|
||||||
}
|
} catch (DOMException e) {
|
||||||
catch (DOMException e) {
|
|
||||||
throw new CoreException(Util.createStatus(e));
|
throw new CoreException(Util.createStatus(e));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -360,10 +356,12 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
if (!(binding instanceof IField)) {
|
if (!(binding instanceof IField)) {
|
||||||
isFileLocal= ASTInternal.isStatic((IVariable) binding);
|
isFileLocal= ASTInternal.isStatic((IVariable) binding);
|
||||||
}
|
}
|
||||||
}
|
} else if (binding instanceof IFunction) {
|
||||||
else if (binding instanceof IFunction) {
|
|
||||||
IFunction f= (IFunction) binding;
|
IFunction f= (IFunction) binding;
|
||||||
isFileLocal= ASTInternal.isStatic(f, false);
|
isFileLocal= ASTInternal.isStatic(f, false);
|
||||||
|
} else if (binding instanceof ICPPUsingDeclaration ||
|
||||||
|
binding instanceof ICPPNamespaceAlias) {
|
||||||
|
isFileLocal= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFileLocal) {
|
if (isFileLocal) {
|
||||||
|
@ -382,7 +380,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback informing the linkage that a name has been added. This is
|
* Callback informing the linkage that a name has been added. This is
|
||||||
* used to do addtional processing, like establishing inheritance relationships.
|
* used to do additional processing, like establishing inheritance relationships.
|
||||||
* @param pdomName the name that was inserted into the linkage
|
* @param pdomName the name that was inserted into the linkage
|
||||||
* @param name the name that caused the insertion
|
* @param name the name that caused the insertion
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
|
@ -402,7 +400,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback informing the linkage that a name is about to be deleted. This is
|
* Callback informing the linkage that a name is about to be deleted. This is
|
||||||
* used to do addtional processing, like removing inheritance relationships.
|
* used to do additional processing, like removing inheritance relationships.
|
||||||
* @param pdomName the name that was inserted into the linkage
|
* @param pdomName the name that was inserted into the linkage
|
||||||
* @param name the name that caused the insertion
|
* @param name the name that caused the insertion
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
|
@ -453,5 +451,4 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
||||||
public void delete(PDOMLinkage linkage) throws CoreException {
|
public void delete(PDOMLinkage linkage) throws CoreException {
|
||||||
assert false; // no need to delete linkages.
|
assert false; // no need to delete linkages.
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,11 +93,11 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants {
|
||||||
} else if (binding instanceof IFunction) {
|
} else if (binding instanceof IFunction) {
|
||||||
IFunction func= (IFunction) binding;
|
IFunction func= (IFunction) binding;
|
||||||
pdomBinding = new PDOMCFunction(pdom, parent, func);
|
pdomBinding = new PDOMCFunction(pdom, parent, func);
|
||||||
} else if (binding instanceof ICompositeType)
|
} else if (binding instanceof ICompositeType) {
|
||||||
pdomBinding = new PDOMCStructure(pdom, parent, (ICompositeType) binding);
|
pdomBinding = new PDOMCStructure(pdom, parent, (ICompositeType) binding);
|
||||||
else if (binding instanceof IEnumeration)
|
} else if (binding instanceof IEnumeration) {
|
||||||
pdomBinding = new PDOMCEnumeration(pdom, parent, (IEnumeration) binding);
|
pdomBinding = new PDOMCEnumeration(pdom, parent, (IEnumeration) binding);
|
||||||
else if (binding instanceof IEnumerator) {
|
} else if (binding instanceof IEnumerator) {
|
||||||
try {
|
try {
|
||||||
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
|
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
|
||||||
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
|
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
|
||||||
|
@ -106,10 +106,11 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants {
|
||||||
} catch (DOMException e) {
|
} catch (DOMException e) {
|
||||||
throw new CoreException(Util.createStatus(e));
|
throw new CoreException(Util.createStatus(e));
|
||||||
}
|
}
|
||||||
} else if (binding instanceof ITypedef)
|
} else if (binding instanceof ITypedef) {
|
||||||
pdomBinding = new PDOMCTypedef(pdom, parent, (ITypedef)binding);
|
pdomBinding = new PDOMCTypedef(pdom, parent, (ITypedef)binding);
|
||||||
|
}
|
||||||
|
|
||||||
if (pdomBinding!=null) {
|
if (pdomBinding != null) {
|
||||||
pdomBinding.setLocalToFile(getLocalToFile(binding));
|
pdomBinding.setLocalToFile(getLocalToFile(binding));
|
||||||
parent.addChild(pdomBinding);
|
parent.addChild(pdomBinding);
|
||||||
afterAddBinding(pdomBinding);
|
afterAddBinding(pdomBinding);
|
||||||
|
|
|
@ -38,7 +38,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
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.ICPPConstructor;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
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.ICPPFunction;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
||||||
|
@ -390,19 +389,22 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, (ICPPNamespaceAlias) binding);
|
pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, (ICPPNamespaceAlias) binding);
|
||||||
} else if (binding instanceof ICPPNamespace) {
|
} else if (binding instanceof ICPPNamespace) {
|
||||||
pdomBinding = new PDOMCPPNamespace(pdom, parent, (ICPPNamespace) binding);
|
pdomBinding = new PDOMCPPNamespace(pdom, parent, (ICPPNamespace) binding);
|
||||||
|
} else if (binding instanceof ICPPUsingDeclaration) {
|
||||||
|
pdomBinding = new PDOMCPPUsingDeclaration(pdom, parent, (ICPPUsingDeclaration) binding);
|
||||||
} else if (binding instanceof IEnumeration) {
|
} else if (binding instanceof IEnumeration) {
|
||||||
pdomBinding = new PDOMCPPEnumeration(pdom, parent, (IEnumeration) binding);
|
pdomBinding = new PDOMCPPEnumeration(pdom, parent, (IEnumeration) binding);
|
||||||
} else if (binding instanceof IEnumerator) {
|
} else if (binding instanceof IEnumerator) {
|
||||||
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
|
IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
|
||||||
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
|
PDOMBinding pdomEnumeration = adaptBinding(enumeration);
|
||||||
if (pdomEnumeration instanceof PDOMCPPEnumeration)
|
if (pdomEnumeration instanceof PDOMCPPEnumeration) {
|
||||||
pdomBinding = new PDOMCPPEnumerator(pdom, parent, (IEnumerator) binding,
|
pdomBinding = new PDOMCPPEnumerator(pdom, parent, (IEnumerator) binding,
|
||||||
(PDOMCPPEnumeration)pdomEnumeration);
|
(PDOMCPPEnumeration)pdomEnumeration);
|
||||||
|
}
|
||||||
} else if (binding instanceof ITypedef) {
|
} else if (binding instanceof ITypedef) {
|
||||||
pdomBinding = new PDOMCPPTypedef(pdom, parent, (ITypedef)binding);
|
pdomBinding = new PDOMCPPTypedef(pdom, parent, (ITypedef)binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pdomBinding!=null) {
|
if (pdomBinding != null) {
|
||||||
pdomBinding.setLocalToFile(getLocalToFile(binding));
|
pdomBinding.setLocalToFile(getLocalToFile(binding));
|
||||||
parent.addChild(pdomBinding);
|
parent.addChild(pdomBinding);
|
||||||
afterAddBinding(pdomBinding);
|
afterAddBinding(pdomBinding);
|
||||||
|
@ -441,8 +443,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
PDOMBinding pdomBinding= adaptBinding(method);
|
PDOMBinding pdomBinding= adaptBinding(method);
|
||||||
if (pdomBinding == null) {
|
if (pdomBinding == null) {
|
||||||
addBinding(type, method);
|
addBinding(type, method);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (!pdomBinding.hasDefinition()) {
|
if (!pdomBinding.hasDefinition()) {
|
||||||
pdomBinding.update(this, method);
|
pdomBinding.update(this, method);
|
||||||
}
|
}
|
||||||
|
@ -534,6 +535,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
return CPPNAMESPACEALIAS;
|
return CPPNAMESPACEALIAS;
|
||||||
else if (binding instanceof ICPPNamespace)
|
else if (binding instanceof ICPPNamespace)
|
||||||
return CPPNAMESPACE;
|
return CPPNAMESPACE;
|
||||||
|
else if (binding instanceof ICPPUsingDeclaration)
|
||||||
|
return CPP_USING_DECLARATION;
|
||||||
else if (binding instanceof IEnumeration)
|
else if (binding instanceof IEnumeration)
|
||||||
return CPPENUMERATION;
|
return CPPENUMERATION;
|
||||||
else if (binding instanceof IEnumerator)
|
else if (binding instanceof IEnumerator)
|
||||||
|
@ -549,17 +552,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PDOMBinding doAdaptBinding(IBinding binding, int localToFileRec) throws CoreException {
|
public PDOMBinding doAdaptBinding(IBinding binding, int localToFileRec) throws CoreException {
|
||||||
if (binding instanceof ICPPUsingDeclaration) {
|
|
||||||
try {
|
|
||||||
ICPPDelegate[] delegates = ((ICPPUsingDeclaration)binding).getDelegates();
|
|
||||||
if (delegates.length == 0)
|
|
||||||
return null;
|
|
||||||
// TODO - if there are more than one delegate, we have no way of knowing which one...
|
|
||||||
return adaptBinding(delegates[0].getBinding());
|
|
||||||
} catch (DOMException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PDOMNode parent = getAdaptedParent(binding, false);
|
PDOMNode parent = getAdaptedParent(binding, false);
|
||||||
if (parent == this) {
|
if (parent == this) {
|
||||||
return CPPFindBinding.findBinding(getIndex(), this, binding, localToFileRec);
|
return CPPFindBinding.findBinding(getIndex(), this, binding, localToFileRec);
|
||||||
|
@ -656,6 +648,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
return new PDOMCPPNamespace(pdom, record);
|
return new PDOMCPPNamespace(pdom, record);
|
||||||
case CPPNAMESPACEALIAS:
|
case CPPNAMESPACEALIAS:
|
||||||
return new PDOMCPPNamespaceAlias(pdom, record);
|
return new PDOMCPPNamespaceAlias(pdom, record);
|
||||||
|
case CPP_USING_DECLARATION:
|
||||||
|
return new PDOMCPPUsingDeclaration(pdom, record);
|
||||||
case GPPBASICTYPE:
|
case GPPBASICTYPE:
|
||||||
return new PDOMGPPBasicType(pdom, record);
|
return new PDOMGPPBasicType(pdom, record);
|
||||||
case CPPBASICTYPE:
|
case CPPBASICTYPE:
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Google, 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:
|
||||||
|
* Sergey Prigogin (Google) - 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.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
||||||
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDelegateCreator;
|
||||||
|
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||||
|
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.PDOMLinkage;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents "using" declaration in PDOM. A single "using" declaration resolving to multiple
|
||||||
|
* objects, e.g. functions with the same name but different signatures, is represented by multiple
|
||||||
|
* chained PDOMCPPUsingDeclaration records.
|
||||||
|
*
|
||||||
|
* @see ICPPUsingDeclaration
|
||||||
|
*/
|
||||||
|
class PDOMCPPUsingDeclaration extends PDOMCPPBinding implements ICPPUsingDeclaration {
|
||||||
|
private static final int TARGET_BINDING = PDOMCPPBinding.RECORD_SIZE + 0;
|
||||||
|
// Using declarations for functions may have multiple delegates. We model such case
|
||||||
|
// by creating a chain of PDOMCPPUsingDeclaration objects linked by NEXT_DELEGATE field.
|
||||||
|
private static final int NEXT_DELEGATE = PDOMCPPBinding.RECORD_SIZE + 4;
|
||||||
|
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 8;
|
||||||
|
private ICPPDelegate[] delegates;
|
||||||
|
|
||||||
|
public PDOMCPPUsingDeclaration(PDOM pdom, PDOMNode parent, ICPPUsingDeclaration using)
|
||||||
|
throws CoreException {
|
||||||
|
super(pdom, parent, using.getNameCharArray());
|
||||||
|
ICPPDelegate[] delegates;
|
||||||
|
try {
|
||||||
|
delegates = using.getDelegates();
|
||||||
|
} catch (DOMException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int nextRecord = 0;
|
||||||
|
for (int i = delegates.length; --i >= 0;) {
|
||||||
|
PDOMCPPUsingDeclaration simpleUsing = i > 0 ?
|
||||||
|
new PDOMCPPUsingDeclaration(pdom, parent, getNameCharArray()) : this;
|
||||||
|
simpleUsing.setTargetBinding(parent.getLinkageImpl(), delegates[i]);
|
||||||
|
pdom.getDB().putInt(record + NEXT_DELEGATE, nextRecord);
|
||||||
|
nextRecord = simpleUsing.getRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public PDOMCPPUsingDeclaration(PDOM pdom, int record) {
|
||||||
|
super(pdom, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PDOMCPPUsingDeclaration(PDOM pdom, PDOMNode parent, char[] name) throws CoreException {
|
||||||
|
super(pdom, parent, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTargetBinding(PDOMLinkage linkage, ICPPDelegate delegate) throws CoreException {
|
||||||
|
PDOMBinding target = getLinkageImpl().adaptBinding(delegate.getBinding());
|
||||||
|
pdom.getDB().putInt(record + TARGET_BINDING, target != null ? target.getRecord() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getRecordSize() {
|
||||||
|
return RECORD_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNodeType() {
|
||||||
|
return IIndexCPPBindingConstants.CPP_USING_DECLARATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPDelegate[] getDelegates() {
|
||||||
|
if (delegates == null) {
|
||||||
|
delegates = new ICPPDelegate[1];
|
||||||
|
int i = 0;
|
||||||
|
PDOMCPPUsingDeclaration alias = this;
|
||||||
|
try {
|
||||||
|
do {
|
||||||
|
IBinding binding = alias.getBinding();
|
||||||
|
if (binding instanceof ICPPDelegateCreator) {
|
||||||
|
ICPPDelegate delegate = ((ICPPDelegateCreator) binding).createDelegate(new CPPASTName(getNameCharArray()));
|
||||||
|
ArrayUtil.append(ICPPDelegate.class, delegates, i++, delegate);
|
||||||
|
}
|
||||||
|
} while ((alias = alias.getNext()) != null);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
delegates = (ICPPDelegate[]) ArrayUtil.trim(ICPPDelegate.class, delegates);
|
||||||
|
}
|
||||||
|
return delegates;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PDOMCPPUsingDeclaration getNext() throws CoreException {
|
||||||
|
int nextRecord = pdom.getDB().getInt(record + NEXT_DELEGATE);
|
||||||
|
return nextRecord != 0 ? new PDOMCPPUsingDeclaration(pdom, nextRecord) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IBinding getBinding() {
|
||||||
|
try {
|
||||||
|
return (IBinding) getLinkageImpl().getNode(
|
||||||
|
getPDOM().getDB().getInt(record + TARGET_BINDING));
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasDeclaration() throws CoreException {
|
||||||
|
// TODO(sprigogin) I'm not sure if returning unconditional true is legitimate,
|
||||||
|
// but I couldn't figure out a better way to satisfy DeclaredBindingsFilter#acceptBinding.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue