@@ -6,28 +6,31 @@ import (
6
6
"go.bug.st/lsp/jsonrpc"
7
7
)
8
8
9
- func (ls * INOLanguageServer ) clang2IdeRangeAndDocumentURI (logger jsonrpc.FunctionLogger , clangURI lsp.DocumentURI , clangRange lsp.Range ) (lsp.DocumentURI , lsp.Range , error ) {
9
+ func (ls * INOLanguageServer ) clang2IdeRangeAndDocumentURI (logger jsonrpc.FunctionLogger , clangURI lsp.DocumentURI , clangRange lsp.Range ) (lsp.DocumentURI , lsp.Range , bool , error ) {
10
10
// Sketchbook/Sketch/Sketch.ino <-> build-path/sketch/Sketch.ino.cpp
11
11
// Sketchbook/Sketch/AnotherTab.ino <-> build-path/sketch/Sketch.ino.cpp (different section from above)
12
12
if ls .clangURIRefersToIno (clangURI ) {
13
13
// We are converting from preprocessed sketch.ino.cpp back to a sketch.ino file
14
14
idePath , ideRange , err := ls .sketchMapper .CppToInoRangeOk (clangRange )
15
- if err == nil {
16
- if ls .sketchMapper .IsPreprocessedCppLine (clangRange .Start .Line ) {
17
- idePath = sourcemapper .NotIno .File
18
- logger .Logf ("Range is in PREPROCESSED section of the sketch" )
19
- }
20
- } else if _ , ok := err .(sourcemapper.AdjustedRangeErr ); ok {
15
+ if _ , ok := err .(sourcemapper.AdjustedRangeErr ); ok {
21
16
logger .Logf ("Range has been END LINE ADJSUTED" )
22
- err = nil
23
- } else {
17
+ } else if err != nil {
24
18
logger .Logf ("Range conversion ERROR: %s" , err )
25
19
ls .sketchMapper .DebugLogAll ()
26
- return lsp .NilURI , lsp .NilRange , err
20
+ return lsp .NilURI , lsp .NilRange , false , err
27
21
}
28
22
ideURI , err := ls .idePathToIdeURI (logger , idePath )
23
+ if err != nil {
24
+ logger .Logf ("Range conversion ERROR: %s" , err )
25
+ ls .sketchMapper .DebugLogAll ()
26
+ return lsp .NilURI , lsp .NilRange , false , err
27
+ }
28
+ inPreprocessed := ls .sketchMapper .IsPreprocessedCppLine (clangRange .Start .Line )
29
+ if inPreprocessed {
30
+ logger .Logf ("Range is in PREPROCESSED section of the sketch" )
31
+ }
29
32
logger .Logf ("Range: %s:%s -> %s:%s" , clangURI , clangRange , ideURI , ideRange )
30
- return ideURI , ideRange , err
33
+ return ideURI , ideRange , inPreprocessed , err
31
34
}
32
35
33
36
// /another/global/path/to/source.cpp <-> /another/global/path/to/source.cpp (same range)
@@ -36,35 +39,35 @@ func (ls *INOLanguageServer) clang2IdeRangeAndDocumentURI(logger jsonrpc.Functio
36
39
inside , err := clangPath .IsInsideDir (ls .buildSketchRoot )
37
40
if err != nil {
38
41
logger .Logf ("ERROR: could not determine if '%s' is inside '%s'" , clangURI , ls .buildSketchRoot )
39
- return lsp .NilURI , lsp .NilRange , err
42
+ return lsp .NilURI , lsp .NilRange , false , err
40
43
}
41
44
if ! inside {
42
45
ideURI := clangURI
43
46
logger .Logf ("Range: %s:%s -> %s:%s" , clangURI , clangRange , ideURI , ideRange )
44
- return clangURI , clangRange , nil
47
+ return clangURI , clangRange , false , nil
45
48
}
46
49
47
50
// Sketchbook/Sketch/AnotherFile.cpp <-> build-path/sketch/AnotherFile.cpp (same range)
48
51
rel , err := ls .buildSketchRoot .RelTo (clangPath )
49
52
if err != nil {
50
53
logger .Logf ("ERROR: could not transform '%s' into a relative path on '%s': %s" , clangURI , ls .buildSketchRoot , err )
51
- return lsp .NilURI , lsp .NilRange , err
54
+ return lsp .NilURI , lsp .NilRange , false , err
52
55
}
53
56
idePath := ls .sketchRoot .JoinPath (rel ).String ()
54
57
ideURI , err := ls .idePathToIdeURI (logger , idePath )
55
58
logger .Logf ("Range: %s:%s -> %s:%s" , clangURI , clangRange , ideURI , ideRange )
56
- return ideURI , clangRange , err
59
+ return ideURI , clangRange , false , err
57
60
}
58
61
59
- func (ls * INOLanguageServer ) clang2IdeDocumentHighlight (logger jsonrpc.FunctionLogger , clangHighlight lsp.DocumentHighlight , cppURI lsp.DocumentURI ) (lsp.DocumentHighlight , error ) {
60
- _ , ideRange , err := ls .clang2IdeRangeAndDocumentURI (logger , cppURI , clangHighlight .Range )
61
- if err != nil {
62
- return lsp.DocumentHighlight {}, err
62
+ func (ls * INOLanguageServer ) clang2IdeDocumentHighlight (logger jsonrpc.FunctionLogger , clangHighlight lsp.DocumentHighlight , cppURI lsp.DocumentURI ) (lsp.DocumentHighlight , bool , error ) {
63
+ _ , ideRange , inPreprocessed , err := ls .clang2IdeRangeAndDocumentURI (logger , cppURI , clangHighlight .Range )
64
+ if err != nil || inPreprocessed {
65
+ return lsp.DocumentHighlight {}, inPreprocessed , err
63
66
}
64
67
return lsp.DocumentHighlight {
65
68
Kind : clangHighlight .Kind ,
66
69
Range : ideRange ,
67
- }, nil
70
+ }, false , nil
68
71
}
69
72
70
73
func (ls * INOLanguageServer ) clang2IdeDiagnostics (logger jsonrpc.FunctionLogger , clangDiagsParams * lsp.PublishDiagnosticsParams ) (map [lsp.DocumentURI ]* lsp.PublishDiagnosticsParams , error ) {
@@ -73,31 +76,60 @@ func (ls *INOLanguageServer) clang2IdeDiagnostics(logger jsonrpc.FunctionLogger,
73
76
allIdeDiagsParams := map [lsp.DocumentURI ]* lsp.PublishDiagnosticsParams {}
74
77
75
78
for _ , clangDiagnostic := range clangDiagsParams .Diagnostics {
76
- ideURI , ideRange , err := ls .clang2IdeRangeAndDocumentURI (logger , clangDiagsParams .URI , clangDiagnostic . Range )
79
+ ideURI , ideDiagnostic , inPreprocessed , err := ls .clang2IdeDiagnostic (logger , clangDiagsParams .URI , clangDiagnostic )
77
80
if err != nil {
78
81
return nil , err
79
82
}
80
- if ideURI . String () == sourcemapper . NotInoURI . String () {
83
+ if inPreprocessed {
81
84
continue
82
85
}
83
-
84
- ideDiagsParams , ok := allIdeDiagsParams [ideURI ]
85
- if ! ok {
86
- ideDiagsParams = & lsp.PublishDiagnosticsParams {
87
- URI : ideURI ,
88
- Diagnostics : []lsp.Diagnostic {},
89
- }
90
- allIdeDiagsParams [ideURI ] = ideDiagsParams
86
+ if _ , ok := allIdeDiagsParams [ideURI ]; ! ok {
87
+ allIdeDiagsParams [ideURI ] = & lsp.PublishDiagnosticsParams {URI : ideURI }
91
88
}
92
-
93
- ideInoDiag := clangDiagnostic
94
- ideInoDiag .Range = ideRange
95
- ideDiagsParams .Diagnostics = append (ideDiagsParams .Diagnostics , ideInoDiag )
89
+ allIdeDiagsParams [ideURI ].Diagnostics = append (allIdeDiagsParams [ideURI ].Diagnostics , ideDiagnostic )
96
90
}
97
91
98
92
return allIdeDiagsParams , nil
99
93
}
100
94
95
+ func (ls * INOLanguageServer ) clang2IdeDiagnostic (logger jsonrpc.FunctionLogger , clangURI lsp.DocumentURI , clangDiagnostic lsp.Diagnostic ) (lsp.DocumentURI , lsp.Diagnostic , bool , error ) {
96
+ ideURI , ideRange , inPreproccesed , err := ls .clang2IdeRangeAndDocumentURI (logger , clangURI , clangDiagnostic .Range )
97
+ if err != nil || inPreproccesed {
98
+ return lsp.DocumentURI {}, lsp.Diagnostic {}, inPreproccesed , err
99
+ }
100
+
101
+ ideDiagnostic := clangDiagnostic
102
+ ideDiagnostic .Range = ideRange
103
+
104
+ if len (clangDiagnostic .RelatedInformation ) > 0 {
105
+ ideInfos , err := ls .clang2IdeDiagnosticRelatedInformationArray (logger , clangDiagnostic .RelatedInformation )
106
+ if err != nil {
107
+ return lsp.DocumentURI {}, lsp.Diagnostic {}, false , err
108
+ }
109
+ ideDiagnostic .RelatedInformation = ideInfos
110
+ }
111
+ return ideURI , ideDiagnostic , false , nil
112
+ }
113
+
114
+ func (ls * INOLanguageServer ) clang2IdeDiagnosticRelatedInformationArray (logger jsonrpc.FunctionLogger , clangInfos []lsp.DiagnosticRelatedInformation ) ([]lsp.DiagnosticRelatedInformation , error ) {
115
+ ideInfos := []lsp.DiagnosticRelatedInformation {}
116
+ for _ , clangInfo := range clangInfos {
117
+ ideLocation , inPreprocessed , err := ls .cpp2inoLocation (logger , clangInfo .Location )
118
+ if err != nil {
119
+ return nil , err
120
+ }
121
+ if inPreprocessed {
122
+ logger .Logf ("Ignoring in-preprocessed-section diagnostic related information" )
123
+ continue
124
+ }
125
+ ideInfos = append (ideInfos , lsp.DiagnosticRelatedInformation {
126
+ Message : clangInfo .Message ,
127
+ Location : ideLocation ,
128
+ })
129
+ }
130
+ return ideInfos , nil
131
+ }
132
+
101
133
func (ls * INOLanguageServer ) clang2IdeSymbolInformation (clangSymbolsInformation []lsp.SymbolInformation ) []lsp.SymbolInformation {
102
134
panic ("not implemented" )
103
135
}
0 commit comments