Skip to content

Commit 6d41c46

Browse files
authored
Merge pull request #710 from usethesource/error-causes
Map optional `causes` field of Message to `RelatedDiagnosticInformation` of Diagnostics
2 parents fb9bf79 + 3741a84 commit 6d41c46

File tree

8 files changed

+37
-16
lines changed

8 files changed

+37
-16
lines changed

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/BaseWorkspaceService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import org.eclipse.lsp4j.services.LanguageClient;
5858
import org.eclipse.lsp4j.services.LanguageClientAware;
5959
import org.eclipse.lsp4j.services.WorkspaceService;
60-
import org.rascalmpl.vscode.lsp.util.locations.Locations;
6160

6261
public class BaseWorkspaceService implements WorkspaceService, LanguageClientAware {
6362
private static final Logger logger = LogManager.getLogger(BaseWorkspaceService.class);

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/IBaseTextDocumentService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.eclipse.lsp4j.services.LanguageClient;
3838
import org.eclipse.lsp4j.services.TextDocumentService;
3939
import org.rascalmpl.vscode.lsp.terminal.ITerminalIDEServer.LanguageParameter;
40+
import org.rascalmpl.vscode.lsp.util.locations.ColumnMaps;
4041
import org.rascalmpl.vscode.lsp.util.locations.LineColumnOffsetMap;
4142

4243
import io.usethesource.vallang.ISourceLocation;
@@ -54,11 +55,13 @@ public interface IBaseTextDocumentService extends TextDocumentService {
5455
void unregisterLanguage(LanguageParameter lang);
5556
CompletableFuture<IValue> executeCommand(String languageName, String command);
5657
LineColumnOffsetMap getColumnMap(ISourceLocation file);
58+
ColumnMaps getColumnMaps();
5759
TextDocumentState getDocumentState(ISourceLocation file);
5860

5961
boolean isManagingFile(ISourceLocation file);
6062

6163
void didRenameFiles(RenameFilesParams params, List<WorkspaceFolder> workspaceFolders);
6264
void didDeleteFiles(DeleteFilesParams params);
6365
void cancelProgress(String progressId);
66+
6467
}

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/LSPIDEServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public void registerLocations(IString scheme, IString auth, IMap map) {
148148

149149
@Override
150150
public void registerDiagnostics(IList messages) {
151-
Map<ISourceLocation, List<Diagnostic>> translated = Diagnostics.translateMessages(messages, docService);
151+
Map<ISourceLocation, List<Diagnostic>> translated = Diagnostics.translateMessages(messages, docService.getColumnMaps());
152152

153153
for (Entry<ISourceLocation, List<Diagnostic>> entry : translated.entrySet()) {
154154
String uri = entry.getKey().getURI().toString();

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,11 @@ public ParametricTextDocumentService(ExecutorService exec, @Nullable LanguagePar
199199
FallbackResolver.getInstance().registerTextDocumentService(this);
200200
}
201201

202+
@Override
203+
public ColumnMaps getColumnMaps() {
204+
return columns;
205+
}
206+
202207
@Override
203208
public LineColumnOffsetMap getColumnMap(ISourceLocation file) {
204209
return columns.get(file);

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParserOnlyContribution.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import org.eclipse.lsp4j.jsonrpc.messages.Either;
3939
import org.rascalmpl.interpreter.NullRascalMonitor;
4040
import org.rascalmpl.shell.ShellEvaluatorFactory;
41-
import org.rascalmpl.uri.URIUtil;
4241
import org.rascalmpl.values.IRascalValueFactory;
4342
import org.rascalmpl.values.RascalFunctionValueFactory;
4443
import org.rascalmpl.values.RascalValueFactory;
@@ -49,7 +48,6 @@
4948

5049
import io.usethesource.vallang.IConstructor;
5150
import io.usethesource.vallang.IList;
52-
import io.usethesource.vallang.IMap;
5351
import io.usethesource.vallang.ISet;
5452
import io.usethesource.vallang.ISourceLocation;
5553
import io.usethesource.vallang.ITuple;

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ public RascalTextDocumentService(ExecutorService exec) {
159159
FallbackResolver.getInstance().registerTextDocumentService(this);
160160
}
161161

162+
@Override
163+
public ColumnMaps getColumnMaps() {
164+
return columns;
165+
}
166+
162167
@Override
163168
public LineColumnOffsetMap getColumnMap(ISourceLocation file) {
164169
return columns.get(file);

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/terminal/TerminalIDEServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public void registerLocations(RegisterLocationsParameters param) {
151151

152152
@Override
153153
public void registerDiagnostics(RegisterDiagnosticsParameters param) {
154-
Map<ISourceLocation, List<Diagnostic>> translated = Diagnostics.translateMessages(param.getMessages(), docService);
154+
Map<ISourceLocation, List<Diagnostic>> translated = Diagnostics.translateMessages(param.getMessages(), docService.getColumnMaps());
155155

156156
for (Entry<ISourceLocation, List<Diagnostic>> entry : translated.entrySet()) {
157157
String uri = entry.getKey().getURI().toString();

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Diagnostics.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,15 @@
3737
import org.apache.logging.log4j.LogManager;
3838
import org.apache.logging.log4j.Logger;
3939
import org.eclipse.lsp4j.Diagnostic;
40+
import org.eclipse.lsp4j.DiagnosticRelatedInformation;
4041
import org.eclipse.lsp4j.DiagnosticSeverity;
4142
import org.eclipse.lsp4j.Position;
4243
import org.eclipse.lsp4j.Range;
4344
import org.rascalmpl.parser.gtd.exception.ParseError;
4445
import org.rascalmpl.values.ValueFactoryFactory;
4546
import org.rascalmpl.values.parsetrees.ITree;
4647
import org.rascalmpl.values.parsetrees.TreeAdapter;
47-
import org.rascalmpl.vscode.lsp.IBaseTextDocumentService;
4848
import org.rascalmpl.vscode.lsp.util.locations.ColumnMaps;
49-
import org.rascalmpl.vscode.lsp.util.locations.LineColumnOffsetMap;
5049
import org.rascalmpl.vscode.lsp.util.locations.Locations;
5150
import io.usethesource.vallang.ICollection;
5251
import io.usethesource.vallang.IConstructor;
@@ -176,19 +175,27 @@ private static void storeFixCommands(IConstructor d, Diagnostic result) {
176175
}
177176

178177
public static Diagnostic translateDiagnostic(IConstructor d, ColumnMaps cm) {
179-
return translateDiagnostic(d, Locations.toRange(getMessageLocation(d), cm));
178+
return translateDiagnostic(d, Locations.toRange(getMessageLocation(d), cm), cm);
180179
}
181180

182-
public static Diagnostic translateDiagnostic(IConstructor d, LineColumnOffsetMap cm) {
183-
return translateDiagnostic(d, Locations.toRange(getMessageLocation(d), cm));
184-
}
185-
186-
public static Diagnostic translateDiagnostic(IConstructor d, Range range) {
181+
public static Diagnostic translateDiagnostic(IConstructor d, Range range, ColumnMaps otherFiles) {
187182
Diagnostic result = new Diagnostic();
188183
result.setSeverity(severityMap.get(d.getName()));
189-
result.setMessage(((IString) d.get("msg")).getValue());
184+
result.setMessage(getMessageString(d));
190185
result.setRange(range);
191186

187+
188+
if (d.asWithKeywordParameters().hasParameter("causes")) {
189+
result.setRelatedInformation(
190+
((IList) d.asWithKeywordParameters().getParameter("causes")).stream()
191+
.map(IConstructor.class::cast)
192+
.map(c -> new DiagnosticRelatedInformation(
193+
Locations.toLSPLocation(getMessageLocation(d), otherFiles.get(getMessageLocation(d))),
194+
getMessageString(c)))
195+
.collect(Collectors.toList())
196+
);
197+
}
198+
192199
storeFixCommands(d, result);
193200
return result;
194201
}
@@ -227,13 +234,13 @@ public static List<Diagnostic> translateDiagnostics(ISourceLocation file, IColle
227234
* @param docService needed to convert column positions
228235
* @return an ordered map of Diagnostics
229236
*/
230-
public static Map<ISourceLocation, List<Diagnostic>> translateMessages(IList messages, IBaseTextDocumentService docService) {
237+
public static Map<ISourceLocation, List<Diagnostic>> translateMessages(IList messages, ColumnMaps cm) {
231238
Map<ISourceLocation, List<Diagnostic>> results = new HashMap<>();
232239

233240
for (IValue elem : messages) {
234241
IConstructor message = (IConstructor) elem;
235242
ISourceLocation file = getMessageLocation(message).top();
236-
Diagnostic d = translateDiagnostic(message, docService.getColumnMap(file));
243+
Diagnostic d = translateDiagnostic(message, cm);
237244

238245
List<Diagnostic> lst = results.computeIfAbsent(file, l -> new LinkedList<>());
239246
lst.add(d);
@@ -246,6 +253,10 @@ private static ISourceLocation getMessageLocation(IConstructor message) {
246253
return Locations.toClientLocation(((ISourceLocation) message.get("at")));
247254
}
248255

256+
private static String getMessageString(IConstructor msg) {
257+
return ((IString) msg.get("msg")).getValue();
258+
}
259+
249260
private static boolean hasValidLocation(IConstructor d, ISourceLocation file) {
250261
ISourceLocation loc = getMessageLocation(d);
251262

0 commit comments

Comments
 (0)