[AA] KT-55566 StandaloneProjectFactory: Setup Java language level before Java files are parsed

- LL FIR tests with Java `record` classes and other new syntax features
  failed because `file.packageName` in `findJvmRootsForJavaFiles`
  caused the Java file to be parsed before the Java language level was
  configured. The Java language level is now set up in
  `registerJavaPsiFacade`, which is early enough.
This commit is contained in:
Marco Pennekamp
2023-01-03 18:16:27 +01:00
committed by Space Team
parent fed86a57e3
commit e68111c218
8 changed files with 7 additions and 9 deletions
@@ -67,6 +67,9 @@ object StandaloneProjectFactory {
registerService(ExternalAnnotationsManager::class.java, MockExternalAnnotationsManager())
registerService(InferredAnnotationsManager::class.java, MockInferredAnnotationsManager())
// The Java language level must be configured before Java source files are parsed. See `findJvmRootsForJavaFiles`.
setupHighestLanguageLevel()
}
}
@@ -85,8 +88,6 @@ object StandaloneProjectFactory {
project.registerService(ProjectStructureProvider::class.java, projectStructureProvider)
initialiseVirtualFileFinderServices(environment, modules, sourceFiles, languageVersionSettings, jdkHome)
project.setupHighestLanguageLevel()
}
private fun initialiseVirtualFileFinderServices(
@@ -153,6 +154,10 @@ object StandaloneProjectFactory {
project.registerService(VirtualFileFinderFactory::class.java, finderFactory)
}
/**
* Note that [findJvmRootsForJavaFiles] parses the given [files] because it needs access to each file's package name. To avoid parsing
* errors, [registerJavaPsiFacade] ensures that the Java language level is configured before [findJvmRootsForJavaFiles] is called.
*/
fun findJvmRootsForJavaFiles(files: List<PsiJavaFile>): List<PsiDirectory> {
if (files.isEmpty()) return emptyList()
val result = mutableSetOf<PsiDirectory>()