Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Compiler Pluginで実現するCustom String Interp...

Avatar for Ryosuke Hasebe Ryosuke Hasebe
November 01, 2025
30

Kotlin Compiler Pluginで実現するCustom String Interpolation

Kotlin Fest 2025の資料です。

Avatar for Ryosuke Hasebe

Ryosuke Hasebe

November 01, 2025
Tweet

Transcript

  1. ࣗݾ঺հ w ௕୩෦ྑี w 9!CF@IBTFF w (JU)VC!CFIBTF w αʔόʔαΠυΤϯδχΞ w

    ೥͔Β+BWB ೥͔Β,PUMJOΛαʔόʔαΠυͷ։ൃͰར༻͍ͯ͠·͢ w ෦෼తʹ͸೥͔Β,PUMJOΛ࢖͍ͬͯ·ͨ͠
  2. ,PUMJO$PNQJMFS1MVHJOͷྫ+FU#SBJOTެࣜ w /PBSH w ಛఆΞϊςʔγϣϯ෇͖ΫϥεʹҾ਺ͳ͠ίϯετϥΫλΛࣗಈੜ੒ IUUQTLPUMJOMBOHPSHEPDTOPBSHQMVHJOIUNM w "MMPQFO w ಛఆΞϊςʔγϣϯ෇͖ΫϥεΛࣗಈతʹPQFOԽ

    IUUQTLPUMJOMBOHPSHEPDTBMMPQFOQMVHJOIUNM w LPUMJOYTFSJBMJ[BUJPO w 4FS%Fίʔυͷੜ੒ IUUQTHJUIVCDPN,PUMJOLPUMJOYTFSJBMJ[BUJPO w 1PXFSBTTFSU w ΞαʔγϣϯϨϙʔτΛڧԽ IUUQTLPUMJOMBOHPSHEPDTQPXFSBTTFSUIUNM
  3. ,PUMJO$PNQJMFS1MVHJOͷྫSEQBSUZ w ,41 ,PUMJO4ZNCPM1SPDFTTJOH  w ܰྔͰߴ଎ͳίϯύΠϥϓϥάΠϯ։ൃΛ࣮ݱ IUUQTHJUIVCDPNHPPHMFLTQ w .PLLFSZ

    w ,PUMJO.VMUJQMBUGPSN༻ͷϞοΫϥΠϒϥϦ IUUQTHJUIVCDPNMVQVVTT.PLLFSZ w .BQQJF w ߴੑೳͳΦϒδΣΫτϚοϐϯάΛࣗಈੜ੒͢Δ,PUMJO.VMUJQMBUGPSNϓϥάΠϯ IUUQTHJUIVCDPN.S.BQQJFNBQQJF
  4. ,PUMJO$PNQJMFS ύʔεղੳ౳ ग़ྗ LU DMBTT KT 'SPOUFOE #BDLFOE '*3 ʜ

    *3 ʜ TP '*3'SPOUFOE*OUFSNFEJBUF3FQSFTFOUBUJPO *3*OUFSNFEJBUF3FQSFTFOUBUJPO
  5. ,PUMJO$PNQJMFS ύʔεղੳ౳ ग़ྗ LU DMBTT KT 'SPOUFOE #BDLFOE '*3 ʜ

    *3 ʜ TP '*3'SPOUFOE*OUFSNFEJBUF3FQSFTFOUBUJPO *3*OUFSNFEJBUF3FQSFTFOUBUJPO $PNQJMFS1MVHJOΛ༻͍Δͱɺ 'SPOUFOE͕ੜ੒͢Δ'*3ͱ#BDLFOE͕ੜ੒͢Δ*3Λ֦ு͢Δ͜ͱ͕Ͱ͖·͢
  6. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF
  7. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF
  8. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF w ࡞੒ͨ͠4RM*OUFSQPMBUJPO*S(FOFSBUJPO&YUFOTJPOΛొ࿥
  9. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF w ࡞੒ͨ͠4RM*OUFSQPMBUJPO5SBOTGPSNFSΛద༻
  10. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF w *3֦ுίʔυͷຊମ w ޙͰৄ͘͠ղઆ
  11. w ˝DPNQJMFSQMVHJO w CVJMEHSBEMFLUT w TSDNBJO w LPUMJO w QMVHJO

    w 4RM*OUFSQPMBUJPO$PNQJMFS 1MVHJO3FHJTUSBSLU w 4RM*OUFSQPMBUJPO*S(FOFSBUJ PO&YUFOTJPOLU w 4RM*OUFSQPMBUJPO5SBOTGPS NFSLU w SFTPVSDFT w .&5"*/'TFSWJDFT w PSHKFUCSBJOTLPUMJODPNQJM FSQMVHJO$PNQJMFS1MVHJO3 FHJTUSBS w ▶FYBNQMF w 4FSWJDF-PBEFS͕࢖ΘΕ͍ͯΔͷͰ $PNQJMFS1MVHJO3FHJTUSBSͷ'2%/Λઃஔ
  12. w ▶DPNQJMFSQMVHJO w ˝FYBNQMF w CVJMEHSBEMFLUT w TSDNBJOLPUMJOFYBNQMF w .BJOLU

    w LPUMJO$PNQJMFS1MVHJO$MBTTQBUIDPO fi HVSBUJPOΛ࢖ͬͯɺ DPNQJMFSQMVHJOQSPKFDUʹґଘͤ͞Δ
  13. #BTFEPOTQSJOHEBUBKECDPSTQSJOHEBUBSECD w ,VFSZ$MJFOU͸42-ˍύϥϝʔλͷ ߏங͕ओͳ໾ׂ w େࣄͳ෦෼͸޿͘࢖ΘΕ͍ͯΔ TQSJOHEBUB͕୲౰ w +%#$3%#$྆ํʹରԠ w

    3%#$ͷ৔߹͸TVTQFOEGVOʹͳΔ ,VFSZ$MJFOU TQSJOHEBUBKECD TQSJOHEBUBSECD +%#$ 3%#$ 3FMBUJPOBM%BUBCBTF 42-ύϥϝʔλ 42-ύϥϝʔλ