vinter 0.6.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/vinter/lexer.rb +16 -59
- data/lib/vinter/linter.rb +15 -13
- data/lib/vinter/parser.rb +5 -4
- data/lib/vinter.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e35b8436cd29035d2d4f78482e343da5cbb88f3972dc47487abdf47b28f4f5ee
|
|
4
|
+
data.tar.gz: e6ce76acaf998dc56ea09712c90dea53f348445179dd435f9186c98ab8a3f4f7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01061b7d58353485bc083c77ca992dc14e8c0395d499d4f9aa704f7efb15fd71c2061464248283b46cda8533a68aca3c8a1d7cf091b029de02a673b86aa7d134
|
|
7
|
+
data.tar.gz: e2862a606a016a4ea64a1cd38956dacd816c4e96520ffab058529774106e4484e8905cb72350a83bf1f1870bc8a9d56f54f62899ce9be0167dc22b609b9bb410
|
data/lib/vinter/lexer.rb
CHANGED
|
@@ -582,6 +582,8 @@ module Vinter
|
|
|
582
582
|
encodings: /\b(latin1|iso|koi8|macroman|cp437|cp737|cp775|cp850|cp852|cp855|cp857|cp860|cp861|cp862|cp863|cp865|cp866|cp869|cp874|cp1250|cp1251|cp1253|cp1254|cp1255|cp1256|cp1257|cp1258|cp932|euc\-jp|sjis|cp949|euc\-kr|cp936|euc\-cn|cp950|big5|euc\-tw|utf\-8|ucs\-2|ucs\-21e|utf\-16|utf\-16le|ucs\-4|ucs\-4le|ansi|japan|korea|prc|chinese|taiwan|utf8|unicode|ucs2be|ucs\-2be|ucs\-4be|utf\-32|utf\-32le)\b/,
|
|
583
583
|
#builtin_funcs: /\b(highlight||normal!|normal|filter|match|extend|redraw!|setbufline)\b/,
|
|
584
584
|
type: /\b(number|list|dict|void|string)\b/,
|
|
585
|
+
mode_command: /\b(?:normal|norm)(?:!)?(?!\w).*$/,
|
|
586
|
+
exec_command: /\b(?:execute|exec).*$/,
|
|
585
587
|
builtin_funcs: /\b(#{Regexp.union(BUILTINS).source})\b/,
|
|
586
588
|
# Identifiers can include # and special characters
|
|
587
589
|
heredoc: /=<</,
|
|
@@ -614,6 +616,7 @@ module Vinter
|
|
|
614
616
|
def initialize(input)
|
|
615
617
|
@input = input
|
|
616
618
|
@tokens = []
|
|
619
|
+
@variables = []
|
|
617
620
|
@position = 0
|
|
618
621
|
@line_num = 1
|
|
619
622
|
@column = 1
|
|
@@ -847,19 +850,6 @@ module Vinter
|
|
|
847
850
|
next
|
|
848
851
|
end
|
|
849
852
|
|
|
850
|
-
# Check for keywords first, before other token types
|
|
851
|
-
if match = chunk.match(/\A\b(if|else|elseif|endif|while|endwhile|for|endfor|def|enddef|function|endfunction|endfunc|return|const|var|final|import|export|class|extends|static|enum|vim9script|abort|autocmd|echoerr|echohl|echomsg|let|unlet|var|setlocal|syntax|highlight|sleep|source)\b/)
|
|
852
|
-
@tokens << {
|
|
853
|
-
type: :keyword,
|
|
854
|
-
value: match[0],
|
|
855
|
-
line: @line_num,
|
|
856
|
-
column: @column
|
|
857
|
-
}
|
|
858
|
-
@column += match[0].length
|
|
859
|
-
@position += match[0].length
|
|
860
|
-
next
|
|
861
|
-
end
|
|
862
|
-
|
|
863
853
|
# Handle Vim scoped option variables with &l: or &g: prefix
|
|
864
854
|
if match = chunk.match(/\A&[lg]:[a-zA-Z_][a-zA-Z0-9_]*/)
|
|
865
855
|
@tokens << {
|
|
@@ -1006,6 +996,9 @@ module Vinter
|
|
|
1006
996
|
|
|
1007
997
|
# Handle compound assignment operators
|
|
1008
998
|
if match = chunk.match(/\A(\+=|-=|\*=|\/=|\.\.=|\.=)/)
|
|
999
|
+
if @tokens.last[:type] == :keyword && @variables.include?(@tokens.last[:value])
|
|
1000
|
+
@tokens.last[:type] = :identifier
|
|
1001
|
+
end
|
|
1009
1002
|
@tokens << {
|
|
1010
1003
|
type: :compound_operator,
|
|
1011
1004
|
value: match[0],
|
|
@@ -1136,52 +1129,6 @@ module Vinter
|
|
|
1136
1129
|
next
|
|
1137
1130
|
end
|
|
1138
1131
|
|
|
1139
|
-
# Handle backslash for line continuation
|
|
1140
|
-
if chunk.start_with?('\\')
|
|
1141
|
-
@tokens << {
|
|
1142
|
-
type: :line_continuation,
|
|
1143
|
-
value: '\\',
|
|
1144
|
-
line: @line_num,
|
|
1145
|
-
column: @column
|
|
1146
|
-
}
|
|
1147
|
-
@column += 1
|
|
1148
|
-
@position += 1
|
|
1149
|
-
|
|
1150
|
-
# If followed by a newline, advance to the next line
|
|
1151
|
-
if @position < @input.length && @input[@position] == "\n"
|
|
1152
|
-
@line_num += 1
|
|
1153
|
-
@column = 1
|
|
1154
|
-
@position += 1
|
|
1155
|
-
end
|
|
1156
|
-
|
|
1157
|
-
# Skip whitespace after the continuation
|
|
1158
|
-
while @position < @input.length && @input[@position] =~ /\s/
|
|
1159
|
-
if @input[@position] == "\n"
|
|
1160
|
-
@line_num += 1
|
|
1161
|
-
@column = 1
|
|
1162
|
-
else
|
|
1163
|
-
@column += 1
|
|
1164
|
-
end
|
|
1165
|
-
@position += 1
|
|
1166
|
-
end
|
|
1167
|
-
|
|
1168
|
-
next
|
|
1169
|
-
end
|
|
1170
|
-
|
|
1171
|
-
# Check for special case where 'function' is followed by '('
|
|
1172
|
-
# which likely means it's used as a built-in function
|
|
1173
|
-
if chunk =~ /\Afunction\s*\(/
|
|
1174
|
-
@tokens << {
|
|
1175
|
-
type: :identifier, # Treat as identifier, not keyword
|
|
1176
|
-
value: 'function',
|
|
1177
|
-
line: @line_num,
|
|
1178
|
-
column: @column
|
|
1179
|
-
}
|
|
1180
|
-
@column += 'function'.length
|
|
1181
|
-
@position += 'function'.length
|
|
1182
|
-
next
|
|
1183
|
-
end
|
|
1184
|
-
|
|
1185
1132
|
match_found = false
|
|
1186
1133
|
|
|
1187
1134
|
TOKEN_TYPES.each do |type, pattern|
|
|
@@ -1193,6 +1140,16 @@ module Vinter
|
|
|
1193
1140
|
line: @line_num,
|
|
1194
1141
|
column: @column
|
|
1195
1142
|
}
|
|
1143
|
+
|
|
1144
|
+
# handling variable names that are also keywords
|
|
1145
|
+
if !@tokens.empty? && @tokens.last[:value] == 'var'
|
|
1146
|
+
@variables << value
|
|
1147
|
+
token[:type] = :identifier
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
#if type != :whitespace
|
|
1151
|
+
#@tokens << token
|
|
1152
|
+
#end
|
|
1196
1153
|
@tokens << token unless type == :whitespace
|
|
1197
1154
|
|
|
1198
1155
|
# Update position
|
data/lib/vinter/linter.rb
CHANGED
|
@@ -24,19 +24,6 @@ module Vinter
|
|
|
24
24
|
end
|
|
25
25
|
end)
|
|
26
26
|
|
|
27
|
-
# Rule: Prefer def over function in Vim9 script
|
|
28
|
-
register_rule(Rule.new("prefer-def-over-function", "Use def instead of function in Vim9 script") do |ast|
|
|
29
|
-
issues = []
|
|
30
|
-
|
|
31
|
-
traverse_ast(ast) do |node|
|
|
32
|
-
if node[:type] == :legacy_function
|
|
33
|
-
issues << { message: "Use def instead of function for #{node[:name]}", line: node[:line] || 0, column: node[:column] || 0 }
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
issues
|
|
38
|
-
end)
|
|
39
|
-
|
|
40
27
|
# Rule: Variables should have type annotations
|
|
41
28
|
register_rule(Rule.new("missing-type-annotation", "Variable declaration is missing type annotation") do |ast|
|
|
42
29
|
issues = []
|
|
@@ -79,6 +66,21 @@ module Vinter
|
|
|
79
66
|
|
|
80
67
|
issues
|
|
81
68
|
end)
|
|
69
|
+
|
|
70
|
+
# Rule: should use the full name of commands that have abbreviations
|
|
71
|
+
register_rule(Rule.new("use-full-name", "Dont use partial names for commands") do |ast|
|
|
72
|
+
issues = []
|
|
73
|
+
|
|
74
|
+
traverse_ast(ast) do |node|
|
|
75
|
+
if node[:type] == :exec_command
|
|
76
|
+
unless node[:value].start_with?("execute")
|
|
77
|
+
issues << { message: "Use of execute command should use the full name", line: node[:line] }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
issues
|
|
83
|
+
end)
|
|
82
84
|
end
|
|
83
85
|
|
|
84
86
|
def traverse_ast(node, &block)
|
data/lib/vinter/parser.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require 'pry'
|
|
2
1
|
module Vinter
|
|
3
2
|
class Parser
|
|
4
3
|
def initialize(tokens, source_text = nil)
|
|
@@ -409,8 +408,6 @@ module Vinter
|
|
|
409
408
|
parse_autocmd_statement
|
|
410
409
|
elsif current_token[:value] == "filter" || current_token[:value] == "filt"
|
|
411
410
|
parse_filter_command
|
|
412
|
-
elsif current_token[:value] == "command"
|
|
413
|
-
parse_command_definition
|
|
414
411
|
else
|
|
415
412
|
parse_expression_statement
|
|
416
413
|
end
|
|
@@ -462,6 +459,10 @@ module Vinter
|
|
|
462
459
|
end
|
|
463
460
|
elsif [:bracket_open, :bracket_close, :operator, :question_mark].include?(current_token[:type])
|
|
464
461
|
advance
|
|
462
|
+
elsif current_token[:type] == :mode_command
|
|
463
|
+
advance
|
|
464
|
+
elsif current_token[:type] == :exec_command
|
|
465
|
+
advance
|
|
465
466
|
else
|
|
466
467
|
@warnings << {
|
|
467
468
|
message: "Unexpected token type: #{current_token[:type]}",
|
|
@@ -1476,7 +1477,7 @@ module Vinter
|
|
|
1476
1477
|
advance
|
|
1477
1478
|
name += current_token[:value]
|
|
1478
1479
|
end
|
|
1479
|
-
elsif !current_token ||
|
|
1480
|
+
elsif !current_token || current_token[:type] != :identifier
|
|
1480
1481
|
add_error("Expected variable name: #{current_token[:type]}")
|
|
1481
1482
|
return nil
|
|
1482
1483
|
else
|
data/lib/vinter.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vinter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dan Bradbury
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-01-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A linter for vim9script
|
|
14
14
|
email: dan.luckydaisy@gmail.com
|