@@ -10,22 +10,34 @@ import com.intellij.codeInsight.hints.declarative.InlayTreeSink
1010import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
1111import com.intellij.codeInsight.hints.declarative.SharedBypassCollector
1212import com.intellij.openapi.editor.Editor
13+ import com.intellij.openapi.util.text.StringUtil
1314import com.intellij.psi.PsiElement
1415import com.intellij.psi.PsiFile
16+ import com.intellij.psi.PsiLanguageInjectionHost
17+ import com.intellij.psi.PsiLiteralValue
1518import com.intellij.psi.util.PsiTreeUtil
1619import com.intellij.psi.util.endOffset
1720
1821class CrontabInlayHintsProvider : InlayHintsProvider {
22+ companion object {
23+ val QUOTES = arrayOf<Char >(' "' , ' \' ' , ' `' )
24+ }
25+
1926 override fun createCollector (
2027 file : PsiFile ,
2128 editor : Editor
2229 ): InlayHintsCollector {
2330 return object : SharedBypassCollector {
2431 override fun collectFromElement (element : PsiElement , sink : InlayTreeSink ) {
25- val crontabFile = CrontabElementFactory .createFile(element.project, element.text)
32+ if (element !is PsiLiteralValue && element !is PsiLanguageInjectionHost ) return
33+
34+ val text = QUOTES .fold(element.text) { acc, string -> StringUtil .unquoteString(acc, string) }
35+
36+ val crontabFile = CrontabElementFactory .createFile(element.project, text)
2637 val expression = crontabFile.children.getOrNull(0 ) as ? CrontabCronExpression ? : return
27- if (expression.schedule.text != element.text) {
28- return
38+ when {
39+ expression.schedule.text != text -> return
40+ text.startsWith(" @" ) -> return
2941 }
3042
3143 val schedules = PsiTreeUtil .findChildrenOfType(crontabFile, CrontabSchedule ::class .java)
@@ -34,17 +46,18 @@ class CrontabInlayHintsProvider : InlayHintsProvider {
3446 if (schedules.isNotEmpty()) {
3547
3648 val offset = when {
37- element.nextSibling.text in arrayOf( " \" " , " ' " , " ` " ) -> element.nextSibling.endOffset
49+ ( element.nextSibling? .text?.getOrNull( 0 )) in QUOTES -> element.nextSibling.endOffset
3850 else -> element.endOffset
3951 }
4052 sink.addPresentation(
4153 position = InlineInlayPosition (offset, false , 100 ),
4254 hintFormat = HintFormat .default,
4355 ) {
44- text(CronScheduleDescriber .asHumanReadable(element. text))
56+ text(CronScheduleDescriber .asHumanReadable(text))
4557 }
4658 }
4759 }
4860 }
4961 }
62+
5063}
0 commit comments