Skip to content

Commit

Permalink
feat: update Problem to account for related information and code
Browse files Browse the repository at this point in the history
This PR makes changes to the existing `xsbti.Problem` to account for an
optional diagnostic code that the compiler can return for a given
diagnostic and also related information.

Given a piece of code like:

```scala
try {}
```

You'll receive the following:

```
-- [E002] Syntax Warning: /Users/ckipp/Documents/scala-workspace/dotty-error-index/examples/002_EmptyCatchAndFinallyBlockID.scala:3:2
3 |  try {}
  |  ^^^^^^
  |  A try without catch or finally is equivalent to putting
  |  its body in a block; no exceptions are handled.
```

The `E002` here is the actual code. Right now there would be no
description.

Some diagnostics have multiple positions that they need to represent.
You can see an example of this
[here](scala/scala3#14002) in Dotty with the
use of inlining. Instead of needing to rely on including all of that
information in the diagnostic message it can now be extracted out into
a `DiagnosticRelatedInformation`.

These changes reference the conversation in sbt#6868
  • Loading branch information
ckipp01 committed Apr 12, 2022
1 parent d065f38 commit 6949ffc
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
23 changes: 23 additions & 0 deletions internal/util-interface/src/main/java/xsbti/DiagnosticCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* sbt
* Copyright 2011 - 2018, Lightbend, Inc.
* Copyright 2008 - 2010, Mark Harrah
* Licensed under Apache License 2.0 (see LICENSE)
*/

package xsbti;

import java.util.Optional;

/**
* A DiagnosticCode is a unique identifier that the compiler can associate with a diagnostic. This
* is useful for tools to be able to quickly identify what diagnostic is being reported without
* having to rely on parsing the actual diagnostic message, which might not be stable.
*/
public interface DiagnosticCode {
/** The unique code. This is typically in the format of E000 */
String code();

/** Possible explanation to explain the meaning of the code */
Optional<String> explanation();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* sbt
* Copyright 2011 - 2018, Lightbend, Inc.
* Copyright 2008 - 2010, Mark Harrah
* Licensed under Apache License 2.0 (see LICENSE)
*/

package xsbti;

/**
* Related information for a given diagnostic. At times this can be another place in your code
* contributing to the diagnostic or just relevant code relating to the diagnostic.
*/
public interface DiagnosticRelatedInformation {
/** Position of the related information */
Position position();

/** Message indicating why this related information is attached to the diagnostic. */
String message();
}
22 changes: 22 additions & 0 deletions internal/util-interface/src/main/java/xsbti/Problem.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package xsbti;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

public interface Problem {
Expand All @@ -26,4 +28,24 @@ public interface Problem {
default Optional<String> rendered() {
return Optional.empty();
}

/**
* The unique code attached to the diagnostic being reported.
*
* <p>NOTE: To avoid breaking compatibility we provide a default to account for older Scala
* version that do not have codes.
*/
default Optional<DiagnosticCode> diagnosticCode() {
return Optional.empty();
}

/**
* The possible releated information for the diagnostic being reported.
*
* <p>NOTE: To avoid breaking compatibility we provide a default to account for older Scala
* version that do not have the concept of "related information".
*/
default List<DiagnosticRelatedInformation> diagnosticRelatedInforamation() {
return Collections.emptyList();
}
}

0 comments on commit 6949ffc

Please sign in to comment.