@@ -32,6 +32,56 @@ GccTreeDecoder::GccTreeDecoder():
32
32
33
33
GccTreeDecoder::~GccTreeDecoder () = default ;
34
34
35
+ static bool gccReadLocRegion (
36
+ DefEvent *pEvt,
37
+ const pt::ptree &beg,
38
+ const pt::ptree &end)
39
+ {
40
+ // read file name
41
+ pEvt->fileName = valueOf<std::string>(beg, " file" , " <unknown>" );
42
+ if (pEvt->fileName != valueOf<std::string>(end, " file" , " <unknown>" ))
43
+ return false ;
44
+
45
+ // read line
46
+ if ((pEvt->line = valueOf<int >(beg, " line" ))) {
47
+ const int endLine = valueOf<int >(end, " line" );
48
+ pEvt->vSize = diffNums (pEvt->line , endLine);
49
+ }
50
+
51
+ // read column
52
+ if ((pEvt->column = valueOf<int >(beg, " byte-column" ))) {
53
+ const int endColumn = valueOf<int >(end, " byte-column" );
54
+ pEvt->hSize = diffNums (pEvt->column , endColumn);
55
+ }
56
+
57
+ return true ;
58
+ }
59
+
60
+ static void gccReadLocation (DefEvent *pEvt, const pt::ptree *locs)
61
+ {
62
+ using std::string;
63
+
64
+ if (locs->empty ())
65
+ return ;
66
+
67
+ const pt::ptree &firstLoc = locs->begin ()->second ;
68
+
69
+ // try to read a region between start..finish
70
+ const pt::ptree *beg, *end;
71
+ if (findChildOf (&beg, firstLoc, " start" )
72
+ && findChildOf (&end, firstLoc, " finish" )
73
+ && gccReadLocRegion (pEvt, *beg, *end))
74
+ return ;
75
+
76
+ // fallback to caret
77
+ const pt::ptree *caret;
78
+ if (findChildOf (&caret, firstLoc, " caret" )) {
79
+ pEvt->fileName = valueOf<string>(*caret, " file" , " <unknown>" );
80
+ pEvt->line = valueOf<int > (*caret, " line" );
81
+ pEvt->column = valueOf<int > (*caret, " byte-column" );
82
+ }
83
+ }
84
+
35
85
static bool gccReadEvent (DefEvent *pEvt, const pt::ptree &evtNode)
36
86
{
37
87
using std::string;
@@ -45,14 +95,8 @@ static bool gccReadEvent(DefEvent *pEvt, const pt::ptree &evtNode)
45
95
// read location
46
96
pEvt->fileName = " <unknown>" ;
47
97
const pt::ptree *locs;
48
- if (findChildOf (&locs, evtNode, " locations" ) && !locs->empty ()) {
49
- const pt::ptree *caret;
50
- if (findChildOf (&caret, locs->begin ()->second , " caret" )) {
51
- pEvt->fileName = valueOf<string>(*caret, " file" , " <unknown>" );
52
- pEvt->line = valueOf<int > (*caret, " line" );
53
- pEvt->column = valueOf<int > (*caret, " byte-column" );
54
- }
55
- }
98
+ if (findChildOf (&locs, evtNode, " locations" ))
99
+ gccReadLocation (pEvt, locs);
56
100
57
101
// read message
58
102
pEvt->msg = valueOf<string>(evtNode, " message" , " <unknown>" );
0 commit comments