QmlJS: Support .import directives in js files.

* Allow .import...
* Fix parsing of JS files when using Lexer::scanDirectives()
* Clean up ImportInfo construction.
* Rename ImportInfo::id to ImportInfo::as.

Change-Id: I888da248f06dc6184db99aa74c3b50d7f2f5e491
Reviewed-on: http://codereview.qt-project.org/5625
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
This commit is contained in:
Christian Kamm
2011-09-27 15:12:22 +02:00
parent faa792f3cd
commit 82cbd0a974
10 changed files with 186 additions and 95 deletions

View File

@@ -211,6 +211,35 @@ QString Document::componentName() const
return _componentName;
}
namespace {
class CollectDirectives : public Directives
{
QString documentPath;
public:
CollectDirectives(const QString &documentPath)
: documentPath(documentPath)
, isLibrary(false)
{}
virtual void pragmaLibrary() { isLibrary = true; }
virtual void importFile(const QString &jsfile, const QString &module)
{
imports += ImportInfo::pathImport(
documentPath, jsfile, LanguageUtils::ComponentVersion(), module);
}
virtual void importModule(const QString &uri, const QString &version, const QString &module)
{
imports += ImportInfo::moduleImport(uri, LanguageUtils::ComponentVersion(version), module);
}
bool isLibrary;
QList<ImportInfo> imports;
};
} // anonymous namespace
bool Document::parse_helper(int startToken)
{
Q_ASSERT(! _engine);
@@ -225,11 +254,8 @@ bool Document::parse_helper(int startToken)
QString source = _source;
lexer.setCode(source, /*line = */ 1, /*qmlMode = */_language == QmlLanguage);
if (startToken == QmlJSGrammar::T_FEED_JS_PROGRAM) {
// ### use directives
Directives directives;
lexer.scanDirectives(&directives);
}
CollectDirectives collectDirectives(path());
_engine->setDirectives(&collectDirectives);
switch (startToken) {
case QmlJSGrammar::T_FEED_UI_PROGRAM:
@@ -248,7 +274,7 @@ bool Document::parse_helper(int startToken)
_ast = parser.rootNode();
_diagnosticMessages = parser.diagnosticMessages();
_bind = new Bind(this, &_diagnosticMessages);
_bind = new Bind(this, &_diagnosticMessages, collectDirectives.isLibrary, collectDirectives.imports);
return _parsedCorrectly;
}