@@ -20,17 +20,13 @@ import com.intellij.openapi.progress.Task
2020import com.intellij.openapi.project.Project
2121import com.intellij.openapi.roots.ModuleRootManager
2222import com.intellij.openapi.util.Key
23- import com.intellij.openapi.util.SystemInfo
2423import com.intellij.openapi.util.UserDataHolder
2524import com.intellij.openapi.vfs.VirtualFile
2625import com.intellij.openapi.wm.ToolWindowManager
27- import com.jetbrains.cidr.cpp.cmake.model.CMakeConfiguration
2826import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace
2927import com.jetbrains.cidr.cpp.execution.CMakeAppRunConfiguration
3028import com.jetbrains.cidr.cpp.execution.CMakeBuildProfileExecutionTarget
3129import com.jetbrains.cidr.cpp.execution.coverage.CMakeCoverageBuildOptionsInstallerFactory
32- import com.jetbrains.cidr.cpp.execution.testing.CMakeTestRunConfiguration
33- import com.jetbrains.cidr.cpp.execution.testing.ctest.CidrCTestRunConfigurationData
3430import com.jetbrains.cidr.cpp.toolchains.CPPEnvironment
3531import com.jetbrains.cidr.execution.CidrBuildTarget
3632import com.jetbrains.cidr.execution.CidrRunConfiguration
@@ -44,7 +40,7 @@ import net.zero9178.cov.data.*
4440import net.zero9178.cov.editor.CoverageFileAccessProtector
4541import net.zero9178.cov.editor.CoverageHighlighter
4642import net.zero9178.cov.settings.CoverageGeneratorSettings
47- import net.zero9178.cov.util.isCTestInstalled
43+ import net.zero9178.cov.util.getCMakeConfigurations
4844import net.zero9178.cov.window.CoverageView
4945import java.io.File
5046import javax.swing.event.HyperlinkEvent
@@ -99,13 +95,15 @@ class CoverageConfigurationExtension : CidrRunConfigurationExtensionBase() {
9995 ) {
10096 return
10197 }
102- context.putUserData(EXECUTION_TARGET_USED , state.executionTarget)
98+ val executionTarget = state.executionTarget as ? CMakeBuildProfileExecutionTarget ? : return
99+ context.putUserData(EXECUTION_TARGET_USED , executionTarget)
103100 val commandLine = context.getUserData(GENERAL_COMMAND_LINE ) ? : return
104101 getCoverageGenerator(environment, configuration.project)?.patchEnvironment(
105102 configuration,
106103 environment,
107- state.executionTarget,
108- commandLine
104+ executionTarget,
105+ commandLine,
106+ context
109107 )
110108 }
111109
@@ -208,7 +206,8 @@ class CoverageConfigurationExtension : CidrRunConfigurationExtensionBase() {
208206 configuration,
209207 environment,
210208 executionTarget,
211- indicator
209+ indicator,
210+ context
212211 )
213212 val root = DefaultMutableTreeNode (" invisible-root" )
214213 invokeLater {
@@ -268,32 +267,6 @@ class CoverageConfigurationExtension : CidrRunConfigurationExtensionBase() {
268267 return coverageGenerator
269268 }
270269
271- private fun getCMakeConfigurations (
272- configuration : CMakeAppRunConfiguration ,
273- executionTarget : CMakeBuildProfileExecutionTarget
274- ): Sequence <CMakeConfiguration > {
275- return if (configuration is CMakeTestRunConfiguration && isCTestInstalled() && configuration.testData is CidrCTestRunConfigurationData ) {
276- val testData = configuration.testData as CidrCTestRunConfigurationData
277- testData.infos?.mapNotNull {
278- it?.command?.exePath
279- }?.distinct()?.asSequence()?.mapNotNull { executable ->
280- CMakeWorkspace .getInstance(configuration.project).modelTargets.asSequence().mapNotNull { target ->
281- target.buildConfigurations.find { it.profileName == executionTarget.profileName }
282- }.find {
283- it.productFile?.name == executable.substringAfterLast(
284- ' /' ,
285- if (SystemInfo .isWindows) executable.substringAfterLast(' \\ ' ) else executable
286- )
287- }
288- } ? : emptySequence()
289- } else {
290- val runConfiguration =
291- configuration.getBuildAndRunConfigurations(executionTarget)?.buildConfiguration
292- ? : return emptySequence()
293- sequenceOf(runConfiguration)
294- }
295- }
296-
297270 private fun hasCompilerFlags (
298271 configuration : CMakeAppRunConfiguration ,
299272 executionTarget : CMakeBuildProfileExecutionTarget
@@ -337,23 +310,31 @@ class CoverageConfigurationExtension : CidrRunConfigurationExtensionBase() {
337310 }
338311 }
339312
313+ val previouslyChanged = mutableSetOf<String >()
340314 val map = mutableMapOf<String , ChosenName >()
341315 for ((_, value) in data.files) {
342316 var new = ChosenName (value.filePath.replace(' \\ ' , ' /' ), 1 , value)
343317 val filename = new.getFilename()
344- val existing = map[filename]
345- if (existing == null ) {
318+ var existing = map[filename]
319+ if (existing == null && ! previouslyChanged.contains(filename) ) {
346320 map[filename] = new
347321 continue
348322 }
349323 map.remove(filename)
350- var nonNull : ChosenName = existing
351- while (new.getFilename() == nonNull.getFilename()) {
324+ while (new.getFilename() == existing?.getFilename() || previouslyChanged.contains(new.getFilename())) {
325+ previouslyChanged.add (new.getFilename())
352326 new = new.copy(count = new.count + 1 )
353- nonNull = nonNull.copy(count = nonNull.count + 1 )
327+ existing = existing?.copy(count = existing.count + 1 )
328+ if (existing == null ) {
329+ // If existing is null due to a filename being part of previouslyChanged, also attempt to find
330+ // existing files that might also have to be changed a long the way
331+ existing = map[new.getFilename()]
332+ }
354333 }
355334 map[new.getFilename()] = new
356- map[nonNull.getFilename()] = nonNull
335+ existing?.let {
336+ map[it.getFilename()] = it
337+ }
357338 }
358339
359340 val fileDataToName = map.map {
0 commit comments