Skip to content

Commit 9f1c570

Browse files
authored
🥐 go: Crank up the linting settings (#25)
Crank up the linting settings so that linter runs in stricter mode and catches more errors, before the codebase gets too big. Disable quite a few annoying linters. Pull-Request: #25
1 parent 037d375 commit 9f1c570

File tree

16 files changed

+197
-89
lines changed

16 files changed

+197
-89
lines changed

.golangci.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
issues:
2+
exclude-use-default: false
3+
exclude:
4+
- "^don't use ALL_CAPS"
5+
- "^ST1003: should not use ALL_CAPS"
6+
- "^G304: Potential file inclusion via variable"
7+
8+
linters:
9+
enable-all: true
10+
disable:
11+
- cyclop
12+
- exhaustive
13+
- exhaustivestruct
14+
- exhaustruct
15+
- forbidigo
16+
- forcetypeassert
17+
- funlen
18+
- gochecknoglobals
19+
- gocyclo
20+
- godox
21+
- golint
22+
- gomnd
23+
- ifshort
24+
- interfacer
25+
- ireturn
26+
- lll
27+
- maligned
28+
- nlreturn
29+
- nosnakecase
30+
- paralleltest
31+
- revive
32+
- rowserrcheck
33+
- scopelint
34+
- sqlclosecheck
35+
- structcheck
36+
- testpackage
37+
- varnamelen
38+
- wastedassign
39+
- wrapcheck
40+
- wsl

main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ type config struct {
2929
type cmdRun struct {
3030
Source string `arg:"" help:"Source file. Default stdin" default:"-"`
3131
}
32+
3233
type cmdTokenize struct {
3334
Source string `arg:"" help:"Source file. Default stdin" default:"-"`
3435
}
36+
3537
type cmdParse struct {
3638
Source string `arg:"" help:"Source file. Default stdin" default:"-"`
3739
}

pkg/assert/assert.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Package assert is a testing utility package for online assertion that
2+
// also work with TinyGo which has only limited support for
3+
// reflection.
14
package assert
25

36
import (
@@ -7,18 +10,18 @@ import (
710
)
811

912
func NoError(t *testing.T, err error, msgAndArgs ...interface{}) {
13+
t.Helper()
1014
if err == nil {
1115
return
1216
}
13-
t.Helper()
1417
fatalf(t, "err: %v%s", err, format(msgAndArgs...))
1518
}
1619

1720
func Equal(t *testing.T, want, got any, msgAndArgs ...interface{}) {
21+
t.Helper()
1822
if equal(want, got) {
1923
return
2024
}
21-
t.Helper()
2225
fatalf(t, "want != got\n%#v\n%#v%s", want, got, format(msgAndArgs...))
2326
}
2427

pkg/evaluator/builtin.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ type BuiltinFunc func(args []Value) Value
2727
func (b BuiltinFunc) Type() ValueType { return BUILTIN }
2828
func (b BuiltinFunc) String() string { return "builtin function" }
2929

30-
func DefaultBuiltins(print func(string)) Builtins {
30+
func DefaultBuiltins(printFn func(string)) Builtins {
3131
return Builtins{
32-
"print": {Func: printFunc(print), Decl: printDecl},
32+
"print": {Func: printFunc(printFn), Decl: printDecl},
3333
"len": {Func: BuiltinFunc(lenFunc), Decl: lenDecl},
34-
"move": {Func: moveFunc(print), Decl: moveDecl},
35-
"line": {Func: lineFunc(print), Decl: lineDecl},
34+
"move": {Func: moveFunc(printFn), Decl: moveDecl},
35+
"line": {Func: lineFunc(printFn), Decl: lineDecl},
3636
}
3737
}
3838

@@ -77,8 +77,8 @@ func lenFunc(args []Value) Value {
7777
var moveDecl = &parser.FuncDecl{
7878
Name: "move",
7979
Params: []*parser.Var{
80-
&parser.Var{Name: "x", T: parser.NUM_TYPE},
81-
&parser.Var{Name: "y", T: parser.NUM_TYPE},
80+
{Name: "x", T: parser.NUM_TYPE},
81+
{Name: "y", T: parser.NUM_TYPE},
8282
},
8383
ReturnType: parser.NUM_TYPE,
8484
}
@@ -93,8 +93,8 @@ func moveFunc(printFn func(string)) BuiltinFunc {
9393
var lineDecl = &parser.FuncDecl{
9494
Name: "line",
9595
Params: []*parser.Var{
96-
&parser.Var{Name: "x", T: parser.NUM_TYPE},
97-
&parser.Var{Name: "y", T: parser.NUM_TYPE},
96+
{Name: "x", T: parser.NUM_TYPE},
97+
{Name: "y", T: parser.NUM_TYPE},
9898
},
9999
ReturnType: parser.NUM_TYPE,
100100
}

pkg/evaluator/evaluator.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
1+
// Package evaluator evaluates a given syntax tree as created by the
2+
// parser packages. It also exports a Run and RunWithBuiltings function
3+
// which creates and calls a Parser.
14
package evaluator
25

36
import (
47
"foxygo.at/evy/pkg/parser"
58
)
69

7-
func Run(input string, print func(string)) {
8-
RunWithBuiltins(input, print, DefaultBuiltins(print))
10+
func Run(input string, printFn func(string)) {
11+
RunWithBuiltins(input, printFn, DefaultBuiltins(printFn))
912
}
1013

11-
func RunWithBuiltins(input string, print func(string), builtins Builtins) {
14+
func RunWithBuiltins(input string, printFn func(string), builtins Builtins) {
1215
p := parser.New(input, builtins.Decls())
1316
prog := p.Parse()
1417
if p.HasErrors() {
15-
print(p.MaxErrorsString(8))
18+
printFn(p.MaxErrorsString(8))
1619
return
1720
}
18-
e := &Evaluator{print: print}
21+
e := &Evaluator{print: printFn}
1922
e.builtins = builtins
2023
val := e.Eval(newScope(), prog)
2124
if isError(val) {
22-
print(val.String())
25+
printFn(val.String())
2326
}
2427
}
2528

pkg/evaluator/scope.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ func (s *scope) getScope(name string) (*scope, bool) {
3333
return s.outer.getScope(name)
3434
}
3535

36-
func (s *scope) set(name string, val Value) Value {
36+
func (s *scope) set(name string, val Value) {
3737
s.values[name] = val
38-
return val
3938
}

pkg/evaluator/value.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,11 @@ func (e *Error) String() string { return "ERROR: " + e.Message }
9999
func isError(val Value) bool { // TODO: replace with panic flow
100100
return val != nil && val.Type() == ERROR
101101
}
102+
102103
func isReturn(val Value) bool {
103104
return val != nil && val.Type() == RETURN_VALUE
104105
}
106+
105107
func newError(msg string) *Error {
106108
return &Error{Message: msg}
107109
}

pkg/lexer/lexer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Package lexer tokenizes input and lets follow up phases in compiler,
2+
// such as parser, iterate over tokens via Lexer.Next() function. The
3+
// lexer package also exposes a Run method for debugging the lexing
4+
// phase only.
15
package lexer
26

37
import (

pkg/lexer/lexer_test.go

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,45 @@ func TestSingleToken(t *testing.T) {
1111
in string
1212
want TokenType
1313
}{
14-
{in: ":=", want: DECLARE}, {in: "=", want: ASSIGN}, {in: "+", want: PLUS}, {in: "-", want: MINUS}, {in: "!", want: BANG}, {in: "*", want: ASTERISK}, {in: "/", want: SLASH},
15-
{in: "==", want: EQ}, {in: "!=", want: NOT_EQ}, {in: "<", want: LT}, {in: ">", want: GT}, {in: "<=", want: LTEQ}, {in: ">=", want: GTEQ},
16-
{in: "(", want: LPAREN}, {in: ")", want: RPAREN}, {in: "[", want: LBRACKET}, {in: "]", want: RBRACKET}, {in: "{", want: LCURLY}, {in: "}", want: RCURLY},
17-
{in: ":", want: COLON}, {in: ".", want: DOT}, {in: "...", want: DOT3},
18-
{in: "num", want: NUM}, {in: "string", want: STRING}, {in: "bool", want: BOOL}, {in: "any", want: ANY},
19-
{in: "true", want: TRUE}, {in: "false", want: FALSE}, {in: "and", want: AND}, {in: "or", want: OR},
20-
{in: "if", want: IF}, {in: "else", want: ELSE}, {in: "func", want: FUNC}, {in: "return", want: RETURN}, {in: "for", want: FOR}, {in: "range", want: RANGE}, {in: "while", want: WHILE}, {in: "break", want: BREAK}, {in: "end", want: END},
14+
{in: ":=", want: DECLARE},
15+
{in: "=", want: ASSIGN},
16+
{in: "+", want: PLUS},
17+
{in: "-", want: MINUS},
18+
{in: "!", want: BANG},
19+
{in: "*", want: ASTERISK},
20+
{in: "/", want: SLASH},
21+
{in: "==", want: EQ},
22+
{in: "!=", want: NOT_EQ},
23+
{in: "<", want: LT},
24+
{in: ">", want: GT},
25+
{in: "<=", want: LTEQ},
26+
{in: ">=", want: GTEQ},
27+
{in: "(", want: LPAREN},
28+
{in: ")", want: RPAREN},
29+
{in: "[", want: LBRACKET},
30+
{in: "]", want: RBRACKET},
31+
{in: "{", want: LCURLY},
32+
{in: "}", want: RCURLY},
33+
{in: ":", want: COLON},
34+
{in: ".", want: DOT},
35+
{in: "...", want: DOT3},
36+
{in: "num", want: NUM},
37+
{in: "string", want: STRING},
38+
{in: "bool", want: BOOL},
39+
{in: "any", want: ANY},
40+
{in: "true", want: TRUE},
41+
{in: "false", want: FALSE},
42+
{in: "and", want: AND},
43+
{in: "or", want: OR},
44+
{in: "if", want: IF},
45+
{in: "else", want: ELSE},
46+
{in: "func", want: FUNC},
47+
{in: "return", want: RETURN},
48+
{in: "for", want: FOR},
49+
{in: "range", want: RANGE},
50+
{in: "while", want: WHILE},
51+
{in: "break", want: BREAK},
52+
{in: "end", want: END},
2153
}
2254

2355
for _, tt := range tests {
@@ -101,7 +133,7 @@ func TestNums(t *testing.T) {
101133
y := 1
102134
y = y * ( 3 + 7)
103135
`
104-
wantTokens := []Token{
136+
wantTokens := []*Token{
105137
{Type: NL, Literal: "", Offset: 0, Line: 1, Col: 1},
106138
{Type: IDENT, Literal: "y", Offset: 1, Line: 2, Col: 1},
107139
{Type: DECLARE, Literal: "", Offset: 3, Line: 2, Col: 3},
@@ -122,7 +154,7 @@ y = y * ( 3 + 7)
122154
l := New(in)
123155
for _, want := range wantTokens {
124156
got := l.Next()
125-
assert.Equal(t, &want, got)
157+
assert.Equal(t, want, got)
126158
}
127159
}
128160

@@ -131,7 +163,7 @@ func TestStrings(t *testing.T) {
131163
s:string
132164
s = "abc"
133165
s = s[:1] // "bc"`
134-
wantTokens := []Token{
166+
wantTokens := []*Token{
135167
{Type: NL, Literal: "", Offset: 0, Line: 1, Col: 1},
136168
{Type: IDENT, Literal: "s", Offset: 1, Line: 2, Col: 1},
137169
{Type: COLON, Literal: "", Offset: 2, Line: 2, Col: 2},
@@ -156,7 +188,7 @@ s = s[:1] // "bc"`
156188
l := New(in)
157189
for _, want := range wantTokens {
158190
got := l.Next()
159-
assert.Equal(t, &want, got)
191+
assert.Equal(t, want, got)
160192
}
161193
}
162194

@@ -167,7 +199,7 @@ for key := range m
167199
print key m[key] // Mali climbing
168200
end
169201
`
170-
wantTokens := []Token{
202+
wantTokens := []*Token{
171203
{Type: NL, Literal: "", Offset: 0, Line: 1, Col: 1},
172204
{Type: IDENT, Literal: "m", Offset: 1, Line: 2, Col: 1},
173205
{Type: DECLARE, Literal: "", Offset: 3, Line: 2, Col: 3},
@@ -206,7 +238,7 @@ end
206238
l := New(in)
207239
for _, want := range wantTokens {
208240
got := l.Next()
209-
assert.Equal(t, &want, got)
241+
assert.Equal(t, want, got)
210242
}
211243
}
212244

pkg/lexer/token.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ const (
2020
EOF
2121
COMMENT // `// a comment`
2222

23-
// Identifiers and Literals
23+
// Identifiers and Literals.
2424
IDENT // some_identifier
2525
NUM_LIT // 123 456.78
2626
STRING_LIT // "a string 🧵"
2727

28-
// Operators
28+
// Operators.
2929
DECLARE // :=
3030
ASSIGN // =
3131
PLUS // +
@@ -41,7 +41,7 @@ const (
4141
LTEQ // <=
4242
GTEQ // >=
4343

44-
// Delimiters
44+
// Delimiters.
4545
LPAREN // (
4646
RPAREN // )
4747
LBRACKET // [
@@ -54,7 +54,7 @@ const (
5454
DOT // .
5555
DOT3 // ...
5656

57-
// Keywords
57+
// Keywords.
5858
NUM // num
5959
STRING // string
6060
BOOL // bool

0 commit comments

Comments
 (0)