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
This commit is contained in:
Emil Hessman 2012-03-05 15:11:08 -08:00 committed by Robert Griesemer
parent 286fb69746
commit 4863980f16
3 changed files with 392 additions and 0 deletions

2
misc/xcode/4/README Normal file
View file

@ -0,0 +1,2 @@
This directory contains files for Go syntax highlighting in Xcode 4.x.
For installation; read, edit and run go4xcode.sh

290
misc/xcode/4/go.xclangspec Normal file
View file

@ -0,0 +1,290 @@
/*
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";
};
},
)

100
misc/xcode/4/go4xcode.sh Executable file
View file

@ -0,0 +1,100 @@
#!/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."