From 51d844aa00282c4471bde7a6cc8a12edaccff5c8 Mon Sep 17 00:00:00 2001 From: Ilia Malakhov Date: Tue, 17 Feb 2026 15:54:42 +0100 Subject: [PATCH] IJPL-219909 FilePatternPackageSet calculates relative path from content file set root if file has no content root GitOrigin-RevId: b0954a23517713021826f550df4c17c9b065528b --- .../packageSet/FilePatternPackageSet.java | 9 ++- .../packageSet/FilePatternPackageSetTest.kt | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 platform/platform-tests/testSrc/com/intellij/psi/search/scope/packageSet/FilePatternPackageSetTest.kt diff --git a/platform/analysis-api/src/com/intellij/psi/search/scope/packageSet/FilePatternPackageSet.java b/platform/analysis-api/src/com/intellij/psi/search/scope/packageSet/FilePatternPackageSet.java index b1799378c7c4..c9548fbc818d 100644 --- a/platform/analysis-api/src/com/intellij/psi/search/scope/packageSet/FilePatternPackageSet.java +++ b/platform/analysis-api/src/com/intellij/psi/search/scope/packageSet/FilePatternPackageSet.java @@ -194,9 +194,16 @@ public final class FilePatternPackageSet extends PatternBasedPackageSet { } } return virtualFile.getPath(); - } else { + } + else if (index.isInContent(virtualFile)) { + final VirtualFile contentFileSetRoot = index.getWorkspaceContentFileSetRoot(virtualFile); + if (contentFileSetRoot == null) return null; + return VfsUtilCore.getRelativePath(virtualFile, contentFileSetRoot, '/'); + } + else if (index.isInLibrary(virtualFile)) { return getLibRelativePath(virtualFile, index); } + return null; } public static String getLibRelativePath(final VirtualFile virtualFile, final ProjectFileIndex index) { diff --git a/platform/platform-tests/testSrc/com/intellij/psi/search/scope/packageSet/FilePatternPackageSetTest.kt b/platform/platform-tests/testSrc/com/intellij/psi/search/scope/packageSet/FilePatternPackageSetTest.kt new file mode 100644 index 000000000000..8fcb2e2e79f0 --- /dev/null +++ b/platform/platform-tests/testSrc/com/intellij/psi/search/scope/packageSet/FilePatternPackageSetTest.kt @@ -0,0 +1,61 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.psi.search.scope.packageSet + +import com.intellij.openapi.application.readAction +import com.intellij.testFramework.VfsTestUtil +import com.intellij.testFramework.junit5.TestApplication +import com.intellij.testFramework.rules.ProjectModelExtension +import com.intellij.testFramework.rules.TempDirectoryExtension +import com.intellij.workspaceModel.ide.registerProjectRoot +import kotlinx.coroutines.runBlocking +import org.assertj.core.api.Assumptions +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension +import kotlin.io.path.createDirectories +import kotlin.io.path.pathString +import kotlin.io.path.writeText + +@TestApplication +class FilePatternPackageSetTest { + @JvmField + @RegisterExtension + val projectModel: ProjectModelExtension = ProjectModelExtension() + + @JvmField + @RegisterExtension + val tempDir: TempDirectoryExtension = TempDirectoryExtension() + + @Test + fun `files from CONTENT_NON_INDEXABLE root are included with empty module pattern when path matches`(): Unit = runBlocking { + val rootPath = tempDir.newDirectoryPath("non-indexable-root") + val filePath = rootPath.resolve("src/match.txt") + filePath.parent.createDirectories() + filePath.writeText("content") + + registerProjectRoot(projectModel.project, rootPath) + + val file = VfsTestUtil.findFileByCaseSensitivePath(filePath.pathString) + Assumptions.assumeThat(file).isNotNull() + + val packageSet = FilePatternPackageSet("", "src/match.txt") + assertTrue(readAction { packageSet.contains(file, projectModel.project, null) }) + } + + @Test + fun `files from CONTENT_NON_INDEXABLE root are not included with non-empty module pattern when path matches`(): Unit = runBlocking { + val rootPath = tempDir.newDirectoryPath("non-indexable-root") + val filePath = rootPath.resolve("src/match.txt") + filePath.parent.createDirectories() + filePath.writeText("content") + + registerProjectRoot(projectModel.project, rootPath) + + val file = VfsTestUtil.findFileByCaseSensitivePath(filePath.pathString) + Assumptions.assumeThat(file).isNotNull() + + val packageSet = FilePatternPackageSet("module", "src/match.txt") + assertFalse(readAction { packageSet.contains(file, projectModel.project, null) }) + } +}