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

Fix for 107821, StackOverflowError during indexing.

This commit is contained in:
Markus Schorn 2007-06-19 07:19:51 +00:00
parent c1eac4b95e
commit f0b4d7ac80

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IQualifierType; 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.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.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;
@ -40,7 +41,6 @@ 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;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope;
import org.eclipse.cdt.internal.core.index.IIndexBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.IIndexScope;
import org.eclipse.cdt.internal.core.index.composite.CompositeScope; import org.eclipse.cdt.internal.core.index.composite.CompositeScope;
@ -193,96 +193,101 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
* @throws CoreException * @throws CoreException
*/ */
protected PDOMNode getAdaptedParent(IBinding binding, boolean createFileLocalScope, boolean addParent) throws CoreException { protected PDOMNode getAdaptedParent(IBinding binding, boolean createFileLocalScope, boolean addParent) throws CoreException {
IBinding scopeBinding = null;
if (binding instanceof ICPPTemplateInstance) {
scopeBinding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
} else {
try { try {
IScope scope = binding.getScope(); IBinding scopeBinding = null;
if (scope == null) { if (binding instanceof ICPPTemplateInstance) {
if (binding instanceof ICPPDeferredTemplateInstance) { scopeBinding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
ICPPDeferredTemplateInstance deferred = (ICPPDeferredTemplateInstance) binding;
ICPPTemplateDefinition template = deferred.getTemplateDefinition();
scope = template.getScope();
} }
else {
IScope scope = binding.getScope();
if (scope == null) {
if (binding instanceof ICPPDeferredTemplateInstance) {
ICPPDeferredTemplateInstance deferred = (ICPPDeferredTemplateInstance) binding;
ICPPTemplateDefinition template = deferred.getTemplateDefinition();
scope = template.getScope();
}
IIndexBinding ib = (binding instanceof IIndexBinding) ? (IIndexBinding) binding : null; IIndexBinding ib = (binding instanceof IIndexBinding) ? (IIndexBinding) binding : null;
if (ib == null && binding instanceof ICPPSpecialization) { if (ib == null && binding instanceof ICPPSpecialization) {
IBinding spec = ((ICPPSpecialization)binding).getSpecializedBinding(); IBinding spec = ((ICPPSpecialization)binding).getSpecializedBinding();
if (spec instanceof IIndexBinding) { if (spec instanceof IIndexBinding) {
ib = (IIndexBinding) spec; ib = (IIndexBinding) spec;
} }
} }
if (ib != null) {
// don't adapt file local bindings from other fragments to this one.
if (ib.isFileLocal()) {
return null;
}
// in an index the null scope represents global scope.
return this;
}
if (ib != null) {
// don't adapt file local bindings from other fragments to this one.
if (ib.isFileLocal()) {
return null; return null;
} }
// in an index the null scope represents global scope.
return this;
}
return null; if(scope instanceof IIndexScope) {
} if(scope instanceof CompositeScope) { // we special case for performance
return adaptBinding(((CompositeScope)scope).getRawScopeBinding());
} else {
return adaptBinding(((IIndexScope) scope).getScopeBinding());
}
}
if(scope instanceof IIndexScope) { // the scope is from the ast
if(scope instanceof CompositeScope) { // we special case for performance if (scope instanceof ICPPTemplateScope && !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPTemplateInstance)) {
return adaptBinding(((CompositeScope)scope).getRawScopeBinding()); scope = scope.getParent();
} else { if (scope == null) {
return adaptBinding(((IIndexScope) scope).getScopeBinding()); return null;
} }
} }
// the scope is from the ast if (scope instanceof ICPPNamespaceScope) {
if (scope instanceof ICPPTemplateScope && !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPTemplateInstance)) { IName name= scope.getScopeName();
scope = scope.getParent(); if (name != null && name.toCharArray().length == 0) {
} // skip unnamed namespaces
return null;
}
}
if (scope instanceof ICPPNamespaceScope) { IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope);
IName name= scope.getScopeName(); if (scopeNode instanceof IASTCompoundStatement) {
if (name != null && name.toCharArray().length == 0) { return null;
// skip unnamed namespaces }
return null; else if (scopeNode instanceof IASTTranslationUnit) {
} if (isFileLocalBinding(binding)) {
} IASTTranslationUnit tu= (IASTTranslationUnit) scopeNode;
return findFileLocalScope(tu.getFilePath(), createFileLocalScope);
IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope); }
if (scopeNode instanceof IASTCompoundStatement) return this;
return null; }
else if (scopeNode instanceof IASTTranslationUnit) { else {
if (isFileLocalBinding(binding)) { if (scope instanceof ICPPClassScope) {
IASTTranslationUnit tu= (IASTTranslationUnit) scopeNode; scopeBinding = ((ICPPClassScope)scope).getClassType();
return findFileLocalScope(tu.getFilePath(), createFileLocalScope); }
} else {
return this; IName scopeName = scope.getScopeName();
} if (scopeName instanceof IASTName) {
else { scopeBinding = ((IASTName) scopeName).resolveBinding();
if (scope instanceof CPPClassSpecializationScope) { }
scopeBinding = ((CPPClassSpecializationScope)scope).getClassType(); }
} else {
IName scopeName = scope.getScopeName();
if (scopeName instanceof IASTName) {
scopeBinding = ((IASTName) scopeName).resolveBinding();
} }
} }
} if (scopeBinding != null && scopeBinding != binding) {
} catch (DOMException e) { PDOMBinding scopePDOMBinding = null;
throw new CoreException(Util.createStatus(e)); if (addParent) {
} scopePDOMBinding = addBinding(scopeBinding);
} } else {
scopePDOMBinding = adaptBinding(scopeBinding);
if (scopeBinding != null) { }
PDOMBinding scopePDOMBinding = null; if (scopePDOMBinding != null)
if (addParent) { return scopePDOMBinding;
scopePDOMBinding = addBinding(scopeBinding);
} else {
scopePDOMBinding = adaptBinding(scopeBinding);
} }
if (scopePDOMBinding != null) }
return scopePDOMBinding; catch (DOMException e) {
throw new CoreException(Util.createStatus(e));
} }
return null; return null;
} }