GNU bug report logs -
#22370
[PATCH] Initial support for Go Language in 'etags'
Previous Next
Reported by: lu4nx <lx <at> shellcodes.org>
Date: Thu, 14 Jan 2016 06:06:02 UTC
Severity: wishlist
Tags: patch
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 22370 in the body.
You can then email your comments to 22370 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#22370
; Package
emacs
.
(Thu, 14 Jan 2016 06:06:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
lu4nx <lx <at> shellcodes.org>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Thu, 14 Jan 2016 06:06:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
* lib-src/etags.c <Go_suffixes>: 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 <lx <at> shellcodes.org>. (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
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#22370
; Package
emacs
.
(Thu, 14 Jan 2016 16:06:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 22370 <at> debbugs.gnu.org (full text, mbox):
> From: lu4nx <lx <at> shellcodes.org>
> Date: Thu, 14 Jan 2016 13:27:48 +0800
> Cc: lu4nx <lx <at> shellcodes.org>
>
> * lib-src/etags.c <Go_suffixes>: New variable.
> (lang_names): Add an entry for Go
> (Go_functions): Add new function.
Thanks.
> * test/manual/etags/ETAGS.good_6: Add TAGS content for Go
Why only ETAGS.good_6? What about other ETAGS.good_N files, and the
CTAGS file?
I will look into pushing this to emacs-25 in a few days, if no one
beats me to it.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#22370
; Package
emacs
.
(Thu, 14 Jan 2016 16:17:01 GMT)
Full text and
rfc822 format available.
Message #11 received at submit <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
在 2016年01月15日 00:05, Eli Zaretskii 写道:
> Why only ETAGS.good_6? What about other ETAGS.good_N files, and the
> CTAGS file?
I'm not familiar ETAGS.good_N files and CTAGS file,
I run `make check` is failed:
/Makefile:61: recipe for target 'ediff_1' failed//
//make[1]: *** [ediff_1] Error 1//
//make[1]: Leaving directory '/opt/emacs/emacs-25/test/manual/etags'//
//Makefile:52: recipe for target 'check' failed//
//make: *** [check] Error 2/
So I don't update other ETAGS.good_N files.
Thanks.
[Message part 2 (text/html, inline)]
Reply sent
to
Eli Zaretskii <eliz <at> gnu.org>
:
You have taken responsibility.
(Sat, 30 Jan 2016 13:00:02 GMT)
Full text and
rfc822 format available.
Notification sent
to
lu4nx <lx <at> shellcodes.org>
:
bug acknowledged by developer.
(Sat, 30 Jan 2016 13:00:03 GMT)
Full text and
rfc822 format available.
Message #16 received at 22370-done <at> debbugs.gnu.org (full text, mbox):
> Date: Thu, 14 Jan 2016 18:05:38 +0200
> From: Eli Zaretskii <eliz <at> gnu.org>
> Cc: 22370 <at> debbugs.gnu.org, lx <at> shellcodes.org
>
> I will look into pushing this to emacs-25 in a few days, if no one
> beats me to it.
Done.
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Sun, 28 Feb 2016 12:24:03 GMT)
Full text and
rfc822 format available.
This bug report was last modified 9 years and 165 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.