--- /dev/null
+/*
+ Copyright 2012 The Go Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
+
+ go.xclangspec
+ Go language specification for Xcode 4.x.
+
+ This is a preliminary version that supports basic syntax coloring
+ (such as keywords, literals, and comments) and an attempt to provide
+ some structure information (incomplete).
+
+ There is not much documentation available regarding the format
+ of .xclangspec files. As a starting point, see for instance the
+ outdated documentation at:
+
+ http://maxao.free.fr/xcode-plugin-interface/specifications.html
+
+*/
+
+(
+
+// ----------------------------------------------------------------------------
+// Keywords
+
+// TODO How do we get general Unicode identifiers?
+
+ {
+ Identifier = "xcode.lang.go.identifier";
+ Syntax = {
+ StartChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
+ Chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
+ Words = (
+ "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",
+ );
+ Type = "xcode.syntax.keyword";
+ AltType = "xcode.syntax.identifier"; // non-keywords are identifiers
+ };
+ },
+
+// TODO decide what should go here, if anything
+ {
+ Identifier = "xcode.lang.go.interestingOperators";
+ Syntax = {
+ Words = (
+ "...",
+ ".",
+ "*",
+ ",",
+ ":",
+ );
+ Type = "xcode.syntax.plain";
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.rawstring";
+ Syntax = {
+ Start = "`";
+ End = "`";
+ Type = "xcode.syntax.string";
+ };
+ },
+
+// ----------------------------------------------------------------------------
+// Syntax Coloring
+
+ {
+ 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";
+ };
+ },
+
+ // The following rule returns tokens to the other rules
+ {
+ Identifier = "xcode.lang.go.lexer";
+ Syntax = {
+ IncludeRules = (
+ "xcode.lang.go.comment",
+ "xcode.lang.go.comment.singleline",
+ "xcode.lang.string",
+ "xcode.lang.character",
+ "xcode.lang.go.rawstring",
+ "xcode.lang.go.identifier",
+ "xcode.lang.number",
+ "xcode.lang.go.interestingOperators",
+ );
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.lexer.toplevel";
+ Syntax = {
+ IncludeRules = (
+ "xcode.lang.go.comment",
+ "xcode.lang.go.comment.singleline",
+ "xcode.lang.string",
+ "xcode.lang.character",
+ "xcode.lang.go.rawstring",
+ "xcode.lang.go.type.declaration",
+ "xcode.lang.go.method.declaration",
+ "xcode.lang.go.function.declaration",
+ "xcode.lang.go.identifier",
+ "xcode.lang.number",
+ );
+ };
+ },
+
+ {
+ 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";
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.type.declaration";
+ Syntax = {
+ Tokenizer = "xcode.lang.go.lexer";
+ Rules = (
+ "type",
+ "xcode.lang.go.identifier",
+ );
+ Type = "xcode.syntax.typedef";
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.function.declaration";
+ Syntax = {
+ Tokenizer = "xcode.lang.go.lexer";
+ Rules = (
+ "func",
+ "xcode.lang.go.identifier",
+ "xcode.lang.go.parenexpr",
+ );
+ Type = "xcode.syntax.declaration.function";
+ };
+ },
+
+// ----------------------------------------------------------------------------
+// Blocks
+
+ {
+ Identifier = "xcode.lang.go.block";
+ Syntax = {
+ Tokenizer = "xcode.lang.go.lexer";
+ Start = "{";
+ End = "}";
+ Foldable = YES;
+ Recursive = YES;
+ IncludeRules = (
+ "xcode.lang.go.bracketexpr",
+ "xcode.lang.go.parenexpr",
+ );
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.parenexpr";
+ Syntax = {
+ Tokenizer = "xcode.lang.go.lexer";
+ Start = "(";
+ End = ")";
+ Recursive = YES;
+ IncludeRules = (
+ "xcode.lang.go.bracketexpr",
+ "xcode.lang.go.block",
+ );
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.bracketexpr";
+ Syntax = {
+ Tokenizer = "xcode.lang.go.lexer";
+ Start = "[";
+ End = "]";
+ Recursive = YES;
+ IncludeRules = (
+ "xcode.lang.go.parenexpr",
+ );
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.comment";
+ Syntax = {
+ Start = "/*";
+ End = "*/";
+ Foldable = YES;
+ IncludeRules = (
+ "xcode.lang.url",
+ "xcode.lang.url.mail",
+ "xcode.lang.comment.mark",
+ );
+ Type = "xcode.syntax.comment";
+ };
+ },
+
+ {
+ Identifier = "xcode.lang.go.comment.singleline";
+ Syntax = {
+ Start = "//";
+ End = "\n";
+ IncludeRules = (
+ "xcode.lang.url",
+ "xcode.lang.url.mail",
+ "xcode.lang.comment.mark",
+ );
+ Type = "xcode.syntax.comment";
+ };
+ },
+
+ // This rule recognizes special comments markers and adds them
+ // to the list of file markers at the top of the editor window.
+ // This overrides the markers specified in
+ // /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/BaseSupport.xclangspec
+ // and appears to apply them to all languages. Thus, for now
+ // "inherit" the existing markers here for backward-compatibility.
+ {
+ Identifier = "xcode.lang.comment.mark";
+ Syntax = {
+ StartChars = "BMTF!?";
+ Match = (
+ // Go-specific markers
+ "^\(BUG.*$\)$", // include "BUG" in the markers list
+ "^\(TODO.*$\)$", // include "TODO" in the markers list
+ // inherited markers
+ "^MARK:[ \t]+\(.*\)$",
+ "^\(TODO:[ \t]+.*\)$", // include "TODO: " in the markers list
+ "^\(FIXME:[ \t]+.*\)$", // include "FIXME: " in the markers list
+ "^\(!!!:.*\)$", // include "!!!:" in the markers list
+ "^\(\\?\\?\\?:.*\)$" // include "???:" in the markers list
+ );
+ // This is the order of captures. All of the match strings above need the same order.
+ CaptureTypes = (
+ "xcode.syntax.mark"
+ );
+ Type = "xcode.syntax.comment";
+ };
+ },
+
+)
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2012 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+# Illustrates how a Go language specification can be installed for Xcode 4.x.,
+# to enable syntax coloring, by adding an entry to a plugindata file.
+#
+# FIXME: Write a decent Xcode plugin to handle the file type association and
+# language specification properly instead of altering Xcode library files.
+
+set -e
+
+# Assumes Xcode 4+.
+XCODE_MAJOR_VERSION=`xcodebuild -version | awk 'NR == 1 {print substr($2,1,1)}'`
+if [ "$XCODE_MAJOR_VERSION" -lt "4" ]; then
+ echo "Xcode 4.x not found."
+ exit 1
+fi
+
+# DVTFOUNDATION_DIR may vary depending on Xcode setup. Change it to reflect
+# your current Xcode setup. Find suitable path with e.g.:
+#
+# find / -type f -name 'DVTFoundation.xcplugindata' 2> /dev/null
+#
+# Example of DVTFOUNDATION_DIR's from "default" Xcode 4.x setups;
+#
+# Xcode 4.1: /Developer/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/
+# Xcode 4.3: /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/
+#
+DVTFOUNDATION_DIR="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/"
+PLUGINDATA_FILE="DVTFoundation.xcplugindata"
+
+PLISTBUDDY=/usr/libexec/PlistBuddy
+PLIST_FILE=tmp.plist
+
+# Provide means of deleting the Go entry from the plugindata file.
+if [ "$1" = "--delete-entry" ]; then
+ echo "Removing Go language specification entry."
+ $PLISTBUDDY -c "Delete :plug-in:extensions:Xcode.SourceCodeLanguage.Go" $DVTFOUNDATION_DIR/$PLUGINDATA_FILE
+ echo "Run 'sudo rm -rf /var/folders/*' and restart Xcode to update change immediately."
+ exit 0
+fi
+
+GO_VERSION="`go version`"
+
+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>
+"
+
+echo "Backing up plugindata file."
+cp $DVTFOUNDATION_DIR/$PLUGINDATA_FILE $DVTFOUNDATION_DIR/$PLUGINDATA_FILE.bak
+
+echo "Adding Go language specification entry."
+echo $GO_LANG_ENTRY > $PLIST_FILE
+$PLISTBUDDY -c "Merge $PLIST_FILE plug-in:extensions" $DVTFOUNDATION_DIR/$PLUGINDATA_FILE
+
+rm -f $PLIST_FILE
+
+echo "Installing Go language specification file for Xcode."
+cp $GOROOT/misc/xcode/4/go.xclangspec $DVTFOUNDATION_DIR
+
+echo "Run 'sudo rm -rf /var/folders/*' and restart Xcode to update change immediately."
+echo "Syntax coloring must be manually selected from the Editor - Syntax Coloring menu in Xcode."