俚语 0.2.0

俚语 0.2.0

Ian Bytchek维护。



 
依赖
SourceKittenFramework~> 0.32
STRegex~> 2.1
 

俚语 0.2.0

  • 作者
  • Ian Bytchek

Slang Build Status Supported Platforms license Carthage Compatible Swift Package Manager Compatible

俚语是一个Swift语言的源代码查询和编辑框架 — 它建立在SourceKitten之上(SourceKitten自身建立在SourceKit之上)并提供对代码片段、语法和结构的简单访问,以便在分析和修改它们时使用。

用法

查看Slang playground和单元测试以获取更多用法示例。以下是提取Swift源代码元素并修改它们的简单展示。

import Slang

let source: String = "import Foundation; class Foo { let bar = 1 }"
let file: File = File(source)
let disassembly: Disassembly = try! Disassembly(file)
var edits: [Edit] = []

// Change "Foundation" identifier to "AppKit".
edits.append(Edit(disassembly.query.syntax.first(of: .identifier).select(where: { $0.contents == "Foundation" }).one!, "AppKit"))
// Change "class" keyword to "struct".
edits.append(Edit(disassembly.query.structure.children(of: .decl(.class)).syntax.first(of: .keyword).one!, "struct"))
// Change "bar" property value from "1" to "BAR".
edits.append(Edit(disassembly.query.structure.children(of: .decl(.class)).syntax.last(of: .number).one!, "\"BAR\""))

print(file.contents.applying(edits))
// import AppKit; struct Foo { let bar = "BAR" }

解析

源代码通过Disassembly类进行解析(反汇编),分解为三个视图

  • 片段 - 原始源代码的字符串切片。
  • 语法 - Swift语言语法定义符,例如importclassvar等。
  • 结构 -包含其他子结构的独立代码块。

语法结构封装了SourceKitten原语及其等价对应物。

查询

每个反汇编的源代码视图(或上下文)有三种查询类型:FragmentQuerySyntaxQueryStructureQuery。查询可通过Disassembly对象的query属性访问。

所有查询具有共同的特征

  • 它们都使用谓词过滤当前选择,创建子查询。
  • 所有查询还遵循Collection协议,允许使用子脚本。
  • 查询扩展提供了基本操作的方便匹配器,但可以使用自定义谓词在更复杂的情况下使用。

并且属性

  • disassembly -引用Disassembly实例。
  • selection -查询要查询的初始查询选择集。
  • one –第一个选择元素,可以是nil
  • all -整个查询选择,可以是空的。

编辑

Edit对象提供编辑指令(插入、替换或删除)并将指令应用于给定字符串。Edit对象提供了便利初始化器,并提供了String扩展以直接应用单个或多个编辑。

动机

SourceKitten 为将 Swift 代码解析成结构化输出的必要工具提供支持。然而,任何进一步的分析和源代码操作都需要手动执行,并且需要大量的样板代码。Slang 致力于提供可扩展的 Swift 源代码解析、提取和操作框架及结构。

安装

Carthage

在您的 Cartfile 中添加 Slang

github "Swifteroid/Slang" ~> 0.1

CocoaPods

在您的 Podfile 中添加 Slang

pod 'Slang', '~> 0.1'

Swift 包管理器

将 Slang 添加到您的 Package.swift 包的依赖项中

.package(url: "https://github.com/Swifteroid/Slang.git", from: "0.1.0")