/* Copyright 2009 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 3 This is a preliminary version that supports basic syntax high-lighting (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 and the files in: /Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/ Place this file in directory: ~/Library/Application Support/Developer/Shared/Xcode/Specifications/ */ ( // ---------------------------------------------------------------------------- // 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.*$\)$", // inlude "BUG" in the markers list "^\(TODO.*$\)$", // inlude "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"; }; }, )