/* * Copyright (c) 2013, 2015 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; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; /** * Declares constants related to tokens that are special in Qt applications. */ public class QtKeywords { public static final String CONNECT = "connect"; public static final String DISCONNECT = "disconnect"; public static final String Q_CLASSINFO = "Q_CLASSINFO"; public static final String Q_DECLARE_FLAGS = "Q_DECLARE_FLAGS"; public static final String Q_ENUMS = "Q_ENUMS"; public static final String Q_FLAGS = "Q_FLAGS"; public static final String Q_GADGET = "Q_GADGET"; public static final String Q_INVOKABLE = "Q_INVOKABLE"; public static final String Q_OBJECT = "Q_OBJECT"; public static final String Q_PROPERTY = "Q_PROPERTY"; public static final String Q_REVISION = "Q_REVISION"; public static final String Q_SIGNAL = "Q_SIGNAL"; public static final String Q_SIGNALS = "Q_SIGNALS"; public static final String Q_SLOT = "Q_SLOT"; public static final String Q_SLOTS = "Q_SLOTS"; public static final String QMETAMETHOD = "QMetaMethod"; public static final String QML_ATTACHED_PROPERTIES = "qmlAttachedProperties"; public static final String QML_REGISTER_TYPE = "qmlRegisterType"; public static final String QML_REGISTER_UNCREATABLE_TYPE = "qmlRegisterUncreatableType"; public static final String QOBJECT = "QObject"; public static final String SIGNAL = "SIGNAL"; public static final String SIGNALS = "signals"; public static final String SLOT = "SLOT"; public static final String SLOTS = "slots"; /** * Returns true if the argument type is for Qt's QObject class and false otherwise. */ public static boolean isQObject(IType type) { if (!(type instanceof ICPPClassType)) return false; ICPPClassType clsType = (ICPPClassType)type; return QtKeywords.QOBJECT.equals(clsType.getName()); } /** * Returns true if the argument type is for Qt's QMetaMethod class and false otherwise. */ public static boolean isQMetaMethod(IType type) { if (!(type instanceof ICPPClassType)) return false; ICPPClassType clsType = (ICPPClassType)type; return QMETAMETHOD.equals(clsType.getName()); } /** * Returns true if the argument binding is for the QObject::connect function * and false otherwise. */ public static boolean is_QObject_connect(IBinding binding) { String[] qualName = getFunctionQualifiedName(binding); return qualName != null && qualName.length == 2 && QOBJECT.equals(qualName[0]) && CONNECT.equals(qualName[1]); } /** * Returns true if the argument binding is for the QObject::disconnect function * and false otherwise. */ public static boolean is_QObject_disconnect(IBinding binding) { String[] qualName = getFunctionQualifiedName(binding); return qualName != null && qualName.length == 2 && QOBJECT.equals(qualName[0]) && DISCONNECT.equals(qualName[1]); } /** * Returns true if the given binding will register a type with the QML type system and false * otherwise. */ public static boolean is_QmlType(IBinding binding) { String[] qualName = getFunctionQualifiedName(binding); return qualName != null && qualName.length == 1 && (QML_REGISTER_TYPE.equals(qualName[0]) || QML_REGISTER_UNCREATABLE_TYPE.equals(qualName[0])); } private static String[] getFunctionQualifiedName(IBinding binding) { // IBinding#getAdapter returns null when binding is an instance of // PDOMCPPMethod. if (binding instanceof ICPPFunction) try { return ((ICPPFunction) binding).getQualifiedName(); } catch (DOMException e) { Activator.log(e); } return null; } }