Skip to content

An Xcode Source Editor extension to generate custom getter methods.

Notifications You must be signed in to change notification settings

Talon2333/OwnTools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Xcode Source Editor Extension

用了一段时间Tools for Xcode,感觉生成代码功能挺好用的,很好奇它是如何实现的。搜索一番,最后找到了Source Editor Extension

Tools for Xcode

此文只是大致梳理了Source Editor Extension的使用流程及遇到的问题,详细内容可查看苹果官方文档XcodeKit,另外本文最后实现了一个自定义生成Getter的demo。

创建一个源代码编辑器扩展

您可以使用 XcodeKit 在 Xcode 中构建源代码编辑器的扩展。源代码编辑器扩展可以读取和修改源文件的内容,以及读取和修改编辑器中的当前选择的文本。

在 Xcode 中创建一个新的 macOS 项目

要创建源代码编辑器扩展,首先在 Xcode 中创建一个新的 macOS 项目。将一个新的 Xcode Source Editor Extension 目标添加到您的项目中,如下图所示,并在出现提示时将其激活。

Create Extension Activate

添加extension完成后,会自动生成SourceEditorCommand类,该类实现了XCSourceEditorCommand协议,协议中定义了performCommandWithInvocation:completionHandler: 方法,当用户点击菜单中添加的命令时,都会调用此方法。

添加可自定义的行为

添加命令

在添加的extension目录下找到info文件,并在XCSourceEditorCommandDefinitions下添加item

实现命令功能

SourceEditorCommand文件中,通过填写方法的主体,将可自定义的行为添加到您的源代码编辑器扩展。以下示例显示了一个反转源代码编辑器中的行顺序的命令:performCommandWithInvocation:completionHandler:

class SourceEditorCommand: NSObject, XCSourceEditorCommand {
    func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
        // Retrieve the contents of the current source editor.
        let lines = invocation.buffer.lines
        // Reverse the order of the lines in a copy.
        let updatedText = Array(lines.reversed())
        lines.removeAllObjects()
        lines.addObjects(from: updatedText)
        // Signal to Xcode that the command has completed.
        completionHandler(nil)
    }
}

测试您的源代码编辑器扩展

源代码编辑器扩展在单独的 Xcode 中运行,以帮助防止正在进行的扩展中的错误干扰您的开发环境。

测试源代码编辑器扩展

选择扩展方案后,通过运行extension来测试您正在开发的源代码编辑器扩展。将出现一个对话框,要求您选择要运行的应用程序。

选择 Xcode,您的源代码编辑器扩展在 Xcode 的第二个实例中初始化。您可以根据应用程序图标的背景颜色来区分 Xcode 的两个实例。运行源代码编辑器扩展的 Xcode 实例具有黑色背景,而不是第一个实例的浅蓝色背景。
要测试您的扩展定义的命令,请在 Xcode 的测试实例中打开一个源文件。扩展程序定义的所有命令都出现在`Editor`中,嵌套在扩展程序的名称下,如下图:

选择一个命令后,SourceEditorCommand类中的performCommandWithInvocation:completionHandler:方法将会被调用。通过参数XCSourceEditorCommandInvocation中的commandIdentifier来区分不用的命令。

当您测试您的源代码编辑器扩展时,Xcode的原始实例会继续运行。您可以使用它来调试或查看您正在测试的扩展的控制台输出。

踩坑

1.运行黑色Xcode后,Editor下没有出现定义的命令

首先确认info文件中的命令配置无误后,可尝试把XcodeKit.framework删除后重新导入。

然后再确认下设置扩展中,您的应用程序是否选中Xcode Source Editor

实战——实现自定义Getter生成工具

使用流程

选中属性后,点击Editor下配置的Getter生成命令(可配置快捷键),便可自动生成对应的Getter方法,生成的Getter方法模版可自定义。

CustomGetter1 CustomGetter2 CustomGetter3

自定义Getter介绍

将对应类的Getter模版拷贝到上方的输入框中,点击添加按钮即可添加。当类已添加时,会覆盖模版。

实现大致流程

  • 获取到选中的行,然后遍历处理每一行
  • 尝试获取行中属性的类名属性名,获取失败则continue
  • 根据获取的类名找到对应的Getter方法模版
  • 替换模版中的类名属性名

简书地址,Xcode Source Editor Extension

最后

参考文章

Releases

No releases published

Packages

No packages published

Languages