From c03a128571ffa7a86fe21f9521bfe8b359c2260a Mon Sep 17 00:00:00 2001 From: haya14busa Date: Wed, 14 Sep 2016 19:45:37 +0900 Subject: [PATCH 1/2] remove unused func and var --- go/vimlfunc.go | 28 ---------------------------- go/vimlfunc_test.go | 4 ---- 2 files changed, 32 deletions(-) diff --git a/go/vimlfunc.go b/go/vimlfunc.go index 50e7018..59ebdf8 100644 --- a/go/vimlfunc.go +++ b/go/vimlfunc.go @@ -76,14 +76,6 @@ func init() { type vimlList interface{} -func viml_call(f string, args ...interface{}) interface{} { - panic("NotImplemented viml_call") -} - -func viml_char2nr(c string) int { - panic("NotImplemented viml_char2nr") -} - func viml_empty(obj interface{}) bool { return viml_len(obj) == 0 } @@ -124,10 +116,6 @@ func viml_escape(s string, chars string) string { return r } -func viml_extend(obj, item interface{}) interface{} { - panic("NotImplemented viml_extend") -} - func viml_join(lst vimlList, sep string) string { var ss []string s := reflect.ValueOf(lst) @@ -137,10 +125,6 @@ func viml_join(lst vimlList, sep string) string { return strings.Join(ss, sep) } -func viml_keys(obj map[string]interface{}) []string { - panic("NotImplemented viml_keys") -} - func viml_len(obj interface{}) int { return reflect.ValueOf(obj).Len() } @@ -157,10 +141,6 @@ func viml_range(start, end int) []int { return rs } -func viml_readfile(path string) []string { - panic("NotImplemented viml_readfile") -} - func viml_split(s string, sep string) []string { if sep == `\zs` { var ss []string @@ -193,11 +173,3 @@ func viml_has_key(obj interface{}, key interface{}) bool { func viml_stridx(a, b string) int { return strings.Index(a, b) } - -func viml_type(obj interface{}) int { - panic("NotImplemented viml_type") -} - -func viml_ternary(cond bool, a interface{}, b interface{}) interface{} { - panic("NotImplemented viml_ternary") -} diff --git a/go/vimlfunc_test.go b/go/vimlfunc_test.go index 10618ef..9fa164d 100644 --- a/go/vimlfunc_test.go +++ b/go/vimlfunc_test.go @@ -5,10 +5,6 @@ import ( "testing" ) -var vimArgs = []string{"-Nu", "NONE", "-i", "NONE", "-n"} - -type testHandler struct{} - func TestViml_len(t *testing.T) { tests := []struct { in interface{} From dcc854ceb32e3356af6013ba1745297f43cca9cc Mon Sep 17 00:00:00 2001 From: haya14busa Date: Sat, 10 Sep 2016 22:36:20 +0900 Subject: [PATCH 2/2] go: fix neovim handling --- autoload/vimlparser.vim | 20 +++++++++++++++++- go/_test/let.go | 24 +++++++++++++++++++++ go/_test/let.vim | 30 +++++++++++++++++++++++++++ go/_test/special.go | 8 +++---- go/_test/special.vim | 6 +++++- go/builtin_commands.go | 30 ++++++++++++++++++++++++++- go/gocompiler.vim | 17 +++++++++------ go/type.go | 9 ++++++-- go/vimlparser.go | 46 ++++++++++++++++++++++++++++++++++++----- go/vimlparser_test.go | 20 ++++++++++++------ vimlparser.go | 2 +- 11 files changed, 185 insertions(+), 27 deletions(-) diff --git a/autoload/vimlparser.vim b/autoload/vimlparser.vim index 3acb900..f483de2 100644 --- a/autoload/vimlparser.vim +++ b/autoload/vimlparser.vim @@ -925,6 +925,24 @@ function! s:VimLParser.find_command() endif endfor + if self.neovim + for x in self.neovim_additional_commands + if stridx(x.name, name) == 0 && len(name) >= x.minlen + unlet cmd + let cmd = x + break + endif + endfor + + for x in self.neovim_removed_commands + if stridx(x.name, name) == 0 && len(name) >= x.minlen + unlet cmd + let cmd = s:NIL + break + endif + endfor + endif + " FIXME: user defined command if (cmd is s:NIL || cmd.name ==# 'Print') && name =~# '^[A-Z]' let name .= self.reader.read_alnum() @@ -978,7 +996,7 @@ function! s:VimLParser.parse_argopt() let self.ea.bad_char = self.reader.getn(1) endif elseif s =~# '^++' - throw 'VimLParser: E474: Invalid Argument' + throw s:Err('E474: Invalid Argument', self.reader.getpos()) else break endif diff --git a/go/_test/let.go b/go/_test/let.go index 000dba4..cc099c6 100644 --- a/go/_test/let.go +++ b/go/_test/let.go @@ -29,3 +29,27 @@ var xs = 1 if x { xs[0] = 1 } +func F() { + var cmd *Cmd = nil + for _, x := range builtin_commands { + if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen { + cmd = x + break + } + } + if self.neovim { + for _, x := range neovim_additional_commands { + if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen { + cmd = x + break + } + } + for _, x := range neovim_removed_commands { + if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen { + cmd = nil + break + } + } + } +} + diff --git a/go/_test/let.vim b/go/_test/let.vim index 2079145..7d7eb11 100644 --- a/go/_test/let.vim +++ b/go/_test/let.vim @@ -31,3 +31,33 @@ let xs = 1 if x let xs[0] = 1 endif + +function! F() + let cmd = s:NIL + + for x in self.builtin_commands + if stridx(x.name, name) == 0 && len(name) >= x.minlen + unlet cmd + let cmd = x + break + endif + endfor + + if self.neovim + for x in self.neovim_additional_commands + if stridx(x.name, name) == 0 && len(name) >= x.minlen + unlet cmd + let cmd = x + break + endif + endfor + + for x in self.neovim_removed_commands + if stridx(x.name, name) == 0 && len(name) >= x.minlen + unlet cmd + let cmd = s:NIL + break + endif + endfor + endif +endfunction diff --git a/go/_test/special.go b/go/_test/special.go index 26212aa..df0d8cc 100644 --- a/go/_test/special.go +++ b/go/_test/special.go @@ -1,7 +1,3 @@ -func (self *VimLParser) __init__() { - var x = 1 -} - var y = &ExArg{} self.hoge = 1 self.ea.range_ = 1 @@ -16,6 +12,10 @@ var lhs = &lhs{} var lhs = hoge() for _, x := range builtin_commands { } +for _, x := range neovim_removed_commands { +} +for _, x := range neovim_additional_commands { +} func (self *LvalueParser) pos1() { var pos = self.reader.tell() } diff --git a/go/_test/special.vim b/go/_test/special.vim index 5988ed0..855006f 100644 --- a/go/_test/special.vim +++ b/go/_test/special.vim @@ -24,7 +24,7 @@ function! s:VimLParser.pop_context() endfunction function! s:VimLParser.__init__() - let x = 1 + " skip VimLParser.__init__ endfunction function! s:Compiler.__init__() @@ -86,6 +86,10 @@ let lhs = hoge() for x in self.builtin_commands endfor +for x in self.neovim_removed_commands +endfor +for x in self.neovim_additional_commands +endfor function! s:LvalueParser.pos1() abort let pos = self.reader.tell() endfunction diff --git a/go/builtin_commands.go b/go/builtin_commands.go index bba1dc4..e5b9042 100644 --- a/go/builtin_commands.go +++ b/go/builtin_commands.go @@ -1,6 +1,22 @@ package vimlparser // " Generated from below script. +// echo 'var neovim_additional_commands = []*Cmd{' +// for s:cmd in vimlparser#import().VimLParser.neovim_additional_commands +// " echo s:cmd +// echo "\t" . printf('{flags: "%s", minlen: %s, name: "%s", parser: "%s" },', +// \ s:cmd.flags, s:cmd.minlen, s:cmd.name, s:cmd.parser) +// endfor +// echo '}' +// +// echo 'var neovim_removed_commands = []*Cmd{' +// for s:cmd in vimlparser#import().VimLParser.neovim_removed_commands +// " echo s:cmd +// echo "\t" . printf('{flags: "%s", minlen: %s, name: "%s", parser: "%s" },', +// \ s:cmd.flags, s:cmd.minlen, s:cmd.name, s:cmd.parser) +// endfor +// echo '}' +// // echo 'var builtin_commands = []*Cmd{' // for s:cmd in vimlparser#import().VimLParser.builtin_commands // " echo s:cmd @@ -8,6 +24,18 @@ package vimlparser // \ s:cmd.flags, s:cmd.minlen, s:cmd.name, s:cmd.parser) // endfor // echo '}' +var neovim_additional_commands = []*Cmd{ + {flags: "EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", minlen: 8, name: "tnoremap", parser: "parse_cmd_common"}, +} +var neovim_removed_commands = []*Cmd{ + {flags: "RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", minlen: 1, name: "Print", parser: "parse_cmd_common"}, + {flags: "TRLBAR|CMDWIN", minlen: 3, name: "fixdel", parser: "parse_cmd_common"}, + {flags: "EXTRA|NOTRLCOM", minlen: 5, name: "helpfind", parser: "parse_cmd_common"}, + {flags: "RANGE|BANG|EXTRA", minlen: 1, name: "open", parser: "parse_cmd_common"}, + {flags: "TRLBAR|CMDWIN", minlen: 2, name: "shell", parser: "parse_cmd_common"}, + {flags: "NEEDARG|EXTRA|TRLBAR|NOTRLCOM|CMDWIN", minlen: 2, name: "tearoff", parser: "parse_cmd_common"}, + {flags: "BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN", minlen: 2, name: "gvim", parser: "parse_cmd_common"}, +} var builtin_commands = []*Cmd{ {flags: "BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY", minlen: 1, name: "append", parser: "parse_cmd_append"}, {flags: "EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", minlen: 2, name: "abbreviate", parser: "parse_cmd_common"}, @@ -498,7 +526,7 @@ var builtin_commands = []*Cmd{ {flags: "BANG|TRLBAR|CMDWIN", minlen: 2, name: "wall", parser: "parse_cmd_common"}, {flags: "EXTRA|NOTRLCOM|SBOXOK|CMDWIN", minlen: 2, name: "while", parser: "parse_cmd_while"}, {flags: "EXTRA|NEEDARG|TRLBAR", minlen: 2, name: "winsize", parser: "parse_cmd_common"}, - {flags: "NEEDARG|WORD1|RANGE|NOTADR", minlen: 4, name: "wincmd", parser: "parse_cmd_common"}, + {flags: "NEEDARG|WORD1|RANGE|NOTADR", minlen: 4, name: "wincmd", parser: "parse_wincmd"}, {flags: "EXTRA|TRLBAR|CMDWIN", minlen: 4, name: "winpos", parser: "parse_cmd_common"}, {flags: "RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR", minlen: 2, name: "wnext", parser: "parse_cmd_common"}, {flags: "RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR", minlen: 2, name: "wprevious", parser: "parse_cmd_common"}, diff --git a/go/gocompiler.vim b/go/gocompiler.vim index d40fed7..716c4cd 100644 --- a/go/gocompiler.vim +++ b/go/gocompiler.vim @@ -348,7 +348,7 @@ function s:GoCompiler.compile_function(node) if name == 'new' \ || (struct == 'ExprTokenizer' && name == 'token') \ || (struct == 'StringReader' && name == 'getpos') - \ || (struct == 'VimLParser' && (name =~ '\(push\|pop\)_context')) + \ || (struct == 'VimLParser' && (name =~ '\(push\|pop\)_context\|__init__')) \ || (struct == 'Compiler' && ( \ name == '__init__' \ || name == 'out' @@ -470,8 +470,12 @@ function s:GoCompiler.compile_let(node) return elseif left == 'cmd' && op == '=' && (right == 'nil' || right =~ '^\Vmap[string]interface{}{') if right == 'nil' - call self.out('var cmd *Cmd = nil') - call self.addscope(left) + if self.isinscope(left) + call self.out('cmd = nil') + else + call self.out('var cmd *Cmd = nil') + call self.addscope(left) + endif else let m = matchstr(right, '^\Vmap[string]interface{}{\zs\(\.\*\)\ze}\$') let rs = [] @@ -534,8 +538,8 @@ function s:GoCompiler.compile_if(node) call self.incindent("\t") call self.inscope() call self.compile_body(a:node.body) - call self.decindent() call self.descope() + call self.decindent() for node in a:node.elseif call self.out('} else if %s {', self.compile(node.cond)) call self.incindent("\t") @@ -829,8 +833,9 @@ function s:GoCompiler.compile_dot(node) let left = self.compile(a:node.left) let right = self.compile(a:node.right) let out = printf('%s.%s', left, right) - if out == 'self.builtin_commands' - return 'builtin_commands' + let cmds = matchstr(out, 'self\.\zs\(builtin_commands\|neovim_additional_commands\|neovim_removed_commands\)') + if cmds != '' + return cmds endif return out endfunction diff --git a/go/type.go b/go/type.go index 7b7200c..cf1f17b 100644 --- a/go/type.go +++ b/go/type.go @@ -100,15 +100,20 @@ type VimLParser struct { reader *StringReader context []*VimNode ea *ExArg + neovim bool } -func NewVimLParser() *VimLParser { +func NewVimLParser(neovim bool) *VimLParser { obj := &VimLParser{} obj.find_command_cache = make(map[string]*Cmd) - obj.__init__() + obj.__init__(neovim) return obj } +func (self *VimLParser) __init__(neovim bool) { + self.neovim = neovim +} + func (self *VimLParser) push_context(n *VimNode) { self.context = append([]*VimNode{n}, self.context...) } diff --git a/go/vimlparser.go b/go/vimlparser.go index 912919d..b369d30 100644 --- a/go/vimlparser.go +++ b/go/vimlparser.go @@ -329,9 +329,6 @@ func Err(msg string, pos *pos) string { return viml_printf("vimlparser: %s: line %d col %d", msg, pos.lnum, pos.col) } -func (self *VimLParser) __init__() { -} - func (self *VimLParser) find_context(type_ int) int { var i = 0 for _, node := range self.context { @@ -822,6 +819,20 @@ func (self *VimLParser) find_command() *Cmd { break } } + if self.neovim { + for _, x := range neovim_additional_commands { + if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen { + cmd = x + break + } + } + for _, x := range neovim_removed_commands { + if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen { + cmd = nil + break + } + } + } // FIXME: user defined command if (cmd == nil || cmd.name == "Print") && viml_eqregh(name, "^[A-Z]") { name += self.reader.read_alnum() @@ -872,7 +883,7 @@ func (self *VimLParser) parse_argopt() { self.ea.bad_char = self.reader.getn(1) } } else if viml_eqregh(s, "^++") { - panic("VimLParser: E474: Invalid Argument") + panic(Err("E474: Invalid Argument", self.reader.getpos())) } else { break } @@ -989,7 +1000,8 @@ func (self *VimLParser) separate_nextcmd() *pos { var c = self.reader.peek() if c == "" || c == "" { break - } else if c == `\` { + } else if c == "\x16" { + // self.reader.get() end = self.reader.getpos() nospend = self.reader.getpos() @@ -1731,6 +1743,30 @@ func (self *VimLParser) ends_excmds(c string) bool { return c == "" || c == "|" || c == "\"" || c == "" || c == "" } +// FIXME: validate argument +func (self *VimLParser) parse_wincmd() { + var c = self.reader.getn(1) + if c == "" { + panic(Err("E471: Argument required", self.reader.getpos())) + } else if c == "g" || c == "\x07" { + // + var c2 = self.reader.getn(1) + if c2 == "" || iswhite(c2) { + panic(Err("E474: Invalid Argument", self.reader.getpos())) + } + } + var end = self.reader.getpos() + self.reader.skip_white() + if !self.ends_excmds(self.reader.peek()) { + panic(Err("E474: Invalid Argument", self.reader.getpos())) + } + var node = Node(NODE_EXCMD) + node.pos = self.ea.cmdpos + node.ea = self.ea + node.str = self.reader.getstr(self.ea.linepos, end) + self.add_node(node) +} + func (self *ExprTokenizer) __init__(reader *StringReader) { self.reader = reader } diff --git a/go/vimlparser_test.go b/go/vimlparser_test.go index 5c0fc1c..b07907c 100644 --- a/go/vimlparser_test.go +++ b/go/vimlparser_test.go @@ -51,7 +51,7 @@ func TestStringReader___init__(t *testing.T) { func TestNewVimLParser(t *testing.T) { defer recovert(t) - NewVimLParser().parse(NewStringReader([]string{})) + NewVimLParser(false).parse(NewStringReader([]string{})) } func TestVimLParser_parse_empty(t *testing.T) { @@ -62,7 +62,7 @@ func TestVimLParser_parse_empty(t *testing.T) { []string{"", ""}, } for _, in := range ins { - NewVimLParser().parse(NewStringReader(in)) + NewVimLParser(false).parse(NewStringReader(in)) } } @@ -78,7 +78,7 @@ func TestVimLParser_parse(t *testing.T) { } for _, tt := range tests { c := NewCompiler() - n := NewVimLParser().parse(NewStringReader(tt.in)) + n := NewVimLParser(false).parse(NewStringReader(tt.in)) if got := c.compile(n).([]string); strings.Join(got, "\n") != tt.want { t.Errorf("c.compile(p.parse(%v)) = %v, want %v", tt.in, got, tt.want) } @@ -87,7 +87,10 @@ func TestVimLParser_parse(t *testing.T) { const basePkg = "github.com/haya14busa/vim-vimlparser/go" -var skipTests = map[string]bool{"test_xxx_colonsharp": true} +var skipTests = map[string]bool{ + "test_xxx_colonsharp": true, + "test_wincmd": true, +} func TestVimLParser_parse_compile(t *testing.T) { p, err := build.Default.Import(basePkg, "", build.FindOnly) @@ -140,8 +143,13 @@ func testFiles(t *testing.T, file string, in, want []string) { } }() + neovim := false + if strings.Contains(file, "test_neo") { + neovim = true + } + r := NewStringReader(in) - p := NewVimLParser() + p := NewVimLParser(neovim) c := NewCompiler() got := c.compile(p.parse(r)).([]string) @@ -177,6 +185,6 @@ func TestVimLParser_VimLParser(t *testing.T) { t.Fatal(err) } c := NewCompiler() - n := NewVimLParser().parse(NewStringReader(lines)) + n := NewVimLParser(false).parse(NewStringReader(lines)) c.compile(n) } diff --git a/vimlparser.go b/vimlparser.go index ececd6c..5e16295 100644 --- a/vimlparser.go +++ b/vimlparser.go @@ -20,7 +20,7 @@ func Parse(r io.Reader) (node *Node, err error) { }() lines := readlines(r) reader := internal.NewStringReader(lines) - node = newNode(internal.NewVimLParser().Parse(reader)) + node = newNode(internal.NewVimLParser(false).Parse(reader)) return }