blob: a9572ff6ef84fe26d570891cd998cb8dab5e8e16 [file] [log] [blame]
/*
* Copyright (c) 2013, 2015 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.cdt.internal.qt.core.index;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.internal.qt.core.ASTUtil;
import org.eclipse.cdt.internal.qt.core.QtKeywords;
import org.eclipse.cdt.internal.qt.core.pdom.AbstractQtPDOMClass;
import org.eclipse.cdt.internal.qt.core.pdom.QtPDOMQObject;
import org.eclipse.core.runtime.CoreException;
public class QtIndexImpl extends QtIndex {
private final CDTIndex cdtIndex;
private static final Pattern QmlTypeNameRegex = Pattern.compile(
"^(?:" + QtKeywords.QML_REGISTER_TYPE + '|' + QtKeywords.QML_REGISTER_UNCREATABLE_TYPE + ")<.*>\0(.*)$"); //$NON-NLS-1$ //$NON-NLS-2$
private static final IndexFilter QtLinkageFilter = new IndexFilter() {
@Override
public boolean acceptLinkage(ILinkage linkage) {
return linkage.getLinkageID() == ILinkage.QT_LINKAGE_ID;
}
@Override
public boolean acceptBinding(IBinding binding) throws CoreException {
return true;
}
};
public QtIndexImpl(CDTIndex cdtIndex) {
this.cdtIndex = cdtIndex;
}
@Override
public IQObject findQObject(String[] name) {
return name == null ? null : cdtIndex.get(new QObjectImplAccessor(name));
}
@Override
public IQGadget findQGadget(String[] name) {
return name == null ? null : cdtIndex.get(new QGadgetImplAccessor(name));
}
@Override
public Collection<IQmlRegistration> getQmlRegistrations() {
return cdtIndex.get(new QmlRegistrationAccessor());
}
private class QObjectImplAccessor implements CDTIndex.Accessor<IQObject> {
private final char[] name;
public QObjectImplAccessor(String[] qualName) {
// QObjects are stored in the Qt linkage using their fully qualified name.
name = ASTUtil.getFullyQualifiedName(qualName).toCharArray();
}
@Override
public IQObject access(IIndex index) throws CoreException {
// TODO can there be more than one result?
for (IIndexBinding binding : index.findBindings(name, QtLinkageFilter, null))
if (binding instanceof QtPDOMQObject)
return new QObject(QtIndexImpl.this, cdtIndex, (QtPDOMQObject) binding);
return null;
}
}
private class QGadgetImplAccessor implements CDTIndex.Accessor<IQGadget> {
private final char[][] name;
public QGadgetImplAccessor(String[] qualName) {
name = new char[qualName.length][];
for (int i = 0; i < name.length; ++i)
name[i] = qualName[i].toCharArray();
}
@Override
public IQGadget access(IIndex index) throws CoreException {
// TODO can there be more than one result?
for (IIndexBinding binding : index.findBindings(name, QtLinkageFilter, null))
if (binding instanceof AbstractQtPDOMClass)
return new QGadget(QtIndexImpl.this, cdtIndex, (AbstractQtPDOMClass) binding);
return null;
}
}
private class QmlRegistrationAccessor implements CDTIndex.Accessor<Collection<IQmlRegistration>> {
@Override
public Collection<IQmlRegistration> access(IIndex index) throws CoreException {
Collection<IQmlRegistration> types = null;
for (IIndexBinding binding : index.findBindings(QmlTypeNameRegex, false, QtLinkageFilter, null)) {
IQmlRegistration qml = QmlRegistration.create(QtIndexImpl.this, binding);
if (qml != null) {
if (types == null)
types = new ArrayList<>();
types.add(qml);
}
}
return types == null ? Collections.<IQmlRegistration>emptyList() : types;
}
}
}