mpsProject.getProjectFile is either project rootbase directory (for file-based projects), or path to file under .idea/. Taking parent file is bad idea as it doesn't produce correct result in former case (there might be few projects under project's parent dir), or irrelevant for .idea/ (it's under project path anyway).
QMG refactored to use supplied classloader manager instance instead of global one.
Language module dependencies: drop deprecated code, get ready for another removal round - deprecate similar methods, use single facility to build closure of extended languages (it's odd to do almost the same in three different places)
Drop ModuleUtil, as there are no uses for this class and it's been deprecated for quite some time
Drop ClasspathCollector, inline it's single use.
SModule#getDeclaredDependencies(): provide truly 'declared' dependencies, not a closure of what we think might be of value to outer code, let caller control how deep it gonna dive. Present uses of getDeclaredDependencies() make me think it was deemed to give direct dependencies only (as there's dependency hierarchy walk always).
SModule dependencies: clear mess with re-exporting dependencies declared in a generator's source language: module tells it's dependencies and doesn't try to build complete closure. Latter is left to GlobalModuleDependenciesManager.