[インデックス 12397] ファイルの概要
このコミットは、Go言語のXcode 4.x向けシンタックスハイライトと基本的な構造情報を提供する言語仕様ファイル (go.xclangspec
) と、そのインストールを補助するシェルスクリプト (go4xcode.sh
) を追加するものです。具体的には、以下の3つのファイルが新規追加されています。
misc/xcode/4/README
: Xcode 4.xでのGo言語シンタックスハイライトに関する説明と、go4xcode.sh
の実行を促すREADMEファイル。misc/xcode/4/go.xclangspec
: Xcode 4.xがGo言語のソースコードを認識し、キーワード、リテラル、コメントなどのシンタックスハイライトを適用するための言語仕様ファイル。また、関数や型宣言などの構造情報も部分的に提供します。misc/xcode/4/go4xcode.sh
:go.xclangspec
ファイルをXcodeの適切なディレクトリにコピーし、Xcodeのプラグインデータファイル (DVTFoundation.xcplugindata
) にGo言語の言語仕様エントリを追加するためのシェルスクリプト。
コミット
commit 4863980f16f3bcd371e5ca8880321fa50afe0626
Author: Emil Hessman <c.emil.hessman@gmail.com>
Date: Mon Mar 5 15:11:08 2012 -0800
Xcode: Example install of language specification for Xcode 4.x.
go.xclangspec is identical to the one in misc/xcode/3/, except for the heading.
Partial workaround for issue 2401.
R=gri
CC=golang-dev
https://golang.org/cl/5732051
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/4863980f16f3bcd371e5ca8880321fa50afe0626
元コミット内容
このコミットは、Xcode 4.x向けにGo言語の言語仕様をインストールする例を提供します。具体的には、Go言語のシンタックスハイライトをXcodeで有効にするためのgo.xclangspec
ファイルと、そのインストールを補助するスクリプトが追加されています。これは、Go言語のIssue 2401に対する部分的な回避策として導入されました。go.xclangspec
ファイルは、既存のXcode 3.x向けのファイルとほとんど同じ内容ですが、ヘッダー部分が更新されています。
変更の背景
この変更の主な背景は、Go言語のIssue 2401です。このIssueは、「Xcode 4.xでGo言語のシンタックスハイライトをサポートする」という要望でした。XcodeはAppleの開発環境であり、多くの開発者が利用しています。Go言語のコードをXcodeで編集する際に、シンタックスハイライトがないとコードの可読性が著しく低下し、開発効率が損なわれます。
以前のXcode 3.x向けには既にGo言語の言語仕様ファイルが存在していましたが、Xcode 4.xでは内部構造やプラグインの仕組みが変更されたため、既存のファイルがそのままでは機能しませんでした。このコミットは、Xcode 4.xの新しい要件に合わせてGo言語のシンタックスハイライトを可能にするための、暫定的な解決策として導入されました。コミットメッセージにある「Partial workaround」という表現は、完全なXcodeプラグインとしてではなく、手動での設定やスクリプトによる補助が必要な、一時的な対応であることを示唆しています。
前提知識の解説
Xcode
Xcodeは、Appleが開発したmacOS、iOS、iPadOS、watchOS、tvOS向けの統合開発環境(IDE)です。ソフトウェア開発に必要なエディタ、コンパイラ、デバッガ、シミュレータなどのツールが統合されています。XcodeはObjective-C、Swift、C、C++などの言語をサポートしており、プラグインや言語仕様ファイルを追加することで、他の言語のサポートを拡張することも可能です。
言語仕様ファイル(.xclangspec)
Xcodeでは、各プログラミング言語のシンタックスハイライト、コード補完、構造解析などを定義するために「言語仕様ファイル」を使用します。これらのファイルは通常.xclangspec
という拡張子を持ち、XMLベースのプロパティリスト(plist)形式で記述されます。xclangspec
ファイルは、特定の言語のキーワード、コメント形式、文字列リテラル、数値リテラルなどを定義し、Xcodeがそれらを適切に色付けしたり、コード構造を認識したりできるようにします。
シンタックスハイライト
シンタックスハイライトとは、プログラミング言語の構文要素(キーワード、変数、関数、コメントなど)を異なる色やフォントスタイルで表示する機能です。これにより、コードの可読性が向上し、構文エラーの発見が容易になります。
PlistBuddy
PlistBuddy
は、macOSに標準で搭載されているコマンドラインツールで、プロパティリスト(.plist
)ファイルを操作するために使用されます。プロパティリストは、macOSやiOSアプリケーションの設定情報などを保存するために広く使われるXMLまたはバイナリ形式のファイルです。PlistBuddy
を使うと、プロパティリストの読み込み、書き込み、要素の追加、削除、変更などがコマンドラインから行えます。このコミットでは、Xcodeのプラグインデータファイル(これもplist形式)にGo言語の言語仕様エントリを追加するために利用されています。
DVTFoundation.xcplugindata
DVTFoundation.xcplugindata
は、Xcodeの内部で使用されるプラグインデータファイルの一つです。Xcodeが起動時に読み込むプラグインや言語仕様に関する情報が含まれています。このファイルは通常、Xcodeのアプリケーションバンドル内の特定のパスに存在し、Xcodeの動作に深く関わるため、手動での変更は注意が必要です。このコミットのgo4xcode.sh
スクリプトは、このファイルにGo言語の言語仕様への参照を追加することで、XcodeにGo言語のサポートを認識させようとします。
技術的詳細
このコミットの技術的詳細は、主にgo.xclangspec
ファイルとgo4xcode.sh
スクリプトの2つの新規ファイルに集約されます。
go.xclangspec
このファイルは、Go言語のシンタックスハイライトと基本的なコード構造認識のためのルールを定義しています。
- キーワードの定義:
break
,case
,chan
,const
,continue
,default
,defer
,else
,fallthrough
,for
,func
,go
,goto
,if
,import
,interface
,map
,package
,range
,return
,select
,struct
,switch
,type
,var
といったGo言語の予約語がxcode.syntax.keyword
として定義されています。 - 識別子: 英数字とアンダースコアで構成される識別子が定義されています。
- 文字列リテラル: バッククォートで囲まれたGo言語の生文字列リテラル(raw string literal)が
xcode.syntax.string
として認識されます。 - コメント:
/* ... */
形式の複数行コメントと//
形式の単一行コメントがxcode.syntax.comment
として定義され、折りたたみ可能(Foldable)な設定も含まれています。 - 特殊なコメントマーカー:
BUG
,TODO
,FIXME
,MARK:
,!!!:
,???:
といったコメント内の特殊なマーカーを認識し、Xcodeのファイルマーカーリストに表示するためのルールが含まれています。これは、開発者がコード内の重要なポイントや未解決の問題をマークするのに役立ちます。 - 構造認識:
func
キーワードを使った関数宣言、type
キーワードを使った型宣言、およびメソッド宣言を認識し、それぞれxcode.syntax.declaration.function
、xcode.syntax.typedef
、xcode.syntax.declaration.method
として分類します。これにより、Xcodeのナビゲータエリアなどでコードの構造がツリー表示されるようになります。 - ブロックと括弧:
{}
で囲まれたコードブロック、()
で囲まれた式、[]
で囲まれた式を認識し、それぞれを再帰的に解析するルールが定義されています。これにより、コードのインデントや折りたたみ機能が適切に動作します。
go4xcode.sh
このシェルスクリプトは、go.xclangspec
ファイルをXcodeにインストールするための自動化された手順を提供します。
- Xcodeバージョンのチェック: スクリプトは
xcodebuild -version
コマンドを使用してXcodeのメジャーバージョンが4以上であることを確認します。 - DVTFoundation.xcplugindataのパス特定: Xcodeのバージョンによって
DVTFoundation.framework
のパスが異なるため、スクリプト内でそのパスを定義しています。コメントアウトされた行には、Xcode 4.1と4.3の典型的なパスが例示されています。 - 既存エントリの削除オプション:
--delete-entry
引数を渡すことで、以前にインストールされたGo言語の言語仕様エントリをDVTFoundation.xcplugindata
ファイルから削除する機能を提供します。これはPlistBuddy
コマンドを使用して行われます。 - Go言語エントリの追加:
- Go言語の言語仕様を定義するXML形式の文字列(plist)が
GO_LANG_ENTRY
変数に格納されます。このXMLは、Go言語がXcodeのソースコード言語として認識されるためのメタデータを含んでいます。 languageSpecification
キーの値としてxcode.lang.go
が指定されており、これはgo.xclangspec
ファイル内で定義されているGo言語の言語仕様の識別子と一致します。PlistBuddy
を使用して、このXMLエントリがDVTFoundation.xcplugindata
ファイルの適切なセクション(plug-in:extensions
)にマージされます。
- Go言語の言語仕様を定義するXML形式の文字列(plist)が
go.xclangspec
ファイルのコピー:go.xclangspec
ファイルがXcodeのDVTFoundation.framework/Versions/A/Resources/
ディレクトリにコピーされます。- キャッシュのクリアとXcodeの再起動指示: 変更を即座に反映させるために、
sudo rm -rf /var/folders/*
を実行してシステムキャッシュをクリアし、Xcodeを再起動するようユーザーに促します。また、シンタックスハイライトは手動で選択する必要があることも伝えています。
コアとなるコードの変更箇所
misc/xcode/4/go.xclangspec
このファイル全体が新規追加されており、Go言語のシンタックスハイライトと構造認識のルールを定義しています。特に重要なのは以下のセクションです。
-
キーワード定義:
Words = ( "break", "case", "chan", "const", "continue", // ... (Go言語の予約語が続く) "type", "var", ); Type = "xcode.syntax.keyword";
Go言語の予約語が
xcode.syntax.keyword
として認識されるように定義されています。 -
生文字列リテラル:
{ Identifier = "xcode.lang.go.rawstring"; Syntax = { Start = "`"; End = "`"; Type = "xcode.syntax.string"; }; },
バッククォートで囲まれた生文字列が文字列としてハイライトされます。
-
言語仕様のメインエントリ:
{ Identifier = "xcode.lang.go"; Description = "Go Coloring"; BasedOn = "xcode.lang.simpleColoring"; IncludeInMenu = YES; Name = "Go"; Syntax = { Tokenizer = "xcode.lang.go.lexer.toplevel"; IncludeRules = ( "xcode.lang.go.block", "xcode.lang.go.bracketexpr", "xcode.lang.go.parenexpr", ); Type = "xcode.syntax.plain"; }; },
これがXcodeにGo言語の言語仕様として認識させるための主要なエントリです。
IncludeInMenu = YES
により、XcodeのエディタメニューからGo言語のシンタックスハイライトを選択できるようになります。 -
宣言の認識:
{ Identifier = "xcode.lang.go.method.declaration"; Syntax = { Tokenizer = "xcode.lang.go.lexer"; Rules = ( "func", "xcode.lang.go.parenexpr", "xcode.lang.go.identifier", "xcode.lang.go.parenexpr", ); Type = "xcode.syntax.declaration.method"; }; }, // ... (type.declaration, function.declaration も同様)
func
やtype
キーワードに続くパターンを認識し、メソッド、型、関数の宣言として分類します。
misc/xcode/4/go4xcode.sh
このシェルスクリプト全体が新規追加されており、Xcodeのシステムファイルを変更してGo言語のサポートを有効にします。
-
DVTFOUNDATION_DIRの定義:
+DVTFOUNDATION_DIR="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"
Xcodeのインストールパスに応じてこの変数を変更する必要があることがコメントで示されています。
-
Go言語エントリのXML定義:
+GO_LANG_ENTRY=" + <?xml version=\"1.0\" encoding=\"UTF-8\"?> + <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"> + <plist version=\"1.0\"> + <dict> + <key>Xcode.SourceCodeLanguage.Go</key> + <dict> + <key>conformsTo</key> + <array> + <dict> + <key>identifier</key> + <string>Xcode.SourceCodeLanguage.Generic</string> + </dict> + </array> + <key>documentationAbbreviation</key> + <string>go</string> + <key>fileDataType</key> + <array> + <dict> + <key>identifier</key> + <string>com.apple.xcode.go-source</string> + </dict> + </array> + <key>id</key> + <string>Xcode.SourceCodeLanguage.Go</string> + <key>languageName</key> + <string>Go</string> + <key>languageSpecification</key> + <string>xcode.lang.go</string> + <key>name</key> + <string>The Go Programming Language</string> + <key>point</key> + <string>Xcode.SourceCodeLanguage</string> + <key>version</key> + <string>$GO_VERSION</string> + </dict> + </dict> + </plist> +"
この長いXML文字列が、Xcodeのプラグインデータファイルに挿入されるGo言語の言語仕様の定義です。
languageSpecification
キーの値がxcode.lang.go
となっており、これがgo.xclangspec
ファイル内のIdentifierと紐付けられます。 -
PlistBuddyによるマージ:
+$PLISTBUDDY -c "Merge $PLIST_FILE plug-in:extensions" $DVTFOUNDATION_DIR/$PLUGINDATA_FILE
PlistBuddy
コマンドを使って、生成したGo言語の言語エントリをXcodeの既存のプラグインデータファイルにマージしています。 -
go.xclangspec
のコピー:+cp $GOROOT/misc/xcode/4/go.xclangspec $DVTFOUNDATION_DIR
go.xclangspec
ファイルをXcodeが言語仕様ファイルを読み込むディレクトリにコピーしています。
コアとなるコードの解説
go.xclangspec
の解説
go.xclangspec
ファイルは、XcodeがGo言語のソースコードをどのように解釈し、表示するかを定義する「レシピ」のようなものです。
- シンタックスハイライト: ファイル内で定義された
Words
リストは、Go言語の予約語をXcodeが認識し、特定のスタイル(通常は色)で表示するためのものです。これにより、func
、var
、if
などのキーワードが目立つようになり、コードの構造が一目でわかるようになります。 - リテラルとコメント: 生文字列リテラル(バッククォートで囲まれた文字列)や、
/* */
、//
形式のコメントもそれぞれ異なるスタイルで表示されます。これにより、コード内のデータや説明部分が明確に区別されます。 - コード構造の認識:
method.declaration
、type.declaration
、function.declaration
といったルールは、XcodeがGo言語の関数、メソッド、型の定義を識別できるようにします。これにより、Xcodeのナビゲータペイン(通常は左側のサイドバー)にこれらの宣言がツリー構造で表示され、コード内を素早く移動したり、特定の定義にジャンプしたりすることが可能になります。これは、大規模なコードベースを扱う際に非常に役立ちます。 - ブロックとスコープ:
{}
、()
、[]
などの括弧で囲まれたブロックや式を認識するルールは、Xcodeがコードのインデントを正しく行い、コードの折りたたみ(folding)機能を提供するために重要です。これにより、長い関数や構造体を一時的に非表示にして、コードの全体像を把握しやすくなります。 - コメントマーカー:
TODO
やFIXME
などの特殊なコメントマーカーを認識する機能は、開発者がコードレビューやタスク管理を行う上で便利です。これらのマーカーはXcodeの特定のUI要素(例えば、ファイル内のマーカーリスト)に表示され、未完了の作業や修正が必要な箇所を追跡しやすくなります。
go4xcode.sh
の解説
go4xcode.sh
スクリプトは、go.xclangspec
ファイルをXcodeに「登録」するための自動化された手順を提供します。
- Xcodeへの登録: Xcodeは、どの言語をサポートしているか、そしてその言語の言語仕様ファイルがどこにあるかを、
DVTFoundation.xcplugindata
という内部のプロパティリストファイルで管理しています。このスクリプトは、PlistBuddy
というツールを使って、このDVTFoundation.xcplugindata
ファイルにGo言語の新しいエントリを追加します。このエントリには、Go言語の名前、識別子、そしてgo.xclangspec
ファイルへの参照が含まれています。これにより、XcodeはGo言語の存在を認識し、対応する言語仕様ファイルを読み込むようになります。 - ファイルの配置: スクリプトは、
go.xclangspec
ファイルをXcodeが言語仕様ファイルを検索する特定のディレクトリ(通常はDVTFoundation.framework
内のResources
ディレクトリ)にコピーします。これにより、Xcodeは登録されたエントリに基づいて、実際にGo言語のルールを適用できるようになります。 - ユーザーへの指示: スクリプトは、変更を有効にするためにXcodeを再起動する必要があること、そしてシステムキャッシュをクリアする必要があることをユーザーに伝えます。これは、Xcodeが起動時にプラグインデータファイルを読み込むため、変更が即座に反映されない場合があるためです。また、シンタックスハイライトは手動で選択する必要があることも明記されており、これはこのソリューションが完全なプラグインではないためです。
このスクリプトは、Xcodeの内部ファイルシステムに直接変更を加えるため、管理者権限(sudo
)が必要となる場合があります。また、Xcodeのアップデートによって内部パスやファイル構造が変更される可能性があるため、将来的にこのスクリプトが動作しなくなる可能性も示唆されています(FIXME
コメントでより堅牢なXcodeプラグインの必要性が言及されています)。
関連リンク
- Go言語のIssue 2401: https://github.com/golang/go/issues/2401
- Go言語のCL 5732051: https://golang.org/cl/5732051
参考にした情報源リンク
- Xcodeの言語仕様ファイルに関する古いドキュメント(
go.xclangspec
内のコメントで参照されています): http://maxao.free.fr/xcode-plugin-interface/specifications.html - PlistBuddyのmanページ (macOSのターミナルで
man PlistBuddy
で参照可能) - Xcodeのプラグイン開発に関する一般的な情報 (Stack Overflow, Apple Developer Documentationなど)
- Go言語の公式ドキュメント (キーワード、構文など)
- GitHubのGoリポジトリのコミット履歴
- Go言語のIssueトラッカー
- Xcodeのバージョンごとのファイルパスに関する情報 (Stack Overflowなど)
xcodebuild
コマンドのドキュメント (macOSのターミナルでman xcodebuild
で参照可能)- シェルスクリプトの基本的な構文とコマンド (
set -e
,awk
,substr
,cp
,rm
など) - XMLとプロパティリストの形式に関する一般的な知識
- シンタックスハイライトの概念に関する一般的な情報
- 統合開発環境 (IDE) の機能に関する一般的な知識
- Gitのコミットメッセージの読み方と解釈
- Go言語のIssue 2401の議論内容 (GitHub Issueページ)
- Go言語のCL (Change List) の内容 (Gerrit Code Review)
DVTFoundation.framework
の役割に関する情報 (Xcodeの内部構造に関する情報源)xcplugindata
ファイルの構造に関する情報 (Xcodeの内部構造に関する情報源)GOROOT
環境変数の意味 (Go言語のインストールパス)xcode.lang.simpleColoring
などのXcodeの組み込み言語仕様の概念xcode.syntax.keyword
,xcode.syntax.string
,xcode.syntax.comment
などのXcodeのシンタックスタイプxcode.syntax.declaration.method
,xcode.syntax.typedef
,xcode.syntax.declaration.function
などのXcodeの構造タイプFoldable
,Recursive
などのxclangspec
のプロパティxcode.lang.url
,xcode.lang.url.mail
,xcode.lang.comment.mark
などのXcodeの組み込みルール^\\(BUG.*$\\)$
,^\\(TODO.*$\\)$
などの正規表現の構文CaptureTypes
とxcode.syntax.mark
の関連性conformsTo
,fileDataType
,languageName
,languageSpecification
,point
,version
などのxcplugindata
のキーの意味com.apple.xcode.go-source
などのUTI (Uniform Type Identifier) の概念$GO_VERSION
変数の利用方法sudo rm -rf /var/folders/*
コマンドの目的と影響Editor - Syntax Coloring
メニューの存在