--- Begin Message ---
Subject: |
26.0.50; Various Forth related improvements for etags |
Date: |
Wed, 30 Nov 2016 12:29:40 +0100 |
I'd like to propose a patch to etags for better Forth support.
With the patch, etags creates explicit tag names. That works better in
combination with tag-exact-match-p.
It also adds supports for some keywords from the (relatively new)
Forth-2012 Standard.
>From 17dc260dd2a609e69d303cdbe1e81375d8d25519 Mon Sep 17 00:00:00 2001
From: Helmut Eller <address@hidden>
Date: Wed, 30 Nov 2016 12:20:34 +0100
Subject: [PATCH] Various Forth related improvements for etags
Create explicit tag names for Forth files, so that names like "(foo)"
can be found. Previously only "(foo" was found due to C-isms.
Fix a bug where a tag for "-bar" was created when encountering things
like "create-bar".
Recognize more words from the Forth-2012 Standard.
* lib-src/etags.c (Forth_words): Check for whitespace after defining
words. Create explict tag name with pfnote.
* test/manual/etags/forth-src/test-forth.fth: Add some test cases.
* test/etags/ETAGS.good_1:
* test/etags/ETAGS.good_2:
* test/etags/ETAGS.good_3:
* test/etags/ETAGS.good_4:
* test/etags/ETAGS.good_5:
* test/etags/ETAGS.good_6:
* test/etags/CTAGS.good: Adapt to the changes in etags.c and new test cases.
---
lib-src/etags.c | 40 ++++++++++++++++++++++--------
test/manual/etags/CTAGS.good | 15 ++++++++++-
test/manual/etags/ETAGS.good_1 | 37 ++++++++++++++++++---------
test/manual/etags/ETAGS.good_2 | 37 ++++++++++++++++++---------
test/manual/etags/ETAGS.good_3 | 37 ++++++++++++++++++---------
test/manual/etags/ETAGS.good_4 | 37 ++++++++++++++++++---------
test/manual/etags/ETAGS.good_5 | 37 ++++++++++++++++++---------
test/manual/etags/ETAGS.good_6 | 37 ++++++++++++++++++---------
test/manual/etags/forth-src/test-forth.fth | 21 ++++++++++++++++
9 files changed, 215 insertions(+), 83 deletions(-)
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 6a722e0..f680d20 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -5469,16 +5469,36 @@ Forth_words (FILE *inf)
do /* skip to ) or eol */
bp++;
while (*bp != ')' && *bp != '\0');
- else if ((bp[0] == ':' && c_isspace (bp[1]) && bp++)
- || LOOKING_AT_NOCASE (bp, "constant")
- || LOOKING_AT_NOCASE (bp, "code")
- || LOOKING_AT_NOCASE (bp, "create")
- || LOOKING_AT_NOCASE (bp, "defer")
- || LOOKING_AT_NOCASE (bp, "value")
- || LOOKING_AT_NOCASE (bp, "variable")
- || LOOKING_AT_NOCASE (bp, "buffer:")
- || LOOKING_AT_NOCASE (bp, "field"))
- get_tag (skip_spaces (bp), NULL); /* Yay! A definition! */
+ else if (((bp[0] == ':' && c_isspace (bp[1]) && bp++)
+ || LOOKING_AT_NOCASE (bp, "constant")
+ || LOOKING_AT_NOCASE (bp, "2constant")
+ || LOOKING_AT_NOCASE (bp, "fconstant")
+ || LOOKING_AT_NOCASE (bp, "code")
+ || LOOKING_AT_NOCASE (bp, "create")
+ || LOOKING_AT_NOCASE (bp, "defer")
+ || LOOKING_AT_NOCASE (bp, "value")
+ || LOOKING_AT_NOCASE (bp, "2value")
+ || LOOKING_AT_NOCASE (bp, "fvalue")
+ || LOOKING_AT_NOCASE (bp, "variable")
+ || LOOKING_AT_NOCASE (bp, "2variable")
+ || LOOKING_AT_NOCASE (bp, "fvariable")
+ || LOOKING_AT_NOCASE (bp, "buffer:")
+ || LOOKING_AT_NOCASE (bp, "field:")
+ || LOOKING_AT_NOCASE (bp, "+field")
+ || LOOKING_AT_NOCASE (bp, "field") /* not standard? */
+ || LOOKING_AT_NOCASE (bp, "begin-structure")
+ || LOOKING_AT_NOCASE (bp, "synonym")
+ )
+ && c_isspace (bp[0]))
+ {
+ /* Yay! A definition! */
+ char* name_start = skip_spaces (bp);
+ char* name_end = skip_non_spaces (name_start);
+ char* name = savenstr (name_start, name_end - name_start);
+ pfnote (name, true, lb.buffer, name_end - lb.buffer,
+ lineno, linecharno);
+ bp = name_end;
+ }
else
bp = skip_non_spaces (bp);
}
diff --git a/test/manual/etags/CTAGS.good b/test/manual/etags/CTAGS.good
index e652989..6f9df19 100644
--- a/test/manual/etags/CTAGS.good
+++ b/test/manual/etags/CTAGS.good
@@ -36,7 +36,8 @@ ${CHECKOBJS} make-src/Makefile /^${CHECKOBJS}:
CFLAGS=-g3 -DNULLFREECHECK=0$/
($prog,$_,@list perl-src/yagrip.pl 39
($string,$flag,@string,@temp,@last perl-src/yagrip.pl 40
(a-forth-constant forth-src/test-forth.fth /^constant
(a-forth-constant$/
-(another-forth-word forth-src/test-forth.fth /^:
(another-forth-word) ( -- )$/
+(another-forth-word) forth-src/test-forth.fth /^:
(another-forth-word) ( -- )$/
+(foo) forth-src/test-forth.fth /^: (foo) 1 ;$/
+ ruby-src/test.rb /^ def +(y)$/
+ tex-src/texinfo.tex /^\\def+{{\\tt \\char 43}}$/
.PRECIOUS make-src/Makefile /^.PRECIOUS: ETAGS CTAGS ETAGS16
CTAGS16 ETAGS17 CTA/
@@ -170,6 +171,9 @@ ${CHECKOBJS} make-src/Makefile /^${CHECKOBJS}:
CFLAGS=-g3 -DNULLFREECHECK=0$/
/wbytes ps-src/rfc1245.ps /^\/wbytes { $/
/wh ps-src/rfc1245.ps /^\/wh { $/
/yen ps-src/rfc1245.ps /^\/yen \/.notdef \/.notdef \/.notdef \/.notdef
\/.notdef /
+2const forth-src/test-forth.fth /^3 4 2constant 2const$/
+2val forth-src/test-forth.fth /^2const 2value 2val$/
+2var forth-src/test-forth.fth /^2variable 2var$/
:a-forth-dictionary-entry forth-src/test-forth.fth /^create
:a-forth-dictionary-entry$/
< tex-src/texinfo.tex /^\\def<{{\\tt \\less}}$/
<< ruby-src/test.rb /^ def <<(y)$/
@@ -2725,6 +2729,7 @@ counter cp-src/c.C 36
cow cp-src/c.C 127
cow cp-src/c.C 131
cplpl c-src/etags.c 2935
+create-bar forth-src/test-forth.fth /^: create-bar foo ;$/
createPOEntries php-src/lce_functions.php /^ function
createPOEntries()$/
createWidgets pyt-src/server.py /^ def createWidgets(self, host):$/
createWidgets pyt-src/server.py /^ def createWidgets(self):$/
@@ -2944,6 +2949,7 @@ fastmap c-src/emacs/src/regex.h 355
fastmap_accurate c-src/emacs/src/regex.h 383
fatal c-src/etags.c /^fatal (const char *s1, const char *s2)$/
fatala c.c /^void fatala () __attribute__ ((noreturn));$/
+fconst forth-src/test-forth.fth /^3.1415e fconstant fconst$/
fdHandler objc-src/Subprocess.m /^- fdHandler:(int)theFd$/
fdHandler objc-src/Subprocess.m /^fdHandler (int theFd, id self)$/
fdefunkey c-src/etags.c 2409
@@ -3015,6 +3021,7 @@ foo cp-src/x.cc /^XX::foo()$/
foo f-src/entry.for /^ character*(*) function foo()$/
foo f-src/entry.strange_suffix /^ character*(*) function foo()$/
foo f-src/entry.strange /^ character*(*) function foo()$/
+foo forth-src/test-forth.fth /^: foo (foo) ;$/
foo php-src/ptest.php /^foo()$/
foo ruby-src/test1.ru /^ attr_reader :foo$/
foo! ruby-src/test1.ru /^ def foo!$/
@@ -3057,6 +3064,8 @@ function c-src/emacs/src/lisp.h 694
function c-src/emacs/src/lisp.h 1685
function c-src/emacs/src/lisp.h 2197
functionp c-src/emacs/src/lisp.h /^functionp (Lisp_Object object)$/
+fval forth-src/test-forth.fth /^fconst fvalue fval$/
+fvar forth-src/test-forth.fth /^fvariable fvar$/
fvdef c-src/etags.c 2418
fvextern c-src/etags.c 2420
fvnameseen c-src/etags.c 2412
@@ -3515,6 +3524,7 @@ my_struct c.c 226
my_struct c-src/h.h 91
my_typedef c.c 228
my_typedef c-src/h.h 93
+mypi forth-src/test-forth.fth /^synonym mypi fconst$/
n c-src/exit.c 28
n c-src/exit.strange_suffix 28
name c-src/getopt.h 76
@@ -3719,6 +3729,8 @@ outputtable html-src/algrthms.html /^Output$/
outsyn prol-src/natded.prolog /^outsyn(['Any'],_).$/
p c-src/emacs/src/lisp.h 4673
p c-src/emacs/src/lisp.h 4679
+p.x forth-src/test-forth.fth /^ 1 CELLS +FIELD p.x \\ A single
cell filed name/
+p.y forth-src/test-forth.fth /^ 1 CELLS +FIELD p.y \\ A single
cell field name/
p/f ada-src/etags-test-for.ada /^ function p pragma Import (C,$/
p/f ada-src/etags-test-for.ada /^function p ("p");$/
pD c-src/emacs/src/lisp.h 165
@@ -3767,6 +3779,7 @@ plist c-src/emacs/src/lisp.h 697
plus cp-src/functions.cpp /^void Date::plus ( int days , int month , int
year /
plus go-src/test1.go 5
plusvalseq prol-src/natded.prolog /^plusvalseq([]) --> [].$/
+point forth-src/test-forth.fth /^BEGIN-STRUCTURE point \\ create the
named structure/
pointer c-src/emacs/src/lisp.h 2125
poll_for_input c-src/emacs/src/keyboard.c /^poll_for_input (struct atimer
*timer)$/
poll_for_input_1 c-src/emacs/src/keyboard.c /^poll_for_input_1
(void)$/
diff --git a/test/manual/etags/ETAGS.good_1 b/test/manual/etags/ETAGS.good_1
index 374692c..4067a80 100644
--- a/test/manual/etags/ETAGS.good_1
+++ b/test/manual/etags/ETAGS.good_1
@@ -2311,19 +2311,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/ETAGS.good_2 b/test/manual/etags/ETAGS.good_2
index a21717a..71634d4 100644
--- a/test/manual/etags/ETAGS.good_2
+++ b/test/manual/etags/ETAGS.good_2
@@ -2880,19 +2880,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/ETAGS.good_3 b/test/manual/etags/ETAGS.good_3
index 33bf110..9b56bb2 100644
--- a/test/manual/etags/ETAGS.good_3
+++ b/test/manual/etags/ETAGS.good_3
@@ -2628,19 +2628,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/ETAGS.good_4 b/test/manual/etags/ETAGS.good_4
index 3d9d626..8629294 100644
--- a/test/manual/etags/ETAGS.good_4
+++ b/test/manual/etags/ETAGS.good_4
@@ -2475,19 +2475,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/ETAGS.good_5 b/test/manual/etags/ETAGS.good_5
index 1dff768..8e246c1 100644
--- a/test/manual/etags/ETAGS.good_5
+++ b/test/manual/etags/ETAGS.good_5
@@ -3361,19 +3361,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/ETAGS.good_6 b/test/manual/etags/ETAGS.good_6
index fdcbd57..37294aa 100644
--- a/test/manual/etags/ETAGS.good_6
+++ b/test/manual/etags/ETAGS.good_6
@@ -3361,19 +3361,32 @@ f-src/entry.strange,172
& intensity1(577,12231
character*(*) function foo(579,12307
-forth-src/test-forth.fth,408
-: a-forth-word 20,301
-99 constant a-forth-constant!22,343
-55 value a-forth-value?23,373
-create :a-forth-dictionary-entry24,397
-defer #a-defer-word27,460
-: (another-forth-word)(another-forth-word29,481
- 9 field >field136,582
- 5 field >field237,605
+forth-src/test-forth.fth,948
+: a-forth-worda-forth-word20,301
+99 constant a-forth-constant!a-forth-constant!22,343
+55 value a-forth-value?a-forth-value?23,373
+create :a-forth-dictionary-entry:a-forth-dictionary-entry24,397
+defer #a-defer-word#a-defer-word27,460
+: (another-forth-word)(another-forth-word)29,481
+ 9 field >field1>field136,582
+ 5 field >field2>field237,605
constant (a-forth-constant(a-forth-constant38,628
-2000 buffer: #some-storage41,657
-code assemby-code-word 43,685
-: a-forth-word 50,870
+2000 buffer: #some-storage#some-storage41,657
+code assemby-code-wordassemby-code-word43,685
+: a-forth-worda-forth-word50,870
+: (foo)(foo)55,988
+: foofoo56,1000
+: create-barcreate-bar58,1015
+3 4 2constant 2const2const61,1074
+2const 2value 2val2val62,1095
+2variable 2var2var63,1114
+3.1415e fconstant fconstfconst65,1130
+fconst fvalue fvalfval66,1155
+fvariable fvarfvar67,1174
+synonym mypimypi69,1190
+BEGIN-STRUCTURE pointpoint71,1211
+ 1 CELLS +FIELD p.xp.x72,1262
+ 1 CELLS +FIELD p.yp.y73,1318
go-src/test.go,48
package main1,0
diff --git a/test/manual/etags/forth-src/test-forth.fth
b/test/manual/etags/forth-src/test-forth.fth
index ce4069d..4521d32 100644
--- a/test/manual/etags/forth-src/test-forth.fth
+++ b/test/manual/etags/forth-src/test-forth.fth
@@ -51,3 +51,24 @@ c;
a-forth-word dup 200 > abort" Eek. The number is too big"
." Result is " . cr
;
+
+: (foo) 1 ;
+: foo (foo) ;
+
+: create-bar foo ;
+create-bar \ Do NOT create a tag here
+
+3 4 2constant 2const
+2const 2value 2val
+2variable 2var
+
+3.1415e fconstant fconst
+fconst fvalue fval
+fvariable fvar
+
+synonym mypi fconst
+
+BEGIN-STRUCTURE point \ create the named structure
+ 1 CELLS +FIELD p.x \ A single cell filed named p.x
+ 1 CELLS +FIELD p.y \ A single cell field named p.y
+END-STRUCTURE
--
2.1.4
--- End Message ---