From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: lu4nx Newsgroups: gmane.emacs.bugs Subject: bug#22370: [PATCH] Initial support for Go Language in 'etags' Date: Thu, 14 Jan 2016 13:27:48 +0800 Message-ID: <1452749268-4569-1-git-send-email-lx@shellcodes.org> NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1452751587 7325 80.91.229.3 (14 Jan 2016 06:06:27 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 14 Jan 2016 06:06:27 +0000 (UTC) Cc: lu4nx To: 22370@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Jan 14 07:06:14 2016 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1aJb2y-0002Bm-HC for geb-bug-gnu-emacs@m.gmane.org; Thu, 14 Jan 2016 07:06:12 +0100 Original-Received: from localhost ([::1]:40376 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb2x-0007fX-Lb for geb-bug-gnu-emacs@m.gmane.org; Thu, 14 Jan 2016 01:06:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59286) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb2t-0007fQ-Ri for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:06:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJb2o-0003EF-RZ for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:06:07 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:60532) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb2o-0003Dw-O3 for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:06:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84) (envelope-from ) id 1aJb2o-0006sY-GB for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:06:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: lu4nx Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 14 Jan 2016 06:06:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 22370 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.145275151626387 (code B ref -1); Thu, 14 Jan 2016 06:06:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 14 Jan 2016 06:05:16 +0000 Original-Received: from localhost ([127.0.0.1]:48752 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aJb23-0006rW-JT for submit@debbugs.gnu.org; Thu, 14 Jan 2016 01:05:15 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:39058) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aJb21-0006rI-CK for submit@debbugs.gnu.org; Thu, 14 Jan 2016 01:05:13 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJb1u-0002bX-TH for submit@debbugs.gnu.org; Thu, 14 Jan 2016 01:05:08 -0500 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:56073) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb1u-0002bT-QU for submit@debbugs.gnu.org; Thu, 14 Jan 2016 01:05:06 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58236) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb1t-0007Aj-Fq for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:05:06 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJb1o-0002XL-FW for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:05:05 -0500 Original-Received: from smtpbg3.qq.com ([183.60.61.198]:51013) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJb1n-0002VP-J8 for bug-gnu-emacs@gnu.org; Thu, 14 Jan 2016 01:05:00 -0500 X-QQ-mid: Xesmtp23t1452749288t004t2898 Original-Received: from lx-pc (unknown [182.138.102.86]) by esmtp4.qq.com (ESMTP) with id ; Thu, 14 Jan 2016 13:28:07 +0800 (CST) X-QQ-SSF: B1000000000000F0FF103F00000000Z X-QQ-FEAT: QX/rXDl9P1v7/8mMno5i9yiok3aI6wv1d6614/b2jAwSHc59tdFOgTNS1h1qU D74u3ouDJUspZMOqsrVBSx3++2meLfB/8joEu44aVJzl/n6DJCfZhV7aQFCbveqEHB3+y7F V5YqhafZqdPBLRwl4YZhc8wlB01l9lxnfVgSRAk/2/qAlqkbCFbzYwXSGvA/3AIAkMrIP/r kTJzz4Qt1/VRs2d6ItUSzCiBB+lPz1kdoXX2BAYIxoGt/bvi4bp/2U5WWhuVYn6A/EzPwBS 4jTg== X-QQ-GoodBg: 0 X-Mailer: git-send-email 2.5.0 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:111606 Archived-At: * lib-src/etags.c : New variable. (lang_names): Add an entry for Go (Go_functions): Add new function. * test/manual/etags/ETAGS.good_6: Add TAGS content for Go * test/manual/etags/Makefile: (GOSRC): Add new variable. (SRCS): Add an entry for Go. --- lib-src/etags.c | 73 +++++++++++++++++++++++++++++++++++++++ test/manual/etags/ETAGS.good_6 | 15 ++++++++ test/manual/etags/Makefile | 3 +- test/manual/etags/go-src/test.go | 11 ++++++ test/manual/etags/go-src/test1.go | 34 ++++++++++++++++++ 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 test/manual/etags/go-src/test.go create mode 100644 test/manual/etags/go-src/test1.go diff --git a/lib-src/etags.c b/lib-src/etags.c index 2192627..5320686 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -354,6 +354,7 @@ static void Cstar_entries (FILE *); static void Erlang_functions (FILE *); static void Forth_words (FILE *); static void Fortran_functions (FILE *); +static void Go_functions (FILE *); static void HTML_labels (FILE *); static void Lisp_functions (FILE *); static void Lua_functions (FILE *); @@ -641,6 +642,10 @@ static const char *Fortran_suffixes [] = static const char Fortran_help [] = "In Fortran code, functions, subroutines and block data are tags."; +static const char *Go_suffixes [] = {"go", NULL}; +static const char Go_help [] = + "In Go code, functions, interfaces and packages."; + static const char *HTML_suffixes [] = { "htm", "html", "shtml", NULL }; static const char HTML_help [] = @@ -794,6 +799,7 @@ static language lang_names [] = { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes }, { "forth", Forth_help, Forth_words, Forth_suffixes }, { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes }, + { "go", Go_help, Go_functions, Go_suffixes }, { "html", HTML_help, HTML_labels, HTML_suffixes }, { "java", Cjava_help, Cjava_entries, Cjava_suffixes }, { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes }, @@ -4210,6 +4216,73 @@ Fortran_functions (FILE *inf) /* + * Go language support + * Idea by Xi Lu . (2016) + */ +static void +Go_functions(FILE *inf) +{ + char *cp, *name; + + LOOP_ON_INPUT_LINES(inf, lb, cp) + { + cp = skip_spaces (cp); + + if (LOOKING_AT (cp, "package")) + { + name = cp; + while (!notinname (*cp) && *cp != '\0') + cp++; + make_tag (name, cp - name, false, lb.buffer, + cp - lb.buffer + 1, lineno, linecharno); + } + else if (LOOKING_AT (cp, "func")) + { + /* Go implementation of interface, such as: + func (n *Integer) Add(m Integer) ... + skip `(n *Integer)` part. + */ + if (*cp == '(') + { + while (*cp != ')') + cp++; + cp = skip_spaces (cp+1); + } + + if (*cp) + { + name = cp; + + while (!notinname (*cp)) + cp++; + + make_tag (name, cp - name, true, lb.buffer, + cp - lb.buffer + 1, lineno, linecharno); + } + } + else if (members && LOOKING_AT (cp, "type")) + { + name = cp; + + /* Ignore similar to the following: + type ( + A + ) + */ + if (*cp == '(') + return; + + while (!notinname (*cp) && *cp != '\0') + cp++; + + make_tag (name, cp - name, false, lb.buffer, + cp - lb.buffer + 1, lineno, linecharno); + } + } +} + + +/* * Ada parsing * Original code by * Philippe Waroquiers (1998) diff --git a/test/manual/etags/ETAGS.good_6 b/test/manual/etags/ETAGS.good_6 index 39522db..3c53a8b 100644 --- a/test/manual/etags/ETAGS.good_6 +++ b/test/manual/etags/ETAGS.good_6 @@ -5406,3 +5406,18 @@ tex-src/nonewline.tex,0 php-src/sendmail.php,0 a-src/empty.zz,0 + +test.go,48 +package main1,0 +func say(5,28 +func main(9,72 + +test1.go,172 +package main1,0 +type plus 5,28 +type str 9,65 +type intNumber 13,99 +func (s str) PrintAdd(17,136 +func (n intNumber) PrintAdd(21,189 +func test(25,248 +func main(29,285 diff --git a/test/manual/etags/Makefile b/test/manual/etags/Makefile index 4d9f358..81ee7a7 100644 --- a/test/manual/etags/Makefile +++ b/test/manual/etags/Makefile @@ -11,6 +11,7 @@ ELSRC=$(addprefix ./el-src/,TAGTEST.EL emacs/lisp/progmodes/etags.el) ERLSRC=$(addprefix ./erl-src/,gs_dialog.erl) FORTHSRC=$(addprefix ./forth-src/,test-forth.fth) FSRC=$(addprefix ./f-src/,entry.for entry.strange_suffix entry.strange) +GOSRC=$(addprefix ./go-src/,test.go test1.go) HTMLSRC=$(addprefix ./html-src/,softwarelibero.html index.shtml algrthms.html software.html) #JAVASRC=$(addprefix ./java-src/, ) LUASRC=$(addprefix ./lua-src/,allegro.lua test.lua) @@ -27,7 +28,7 @@ RBSRC=$(addprefix ./ruby-src/,test.rb test1.ruby) TEXSRC=$(addprefix ./tex-src/,testenv.tex gzip.texi texinfo.tex nonewline.tex) YSRC=$(addprefix ./y-src/,parse.y parse.c atest.y cccp.c cccp.y) SRCS=${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\ - ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\ + ${FORTHSRC} ${GOSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\ ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\ ${RBSRC} ${TEXSRC} ${YSRC} NONSRCS=./f-src/entry.strange ./erl-src/lists.erl ./cp-src/clheir.hpp.gz diff --git a/test/manual/etags/go-src/test.go b/test/manual/etags/go-src/test.go new file mode 100644 index 0000000..6aea26e --- /dev/null +++ b/test/manual/etags/go-src/test.go @@ -0,0 +1,11 @@ +package main + +import "fmt" + +func say(msg string) { + fmt.Println(msg) +} + +func main() { + say("Hello, Emacs!") +} diff --git a/test/manual/etags/go-src/test1.go b/test/manual/etags/go-src/test1.go new file mode 100644 index 0000000..6d1efaa --- /dev/null +++ b/test/manual/etags/go-src/test1.go @@ -0,0 +1,34 @@ +package main + +import "fmt" + +type plus interface { + PrintAdd() +} + +type str struct { + a, b string +} + +type intNumber struct { + a, b int +} + +func (s str) PrintAdd() { + fmt.Println(s.a + s.b) +} + +func (n intNumber) PrintAdd() { + fmt.Println(n.a + n.b) +} + +func test(p plus) { + p.PrintAdd() +} + +func main() { + s := str{a: "Hello,", b: "Emacs!"} + number := intNumber{a: 1, b: 2} + test(number) + test(s) +} -- 2.5.0