QScriptValue ScriptEngine::js_loadFile(QScriptContext *context, QScriptEngine *qtengine) { ScriptEngine *engine = static_cast<ScriptEngine *>(qtengine); if (context->argumentCount() < 1) { return context->throwError( ScriptEngine::tr("The loadFile function requires a file path.")); } if (engine->m_currentDirPathStack.isEmpty()) { return context->throwError( ScriptEngine::tr("loadFile: internal error. No current directory.")); } QScriptValue result; const QString relativeFilePath = context->argument(0).toVariant().toString(); try { const QString filePath = FileInfo::resolvePath(engine->m_currentDirPathStack.top(), relativeFilePath); result = engine->importFile(filePath, QScriptValue()); } catch (const ErrorInfo &e) { result = context->throwError(e.toString()); } return result; }
QScriptValue ScriptEngine::js_loadExtension(QScriptContext *context, QScriptEngine *qtengine) { ScriptEngine *engine = static_cast<ScriptEngine *>(qtengine); if (context->argumentCount() < 1) { return context->throwError( ScriptEngine::tr("The loadExtension function requires " "an extension name.")); } if (engine->m_extensionSearchPathsStack.isEmpty()) return context->throwError( ScriptEngine::tr("loadExtension: internal error. No search paths.")); const QString uri = context->argument(0).toVariant().toString(); if (engine->m_logger.debugEnabled()) { engine->m_logger.qbsDebug() << "[loadExtension] loading extension " << uri; } QString uriAsPath = uri; uriAsPath.replace(QLatin1Char('.'), QLatin1Char('/')); const QStringList searchPaths = engine->m_extensionSearchPathsStack.top(); const QString dirPath = findExtensionDir(searchPaths, uriAsPath); if (dirPath.isEmpty()) { if (uri.startsWith(QLatin1String("qbs."))) return loadInternalExtension(context, engine, uri); return context->throwError( ScriptEngine::tr("loadExtension: Cannot find extension '%1'. " "Search paths: %2.").arg(uri, searchPaths.join( QLatin1String(", ")))); } QDirIterator dit(dirPath, QDir::Files | QDir::Readable); QScriptValueList values; try { while (dit.hasNext()) { const QString filePath = dit.next(); if (engine->m_logger.debugEnabled()) { engine->m_logger.qbsDebug() << "[loadExtension] importing file " << filePath; } values << engine->importFile(filePath, QScriptValue()); } } catch (const ErrorInfo &e) { return context->throwError(e.toString()); } return mergeExtensionObjects(values); }