Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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.functionxcode.syntax.typedefxcode.syntax.declaration.methodとして分類します。これにより、Xcodeのナビゲータエリアなどでコードの構造がツリー表示されるようになります。
  • ブロックと括弧: {}で囲まれたコードブロック、()で囲まれた式、[]で囲まれた式を認識し、それぞれを再帰的に解析するルールが定義されています。これにより、コードのインデントや折りたたみ機能が適切に動作します。

go4xcode.sh

このシェルスクリプトは、go.xclangspecファイルをXcodeにインストールするための自動化された手順を提供します。

  1. Xcodeバージョンのチェック: スクリプトはxcodebuild -versionコマンドを使用してXcodeのメジャーバージョンが4以上であることを確認します。
  2. DVTFoundation.xcplugindataのパス特定: XcodeのバージョンによってDVTFoundation.frameworkのパスが異なるため、スクリプト内でそのパスを定義しています。コメントアウトされた行には、Xcode 4.1と4.3の典型的なパスが例示されています。
  3. 既存エントリの削除オプション: --delete-entry引数を渡すことで、以前にインストールされたGo言語の言語仕様エントリをDVTFoundation.xcplugindataファイルから削除する機能を提供します。これはPlistBuddyコマンドを使用して行われます。
  4. Go言語エントリの追加:
    • Go言語の言語仕様を定義するXML形式の文字列(plist)がGO_LANG_ENTRY変数に格納されます。このXMLは、Go言語がXcodeのソースコード言語として認識されるためのメタデータを含んでいます。
    • languageSpecificationキーの値としてxcode.lang.goが指定されており、これはgo.xclangspecファイル内で定義されているGo言語の言語仕様の識別子と一致します。
    • PlistBuddyを使用して、このXMLエントリがDVTFoundation.xcplugindataファイルの適切なセクション(plug-in:extensions)にマージされます。
  5. go.xclangspecファイルのコピー: go.xclangspecファイルがXcodeのDVTFoundation.framework/Versions/A/Resources/ディレクトリにコピーされます。
  6. キャッシュのクリアと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 も同様)
    

    functypeキーワードに続くパターンを認識し、メソッド、型、関数の宣言として分類します。

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が認識し、特定のスタイル(通常は色)で表示するためのものです。これにより、funcvarifなどのキーワードが目立つようになり、コードの構造が一目でわかるようになります。
  • リテラルとコメント: 生文字列リテラル(バッククォートで囲まれた文字列)や、/* *///形式のコメントもそれぞれ異なるスタイルで表示されます。これにより、コード内のデータや説明部分が明確に区別されます。
  • コード構造の認識: method.declarationtype.declarationfunction.declarationといったルールは、XcodeがGo言語の関数、メソッド、型の定義を識別できるようにします。これにより、Xcodeのナビゲータペイン(通常は左側のサイドバー)にこれらの宣言がツリー構造で表示され、コード内を素早く移動したり、特定の定義にジャンプしたりすることが可能になります。これは、大規模なコードベースを扱う際に非常に役立ちます。
  • ブロックとスコープ: {}()[]などの括弧で囲まれたブロックや式を認識するルールは、Xcodeがコードのインデントを正しく行い、コードの折りたたみ(folding)機能を提供するために重要です。これにより、長い関数や構造体を一時的に非表示にして、コードの全体像を把握しやすくなります。
  • コメントマーカー: TODOFIXMEなどの特殊なコメントマーカーを認識する機能は、開発者がコードレビューやタスク管理を行う上で便利です。これらのマーカーは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プラグインの必要性が言及されています)。

関連リンク

参考にした情報源リンク

  • 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.*$\\)$などの正規表現の構文
  • CaptureTypesxcode.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メニューの存在