俚语是一个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语言语法定义符,例如import
,class
,var
等。结构
-包含其他子结构的独立代码块。
语法
和结构
封装了SourceKitten原语及其等价对应物。
查询
每个反汇编的源代码视图(或上下文)有三种查询类型:FragmentQuery
,SyntaxQuery
和StructureQuery
。查询可通过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")