Commit Graph

17 Commits

Author SHA1 Message Date
Sam Rawlins 088614d11b DAS plugins: Export types from analyzer_plugin for convenience
Fixes https://github.com/dart-lang/sdk/issues/61821

Change-Id: Ibb2737553de713aeef725a19417e09202bee8ac3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/509543
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
2026-06-10 09:38:40 -07:00
Konstantin Shcheglov 1309dffc0a CQ. Move analyzer diagnostics back into analyzer.
Move the analyzer-only Diagnostic, DiagnosticMessage, Severity, and
locatable diagnostic helper types out of _fe_analyzer_shared and into
package:analyzer.

I paln to make changes outlined in
https://github.com/dart-lang/sdk/issues/63311 and chat discussion.
Keeping these classes in the analyzer simplifies the migration and
avoids introducing a shared abstraction before there is a concrete need
for one.

If we decide later need to have a shared abstraction, we can always
extract one at that point. With coding agents internal code motion is
cheap.

Update analyzer, analysis server plugin, analyzer plugin, linter, and
scanner call sites to import the moved APIs from analyzer libraries, and
refresh API baselines to reflect the new public owner.

Change-Id: Ie0ef0f01c6e4be7ebaac25619ac3e3fe991a44d9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/501000
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2026-05-07 13:54:59 -07:00
Paul Berry c6a9c9536e [api_summary] Add class modifier support.
Adds the modifiers `abstract`, `base`, `final`, and `interface` to the
API summary output.

This information is an important part of the public API of a package,
because it determines whether a client can:

- Construct an instance of the class,
- Extend the class, or
- Implement the class.

Change-Id: I6a6a6964ba07db1714bc2fcb549cc15230e87058
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/482362
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2026-02-20 10:49:45 -08:00
Paul Berry 02ced6c1a5 [api_summary] Fix member sort order.
Fixes two minor bugs with the sorting of members in the API summary
tool:

- The technique for placing getters next to their corresponding
  setters was to sort them lexicographically based on
  `Element.apiName`, which in the case of setters appends `=`. This
  mostly worked, but due to the fact that `=` is between `9` and `A`
  in ASCII, it was wrong in a few corner cases. For example, it would
  sort `x`, `x=`, `x1`, and `x1=` in the order `x`, `x1`, `x1=`,
  `x=`. Fixing this didn't affect any `api.txt` files in practice.

- The technique for sorting constructors also used `Element.apiName`,
  which in the case of an unnamed constructor is `new`. This meant
  that if a class had both named and unnamed constructors, the unnamed
  constructor would not always be sorted before the other
  constructors.

The fix for both bugs is to sort by `Element.name` (which does not add
`=` for setters and is the empty string for unnamed constructors), and
then to break ties by explicitly checking whether the element is a
setter.

Change-Id: I6a6a69648fb5915266a9111c5d884531bba4405d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/482361
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2026-02-20 10:43:16 -08:00
FMorschel 03980b59ac [analysis_server_plugin] Fixes warning ignores by namespacing rules by plugins
Bug: https://github.com/dart-lang/sdk/issues/62173
Change-Id: I09b26b99fa928822f76246d8c6380a7c9a2b0a1e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/475080
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
Auto-Submit: Felipe Morschel <git@fmorschel.dev>
2026-01-28 12:22:28 -08:00
Paul Berry 5d199d6afe [messages] Move SourceRange class to _fe_analyzer_shared.
This will allow `SourceRange` to be referred to by classes in
`pkg/_fe_analyzer_shared` such as `LocatableDiagnostic` and
`SyntacticEntity`.

Change-Id: I6a6a69641f9daa351fbea3a0cc61f760f7a966d3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/467683
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2025-12-11 14:51:41 -08:00
Sam Rawlins b08eab360c DAS plugins: Fix parameter type of registerFixForRule
Fixes https://github.com/dart-lang/sdk/issues/61928

Change-Id: Ibdd63ebe9d70217e8699546d916826480bdfd3f6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/460901
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2025-11-10 13:25:11 -08:00
Jens Johansen 6b4210d9ca [analysis server/analyzer] Improvements to completion
Observation 1: The legacy protocol answered completion requests via a
`server.resolveForCompletion` call, and the LSP protocol answered
completion requests via a `server.getResolvedUnit` call where the idea
is that resolving for completion requires less and is therefore faster.

Solution: Make the LSP protocol use `server.resolveForCompletion` too.

Observation 2: Completion requests often come right after change request
making timing important and the `await driver.applyPendingFileChanges()`
call done in the analysis server "pushed" the timing making the
`server.resolveForCompletion` actually finished after it had already
resolved the whole thing.

Solution: Don't do that - the driver adds it to the queue of work, the
work is done later in `performWork` called from
`AnalysisDriverScheduler._run` where `_applyPendingFileChanges` is
always called anyway (which is the call that completes the
`applyPendingFileChanges`call).

Observation 3: If there is no change yet to be processed, a
`resolveForCompletion` call is slower than a `getResolvedUnit` because
the resolved unit is cached (assuming it's a priority file) and the
`resolveForCompletion` call always parses the file again.

Solution: Respond to the `resolveForCompletion` call with the resolved
unit data if it's available in the cache. The cache is always cleared
when changes happen anyway.

Benchmarks on this stuff is a bit weird because it's timing related - so
while I'd say this is overall just better there are also runs where we
get "bad timing" and the runtimes are therefore not better. In an
attempt to clear it up I've run the benchmarks 25 times each, and
attempted to put the data in two different buckets as needed.

*lsp_type_in_big_file of size 16,000*

```
Fully done after last type (ms):
Difference at 95.0% confidence
        -1419.2 +/- 322.074
        -16.8866% +/- 3.83225%
        (Student's t, pooled s = 566.238)

Whole typing time (ms):
Difference at 95.0% confidence
        -1418.88 +/- 322.037
        -13.9661% +/- 3.16983%
        (Student's t, pooled s = 566.172)

Uncancelled completion response time (ms):
Difference at 95.0% confidence
        -1590.48 +/- 682.753
        -28.0194% +/- 12.028%
        (Student's t, pooled s = 1200.35)
```

The `Uncancelled completion response time` has a big "+/-" so attempting
to "good and bad bucketize" it I get:

good bucket:

```
Difference at 95.0% confidence
        -1929.8 +/- 347.712
        -35.9528% +/- 6.47797%
        (Student's t, pooled s = 543.261)
```

bad bucket (though truthfully there wasn't a clear cutoff before):

```
No difference proven at 95.0% confidence
```

which sort of makes sense: If the completion runs before a (new) change
starts processing we now `resolveForCompletion` instead which is faster,
but if completion runs after the change has started processing we
essentially - both before and after - do nothing (except wait for the
calculation to finish) because we just load the data from cache.

*lsp_type_in_big_file_ask_for_completion, 16,000*

```
Completion #1 (ms):
No difference proven at 95.0% confidence
```

Ehh. There's a clear cutoff in the now, so taking the 8 (how the cutoff
happens to be) fastest from each I get

```
Difference at 95.0% confidence
        -1034.12 +/- 75.3617
        -37.673% +/- 2.74542%
        (Student's t, pooled s = 70.2673)
```

Moving on.

```
Completion #2 (ms):
Difference at 95.0% confidence
        -1076.28 +/- 178.446
        -37.2601% +/- 6.17769%
        (Student's t, pooled s = 313.726)
```

here 2 in the "now" has bad timing, removing them from the statistics
gives

```
Difference at 95.0% confidence
        -1182.39 +/- 104.543
        -40.9334% +/- 3.6192%
        (Student's t, pooled s = 179.748)
```

Moving on.

```
Completion #3 (ms):
Difference at 95.0% confidence
        -735.6 +/- 292.553
        -25.6471% +/- 10.2%
        (Student's t, pooled s = 514.336)

and removing the 8 bad ones:

Difference at 95.0% confidence
        -1195.69 +/- 99.305
        -41.6884% +/- 3.46232%
        (Student's t, pooled s = 156.306)
```

Continuing like this:

```
Completion #4 (ms):
Difference at 95.0% confidence
        -948.4 +/- 265.704
        -32.9887% +/- 9.24214%
        (Student's t, pooled s = 467.134)

and removing the 5 bad ones:

Difference at 95.0% confidence
        -1252.87 +/- 86.5425
        -43.5793% +/- 3.01026%
        (Student's t, pooled s = 143.022)

Completion #5 (ms):

Difference at 95.0% confidence
        -1067.88 +/- 199.266
        -37.0011% +/- 6.90439%
        (Student's t, pooled s = 350.329)

and removing the 3 bad ones:

Difference at 95.0% confidence
        -1236.76 +/- 69.5776
        -42.8527% +/- 2.4108%
        (Student's t, pooled s = 118.18)
```

Moving on to the "Completion without change" I realize just now that the
benchmark for the first entry is broken - it doesn't wait until the
previous change has been processed, meaning that in the 3 cases where we
got bad timing in "Completion #5 (ms)" we see about the same result as
before, but in the 22 other cases we see bad results because it has to
wait until the previous change has been processed. For the remaining
(2-5) there is no virtually change which makes sense because both before
and now it just fetches the resolved unit from cache.

*legacy_type_in_big_file_ask_for_completion*

```
Completion #1 (ms):
Difference at 95.0% confidence
        -1817.08 +/- 60.6836
        -48.0638% +/- 1.60515%
        (Student's t, pooled s = 106.688)

Completion #2 (ms):
Difference at 95.0% confidence
        -2208.56 +/- 48.4844
        -55.4647% +/- 1.21761%
        (Student's t, pooled s = 85.2403)

Completion #3 (ms):
Difference at 95.0% confidence
        -2159.68 +/- 69.4145
        -53.0717% +/- 1.70578%
        (Student's t, pooled s = 122.037)

Completion #4 (ms):
Difference at 95.0% confidence
        -2264.44 +/- 73.2112
        -53.5455% +/- 1.73117%
        (Student's t, pooled s = 128.712)

Completion #5 (ms):
Difference at 95.0% confidence
        -2147.4 +/- 68.5023
        -50.9254% +/- 1.62453%
        (Student's t, pooled s = 120.434)
```

The first "Completion without change" suffers from the same as before
and I will skip it here.

```
Completion without change #2 (ms):
Difference at 95.0% confidence
        -416.28 +/- 28.2024
        -61.3512% +/- 4.15646%
        (Student's t, pooled s = 49.5826)

Completion without change #3 (ms):
Difference at 95.0% confidence
        -687.24 +/- 21.9848
        -92.6499% +/- 2.96387%
        (Student's t, pooled s = 38.6514)

Completion without change #4 (ms):
Difference at 95.0% confidence
        -637.32 +/- 26.482
        -95.2703% +/- 3.95868%
        (Student's t, pooled s = 46.5579)

Completion without change #5 (ms):
Difference at 95.0% confidence
        -702.32 +/- 18.7277
        -95.8301% +/- 2.55535%
        (Student's t, pooled s = 32.925)
```

I don't know why there doesn't appear to be any timing related issues
here (maybe sending and receiving the entire big file (in legacy vs in
lsp where a small 'diff' is send) taking more time pushes the timing,
but I'm guessing) - nor do I know why now "Completion without change #2"
is slower (~250 ms) than the subsequent ones (~30 ms).

Change-Id: I4c21d658efccbcf197eedb69f466b2942b78c4b9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/457364
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
2025-10-28 05:28:09 -07:00
FMorschel bf2fc7d8e5 [DAS] Fixes part file handling for some create fixes
Bug: https://github.com/dart-lang/sdk/issues/61192
Change-Id: I8aa765fca2d2948ab6fe1b47a6bff6bf58de3cd3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447341
Auto-Submit: Felipe Morschel <git@fmorschel.dev>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2025-10-08 11:40:11 -07:00
Sam Rawlins 26102c5d52 DAS plugins: Wire up initial screen for new plugins.
This renames the old screen, "Legacy plugins" and adds a new screen,
"Plugins". On the new plugins screen, we ask the plugins isolate(s) for
their plugins details, and print the following, for eadh plugin:

* the plugin's name
* the names of the registered lint rules
* the names of the registered warning rules
* the IDs and "messages" of the registered assists
* the IDs and "messages" and associated diagnostic codes of the
  registered quick fixes

More to come in follow ups:

* The resolved versions of plugin packages (coming from package_config.json)

Change-Id: Ic3dc4c5bffa64fd4da4097c042a847cc064e41ce
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447763
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2025-09-02 08:38:32 -07:00
Paul Berry 8b23e3449d [analyzer] Move some error reporting code into _fe_analyzer_shared.
The following classes are moved from `package:analyzer` to
`package:_fe_analyzer_shared`:

- `Diagnostic`
- `DiagnosticMessage`
- `DiagnosticMessageImpl`

The following declarations are also moved, since they are needed by
the above classes:

- `formatList`
- `Severity`
- `Source`
- `TimestampedData`

There is no change to the analyzer public API, and `export`
declarations have been added to the analyzer libraries that the
declarations have been moved from, so that code depending on these
declarations is unaffected.

These changes are part of a larger arc of work that introduces methods
`.withArguments` and `.at`, forming a literate API for reporting
analyzer errors that looks roughly like this:

    diagnosticReporter.reportError(
        ERROR_CODE.withArguments(...arguments...).at(...location...));

Moving this code into `_fe_analyzer_shared` is necessary because
scanner error codes are defined inside `_fe_analyzer_shared` (to allow
the scanner to be shared between the analyzer and CFE). Hence, to
avoid a circular depedency between `_fe_analyzer_shared` and
`analyzer`, the `.withArguments` and `.at` methods will need to live
in `_fe_analyzer_shared` too, as well as the classes representing the
diagnostic messages they create.

Note that there are some minor changes to
`pkg/analysis_server_plugin/api.txt` and
`pkg/analyzer_plugin/api.txt`; these have to do with the way the
`api.txt` generator chooses to report referenced elements, and don't
reflect actual API changes.

Change-Id: I6a6a6964a5c46f4a0205ce0d85620669ce55eb3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/444620
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2025-08-12 11:09:33 -07:00
Sam Rawlins 636f144fb6 DAS plugins: Change AnalysisRule type to AbstractAnalysisRule
Change-Id: I17f13d386872b21fdd4ff16601bb0e23c478e992
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439341
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2025-07-08 13:34:13 -07:00
Sam Rawlins 1029af6229 DAS plugins: Rename FixContext.error to .diagnostic
Work towards https://github.com/dart-lang/sdk/issues/60635

Change-Id: I2a789749393efa3688ad0cf6b0d0e93e97136492
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/434540
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2025-06-16 10:28:53 -07:00
Sam Rawlins dadef9bfab DAS: Rename CorrectionProducer.errorLength and errorOffset to diagnostic names
Change-Id: I7578da7f1be1f996474b22621885e45ab3e86428
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/434100
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2025-06-11 11:06:31 -07:00
Sam Rawlins 31f8f4b522 analyzer: Make various AnalysisRule classes and their dependencies public
This is a big CL; no code is really "changed." We basically move 3
components into the public API, which can all be reviewed concisely
in the `api.txt` file.

* The AnalysisRule classes: `AbstractAnalysisRule` (which is good to
  make public as a lot of the public API is specified and documented
  here), `AnalysisRule`, `MultiAnalysisRule`.
* The Pubspec classes, available for linting pubspec files:
  `PubspecDependency`, `PubspecDependencyList`, `PubspecEntry`,
  `PubspecEnvironment`, `PubspecGitRepo`, `PubspecHost`, `PubspecNode`,
  `PubspecNodeList`, `PubspecVisitor`.
* The `RuleVisitorRegistry` class. This class is needed by analysis
  rule authors, and is part of the public API of AnalysisRule.

Change-Id: Ib1803180de9469f4ff39cf1778f96787f5f74b14
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432363
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2025-06-03 11:09:32 -07:00
Sam Rawlins f16cd980ce DAS: Deprecate CorrectionProducer.inheritanceManager
Change-Id: Id1772d47617a98ffc15d700a9bd7de58a04d745e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/430020
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2025-05-21 14:42:21 -07:00
Sam Rawlins 78c2181b3c analysis_server_plugin: Check-in the current api.txt file
Change-Id: Ia88f755e6b92559ad15aa53ec612d92597fb0dc3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428928
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2025-05-19 12:24:39 -07:00