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

Improving Swift Tools with libSyntax

Harlan
September 05, 2017

Improving Swift Tools with libSyntax

libSyntax is a new library in the Swift compiler that lets you parse, generate, and analyze Swift files from Swift. Learn how libSyntax works and how to use it to make awesome tools.

Harlan

September 05, 2017
Tweet

More Decks by Harlan

Other Decks in Programming

Transcript

  1. 4FNBOUJD"OBMZTJT 1BSTFS -FYFS $PNQJMFS#BTJDT Lexers, Parsers, Code Gen, Oh My!

    struct Cat {} [kw_struct, ident("Cat"), l_brace, r_brace] $BU 'SPOUFOE #BDLFOE
  2. .BDIJOF-PXFSJOH 4FNBOUJD"OBMZTJT 1BSTFS -FYFS $PNQJMFS#BTJDT Lexers, Parsers, Code Gen, Oh

    My! struct Cat {} [kw_struct, ident("Cat"), l_brace, r_brace] $BU $BU 0QUJNJ[FS 4*-(FO 0101001010100… "OBMZTJT --7.*3(FO 'SPOUFOE #BDLFOE
  3. MJC4ZOUBY ↟ 'VMMTPVSDFQSFTFSWJOH4ZOUBYUSFF ↟ 4XJGUBOE$ "1*T ↟ ,FFQTUSBDLPGBMMUPLFOTBOE5SJWJB ↟ 4QBDFT

    OFXMJOFT DPNNFOUT ↟ &WFSZUIJOHOFDFTTBSZUPQSJOUUIFGJMFCBDLPVU Why throw it all away?
  4. struct Cat {} struct Cat { } struct Feline {}

    struct { } Feline 5SBOTGPSNJOH4ZOUBY struct Feline {} struct Cat {}
  5. struct Cat {} struct Cat { } struct Feline {}

    struct { } Feline 5SBOTGPSNJOH4ZOUBY struct Feline {} struct Cat {}
  6. struct Cat {} struct Cat { } struct Feline {}

    struct { } Feline 5SBOTGPSNJOH4ZOUBY struct Feline {} struct Cat {}
  7. struct Cat {} struct Cat { } struct Feline {}

    struct { } Feline 5SBOTGPSNJOH4ZOUBY struct Feline {} struct Cat {}
  8. 4ZOUBY/PEFT ↟ "TUSVDUGPSFBDILJOEPGOPEF ↟ 5ZQFTBGF"1* ↟ "DDFTTPSTGPSFBDIDIJME ↟ 5SBOTGPSNBUJPONFUIPET public

    class IfStmtSyntax: StmtSyntax { var ifKeyword: TokenSyntax { … } func withIfKeyword(_ node: TokenSyntax) -> IfStmtSyntax { … } // … more methods }
  9. make"1*T let returnKeyword = SyntaxFactory.makeReturnKeyword(trailingTrivia: .spaces(1)) let three = SyntaxFactory.makeIntegerLiteralExpr(3)

    let returnStmt = SyntaxFactory.makeReturnStmt(returnKeyword: returnKeyword, expression: three) Fully Formed and Ready to Go return 3
  10. with"1*T Fully Formed and Ready to Go let returnHello =

    returnStmt.withExpression( SyntaxFactory.makeStringLiteralExpr("Hello")) return "Hello" return 3
  11. 4ZOUBY#VJMEFST let structKeyword = SyntaxFactory.makeStructKeyword( trailingTrivia: .spaces(1)) let catID =

    SyntaxFactory.makeIdentifier("Cat", trailingTrivia: .spaces(1)) struct Cat {}
  12. 4ZOUBY#VJMEFST let structKeyword = SyntaxFactory.makeStructKeyword( trailingTrivia: .spaces(1)) let catID =

    SyntaxFactory.makeIdentifier("Cat", trailingTrivia: .spaces(1)) let struct = StructDeclSyntax { builder in builder.useStructKeyword(structKeyword) builder.useName(catID) builder.useLeftBrace(SyntaxFactory.makeLeftBraceToken()) builder.useRightBrace(SyntaxFactory.makeRightBraceToken()) } struct Cat {}