@@ -2,8 +2,15 @@ package io.gitlab.arturbosch.detekt
2
2
3
3
import com.intellij.lang.annotation.AnnotationHolder
4
4
import com.intellij.lang.annotation.ExternalAnnotator
5
+ import com.intellij.notification.Notification
6
+ import com.intellij.notification.NotificationType
7
+ import com.intellij.openapi.actionSystem.AnAction
8
+ import com.intellij.openapi.actionSystem.AnActionEvent
9
+ import com.intellij.openapi.application.ApplicationManager
5
10
import com.intellij.openapi.command.WriteCommandAction
6
11
import com.intellij.openapi.fileEditor.FileDocumentManager
12
+ import com.intellij.openapi.options.newEditor.SettingsDialog
13
+ import com.intellij.openapi.project.Project
7
14
import com.intellij.openapi.util.Computable
8
15
import com.intellij.openapi.util.TextRange
9
16
import com.intellij.openapi.vfs.VirtualFile
@@ -12,12 +19,14 @@ import io.gitlab.arturbosch.detekt.api.Finding
12
19
import io.gitlab.arturbosch.detekt.api.TextLocation
13
20
import io.gitlab.arturbosch.detekt.cli.CliArgs
14
21
import io.gitlab.arturbosch.detekt.cli.loadConfiguration
22
+ import io.gitlab.arturbosch.detekt.config.DetektConfig
15
23
import io.gitlab.arturbosch.detekt.config.DetektConfigStorage
16
24
import io.gitlab.arturbosch.detekt.config.NoAutoCorrectConfig
17
25
import io.gitlab.arturbosch.detekt.core.DetektFacade
18
26
import io.gitlab.arturbosch.detekt.core.FileProcessorLocator
19
27
import io.gitlab.arturbosch.detekt.core.ProcessingSettings
20
28
import io.gitlab.arturbosch.detekt.core.RuleSetLocator
29
+ import java.io.File
21
30
import java.nio.file.Paths
22
31
import java.util.concurrent.ForkJoinPool
23
32
@@ -52,9 +61,12 @@ class DetektAnnotator : ExternalAnnotator<PsiFile, List<Finding>>() {
52
61
configuration : DetektConfigStorage
53
62
): List <Finding > {
54
63
val virtualFile = collectedInfo.originalFile.virtualFile
55
- val settings = processingSettings(virtualFile, configuration)
56
- val result = createFacade(settings, configuration).run ()
57
- return result.findings.flatMap { it.value }
64
+ val settings = processingSettings(collectedInfo.project, virtualFile, configuration)
65
+
66
+ return settings?.let {
67
+ val result = createFacade(settings, configuration).run ()
68
+ result.findings.flatMap { it.value }
69
+ } ? : emptyList()
58
70
}
59
71
60
72
override fun apply (
@@ -76,19 +88,43 @@ class DetektAnnotator : ExternalAnnotator<PsiFile, List<Finding>>() {
76
88
77
89
private fun TextLocation.toTextRange (): TextRange = TextRange .create(start, end)
78
90
79
- private fun processingSettings (virtualFile : VirtualFile ,
80
- configStorage : DetektConfigStorage ) =
81
- ProcessingSettings (
91
+ private fun processingSettings (
92
+ project : Project ,
93
+ virtualFile : VirtualFile ,
94
+ configStorage : DetektConfigStorage
95
+ ): ProcessingSettings ? {
96
+ if (configStorage.rulesPath.isNotEmpty()) {
97
+ val path = File (configStorage.rulesPath)
98
+ if (! path.exists()) {
99
+ val n = Notification (
100
+ " Detekt" ,
101
+ " Configuration file not found" ,
102
+ " The provided detekt configuration file <b>${path.absolutePath} </b> does not exist. Skipping detekt run." ,
103
+ NotificationType .WARNING
104
+ )
105
+ n.addAction(object : AnAction (" Open Detekt projects settings" ) {
106
+ override fun actionPerformed (e : AnActionEvent ) {
107
+ val dialog = SettingsDialog (project, " Detekt project settings" , DetektConfig (project), true , true )
108
+ ApplicationManager .getApplication().invokeLater(dialog::show);
109
+ }
110
+ })
111
+ n.notify(project)
112
+ return null
113
+ }
114
+ }
115
+
116
+
117
+
118
+ return ProcessingSettings (
82
119
inputPath = Paths .get(virtualFile.path),
83
120
config = NoAutoCorrectConfig (CliArgs ().apply {
84
- if (configStorage.rulesPath.isNotEmpty()) {
85
- config = configStorage.rulesPath
86
- failFast = configStorage.failFast
87
- buildUponDefaultConfig = configStorage.buildUponDefaultConfig
88
- }
121
+ config = configStorage.rulesPath
122
+ failFast = configStorage.failFast
123
+ buildUponDefaultConfig = configStorage.buildUponDefaultConfig
89
124
}.loadConfiguration()),
90
125
executorService = ForkJoinPool .commonPool()
91
126
)
127
+ }
92
128
93
129
private fun createFacade (settings : ProcessingSettings , configuration : DetektConfigStorage ): DetektFacade {
94
130
var providers = RuleSetLocator (settings).load()
0 commit comments