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

[インデックス 10384] BBEdit Go言語サポートの拡張:error型とrune型のシンタックスハイライト対応

コミット

commit 23f541aa54a1835ba7c851e476f3bc040cd9c103
Author: Anthony Starks <ajstarks@gmail.com>
Date:   Mon Nov 14 11:18:00 2011 -0800

    misc/bbedit: error and rune support
    
    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5369057

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/23f541aa54a1835ba7c851e476f3bc040cd9c103

元コミット内容

このコミットは、BBEditエディタのGo言語サポートファイル(misc/bbedit/Go.plist)に2つの新しいキーワードを追加しました:

  • error - 予約語リストに追加
  • rune - 予約語リストに追加

変更内容:

@@ -23,6 +23,7 @@
 		default,      
 		defer,
 		else,
+		error,
 		fallthrough,
 		false,
 		float32,
@@ -54,6 +55,7 @@
 		real,
 		recover,
 		return,
+		rune,
 		select,
 		string,
 		struct,

変更の背景

2011年当時、Go言語は1.0リリースに向けて急速に発展しており、言語仕様が安定化されていく過程にありました。特に、エラーハンドリングの仕組みとUnicodeサポートの強化が重要な課題でした。

BBEditは当時(現在も)macOSで人気の高いテキストエディタでしたが、Go言語の新しい型システムに対応するため、シンタックスハイライトの更新が必要でした。コミット日(2011年11月)は、Go 1.0のリリース(2012年3月)の約4か月前であり、言語仕様の最終調整期でした。

前提知識の解説

BBEditとは

BBEditは、Bare Bones Softwareが開発したmacOS用のテキストエディタです。以下の特徴があります:

  • シンタックスハイライト: 多数のプログラミング言語をサポート
  • 言語モジュール: .plistファイルによる言語定義
  • 開発者向け機能: 正規表現検索、コードナビゲーション、FTP/SFTP統合
  • 拡張性: カスタム言語モジュールの作成が可能

Go言語における型システムの進化

2011年当時のGo言語は、以下の重要な変更を経験していました:

  1. エラーハンドリングの標準化: os.Errorからerrorインターフェースへの移行
  2. Unicode対応の強化: rune型の明確化
  3. 型システムの整備: Go 1.0に向けた言語仕様の安定化

技術的詳細

error型の技術的背景

Go言語のerror型は、以下のような進化を経ました:

// Go 1.0以前
type Error interface {
    String() string
}

// Go 1.0以降
type error interface {
    Error() string
}

この変更により:

  • エラーハンドリングがより一貫性のあるものになった
  • os.Errorからerrorインターフェースへの移行が可能になった
  • 誤ったString()メソッドによるエラーインターフェースの実装を防げるようになった

rune型の技術的背景

rune型は、Unicodeサポートの核心となる型です:

// rune型の定義
type rune = int32  // Go 1.9以降の型エイリアス記法で表現すると

特徴:

  • Unicode Code Point: 1つのUnicode文字を表現
  • int32エイリアス: 32ビット符号付き整数として実装
  • UTF-8対応: Go言語のUTF-8ベースの文字列処理をサポート

.plistファイルの構造

BBEditの言語定義ファイル(.plist)は、以下の構造を持ちます:

<?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>BBEditDocumentType</key>
    <string>CodelessLanguageModule</string>
    <key>BBLMLanguageDisplayName</key>
    <string>Go</string>
    <key>BBLMLanguageCode</key>
    <string>go</string>
    <key>BBLMKeywordList</key>
    <array>
        <string>break</string>
        <string>case</string>
        <!-- その他のキーワード -->
    </array>
</dict>
</plist>

コアとなるコードの変更箇所

変更された箇所はmisc/bbedit/Go.plistBBLMKeywordList配列内です:

変更箇所1: error型の追加

<!-- 変更前 -->
<string>else</string>
<string>fallthrough</string>

<!-- 変更後 -->
<string>else</string>
<string>error</string>
<string>fallthrough</string>

変更箇所2: rune型の追加

<!-- 変更前 -->
<string>return</string>
<string>select</string>

<!-- 変更後 -->
<string>return</string>
<string>rune</string>
<string>select</string>

コアとなるコードの解説

なぜこの変更が必要だったか

  1. 型の可視性向上: errorruneを予約語としてハイライトすることで、開発者がこれらの重要な型を識別しやすくなります。

  2. コード可読性の向上: シンタックスハイライトにより、Go言語の型システムの理解が促進されます。

  3. 開発効率の向上: エディタレベルでの適切な色分けにより、コードの構造が把握しやすくなります。

技術的な影響

この変更により、BBEditで以下のようなGo言語コードが適切にハイライトされるようになりました:

// errorの使用例
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

// runeの使用例
func processRunes(s string) {
    for _, r := range s {
        if r > 127 {
            fmt.Printf("Non-ASCII rune: %c\n", r)
        }
    }
}

実装の詳細

BBEditの言語モジュールは、以下の処理を行います:

  1. トークン化: ソースコードをトークンに分割
  2. キーワード照合: 定義されたキーワードリストと照合
  3. スタイル適用: マッチしたキーワードに対してスタイルを適用
  4. レンダリング: エディタ上での色分け表示

この変更により、errorruneが他の予約語(if, for, funcなど)と同様に扱われるようになりました。

関連リンク

参考にした情報源リンク