/*******************************************************************************
* Copyright (c) 2007, 2010 Symbian Software Systems 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:
* Andrew Ferguson (Symbian) - Initial implementation
* Markus Schorn (Wind River Systems)
* Bryan Wilkinson (QNX)
*******************************************************************************/
package org.eclipse.cdt.internal.core.index.composite;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.IIndexScope;
import org.eclipse.core.runtime.CoreException;
/**
* Represents a binding which is split over several index fragments.
* <p>
* Like the component IIndexBinding objects that make up a CompositeIndexBinding, the
* it is only valid to call methods and obtain information while a read-lock is held on the
* associated IIndex
*/
public abstract class CompositeIndexBinding implements IIndexBinding {
/**
* The factory used for obtaining further composite bindings
*/
protected final ICompositesFactory cf;
/**
* The representative binding for this composite binding. Most cases are simple
* enough that this becomes a delegate, some need to use it as a search key over fragments,
* and some ignore it as a representative binding from each fragment is needed to meet interface
* contracts.
*/
protected final IIndexFragmentBinding rbinding;
public CompositeIndexBinding(ICompositesFactory cf, IIndexFragmentBinding rbinding) {
if (rbinding == null || cf == null)
throw new IllegalArgumentException();
this.cf = cf;
this.rbinding = rbinding;
}
public ILinkage getLinkage() {
return rbinding.getLinkage();
}
public String getName() {
return rbinding.getName();
}
public char[] getNameCharArray() {
return rbinding.getNameCharArray();
}
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
if (adapter.isInstance(rbinding)) {
return rbinding;
}
return null;
}
public String[] getQualifiedName() {
return new String[] { getName() };
}
public IIndexScope getScope() {
return cf.getCompositeScope(rbinding.getScope());
}
public boolean hasDefinition() throws CoreException {
fail(); return false;
}
protected final void fail() {
throw new CompositingNotImplementedError("Compositing feature not implemented"); //$NON-NLS-1$
}
@Override
public String toString() {
return rbinding.toString();
}
public boolean isFileLocal() throws CoreException {
return rbinding != null && rbinding.isFileLocal();
}
public IIndexFile getLocalToFile() throws CoreException {
return rbinding != null ? rbinding.getLocalToFile() : null;
}
@Override
public boolean equals(Object other) {
if (other == this)
return true;
if (!(other instanceof CompositeIndexBinding))
return false;
CompositeIndexBinding otherComposite = (CompositeIndexBinding) other;
return rbinding.equals(otherComposite.rbinding) && cf.equals(otherComposite.cf);
}
@Override
public int hashCode() {
return rbinding.hashCode();
}
public IIndexBinding getOwner() {
final IIndexFragmentBinding owner= rbinding.getOwner();
if (owner == null)
return null;
return cf.getCompositeBinding(owner);
}
public IIndexBinding getRawBinding() {
return rbinding;
}
}