How to ignore LanguageInjection in kotlin PSI for value containing placeholder "\${my-placeholder}"?

How to ignore LanguageInjection in kotlin PSI for value containing placeholder “${my-placeholder}”

I am using ignore-pattern as the value \\\$\{.+\} but it is ignored completely.

injectionConfig:

<injection language="RegExp" injector-id="kotlin">
<display name>...</display name>
<place><![CDATA[ ...]]></place>
<ignore-pattern>\\\$\{.+\}</ignore-pattern>
</injection>

Can anyone help me?

Could you show an example where you want to ignore the injection? Which plugin sets the injection place?

1 Like

Hi Yuriy,
I’m still developing the plugin,
In Java it works as expected, but in Kotlin it injects, but doesn’t ignore

the code is like this so far.

resources/META-INF/plugin.xml

<idea-plugin require-restart="false">
    <depends>com.intellij.modules.java</depends>
    <depends>com.intellij.modules.lang</depends>
    <depends>com.intellij.modules.platform</depends>

    <depends>com.intellij.java</depends>
    <depends>org.jetbrains.kotlin</depends>

    <extensions defaultExtensionNs="org.intellij.intelliLang">
        <injectionConfig config="javainjections.xml"/>
    </extensions>
   ...
</idea-plugin>

resources/javainjections.xml

<?xml version="1.0" encoding="UTF-8"?>
<component name="LanguageInjectionConfiguration">

    <injection language="RegExp" injector-id="java">
        <display-name>JsonFormat (com.fasterxml.jackson.annotation.JsonFormat)</display-name>
        <place><![CDATA[
            psiMethod().withName("pattern").withParameters().definedInClass("com.fasterxml.jackson.annotation.JsonFormat")
            ]]></place>
        <ignore-pattern>\$\{.+\}</ignore-pattern>
    </injection>
    
    <injection language="RegExp" injector-id="kotlin">
        <display-name>JsonFormat (com.fasterxml.jackson.annotation.JsonFormat)</display-name>
        <place><![CDATA[
            psiMethod().withName("pattern").withParameters().definedInClass("com.fasterxml.jackson.annotation.JsonFormat")
            ]]></place>
        <ignore-pattern>\\\$\{.+\}</ignore-pattern>
    </injection>

</component>

My test

package dev.sample;

import com.fasterxml.jackson.annotation.JsonFormat;

public class AnyTest {

    //Good ignored-pattern placeholder
    @JsonFormat(pattern = "${my-placeholder:(\\d{4})\\/(\\d{2})\\/(\\d{2})}")
    LocalDate dateWithPlaceholder;

    //Good
    @JsonFormat(pattern = "(\\d{4})\\/(\\d{2})\\/(\\d{2})")
    LocalDate dateWithoutPlaceholder;
}
package dev.sample

import com.fasterxml.jackson.annotation.JsonFormat

class KtAnyTest(

//bad: ignored-pattern placeholder failure
    @JsonFormat(pattern = "\${my-placeholder:(\\d{4})\\/(\\d{2})\\/(\\d{2})}")
    val dateWithPlaceholder: LocalDate?,

//good: injection OK
    @JsonFormat(pattern = "(\\d{4})\\/(\\d{2})\\/(\\d{2})")
    val dateWithoutPlaceholder: LocalDate?
)