Commit Graph

936 Commits

Author SHA1 Message Date
Sam Rawlins e1822e9626 Migrator: Add new fix kinds: replaceVar, addType
Fixes #41410

Change-Id: I127d309e84423c24eb2563063af433187b9bf057
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143222
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2020-04-13 20:11:32 +00:00
Janice Collins 40b4389891 Add AnalysisServer client implementation for isolates.
Change-Id: I1b4a9394a996cdc9907273689d2c9dc0c900de55
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142556
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Janice Collins <jcollins@google.com>
2020-04-07 20:02:16 +00:00
Paul Berry 49f6a49056 Migration: remove the PotentialModification class and some of its descendants.
This code was part of the old infrastructure that pre-dated FixBuilder
and is not needed anymore.

Change-Id: I697dbfcd325b2f1c38754890cc8f60679004f7c6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142680
Reviewed-by: Janice Collins <jcollins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-04-07 18:35:56 +00:00
Paul Berry 03c15848d6 Migration: distinguish inserted casts based on whether they are downcasts.
Inserted casts that aren't downcasts are much less likely to be safe
than inserted downcasts.

Change-Id: I21e0ef54b1c4d58c54724a510b25828fc3018142
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142552
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-04-07 18:35:56 +00:00
Paul Berry ab27cd12da Migration: fix listener setup for FixBuilder
We should only set the listener to non-null in permissive mode, since
a non-null listener is the signal to FixBuilder that it should report
expections rather than letting them bubble up the stack.

Change-Id: Ief047a54a5c8d63369420370e0ab891d03ce287f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142551
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-04-07 18:35:56 +00:00
Paul Berry 8c982a1373 Migration: categorize changes shown in the preview tool.
We now sort changes into the following categories (in order):
- Dead code removals
- Casts added
- Null checks added
- Required keywords added
- Types made nullable
- Casts now unnecessary
- Language version comments removed

The reasoning is that this corresponds roughly to how important it is
for a human to inspect each kind of change to make sure it is safe
(dead code removals, for example, are highly likely to indicate an
incorrect migration, where as dropping of unnecessary casts is benign
and almost certainly correct).

Change-Id: I49e3adac3ac98de1a9298f9caadb76c73a9c67d9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142542
Reviewed-by: Janice Collins <jcollins@google.com>
2020-04-07 18:35:56 +00:00
Paul Berry 3edfab164f Migration: remove redundancy from NullabilityFixKind enum.
The values discardCondition, discardElse, discardIf, discardThen, and
removeNullAwareness are all variants of dead code removal and there's
no reason to distinguish them.

Change-Id: Id55035486e07f52e6ef7b5a2485dcb0cadb153e1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142060
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-04-03 16:18:51 +00:00
Paul Berry 40dacf82b9 Migration: add support for a late hint with spaces
Change-Id: If3a95283e4a70d41cfaee72a97525e69ec54be2b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141917
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-04-03 16:18:51 +00:00
Paul Berry 847718195d Migration: handle /*!*/ hint after more expression types.
Change-Id: I5f5b659ce6b07b547ebe3509ce923da02dff584b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141916
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-04-03 16:18:51 +00:00
Paul Berry f04053d767 Migration: do not union inferred types in overrides.
Previously, when handling an override such as:

  abstract class A {
    int/*?*/ f();
  }
  class C implements A {
    f() => 0;
  }

we would create a union edge between the implicit return type of C.f
and the explicit return type of A.f.  This was a problem because
nullability information can propagate bidirectionally through union
edges, so it could result in types unnecessarily becoming nullable,
e.g.:

  abstract class A {
    int/*?*/ f();
  }
  abstract class B {
    int f(); // Should not need to be made nullable
  }
  class C implements A, B {
    f() => 0;
  }

This CL fixes the problem by just making ordinary unidirectional edges
for overrides involving inferred types.

Change-Id: I63a5f1f640b5543fcf39304087592e984aa66694
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141853
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-04-01 12:07:44 +00:00
Paul Berry 4ffb95d631 Migration: add support for /*late*/ hints.
Fixes #41230.

Change-Id: I99b6ad67ebccbc972f72099818a8168003537fa5
Bug: https://github.com/dart-lang/sdk/issues/41230
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141842
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-31 22:04:46 +00:00
Paul Berry 1f794f000e Migration: do not propagate exact nullability in violation of a /*!*/ hint.
Fixes #41228.

Bug: https://github.com/dart-lang/sdk/issues/41228
Change-Id: I9c7e7554cee08d9f8f2241ff627bab7cbb16f4da
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141801
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-31 22:04:46 +00:00
Paul Berry b7130b0bf7 Migration: improve preview tool display when ! is added due to an explicit hint.
Change-Id: Ie9b2a6cabaf02c46da2e8b8ac1bffa0e699acc64
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141741
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-31 22:04:46 +00:00
Paul Berry 8df442e414 Migration: don't use union edges for field formal parameters
Fixes #41182.

Bug: https://github.com/dart-lang/sdk/issues/41182
Change-Id: I485c1a502e34de758fdd0bc831bc18a665005bd1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140911
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-27 21:13:47 +00:00
Mike Fairhurst 2eaa5bcec6 [nnbd_migration] Handle removing language comments after other comments
Change-Id: Iecee603fbef5ff2d0f822728b9ae0d83967afc21
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140770
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
Reviewed-by: Janice Collins <jcollins@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2020-03-26 03:47:57 +00:00
Mike Fairhurst 3095a082cd [analyzer] Add an API to get a language comment token off a unit.
Change-Id: I377fdc44d5e514d6d9a601b3947c3908e5a4497a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140768
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2020-03-26 03:47:57 +00:00
Mike Fairhurst f10e1ed253 [nnbd_migration] Fix #38462, remove @ for @required nullable params
Change-Id: I755cd261a812a714f03cc09b1858d4925e98f88f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140907
Commit-Queue: Paul Berry <paulberry@google.com>
Auto-Submit: Mike Fairhurst <mfairhurst@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2020-03-25 19:40:24 +00:00
Paul Berry bdf8e7b27e Migration: handle introduction of both ! and as on a single expression.
Fixes #40016.

Bug: https://github.com/dart-lang/sdk/issues/40016
Change-Id: I54047d843d5d1670876a5827276899b1a56dcc65
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140905
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry 9007eb4ce4 Sort declarations in fix_aggregator.dart
Change-Id: Ie3a3ba432531a920c7227193d60de32cd0347d57
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140941
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry 08c6dd6164 Migration: add FixBuilder support for expression null check hints.
Previously, null check hints were only affecting the behavior of
EdgeBuilder, which meant that we handled simple cases like:

  int f(int/*?*/ x) => x/*!*/;

(because the EdgeBuilder wouldn't build an edge from the type of `x`
to the return type of `f`, so the return type of `f` would be
non-nullable int, and hence the FixBuilder would insert a `!` in order
to prevent an error).

But if there were some *other* reason for the destination type to be
nullable, then no `!` would get inserted.

This CL adds explicit logic to the FixBuilder to ensure that a `/*!*/`
hint causes a `!` to be inserted whether it's necessary or not.

Change-Id: I283bb9793d8d01408333f5b56562286bf19d8773
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140904
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry e0e83793af Sort declarations in fix_builder.dart
Change-Id: I85934963e8d87e26c4fcb436651062b2adfbdc58
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140900
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry 2b74e6bca6 Migration: get rid of interfaces VariableRepository and VariableRecorder.
The only purpose of these interfaces was to enforce an artificial
separation of concerns between the methods of Variables used by
NodeBuilder and EdgeBuilder; this separation was never really very
useful, and it's getting in the way of adding features to FixBuilder.
It seems better to just use the Variables class directly everywhere.

Change-Id: I7b9c6c08c09a466bbcc1e3f72f9aa05db0d1a7b1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140884
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry 244b4247e9 Migration: better description text for edges.
Change-Id: I58651c927a741721283c3c4c951673a86aa7a1b3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140883
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-25 19:38:34 +00:00
Paul Berry 94dadae052 Migration: add support for expression bang hints
Change-Id: I6199c02b16249aade611e316b3b845ea1386ff8a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140440
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-24 20:35:15 +00:00
Mike Fairhurst 799560bff7 [nnbd_migration] Remove language version comments during migrate
Bug: 41095
Change-Id: I3262d6da485d78fee1e2dfe4ac22692c5e4b6daf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140369
Reviewed-by: Janice Collins <jcollins@google.com>
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
2020-03-24 16:44:05 +00:00
Paul Berry fbd0c8a468 Migration: mark for-each loop variables as initialized
Change-Id: I3e6be77a5a67af0ef722f6e37802980d63aeb650
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140368
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-20 23:50:50 +00:00
Paul Berry f1e98b84f9 Migration: use prefixes when introducing "as" expressions
Change-Id: I0f90dc4707cae35b04df7388a687895b80996fa2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140364
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-03-20 23:50:50 +00:00
Paul Berry 529f52a05a Migration: handle field overrides
Change-Id: I21db786afa80a0e4811341ad605bf2657377810b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140255
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-20 20:23:23 +00:00
Paul Berry 051d51f6be Migration: fix the descriptions of nullability nodes associated with parameters.
Previously, parameters with explicit types just got a description of
"explicit type"; now they get a description like "parameter 0 of
Foo.bar".

Change-Id: Ia6134fff48bc7d7e628304333f1c6ba406e8bdc8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139957
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-19 14:45:39 +00:00
Paul Berry f2dd2e28f3 Migration: preserve code references for nullability nodes with explicit types.
Previously, when analyzing code like:

  int f() {}

We assigned a NullabilityNodeTarget for `int` that simply said it was
the return type of the element for `f`; the location of `int` in the
source code was lost.  With this CL, we produce the same target, but
we preserve the location information.

Change-Id: Ibfe11485aedf208a39947e5a4903b4fa738e86a7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139954
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-19 09:03:17 +00:00
Paul Berry 41b67a9b52 Migration: add grayed-out spaces to indicate types not being made nullable.
Change-Id: I4fa076693c25cf9466d33332030df3983043ffd1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139940
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-03-18 21:18:22 +00:00
Janice Collins 34fee361b6 Add sanity checks for NNBD state in migration.
Also adds some ability for the migration tool to abort itself on
a few known-fatal errors and armor-plates dartdev tests against
CWD problems.

Bug: https://github.com/dart-lang/sdk/issues/40329
Change-Id: I1cfa2c9dcc7815eed075ecb38c63a74c75889002
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139282
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Janice Collins <jcollins@google.com>
2020-03-16 18:27:58 +00:00
Paul Berry c3a0bb086a Migration: Add "why not nullable" traces where "!"s are inserted.
Change-Id: I0367f869d59da0397589df7df43170f1ecbcb69c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139401
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-13 16:31:11 +00:00
Paul Berry fcefb8258e Migration: switch graph propagation to breadth first rather than depth first.
Breadth first is theoretically slightly slower due to less locality of
reference, however it has the benefit of ensuring that the user sees
the shortest possible trace when investigating the cause of a change.
Without this change, it's possible to get some really confusing
traces, e.g. a trace suggesting that a type in some
previously-migrated library is nullable due to a cause within the
library currently being migrated.

This CL also adds tracking of why a node was determined to have
non-null intent, which I plan to expose to the user in follow-up CLs.

Change-Id: I43025ca0ab825d178a28555f85ad9eea43eadfe9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139140
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-12 19:32:36 +00:00
Sam Rawlins 43a5d7d80d Migrator: improve descriptions of return types in stack traces
Change-Id: Iaba43c4a3bf27ffb7913df6122eb9c0908795937
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139180
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
2020-03-12 16:56:36 +00:00
Paul Berry 93448a47c6 Migration: change trace view to alternate between edges and nodes.
Previously, we only included edges in the trace view, which resulted
in a lot of missing information.  Generally the reasoning process
looks like "type at A is nullable because of an expression at B, which
propagates nullability from a type at C, which is nullable because of
an expression at D, etc."  This change makes the trace reflect that
reasoning process better.

Change-Id: I27d1b7aac736529b6f1fa2f7be8dea0d3eca9a6c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139064
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-11 21:30:40 +00:00
Paul Berry 2ec127a305 Migration: give nullability nodes human-readable names.
Change-Id: I86b510c6cc9afacb7d720af214c8f4e5a311c9ff
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138885
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-03-11 15:20:59 +00:00
Paul Berry fb496ee160 Fix "unknown" in CodeReference.toString
Change-Id: I90ac36e9ef2d1488802b48cdfa5aebf9f876520a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138840
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
2020-03-10 22:03:21 +00:00
Paul Berry 043af430c1 Migraiton: Add function names to trace output.
This makes them look a lot more like real stacktraces.

Change-Id: I0c060f72f8676ab6d5c0272532b90931b815fddf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138607
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
2020-03-09 22:00:59 +00:00
Konstantin Shcheglov 24c8021f03 Replace initialize() with declare().
Fixes https://github.com/dart-lang/sdk/issues/38791

Change-Id: I954059160c75de91e1e32fe2f82ebfdc5569d947
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138666
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2020-03-09 18:24:51 +00:00
Paul Berry a74253987b Migration: add trace functionality to the preview tool.
This establishes the base functionality.  A lot of follow-up work is
needed from here:

- Each trace should have an entry at the top of it pointing to the
  thing that was made nullable.

- The source code links in traces don't include lengths, so we can't
  highlight whole identifiers when the user clicks on a link.

- Description strings are currently generated by running toString() on
  the individual nullability nodes and edges, resulting in long-winded
  and useless descriptions.

Change-Id: Ibb370bae6bedc7a8c86092462785023002a48ac3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138481
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-05 17:21:54 +00:00
Devon Carew fc1d2a82f4 [dartfix] remove the 'dartfix upgrade sdk' command (prefer 'dartdev migrate')
Change-Id: I981e2b1805a81210cfb0ed7af809a07eb3eabb5f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137221
Commit-Queue: Devon Carew <devoncarew@google.com>
Reviewed-by: Janice Collins <jcollins@google.com>
2020-03-04 17:55:06 +00:00
Paul Berry eec7876eb2 Migration: prototype a "stacktrace-like" display of the principal cause of a nullability decision.
The principal cause may be displayed by invoking the "postmortem" tool
using the "trace" subcommand, followed by the id of the node for which
a trace is desired.

Change-Id: I5868b4bc979320bb46698b02c7b43b317205c487
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137429
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-03 01:24:17 +00:00
Mike Fairhurst ca3ad264a6 [nnbd_migration] Report info building exceptions to server adapter
Change-Id: I4e3eef0d3e404bd090f36f8b2516abb97cc6c311
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137520
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
2020-03-02 23:33:06 +00:00
Paul Berry 696faba804 Migration: add components display to postmortem tool.
Change-Id: If5c983a85c65600906f62dda7bf0aa9e3b89e470
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137287
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2020-03-02 22:05:16 +00:00
Mike Fairhurst dc366a5ad5 [nnbd_migration] Assert an edge origin exists in _checkAssignment
Change-Id: If2b9d9c4cfdf35b67df478cc20ed16fe6b868b44
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137823
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
2020-02-28 23:26:22 +00:00
Mike Fairhurst 3ae91fc8c5 [nnbd_migration] Add an edge origin for return;
Change-Id: I94e56933c4fb8d8c8b80ca0c427fc34c56674d04
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137841
Reviewed-by: Paul Berry <paulberry@google.com>
2020-02-28 23:26:22 +00:00
Mike Fairhurst 1d1f3a5049 [nnbd_migration] Origin for inferred instance creation bounds
Change-Id: Ice51e241833e4eb70f7b41accc3908717ca8bd72
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137659
Reviewed-by: Paul Berry <paulberry@google.com>
2020-02-28 23:26:22 +00:00
Mike Fairhurst e9df1ee07a [nnbd_migration] Add an edge origin for inferred parameter substitution
Change-Id: I37ce933e05a6b7ad7b8fdcc26f44968ae92516be
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137658
Reviewed-by: Paul Berry <paulberry@google.com>
2020-02-28 23:26:22 +00:00
Mike Fairhurst 42d0c8245d [nnbd_migration] Add edge origin for explicit instantiation params
Change-Id: I9feebb693d8e97027019b5ff2e936ce0fd69bd3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137655
Reviewed-by: Paul Berry <paulberry@google.com>
2020-02-28 23:26:22 +00:00