/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ #ifndef QMLDOCUMENT_H #define QMLDOCUMENT_H #include #include #include #include #include #include "parser/qmldirparser_p.h" #include "parser/qmljsengine_p.h" #include "qmljs_global.h" namespace QmlJS { class Bind; class Snapshot; class QMLJS_EXPORT Document { public: typedef QSharedPointer Ptr; typedef QSharedPointer MutablePtr; // used in a 3-bit bitfield enum Language { QmlLanguage = 0, JavaScriptLanguage = 1, JsonLanguage = 2, UnknownLanguage = 3 }; protected: Document(const QString &fileName, Language language); public: ~Document(); static MutablePtr create(const QString &fileName, Language language); static Language guessLanguageFromSuffix(const QString &fileName); Document::Ptr ptr() const; bool isQmlDocument() const; Language language() const; AST::UiProgram *qmlProgram() const; AST::Program *jsProgram() const; AST::ExpressionNode *expression() const; AST::Node *ast() const; const QmlJS::Engine *engine() const; QList diagnosticMessages() const; QString source() const; void setSource(const QString &source); bool parse(); bool parseQml(); bool parseJavaScript(); bool parseExpression(); bool isParsedCorrectly() const { return _parsedCorrectly; } Bind *bind() const; int editorRevision() const; void setEditorRevision(int revision); QString fileName() const; QString path() const; QString componentName() const; private: bool parse_helper(int kind); private: QmlJS::Engine *_engine; AST::Node *_ast; Bind *_bind; QList _diagnosticMessages; QString _fileName; QString _path; QString _componentName; QString _source; QWeakPointer _ptr; int _editorRevision; Language _language : 3; bool _parsedCorrectly : 1; // for documentFromSource friend class Snapshot; }; class QMLJS_EXPORT ModuleApiInfo { public: QString uri; LanguageUtils::ComponentVersion version; QString cppName; }; class QMLJS_EXPORT LibraryInfo { public: enum PluginTypeInfoStatus { NoTypeInfo, DumpDone, DumpError, TypeInfoFileDone, TypeInfoFileError }; enum Status { NotScanned, NotFound, Found }; private: Status _status; QList _components; QList _plugins; QList _typeinfos; typedef QList FakeMetaObjectList; FakeMetaObjectList _metaObjects; QList _moduleApis; PluginTypeInfoStatus _dumpStatus; QString _dumpError; public: explicit LibraryInfo(Status status = NotScanned); explicit LibraryInfo(const QmlDirParser &parser); ~LibraryInfo(); QList components() const { return _components; } QList plugins() const { return _plugins; } QList typeInfos() const { return _typeinfos; } FakeMetaObjectList metaObjects() const { return _metaObjects; } void setMetaObjects(const FakeMetaObjectList &objects) { _metaObjects = objects; } QList moduleApis() const { return _moduleApis; } void setModuleApis(const QList &apis) { _moduleApis = apis; } bool isValid() const { return _status == Found; } bool wasScanned() const { return _status != NotScanned; } PluginTypeInfoStatus pluginTypeInfoStatus() const { return _dumpStatus; } QString pluginTypeInfoError() const { return _dumpError; } void setPluginTypeInfoStatus(PluginTypeInfoStatus dumped, const QString &error = QString()) { _dumpStatus = dumped; _dumpError = error; } }; class QMLJS_EXPORT Snapshot { typedef QHash _Base; QHash _documents; QHash > _documentsByPath; QHash _libraries; public: Snapshot(); ~Snapshot(); typedef _Base::iterator iterator; typedef _Base::const_iterator const_iterator; const_iterator begin() const { return _documents.begin(); } const_iterator end() const { return _documents.end(); } void insert(const Document::Ptr &document, bool allowInvalid = false); void insertLibraryInfo(const QString &path, const LibraryInfo &info); void remove(const QString &fileName); Document::Ptr document(const QString &fileName) const; QList documentsInDirectory(const QString &path) const; LibraryInfo libraryInfo(const QString &path) const; Document::MutablePtr documentFromSource(const QString &code, const QString &fileName, Document::Language language) const; }; } // namespace QmlJS #endif // QMLDOCUMENT_H