/******************************************************************************* * Copyright (c) 2008, 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 *******************************************************************************/ 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.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexMacroContainer; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.index.IIndexBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.core.runtime.CoreException; /** * A container collecting definitions and references for macros. * @since 5.0 */ public class PDOMMacroContainer extends PDOMNamedNode implements IIndexMacroContainer, IPDOMBinding { private static final int FIRST_DEF_OFFSET = PDOMNamedNode.RECORD_SIZE + 0; // size 4 private static final int FIRST_REF_OFFSET = PDOMNamedNode.RECORD_SIZE + 4; // size 4 @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 8; public PDOMMacroContainer(PDOMLinkage linkage, char[] name) throws CoreException { super(linkage, linkage, name); } PDOMMacroContainer(PDOMLinkage linkage, long record) { super(linkage, record); } @Override public int getNodeType() { return IIndexBindingConstants.MACRO_CONTAINER; } @Override protected int getRecordSize() { return RECORD_SIZE; } public boolean isOrphaned() throws CoreException { Database db = getDB(); return db.getRecPtr(record + FIRST_DEF_OFFSET) == 0 && db.getRecPtr(record + FIRST_REF_OFFSET) == 0; } public void addDefinition(PDOMMacro name) throws CoreException { PDOMMacro first = getFirstDefinition(); if (first != null) { first.setPrevInContainer(name); name.setNextInContainer(first); } setFirstDefinition(name); } public void addReference(PDOMMacroReferenceName name) throws CoreException { PDOMMacroReferenceName first = getFirstReference(); if (first != null) { first.setPrevInContainer(name); name.setNextInContainer(first); } setFirstReference(name); } public PDOMMacro getFirstDefinition() throws CoreException { long namerec = getDB().getRecPtr(record + FIRST_DEF_OFFSET); return namerec != 0 ? new PDOMMacro(getLinkage(), namerec) : null; } void setFirstDefinition(PDOMMacro macro) throws CoreException { long namerec = macro != null ? macro.getRecord() : 0; getDB().putRecPtr(record + FIRST_DEF_OFFSET, namerec); } public PDOMMacroReferenceName getFirstReference() throws CoreException { long namerec = getDB().getRecPtr(record + FIRST_REF_OFFSET); return namerec != 0 ? new PDOMMacroReferenceName(getLinkage(), namerec) : null; } void setFirstReference(PDOMMacroReferenceName nextName) throws CoreException { long namerec = nextName != null ? nextName.getRecord() : 0; getDB().putRecPtr(record + FIRST_REF_OFFSET, namerec); } public IIndexMacro[] getDefinitions() throws CoreException { PDOMMacro macro; List<PDOMMacro> macros= new ArrayList<PDOMMacro>(); for (macro= getFirstDefinition(); macro != null; macro= macro.getNextInContainer()) { macros.add(macro); } return macros.toArray(new IIndexMacro[macros.size()]); } @Override public void delete(PDOMLinkage linkage) throws CoreException { if (linkage != null) { linkage.removeMacroContainer(this); } super.delete(linkage); } public int getBindingConstant() { return IIndexBindingConstants.MACRO_CONTAINER; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.index.IIndexFragmentBinding#getFragment() */ public IIndexFragment getFragment() { return getPDOM(); } public IIndexScope getScope() { return null; } public boolean hasDeclaration() throws CoreException { return false; } public boolean hasDefinition() throws CoreException { return getDB().getRecPtr(record + FIRST_DEF_OFFSET) != 0; } public IIndexFile getLocalToFile() throws CoreException { return null; } public String[] getQualifiedName() { return new String[]{getName()}; } public boolean isFileLocal() throws CoreException { return false; } @Override public char[] getNameCharArray() { try { return super.getNameCharArray(); } catch (CoreException e) { CCorePlugin.log(e); } return CharArrayUtils.EMPTY; } public String getName() { return new String(getNameCharArray()); } @SuppressWarnings({ "unchecked", "rawtypes" }) public Object getAdapter(Class adapter) { if (adapter.isAssignableFrom(PDOMMacroContainer.class)) { return this; } return null; } }