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

Prettier Plugins

Prettier Plugins

フロントエンド 年越し LT忘年会 2019でPrettier PluginsについてLTをしました。
イベントページ( https://kfug.connpass.com/event/153648/ )

Prettier Pluginsを使って何ができるか、ASTについて話しました。

Prettier PluginsによりJavaやRuby、PHP、Kotlin、Elmなどの言語へのPrettierの実行が可能になります。また、JavaScript / TypeScriptなどPrettier本体がサポートしている言語に関しても機能拡張できます。

Masashi Hirano

December 29, 2019
Tweet

More Decks by Masashi Hirano

Other Decks in Programming

Transcript

  1. How to use package jp.com.test; public class Main { public

    static void main(String[] args) { System.out.println("Hello, world"); } } Javaͷ৔߹ Πϯσϯτ͕ἧ͍ͬͯͳ͔ͬͨΓɺ ແବͳۭനߦ͕͋Δ৔߹
  2. How to use package jp.com.test; public class Main { public

    static void main(String[] args) { System.out.println("Hello, world"); } } Javaͷ৔߹ 1SFUUJFSʹΑΓϑΥʔϚοτ͞ΕΔ
  3. How to develop Prettier Plugin • languagesɺparsersɺprintersɺoptionsɺdefaultOptionsΛ༻ҙ͠ ͯnamed export͢Δ •

    ࠷௿ݶˢͷ੺ࣈ͸ඞཁ • ίʔυ͔ΒASTʹม׵͢ΔParser͸npm͔ΒΠϯετʔϧͯ͠࢖͏͜ ͱ͕Մೳ
 e.g. toml_nodeɺjava-parserɺpug-lexerɺ…etc
  4. How to develop Prettier Plugin • languages: Ͳͷ֦ுࢠΛର৅ʹ͢Δ͔ͳͲΛࢦఆ͢Δ • parsers:

    AST΁ͷύʔαʔΛ࣮૷͢Δ • printers: ग़ྗํ๏Λ࣮૷͢Δ
  5. languages (TOMLͷ৔߹) const languages = [ { extensions: ['.toml'], name:

    'TOML', parsers: ['toml-parse'] } ] ֦ுࢠɺ໊લɺQBSTFST ޙड़ ͷ໊લΛࢦఆ
  6. parsers (TOMLͷ৔߹) const parser = require('toml/lib/parser') const parsers = {

    'toml-parse': { parse: text => parser.parse(text), astFormat: 'toml-ast' } } UPNM@OPEFͷQBSTFSΛ࢖ͬͯ"45ʹม׵͢Δ BTU'PSNBU͸ޙड़ͷQSJOUFSTͰ࢖͍·͢
  7. printers (TOMLͷ৔߹) const printers = { 'toml-ast': { print: printToml

    } } QBSTFSTͷBTU'PSNBUͰࢦఆͨ͠UPNMBTUͷ QSJOUʹؔ਺Λࢦఆ͢Δ
  8. printers༻ͷؔ਺ (TOMLͷ৔߹) function printToml(path, options, print) { const node =

    path.getValue() if (Array.isArray(node)) { return concat(path.map(print)) } switch (node.type) { case 'Assign': return concat([node.key, ' = ', path.call(print, 'value'), hardline]) case 'String': // return concat(['"', node.value, '"']) return `"${node.value}"` // ... default: return '' } } "45Λ࢖ͬͯίʔυ΁ͷग़ྗ಺༰Λ࣮૷͢Δɻ ม਺એݴͳͷ͔จࣈྻͳͷ͔ͳͲ͕UZQFͰ൑ఆՄ ೳɺUZQF͝ͱʹग़ྗ಺༰Λม͑Δ
  9. const a = 1; { "type": "Program", "start": 0, "end":

    12, "body": [ { "type": "VariableDeclaration", "start": 0, "end": 12, "declarations": [ { "type": "VariableDeclarator", "start": 6, "end": 11, "id": { "type": "Identifier", "start": 6, "end": 7, "name": "a" }, "init": { "type": "Literal", "start": 10, "end": 11, "value": 1, "raw": "1" } } ], "kind": "const" } ], "sourceType": "module" } ASTม׵