Language-tools: ํ˜ธ๋ฒ„ ๋ฌธ์„œ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋…์ŠคํŠธ๋ง์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ๋ฌธ์„œํ™”

์— ๋งŒ๋“  2020๋…„ 07์›” 05์ผ  ยท  16์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sveltejs/language-tools

๋ฌธ์ œ

React์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ ์š”์†Œ์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/** Documentation that will appear on hover in other places where this is imported */
function MyComponent() { return null }

๊ทธ๋Ÿฌ๋‚˜ Svelte์—์„œ๋Š” ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…

VSCode ๋ฐ Vim/Neovim(coc.nvim ํฌํ•จ)๊ณผ ๊ฐ™์€ ํŽธ์ง‘๊ธฐ์˜ ์˜จ-์˜ค๋ฒ„ ๋ฌธ์„œ์—์„œ ์ฑ„ํƒํ•  ์ฃผ์„์„ ์–ด๋””์— ๋‘˜ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— MyComponent ์žˆ์ง€๋งŒ import MyComponent .

image

๋‚ด ๋…์ŠคํŠธ๋ง Documentation that will appear on hover in other places where this is imported ์„ ํˆดํŒ์— ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ์ž ์‹œ ๋™์•ˆ ์ฃผ์œ„๋ฅผ ๋‘˜๋Ÿฌ ๋ณด์•˜๊ณ  TypeScript๋กœ ๋กœ์ปฌ ์„ค์ •์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Svelte ๊ตฌ์„ฑ ์š”์†Œ ์— ๋Œ€ํ•œ

ํŽธ์ง‘: ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๋” ์ž˜ ์ถ”๊ฐ€๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋…ผ์˜ ์ค‘์ด๋ฏ€๋กœ https://github.com/sveltejs/svelte/issues/5102 ์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Fixed enhancement

๋ชจ๋“  16 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ์—๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ HTML ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. svelte2tsx ๋Š” ํŠน์ˆ˜ ํƒœ๊ทธ(์˜ˆ @doc )๋กœ ์‹œ์ž‘ํ•˜๋Š” HTML ์ฃผ์„์„ ์ฐพ๊ณ  ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„์— ๋‚ด์šฉ์„ jsdoc๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ? ๋‹ค๋ฅธ ์•„์ด๋””์–ด?

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค์ผ _๋งค์šฐ ์ž์ฃผ_ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/**
 * <strong i="6">@file</strong> Here is my documentation for this component
 */

ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„. ํ•˜์ง€๋งŒ HTML ์ฃผ์„๋งŒ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

๋˜ํ•œ ๋‹ค๋ฅธ ํƒœ๊ทธ์™€ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด <svelte:head> ์™€ ์œ ์‚ฌํ•œ <svelte:documentation> ํƒœ๊ทธ๊ฐ€ ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ <svelte:options documentation="blabla" /> ?

๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์•ฝ๊ฐ„์˜ ์ž‘์—…๊ณผ ๊ธฐ๋ณธ ์ €์žฅ์†Œ์˜ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฉ”์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค :+1:

https://github.com/sveltejs/language-tools/pull/282 ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋ฉด ์ ˆ๋ฐ˜์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. LSP๋Š” ํ˜ธ๋ฒ„์— ๋ฌธ์„œ ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ @doc HTML ์ฃผ์„์—์„œ ๋…์ŠคํŠธ๋ง์„ ๊ฐ€์ ธ์™€ svelte2tsx์˜ addComponentExport ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dummdidumm ํ˜„์žฌ ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์—

export default class {
    $$prop_def = __sveltets_partial(render().props)
    $$slot_def = render().slots
}

๊ฐ ํŒŒ์ผ์˜ ๋ฃจํŠธ ๋ฒ”์œ„์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ render ๋ฐ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฟ์ด๋ฏ€๋กœ Component ์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ฌดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํŒŒ์ผ ์ด๋ฆ„์—์„œ ์„ ํƒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋„ค, ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฒฐ๊ตญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Ÿฐํƒ€์ž„์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋„๊ตฌ ์ง€์›์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๊ทธ๋ƒฅ ๋„๊ตฌ.
๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ ์ •๋ณด: ๊ฐ€์ ธ์˜ค๊ธฐ ์ž๋™ ์™„์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งž์•„์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜„์žฌ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด TS ์ „์šฉ ํ™˜๊ฒฝ์—์„œ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋ ค๊ณ  ํ•˜๋ฉด:

// Component.ts
export default class {}

๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” Component ์— ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ Svelte์—์„œ๋Š” ์–ด๋–ป๊ฒŒ๋“  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ LSP์—์„œ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋Œ€์‹  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:

// Component.ts
export default class Component {}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ Component ๋กœ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ์ด๋ฆ„์„ ํŒŒ์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ง€์ •ํ•œ ๋‹ค์Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ LSP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ์ž๋™ ์™„์„ฑ์— ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export default class {
  // etc
}

๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ๋“ค:

  • ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ์ค„์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • export default class Name ์ค„์— ๋ฐ”๋กœ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

~ ๋‘˜ ๋‹ค ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ์™„์„ฑ ๊ณต๊ธ‰์ž(https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts)๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์ธ์€ TS ์ „์šฉ ํ™˜๊ฒฝ์—์„œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…๋ช…๋œ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.~

์—…๋ฐ์ดํŠธ: ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ ๋‚ด๋ณด๋‚ด๊ธฐ ์ด๋ฆ„์ด ํŒŒ์ผ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ํ•œ ๋‹ค๋ฅธ ์ค„์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์˜ต์…˜์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์–‡์€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์ œ์•ˆ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. svelte2tsx์— ํŒŒ์ผ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๋ช…๋ช…๋œ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/sveltejs/language-tools/pull/285 ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰