Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e9dc0f0

Browse files
committedNov 8, 2023
Added gcc output parser
1 parent 37d30b3 commit e9dc0f0

File tree

11 files changed

+1033
-0
lines changed

11 files changed

+1033
-0
lines changed
 
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to license@arduino.cc.
15+
16+
package diagnostics
17+
18+
import (
19+
"bytes"
20+
"path/filepath"
21+
"strings"
22+
23+
"github.com/arduino/arduino-cli/executils"
24+
semver "go.bug.st/relaxed-semver"
25+
)
26+
27+
// DetectedCompiler represents a compiler detected from a given command line
28+
type DetectedCompiler struct {
29+
Name string
30+
Family string
31+
Version *semver.Version
32+
DetailedVersion []string
33+
}
34+
35+
// This function is overridden for mocking unit tests
36+
var runProcess = func(args ...string) []string {
37+
if cmd, err := executils.NewProcess(nil, args...); err == nil {
38+
out := &bytes.Buffer{}
39+
cmd.RedirectStdoutTo(out)
40+
cmd.Run()
41+
return splitLines(out.Bytes())
42+
}
43+
return nil
44+
}
45+
46+
// DetectCompilerFromCommandLine tries to detect a compiler from a given command line.
47+
// If probeCompiler is true, the compiler may be executed with different flags to
48+
// infer the version or capabilities.
49+
func DetectCompilerFromCommandLine(args []string, probeCompiler bool) *DetectedCompiler {
50+
if len(args) == 0 {
51+
return nil
52+
}
53+
basename := filepath.Base(args[0])
54+
family := ""
55+
if strings.Contains(basename, "g++") || strings.Contains(basename, "gcc") {
56+
family = "gcc"
57+
}
58+
res := &DetectedCompiler{
59+
Name: basename,
60+
Family: family,
61+
}
62+
63+
if family == "gcc" && probeCompiler {
64+
// Run "gcc --version" to obtain more info
65+
res.DetailedVersion = runProcess(args[0], "--version")
66+
67+
// Usually on the first line we get the compiler architecture and
68+
// version (as last field), followed by the compiler license, for
69+
// example:
70+
//
71+
// g++ (Ubuntu 12.2.0-3ubuntu1) 12.2.0
72+
// Copyright (C) 2022 Free Software Foundation, Inc.
73+
// This is free software; see the source for copying conditions. There is NO
74+
// warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
75+
//
76+
if len(res.DetailedVersion) > 0 {
77+
split := strings.Split(res.DetailedVersion[0], " ")
78+
if len(split) >= 3 {
79+
res.Name = split[0]
80+
res.Version, _ = semver.Parse(split[len(split)-1])
81+
}
82+
}
83+
}
84+
return res
85+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to license@arduino.cc.
15+
16+
package diagnostics
17+
18+
import (
19+
"strings"
20+
"testing"
21+
22+
"github.com/stretchr/testify/require"
23+
)
24+
25+
func init() {
26+
runProcess = mockedRunProcessToGetCompilerVersion
27+
}
28+
29+
func mockedRunProcessToGetCompilerVersion(args ...string) []string {
30+
if strings.HasSuffix(args[0], "7.3.0-atmel3.6.1-arduino7/bin/avr-g++") && args[1] == "--version" {
31+
return []string{
32+
"avr-g++ (GCC) 7.3.0",
33+
"Copyright (C) 2017 Free Software Foundation, Inc.",
34+
"This is free software; see the source for copying conditions. There is NO",
35+
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
36+
"",
37+
}
38+
}
39+
if strings.HasSuffix(args[0], "7.3.0-atmel3.6.1-arduino7/bin/avr-gcc") && args[1] == "--version" {
40+
return []string{
41+
"avr-gcc (GCC) 7.3.0",
42+
"Copyright (C) 2017 Free Software Foundation, Inc.",
43+
"This is free software; see the source for copying conditions. There is NO",
44+
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
45+
"",
46+
}
47+
}
48+
if strings.HasSuffix(args[0], "xtensa-esp32-elf-gcc/gcc8_4_0-esp-2021r2-patch3/bin/xtensa-esp32-elf-g++") && args[1] == "--version" {
49+
return []string{
50+
"xtensa-esp32-elf-g++ (crosstool-NG esp-2021r2-patch3) 8.4.0",
51+
"Copyright (C) 2018 Free Software Foundation, Inc.",
52+
"This is free software; see the source for copying conditions. There is NO",
53+
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
54+
"",
55+
}
56+
}
57+
58+
panic("missing mock for command line: " + strings.Join(args, " "))
59+
}
60+
61+
func TestCompilerDetection(t *testing.T) {
62+
comp := DetectCompilerFromCommandLine([]string{"~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++"}, true)
63+
require.NotNil(t, comp)
64+
require.Equal(t, "gcc", comp.Family)
65+
require.Equal(t, "avr-g++", comp.Name)
66+
require.Equal(t, "7.3.0", comp.Version.String())
67+
68+
comp = DetectCompilerFromCommandLine([]string{"~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-gcc"}, true)
69+
require.NotNil(t, comp)
70+
require.Equal(t, "gcc", comp.Family)
71+
require.Equal(t, "avr-gcc", comp.Name)
72+
require.Equal(t, "7.3.0", comp.Version.String())
73+
74+
comp = DetectCompilerFromCommandLine([]string{"/home/megabug/.arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/gcc8_4_0-esp-2021r2-patch3/bin/xtensa-esp32-elf-g++"}, true)
75+
require.NotNil(t, comp)
76+
require.Equal(t, "gcc", comp.Family)
77+
require.Equal(t, "xtensa-esp32-elf-g++", comp.Name)
78+
require.Equal(t, "8.4.0", comp.Version.String())
79+
}

‎arduino/builder/internal/diagnostics/parser.go

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,159 @@
1515

1616
package diagnostics
1717

18+
import (
19+
"fmt"
20+
"strings"
21+
22+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
23+
)
24+
1825
// CompilerOutputParserCB is a callback function that is called to feed a parser
1926
// with the plain-text compiler output.
2027
type CompilerOutputParserCB func(cmdline []string, out []byte)
28+
29+
// Diagnostics represents a list of diagnostics
30+
type Diagnostics []*Diagnostic
31+
32+
// Diagnostic represents a diagnostic (a compiler error, warning, note, etc.)
33+
type Diagnostic struct {
34+
Severity Severity `json:"severity,omitempty"`
35+
Message string `json:"message"`
36+
File string `json:"file,omitempty"`
37+
Line int `json:"line,omitempty"`
38+
Column int `json:"col,omitempty"`
39+
Context FullContext `json:"context,omitempty"`
40+
Suggestions Notes `json:"suggestions,omitempty"`
41+
}
42+
43+
// Severity is a diagnostic severity
44+
type Severity string
45+
46+
const (
47+
// SeverityUnspecified is the undefined severity
48+
SeverityUnspecified Severity = ""
49+
// SeverityWarning is a warning
50+
SeverityWarning = "WARNING"
51+
// SeverityError is an error
52+
SeverityError = "ERROR"
53+
// SeverityFatal is a fatal error
54+
SeverityFatal = "FATAL"
55+
)
56+
57+
// Notes represents a list of Note
58+
type Notes []*Note
59+
60+
// Note represents a compiler annotation or suggestion
61+
type Note struct {
62+
Message string `json:"message"`
63+
File string `json:"file,omitempty"`
64+
Line int `json:"line,omitempty"`
65+
Column int `json:"col,omitempty"`
66+
}
67+
68+
// FullContext represents a list of Context
69+
type FullContext []*Context
70+
71+
// Context represents a context, i.e. a reference to a file, line and column
72+
// or a part of the code that a Diagnostic refers to.
73+
type Context struct {
74+
Message string `json:"message"`
75+
File string `json:"file,omitempty"`
76+
Line int `json:"line,omitempty"`
77+
Column int `json:"col,omitempty"`
78+
}
79+
80+
// ParseCompilerOutput parses the output of a compiler and returns a list of
81+
// diagnostics.
82+
func ParseCompilerOutput(compiler *DetectedCompiler, out []byte) ([]*Diagnostic, error) {
83+
lines := splitLines(out)
84+
switch compiler.Family {
85+
case "gcc":
86+
return parseGccOutput(lines)
87+
default:
88+
return nil, fmt.Errorf("unsupported compiler: %s", compiler)
89+
}
90+
}
91+
92+
func splitLines(in []byte) []string {
93+
res := strings.Split(string(in), "\n")
94+
for i, line := range res {
95+
res[i] = strings.TrimSuffix(line, "\r")
96+
}
97+
if l := len(res) - 1; res[l] == "" {
98+
res = res[:l]
99+
}
100+
return res
101+
}
102+
103+
// ToRPC converts a Diagnostics to a slice of rpc.CompileDiagnostic
104+
func (d Diagnostics) ToRPC() []*rpc.CompileDiagnostic {
105+
if len(d) == 0 {
106+
return nil
107+
}
108+
var res []*rpc.CompileDiagnostic
109+
for _, diag := range d {
110+
res = append(res, diag.ToRPC())
111+
}
112+
return res
113+
}
114+
115+
// ToRPC converts a Diagnostic to a rpc.CompileDiagnostic
116+
func (d *Diagnostic) ToRPC() *rpc.CompileDiagnostic {
117+
if d == nil {
118+
return nil
119+
}
120+
return &rpc.CompileDiagnostic{
121+
Severity: string(d.Severity),
122+
Message: d.Message,
123+
File: d.File,
124+
Line: int64(d.Line),
125+
Column: int64(d.Column),
126+
Context: d.Context.ToRPC(),
127+
Notes: d.Suggestions.ToRPC(),
128+
}
129+
}
130+
131+
// ToRPC converts a Notes to a slice of rpc.CompileDiagnosticNote
132+
func (s Notes) ToRPC() []*rpc.CompileDiagnosticNote {
133+
var res []*rpc.CompileDiagnosticNote
134+
for _, suggestion := range s {
135+
res = append(res, suggestion.ToRPC())
136+
}
137+
return res
138+
}
139+
140+
// ToRPC converts a Note to a rpc.CompileDiagnosticNote
141+
func (s *Note) ToRPC() *rpc.CompileDiagnosticNote {
142+
if s == nil {
143+
return nil
144+
}
145+
return &rpc.CompileDiagnosticNote{
146+
File: s.File,
147+
Line: int64(s.Line),
148+
Column: int64(s.Column),
149+
Message: s.Message,
150+
}
151+
}
152+
153+
// ToRPC converts a FullContext to a slice of rpc.CompileDiagnosticContext
154+
func (t FullContext) ToRPC() []*rpc.CompileDiagnosticContext {
155+
var res []*rpc.CompileDiagnosticContext
156+
for _, trace := range t {
157+
res = append(res, trace.ToRPC())
158+
}
159+
return res
160+
}
161+
162+
// ToRPC converts a Context to a rpc.CompileDiagnosticContext
163+
func (d *Context) ToRPC() *rpc.CompileDiagnosticContext {
164+
if d == nil {
165+
return nil
166+
}
167+
return &rpc.CompileDiagnosticContext{
168+
File: d.File,
169+
Line: int64(d.Line),
170+
Column: int64(d.Column),
171+
Message: d.Message,
172+
}
173+
}
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to license@arduino.cc.
15+
16+
package diagnostics
17+
18+
import (
19+
"strconv"
20+
"strings"
21+
)
22+
23+
// Parse output from gcc compiler and extract diagnostics
24+
func parseGccOutput(output []string) ([]*Diagnostic, error) {
25+
// Output from gcc is a mix of diagnostics and other information.
26+
//
27+
// 1. include trace lines:
28+
//
29+
// In file included from /home/megabug/Arduino/libraries/Audio/src/Audio.h:16:0,
30+
// ·················from /home/megabug/Arduino/Blink/Blink.ino:1:
31+
//
32+
// 2. in-file context lines:
33+
//
34+
// /home/megabug/Arduino/libraries/Audio/src/DAC.h: In member function 'void DACClass::enableInterrupts()':
35+
//
36+
// 3. actual diagnostic lines:
37+
//
38+
// /home/megabug/Arduino/libraries/Audio/src/DAC.h:31:44: fatal error: 'isrId' was not declared in this scope
39+
//
40+
// /home/megabug/Arduino/libraries/Audio/src/DAC.h:31:44: error: 'isrId' was not declared in this scope
41+
//
42+
// /home/megabug/Arduino/libraries/Audio/src/DAC.h:31:44: warning: 'isrId' was not declared in this scope
43+
//
44+
// 4. annotations or suggestions:
45+
//
46+
// /home/megabug/Arduino/Blink/Blink.ino:4:1: note: suggested alternative: 'rand'
47+
//
48+
// 5. extra context lines with an extract of the code that errors refers to:
49+
//
50+
// ·asd;
51+
// ·^~~
52+
// ·rand
53+
//
54+
// ·void enableInterrupts() { NVIC_EnableIRQ(isrId); };
55+
// ···········································^~~~~
56+
57+
var fullContext FullContext
58+
var fullContextRefersTo string
59+
var inFileContext *Context
60+
var currentDiagnostic *Diagnostic
61+
var currentMessage *string
62+
var res []*Diagnostic
63+
64+
for _, in := range output {
65+
isTrace := false
66+
if strings.HasPrefix(in, "In file included from ") {
67+
in = strings.TrimPrefix(in, "In file included from ")
68+
// 1. include trace
69+
isTrace = true
70+
inFileContext = nil
71+
fullContext = nil
72+
fullContextRefersTo = ""
73+
} else if strings.HasPrefix(in, " from ") {
74+
in = strings.TrimPrefix(in, " from ")
75+
// 1. include trace continuation
76+
isTrace = true
77+
}
78+
if isTrace {
79+
in = strings.TrimSuffix(in, ",")
80+
file, line, col := extractFileLineAndColumn(in)
81+
context := &Context{
82+
File: file,
83+
Line: line,
84+
Column: col,
85+
Message: "included from here",
86+
}
87+
currentMessage = &context.Message
88+
fullContext = append(fullContext, context)
89+
continue
90+
}
91+
92+
if split := strings.SplitN(in, ": ", 2); len(split) == 2 {
93+
file, line, column := extractFileLineAndColumn(split[0])
94+
msg := split[1]
95+
96+
if line == 0 && column == 0 {
97+
// 2. in-file context
98+
inFileContext = &Context{
99+
Message: msg,
100+
File: file,
101+
}
102+
currentMessage = &inFileContext.Message
103+
continue
104+
}
105+
106+
if strings.HasPrefix(msg, "note: ") {
107+
msg = strings.TrimPrefix(msg, "note: ")
108+
// 4. annotations or suggestions
109+
if currentDiagnostic != nil {
110+
suggestion := &Note{
111+
Message: msg,
112+
File: file,
113+
Line: line,
114+
Column: column,
115+
}
116+
currentDiagnostic.Suggestions = append(currentDiagnostic.Suggestions, suggestion)
117+
currentMessage = &suggestion.Message
118+
}
119+
continue
120+
}
121+
122+
severity := SeverityUnspecified
123+
if strings.HasPrefix(msg, "error: ") {
124+
msg = strings.TrimPrefix(msg, "error: ")
125+
severity = SeverityError
126+
} else if strings.HasPrefix(msg, "warning: ") {
127+
msg = strings.TrimPrefix(msg, "warning: ")
128+
severity = SeverityWarning
129+
} else if strings.HasPrefix(msg, "fatal error: ") {
130+
msg = strings.TrimPrefix(msg, "fatal error: ")
131+
severity = SeverityFatal
132+
}
133+
if severity != SeverityUnspecified {
134+
// 3. actual diagnostic lines
135+
currentDiagnostic = &Diagnostic{
136+
Severity: severity,
137+
Message: msg,
138+
File: file,
139+
Line: line,
140+
Column: column,
141+
}
142+
currentMessage = &currentDiagnostic.Message
143+
144+
if len(fullContext) > 0 {
145+
if fullContextRefersTo == "" || fullContextRefersTo == file {
146+
fullContextRefersTo = file
147+
currentDiagnostic.Context = append(currentDiagnostic.Context, fullContext...)
148+
}
149+
}
150+
if inFileContext != nil && inFileContext.File == file {
151+
currentDiagnostic.Context = append(currentDiagnostic.Context, inFileContext)
152+
}
153+
154+
res = append(res, currentDiagnostic)
155+
continue
156+
}
157+
}
158+
159+
// 5. extra context lines
160+
if strings.HasPrefix(in, " ") {
161+
if currentMessage != nil {
162+
*currentMessage += "\n" + in
163+
}
164+
continue
165+
}
166+
}
167+
return res, nil
168+
}
169+
170+
func extractFileLineAndColumn(file string) (string, int, int) {
171+
split := strings.Split(file, ":")
172+
file = split[0]
173+
if len(split) == 1 {
174+
return file, 0, 0
175+
}
176+
line, err := strconv.Atoi(split[1])
177+
if err != nil || len(split) == 2 {
178+
return file, line, 0
179+
}
180+
column, _ := strconv.Atoi(split[2])
181+
return file, line, column
182+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to license@arduino.cc.
15+
16+
package diagnostics
17+
18+
import (
19+
"bytes"
20+
"encoding/json"
21+
"strings"
22+
"testing"
23+
24+
"github.com/arduino/go-paths-helper"
25+
"github.com/stretchr/testify/require"
26+
)
27+
28+
func TestParser(t *testing.T) {
29+
t.Run("Generic001", func(t *testing.T) { runParserTest(t, "test001.txt") })
30+
t.Run("Generic002", func(t *testing.T) { runParserTest(t, "test002.txt") })
31+
t.Run("Generic003", func(t *testing.T) { runParserTest(t, "test003.txt") })
32+
}
33+
34+
func runParserTest(t *testing.T, testFile string) {
35+
testData, err := paths.New("testdata", "compiler_outputs", testFile).ReadFile()
36+
require.NoError(t, err)
37+
// The first line contains the compiler arguments
38+
idx := bytes.Index(testData, []byte("\n"))
39+
require.NotEqual(t, -1, idx)
40+
args := strings.Split(string(testData[0:idx]), " ")
41+
// The remainder of the file is the compiler output
42+
data := testData[idx:]
43+
44+
// Run compiler detection and parse compiler output
45+
detectedCompiler := DetectCompilerFromCommandLine(args, true)
46+
require.NotNil(t, detectedCompiler)
47+
diags, err := ParseCompilerOutput(detectedCompiler, data)
48+
require.NoError(t, err)
49+
50+
// Check if the parsed data match the expected output
51+
output, err := json.MarshalIndent(diags, "", " ")
52+
require.NoError(t, err)
53+
golden, err := paths.New("testdata", "compiler_outputs", testFile+".json").ReadFile()
54+
require.NoError(t, err)
55+
require.Equal(t, string(golden), string(output))
56+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/home/megabug/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x8036 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"Arduino Leonardo\"" -I/home/megabug/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I/home/megabug/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/leonardo /tmp/arduino/sketches/002050EAA7EFB9A4FC451CDFBC0FA2D3/sketch/Blink.ino.cpp -o /tmp/arduino/sketches/002050EAA7EFB9A4FC451CDFBC0FA2D3/sketch/Blink.ino.cpp.o
2+
/home/megabug/Arduino/Blink/Blink.ino:1:14: error: expected initializer before 'asd'
3+
void setup() asd {
4+
^~~
5+
/home/megabug/Arduino/Blink/Blink.ino: In function 'void loop()':
6+
/home/megabug/Arduino/Blink/Blink.ino:6:1: error: 'asd' was not declared in this scope
7+
asd
8+
^~~
9+
/home/megabug/Arduino/Blink/Blink.ino:6:1: note: suggested alternative: 'rand'
10+
asd
11+
^~~
12+
rand
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[
2+
{
3+
"severity": "ERROR",
4+
"message": "expected initializer before 'asd'\n void setup() asd {\n ^~~",
5+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
6+
"line": 1,
7+
"col": 14
8+
},
9+
{
10+
"severity": "ERROR",
11+
"message": "'asd' was not declared in this scope\n asd\n ^~~",
12+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
13+
"line": 6,
14+
"col": 1,
15+
"context": [
16+
{
17+
"message": "In function 'void loop()':",
18+
"file": "/home/megabug/Arduino/Blink/Blink.ino"
19+
}
20+
],
21+
"suggestions": [
22+
{
23+
"message": "suggested alternative: 'rand'\n asd\n ^~~\n rand",
24+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
25+
"line": 6,
26+
"col": 1
27+
}
28+
]
29+
}
30+
]
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/home/megabug/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/home/megabug/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I/home/megabug/.arduino15/packages/arduino/hardware/avr/1.8.6/variants/standard -I/home/megabug/Arduino/libraries/Audio/src /tmp/arduino/sketches/002050EAA7EFB9A4FC451CDFBC0FA2D3/sketch/Blink.ino.cpp -o /tmp/arduino/sketches/002050EAA7EFB9A4FC451CDFBC0FA2D3/sketch/Blink.ino.cpp.o
2+
In file included from /home/megabug/Arduino/libraries/Audio/src/Audio.h:16:0,
3+
from /home/megabug/Arduino/Blink/Blink.ino:1:
4+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:21:16: error: expected ')' before '*' token
5+
DACClass(Dacc *_dac, uint32_t _dacId, IRQn_Type _isrId) :
6+
^
7+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:35:2: error: 'Dacc' does not name a type
8+
Dacc *dac;
9+
^~~~
10+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:37:2: error: 'IRQn_Type' does not name a type
11+
IRQn_Type isrId;
12+
^~~~~~~~~
13+
/home/megabug/Arduino/libraries/Audio/src/DAC.h: In member function 'void DACClass::enableInterrupts()':
14+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:31:44: error: 'isrId' was not declared in this scope
15+
void enableInterrupts() { NVIC_EnableIRQ(isrId); };
16+
^~~~~
17+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:31:29: error: 'NVIC_EnableIRQ' was not declared in this scope
18+
void enableInterrupts() { NVIC_EnableIRQ(isrId); };
19+
^~~~~~~~~~~~~~
20+
/home/megabug/Arduino/libraries/Audio/src/DAC.h: In member function 'void DACClass::disableInterrupts()':
21+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:32:45: error: 'isrId' was not declared in this scope
22+
void disableInterrupts() { NVIC_DisableIRQ(isrId); };
23+
^~~~~
24+
/home/megabug/Arduino/libraries/Audio/src/DAC.h:32:29: error: 'NVIC_DisableIRQ' was not declared in this scope
25+
void disableInterrupts() { NVIC_DisableIRQ(isrId); };
26+
^~~~~~~~~~~~~~~
27+
/home/megabug/Arduino/Blink/Blink.ino: In function 'void setup()':
28+
/home/megabug/Arduino/Blink/Blink.ino:4:1: error: 'asd' was not declared in this scope
29+
asd;
30+
^~~
31+
/home/megabug/Arduino/Blink/Blink.ino:4:1: note: suggested alternative: 'rand'
32+
asd;
33+
^~~
34+
rand
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
[
2+
{
3+
"severity": "ERROR",
4+
"message": "expected ')' before '*' token\n DACClass(Dacc *_dac, uint32_t _dacId, IRQn_Type _isrId) :\n ^",
5+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
6+
"line": 21,
7+
"col": 16,
8+
"context": [
9+
{
10+
"message": "included from here",
11+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
12+
"line": 16
13+
},
14+
{
15+
"message": "included from here",
16+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
17+
"line": 1
18+
}
19+
]
20+
},
21+
{
22+
"severity": "ERROR",
23+
"message": "'Dacc' does not name a type\n Dacc *dac;\n ^~~~",
24+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
25+
"line": 35,
26+
"col": 2,
27+
"context": [
28+
{
29+
"message": "included from here",
30+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
31+
"line": 16
32+
},
33+
{
34+
"message": "included from here",
35+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
36+
"line": 1
37+
}
38+
]
39+
},
40+
{
41+
"severity": "ERROR",
42+
"message": "'IRQn_Type' does not name a type\n IRQn_Type isrId;\n ^~~~~~~~~",
43+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
44+
"line": 37,
45+
"col": 2,
46+
"context": [
47+
{
48+
"message": "included from here",
49+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
50+
"line": 16
51+
},
52+
{
53+
"message": "included from here",
54+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
55+
"line": 1
56+
}
57+
]
58+
},
59+
{
60+
"severity": "ERROR",
61+
"message": "'isrId' was not declared in this scope\n void enableInterrupts() { NVIC_EnableIRQ(isrId); };\n ^~~~~",
62+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
63+
"line": 31,
64+
"col": 44,
65+
"context": [
66+
{
67+
"message": "included from here",
68+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
69+
"line": 16
70+
},
71+
{
72+
"message": "included from here",
73+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
74+
"line": 1
75+
},
76+
{
77+
"message": "In member function 'void DACClass::enableInterrupts()':",
78+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
79+
}
80+
]
81+
},
82+
{
83+
"severity": "ERROR",
84+
"message": "'NVIC_EnableIRQ' was not declared in this scope\n void enableInterrupts() { NVIC_EnableIRQ(isrId); };\n ^~~~~~~~~~~~~~",
85+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
86+
"line": 31,
87+
"col": 29,
88+
"context": [
89+
{
90+
"message": "included from here",
91+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
92+
"line": 16
93+
},
94+
{
95+
"message": "included from here",
96+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
97+
"line": 1
98+
},
99+
{
100+
"message": "In member function 'void DACClass::enableInterrupts()':",
101+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
102+
}
103+
]
104+
},
105+
{
106+
"severity": "ERROR",
107+
"message": "'isrId' was not declared in this scope\n void disableInterrupts() { NVIC_DisableIRQ(isrId); };\n ^~~~~",
108+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
109+
"line": 32,
110+
"col": 45,
111+
"context": [
112+
{
113+
"message": "included from here",
114+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
115+
"line": 16
116+
},
117+
{
118+
"message": "included from here",
119+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
120+
"line": 1
121+
},
122+
{
123+
"message": "In member function 'void DACClass::disableInterrupts()':",
124+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
125+
}
126+
]
127+
},
128+
{
129+
"severity": "ERROR",
130+
"message": "'NVIC_DisableIRQ' was not declared in this scope\n void disableInterrupts() { NVIC_DisableIRQ(isrId); };\n ^~~~~~~~~~~~~~~",
131+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
132+
"line": 32,
133+
"col": 29,
134+
"context": [
135+
{
136+
"message": "included from here",
137+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
138+
"line": 16
139+
},
140+
{
141+
"message": "included from here",
142+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
143+
"line": 1
144+
},
145+
{
146+
"message": "In member function 'void DACClass::disableInterrupts()':",
147+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
148+
}
149+
]
150+
},
151+
{
152+
"severity": "ERROR",
153+
"message": "'asd' was not declared in this scope\n asd;\n ^~~",
154+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
155+
"line": 4,
156+
"col": 1,
157+
"context": [
158+
{
159+
"message": "In function 'void setup()':",
160+
"file": "/home/megabug/Arduino/Blink/Blink.ino"
161+
}
162+
],
163+
"suggestions": [
164+
{
165+
"message": "suggested alternative: 'rand'\n asd;\n ^~~\n rand",
166+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
167+
"line": 4,
168+
"col": 1
169+
}
170+
]
171+
}
172+
]

‎arduino/builder/internal/diagnostics/testdata/compiler_outputs/test003.txt

Lines changed: 40 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
[
2+
{
3+
"severity": "ERROR",
4+
"message": "expected ')' before '*' token\n DACClass(Dacc *_dac, uint32_t _dacId, IRQn_Type _isrId) :\n ~ ^~\n )",
5+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
6+
"line": 21,
7+
"col": 15,
8+
"context": [
9+
{
10+
"message": "included from here",
11+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
12+
"line": 16
13+
},
14+
{
15+
"message": "included from here",
16+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
17+
"line": 1
18+
}
19+
]
20+
},
21+
{
22+
"severity": "ERROR",
23+
"message": "'Dacc' does not name a type\n Dacc *dac;\n ^~~~",
24+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
25+
"line": 35,
26+
"col": 2,
27+
"context": [
28+
{
29+
"message": "included from here",
30+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
31+
"line": 16
32+
},
33+
{
34+
"message": "included from here",
35+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
36+
"line": 1
37+
}
38+
]
39+
},
40+
{
41+
"severity": "ERROR",
42+
"message": "'IRQn_Type' does not name a type\n IRQn_Type isrId;\n ^~~~~~~~~",
43+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
44+
"line": 37,
45+
"col": 2,
46+
"context": [
47+
{
48+
"message": "included from here",
49+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
50+
"line": 16
51+
},
52+
{
53+
"message": "included from here",
54+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
55+
"line": 1
56+
}
57+
]
58+
},
59+
{
60+
"severity": "ERROR",
61+
"message": "'isrId' was not declared in this scope\n void enableInterrupts() { NVIC_EnableIRQ(isrId); };\n ^~~~~",
62+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
63+
"line": 31,
64+
"col": 43,
65+
"context": [
66+
{
67+
"message": "included from here",
68+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
69+
"line": 16
70+
},
71+
{
72+
"message": "included from here",
73+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
74+
"line": 1
75+
},
76+
{
77+
"message": "In member function 'void DACClass::enableInterrupts()':",
78+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
79+
}
80+
]
81+
},
82+
{
83+
"severity": "ERROR",
84+
"message": "'NVIC_EnableIRQ' was not declared in this scope\n void enableInterrupts() { NVIC_EnableIRQ(isrId); };\n ^~~~~~~~~~~~~~",
85+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
86+
"line": 31,
87+
"col": 28,
88+
"context": [
89+
{
90+
"message": "included from here",
91+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
92+
"line": 16
93+
},
94+
{
95+
"message": "included from here",
96+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
97+
"line": 1
98+
},
99+
{
100+
"message": "In member function 'void DACClass::enableInterrupts()':",
101+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
102+
}
103+
]
104+
},
105+
{
106+
"severity": "ERROR",
107+
"message": "'isrId' was not declared in this scope\n void disableInterrupts() { NVIC_DisableIRQ(isrId); };\n ^~~~~",
108+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
109+
"line": 32,
110+
"col": 44,
111+
"context": [
112+
{
113+
"message": "included from here",
114+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
115+
"line": 16
116+
},
117+
{
118+
"message": "included from here",
119+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
120+
"line": 1
121+
},
122+
{
123+
"message": "In member function 'void DACClass::disableInterrupts()':",
124+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
125+
}
126+
]
127+
},
128+
{
129+
"severity": "ERROR",
130+
"message": "'NVIC_DisableIRQ' was not declared in this scope\n void disableInterrupts() { NVIC_DisableIRQ(isrId); };\n ^~~~~~~~~~~~~~~",
131+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h",
132+
"line": 32,
133+
"col": 28,
134+
"context": [
135+
{
136+
"message": "included from here",
137+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
138+
"line": 16
139+
},
140+
{
141+
"message": "included from here",
142+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
143+
"line": 1
144+
},
145+
{
146+
"message": "In member function 'void DACClass::disableInterrupts()':",
147+
"file": "/home/megabug/Arduino/libraries/Audio/src/DAC.h"
148+
}
149+
]
150+
},
151+
{
152+
"severity": "WARNING",
153+
"message": "no return statement in function returning non-void [-Wreturn-type]\n virtual size_t write(uint8_t c) { /* not implemented */ };\n ^",
154+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h",
155+
"line": 25,
156+
"col": 82,
157+
"context": [
158+
{
159+
"message": "included from here",
160+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
161+
"line": 1
162+
},
163+
{
164+
"message": "In member function 'virtual size_t AudioClass::write(uint8_t)':",
165+
"file": "/home/megabug/Arduino/libraries/Audio/src/Audio.h"
166+
}
167+
]
168+
},
169+
{
170+
"severity": "ERROR",
171+
"message": "'asd' was not declared in this scope\n asd;\n ^~~",
172+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
173+
"line": 4,
174+
"col": 1,
175+
"context": [
176+
{
177+
"message": "In function 'void setup()':",
178+
"file": "/home/megabug/Arduino/Blink/Blink.ino"
179+
}
180+
],
181+
"suggestions": [
182+
{
183+
"message": "suggested alternative: 'rand'\n asd;\n ^~~\n rand",
184+
"file": "/home/megabug/Arduino/Blink/Blink.ino",
185+
"line": 4,
186+
"col": 1
187+
}
188+
]
189+
}
190+
]

0 commit comments

Comments
 (0)
Please sign in to comment.