forked from quickshell/quickshell
		
	core: add Internal pragma
This commit is contained in:
		
							parent
							
								
									78e3874ac6
								
							
						
					
					
						commit
						201c559dcd
					
				
					 3 changed files with 47 additions and 32 deletions
				
			
		| 
						 | 
				
			
			@ -58,7 +58,7 @@ void RootWrapper::reloadGraph(bool hard) {
 | 
			
		|||
	auto rootFile = QFileInfo(this->rootPath);
 | 
			
		||||
	auto rootPath = rootFile.dir();
 | 
			
		||||
	auto scanner = QmlScanner(rootPath);
 | 
			
		||||
	scanner.scanQmlFile(this->rootPath);
 | 
			
		||||
	scanner.scanQmlRoot(this->rootPath);
 | 
			
		||||
 | 
			
		||||
	qs::core::QmlToolingSupport::updateTooling(rootPath, scanner);
 | 
			
		||||
	this->configDirWatcher.addPath(rootPath.path());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,30 +26,41 @@ void QmlScanner::scanDir(const QString& path) {
 | 
			
		|||
	qCDebug(logQmlScanner) << "Scanning directory" << path;
 | 
			
		||||
	auto dir = QDir(path);
 | 
			
		||||
 | 
			
		||||
	struct Entry {
 | 
			
		||||
		QString name;
 | 
			
		||||
		bool singleton = false;
 | 
			
		||||
		bool internal = false;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	bool seenQmldir = false;
 | 
			
		||||
	auto singletons = QVector<QString>();
 | 
			
		||||
	auto entries = QVector<QString>();
 | 
			
		||||
	for (auto& entry: dir.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
 | 
			
		||||
		if (entry == "qmldir") {
 | 
			
		||||
	auto entries = QVector<Entry>();
 | 
			
		||||
 | 
			
		||||
	for (auto& name: dir.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
 | 
			
		||||
		if (name == "qmldir") {
 | 
			
		||||
			qCDebug(logQmlScanner
 | 
			
		||||
			) << "Found qmldir file, qmldir synthesization will be disabled for directory"
 | 
			
		||||
			  << path;
 | 
			
		||||
			seenQmldir = true;
 | 
			
		||||
		} else if (entry.at(0).isUpper() && entry.endsWith(".qml")) {
 | 
			
		||||
			if (this->scanQmlFile(dir.filePath(entry))) {
 | 
			
		||||
				singletons.push_back(entry);
 | 
			
		||||
		} else if (name.at(0).isUpper() && name.endsWith(".qml")) {
 | 
			
		||||
			auto& entry = entries.emplaceBack();
 | 
			
		||||
 | 
			
		||||
			if (this->scanQmlFile(dir.filePath(name), entry.singleton, entry.internal)) {
 | 
			
		||||
				entry.name = name;
 | 
			
		||||
			} else {
 | 
			
		||||
				entries.push_back(entry);
 | 
			
		||||
				entries.pop_back();
 | 
			
		||||
			}
 | 
			
		||||
		} else if (name.at(0).isUpper() && name.endsWith(".qml.json")) {
 | 
			
		||||
			if (this->scanQmlJson(dir.filePath(name))) {
 | 
			
		||||
				entries.push_back({
 | 
			
		||||
				    .name = name.first(name.length() - 5),
 | 
			
		||||
				    .singleton = true,
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		} else if (entry.at(0).isUpper() && entry.endsWith(".qml.json")) {
 | 
			
		||||
			this->scanQmlJson(dir.filePath(entry));
 | 
			
		||||
			singletons.push_back(entry.first(entry.length() - 5));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!seenQmldir) {
 | 
			
		||||
		qCDebug(logQmlScanner) << "Synthesizing qmldir for directory" << path << "singletons"
 | 
			
		||||
		                       << singletons;
 | 
			
		||||
		qCDebug(logQmlScanner) << "Synthesizing qmldir for directory" << path;
 | 
			
		||||
 | 
			
		||||
		QString qmldir;
 | 
			
		||||
		auto stream = QTextStream(&qmldir);
 | 
			
		||||
| 
						 | 
				
			
			@ -77,13 +88,10 @@ void QmlScanner::scanDir(const QString& path) {
 | 
			
		|||
			qCWarning(logQmlScanner) << "Module path" << path << "is outside of the config folder.";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (auto& singleton: singletons) {
 | 
			
		||||
			stream << "singleton " << singleton.sliced(0, singleton.length() - 4) << " 1.0 " << singleton
 | 
			
		||||
			       << "\n";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (auto& entry: entries) {
 | 
			
		||||
			stream << entry.sliced(0, entry.length() - 4) << " 1.0 " << entry << "\n";
 | 
			
		||||
		for (const auto& entry: entries) {
 | 
			
		||||
			if (entry.internal) stream << "internal ";
 | 
			
		||||
			if (entry.singleton) stream << "singleton ";
 | 
			
		||||
			stream << entry.name.sliced(0, entry.name.length() - 4) << " 1.0 " << entry.name << '\n';
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		qCDebug(logQmlScanner) << "Synthesized qmldir for" << path << qPrintable("\n" + qmldir);
 | 
			
		||||
| 
						 | 
				
			
			@ -91,7 +99,7 @@ void QmlScanner::scanDir(const QString& path) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool QmlScanner::scanQmlFile(const QString& path) {
 | 
			
		||||
bool QmlScanner::scanQmlFile(const QString& path, bool& singleton, bool& internal) {
 | 
			
		||||
	if (this->scannedFiles.contains(path)) return false;
 | 
			
		||||
	this->scannedFiles.push_back(path);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,13 +114,12 @@ bool QmlScanner::scanQmlFile(const QString& path) {
 | 
			
		|||
	auto stream = QTextStream(&file);
 | 
			
		||||
	auto imports = QVector<QString>();
 | 
			
		||||
 | 
			
		||||
	bool singleton = false;
 | 
			
		||||
 | 
			
		||||
	while (!stream.atEnd()) {
 | 
			
		||||
		auto line = stream.readLine().trimmed();
 | 
			
		||||
		if (!singleton && line == "pragma Singleton") {
 | 
			
		||||
			qCDebug(logQmlScanner) << "Discovered singleton" << path;
 | 
			
		||||
			singleton = true;
 | 
			
		||||
		} else if (!internal && line == "//@ pragma Internal") {
 | 
			
		||||
			internal = true;
 | 
			
		||||
		} else if (line.startsWith("import")) {
 | 
			
		||||
			// we dont care about "import qs" as we always load the root folder
 | 
			
		||||
			if (auto importCursor = line.indexOf(" qs."); importCursor != -1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -188,16 +195,22 @@ bool QmlScanner::scanQmlFile(const QString& path) {
 | 
			
		|||
		else this->scanDir(cpath);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return singleton;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QmlScanner::scanQmlJson(const QString& path) {
 | 
			
		||||
void QmlScanner::scanQmlRoot(const QString& path) {
 | 
			
		||||
	bool singleton = false;
 | 
			
		||||
	bool internal = false;
 | 
			
		||||
	this->scanQmlFile(path, singleton, internal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool QmlScanner::scanQmlJson(const QString& path) {
 | 
			
		||||
	qCDebug(logQmlScanner) << "Scanning qml.json file" << path;
 | 
			
		||||
 | 
			
		||||
	auto file = QFile(path);
 | 
			
		||||
	if (!file.open(QFile::ReadOnly | QFile::Text)) {
 | 
			
		||||
		qCWarning(logQmlScanner) << "Failed to open file" << path;
 | 
			
		||||
		return;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto data = file.readAll();
 | 
			
		||||
| 
						 | 
				
			
			@ -209,7 +222,7 @@ void QmlScanner::scanQmlJson(const QString& path) {
 | 
			
		|||
	if (error.error != QJsonParseError::NoError) {
 | 
			
		||||
		qCCritical(logQmlScanner).nospace()
 | 
			
		||||
		    << "Failed to parse qml.json file at " << path << ": " << error.errorString();
 | 
			
		||||
		return;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const QString body =
 | 
			
		||||
| 
						 | 
				
			
			@ -219,6 +232,7 @@ void QmlScanner::scanQmlJson(const QString& path) {
 | 
			
		|||
 | 
			
		||||
	this->fileIntercepts.insert(path.first(path.length() - 5), body);
 | 
			
		||||
	this->scannedFiles.push_back(path);
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QPair<QString, QString> QmlScanner::jsonToQml(const QJsonValue& value, int indent) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,8 @@ public:
 | 
			
		|||
 | 
			
		||||
	// path must be canonical
 | 
			
		||||
	void scanDir(const QString& path);
 | 
			
		||||
	// returns if the file has a singleton
 | 
			
		||||
	bool scanQmlFile(const QString& path);
 | 
			
		||||
 | 
			
		||||
	void scanQmlRoot(const QString& path);
 | 
			
		||||
 | 
			
		||||
	QVector<QString> scannedDirs;
 | 
			
		||||
	QVector<QString> scannedFiles;
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ public:
 | 
			
		|||
private:
 | 
			
		||||
	QDir rootPath;
 | 
			
		||||
 | 
			
		||||
	void scanQmlJson(const QString& path);
 | 
			
		||||
	bool scanQmlFile(const QString& path, bool& singleton, bool& internal);
 | 
			
		||||
	bool scanQmlJson(const QString& path);
 | 
			
		||||
	[[nodiscard]] static QPair<QString, QString> jsonToQml(const QJsonValue& value, int indent = 0);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue