/******************************************************************************* * Copyright (c) 2007, 2009 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 * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.index; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.internal.core.index.composite.CompositeIndexBinding; import org.eclipse.core.runtime.CoreException; public class DeclaredBindingsFilter extends IndexFilter { final private int fLinkageID; final private boolean fAcceptImplicit; final private boolean fAllowInstances; public DeclaredBindingsFilter() { this(-1, false, true); } public DeclaredBindingsFilter(int linkageID, boolean acceptImplicit, boolean allowInstances) { fLinkageID= linkageID; fAcceptImplicit= acceptImplicit; fAllowInstances= allowInstances; } @Override public boolean acceptLinkage(ILinkage linkage) { return fLinkageID == -1 || fLinkageID == linkage.getLinkageID(); } @Override public boolean acceptBinding(IBinding binding) throws CoreException { if (!fAllowInstances && binding instanceof ICPPTemplateInstance) return false; if (binding instanceof IIndexFragmentBinding) { return ((IIndexFragmentBinding) binding).hasDeclaration() || (fAcceptImplicit && isImplicit(binding)); } // composite bindings don't support that kind of check. if (binding instanceof CompositeIndexBinding) { IIndexBinding raw= ((CompositeIndexBinding) binding).getRawBinding(); if (raw instanceof IIndexFragmentBinding) { if (((IIndexFragmentBinding) raw).hasDeclaration()) { return true; } } } return fAcceptImplicit || !isImplicit(binding); } private boolean isImplicit(IBinding binding) { if (binding instanceof ICPPSpecialization) return true; if (binding instanceof ICPPMethod) { return ((ICPPMethod) binding).isImplicit(); } return false; } }