/*
* Copyright (c) 2013, 2014 QNX 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
*/
package org.eclipse.cdt.internal.qt.core.pdom;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.core.runtime.CoreException;
@SuppressWarnings("restriction")
public class QtPDOMQEnum extends QtPDOMBinding {
private static int offsetInitializer = QtPDOMBinding.Field.Last.offset;
protected static enum Field {
Flags(1),
CppRecord(Database.PTR_SIZE),
Last(0);
public final int offset;
private Field(int sizeof) {
this.offset = offsetInitializer;
offsetInitializer += sizeof;
}
public long getRecord(long baseRec) {
return baseRec + offset;
}
}
private static final int IS_FLAG_MASK = 1;
protected QtPDOMQEnum(QtPDOMLinkage linkage, long record) throws CoreException {
super(linkage, record);
}
public QtPDOMQEnum(QtPDOMLinkage linkage, PDOMBinding parent, IASTName qtName, IASTName cppName) throws CoreException {
super(linkage, parent, qtName);
getDB().putRecPtr(Field.CppRecord.getRecord(record), linkage.getCPPRecord(cppName));
// The flags are set in several sections, and then written to the Database in one operation.
byte flags = 0;
if (qtName instanceof QtEnumName
&& ((QtEnumName) qtName).isFlag())
flags |= IS_FLAG_MASK;
// Write the flags to the database.
getDB().putByte(Field.Flags.getRecord(record), flags);
if(parent instanceof AbstractQtPDOMClass)
((AbstractQtPDOMClass) parent).addChild(this);
}
@Override
public int getRecordSize() {
return Field.Last.offset;
}
public IEnumeration getCppEnumeration() throws CoreException {
long cppRec = getDB().getRecPtr(Field.CppRecord.getRecord(record));
if (cppRec == 0)
return null;
PDOMLinkage cppLinkage = getPDOM().getLinkage(ILinkage.CPP_LINKAGE_ID);
if (cppLinkage == null)
return null;
PDOMBinding cppBinding = cppLinkage.getBinding(cppRec);
// TODO
if (cppBinding == null)
return null;
cppBinding.getAdapter(IEnumeration.class);
return cppBinding instanceof IEnumeration ? (IEnumeration) cppBinding : null;
}
public boolean isFlag() throws CoreException {
byte flags = getDB().getByte(Field.Flags.getRecord(record));
return (flags & IS_FLAG_MASK) == IS_FLAG_MASK;
}
@Override
public int getNodeType() {
return QtPDOMNodeType.QEnum.Type;
}
public List<IEnumerator> getEnumerators() throws CoreException {
IEnumeration cppEnum = getCppEnumeration();
return cppEnum == null ? Collections.<IEnumerator>emptyList() : Arrays.asList(cppEnum.getEnumerators());
}
}