Commit Graph

517 Commits

Author SHA1 Message Date
kmillikin b019045393 Front-end implementation of mixin type inference.
Infer missing type arguments to generic mixin classes in mixin
applications based on mixin supertype constraints.  The implementation
directly follows the draft feature specification at
https://dart-review.googlesource.com/c/sdk/+/38940.

Bug: https://github.com/dart-lang/sdk/issues/31984
Change-Id: I7caba037b1b0e73c44f71aaa958f3ff3e8f3c1f0
Reviewed-on: https://dart-review.googlesource.com/40661
Commit-Queue: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
2018-02-14 22:43:24 +00:00
Dmitry Stefantsov ec9c927b18 Resolve type arguments of redirecting factories invocations
Fixes #32068

Change-Id: Ifc2c832d5a761ae51b7f93084543aa04902a9529
Reviewed-on: https://dart-review.googlesource.com/40280
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2018-02-14 22:03:23 +00:00
Dmitry Stefantsov 47fbe76d03 Avoid patching with redirecting factories in vm-related patches
Change-Id: Id45696a38b281b1b75a9a0e26d89216388a4ec19
Reviewed-on: https://dart-review.googlesource.com/39942
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-08 14:11:50 +00:00
Paul Berry 5e0410a34f Consistently wrap/unwrap types during closure type inference.
Fixes #32066.

Change-Id: I5383ee2ebe8de1b0220f0b6fa55461fb0b3e2d56
Reviewed-on: https://dart-review.googlesource.com/39540
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2018-02-07 10:00:09 +00:00
Paul Berry 2fb377240a Further fix to type inference of operator []=.
When one of the parameter types needs to be type inferred, don't also
try to use ordinary method type inference for the return type; it is
still inferred as `void`.

Add a test to make sure this corner case works, as well as a similar
corner case for setters (which did not require fixing).

Fixes #31779.

Change-Id: Id443260a12e44f88d9dadbbf916c13be3cc303b9
Reviewed-on: https://dart-review.googlesource.com/37300
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
2018-01-29 13:27:24 +00:00
Dmitry Stefantsov 936d8c317b Forbid super-bounded types in constructor invocations
Change-Id: I9af6b843925105da69148fcfb099e965f0e62f73
Reviewed-on: https://dart-review.googlesource.com/35180
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2018-01-29 13:19:23 +00:00
Paul Berry 18ff13517d Fix type promotion handling of ||.
Fixes #31983.

Change-Id: I3ee02a2886de0a44e1dfe7cdd9f66f46293d4255
Reviewed-on: https://dart-review.googlesource.com/37081
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2018-01-27 16:04:50 +00:00
Paul Berry 1891084dec Generate fresh type parameters prior to inferring an invocation.
This is necessary to avoid confusion when a generic function or method
recursively calls itself.

Fixes #31759.

Change-Id: I4e3be2093e9d6b81f084250435ea7493ca6b2464
Reviewed-on: https://dart-review.googlesource.com/36363
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2018-01-24 19:41:58 +00:00
Jens Johansen c1160d8cfa [kernel] Change ast to text output to use synthetic instead of default
Change-Id: Ied8777df13aa0411daf89f3ad3ec6bdda7bb4898
Reviewed-on: https://dart-review.googlesource.com/35862
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
2018-01-19 09:58:46 +00:00
Paul Berry 52c036c6f8 Always infer the return type of operator[]= as void.
Fixes #31779.

Change-Id: Ib7c2b79271ce7eca7ec8143ceb425c73e72f7cc1
Reviewed-on: https://dart-review.googlesource.com/35005
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2018-01-17 13:46:08 +00:00
Paul Berry 45b02f8216 Use the new spec for Future flattening for type inference
Change Fasta type inference and Kernel type checking to use the new
definition for Future flattening, which is really unwrapping (peeling
off one layer of Future or FutureOr).  Use this for inferring types of
`await` expressions and return types from `async` functions.

Ensure that we are using the same notion of flattening for inference
and checking.  (Maybe it was a red flag that we weren't.)

This fixes await_test so that it produces a runtime error rather than
a compile time error - see #31541.

A similar change will need to be made to the analyzer - see #31887.

Change-Id: I7d936e9788969a48fdc216628eaa793389fb5e30
Reviewed-on: https://dart-review.googlesource.com/34504
Commit-Queue: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2018-01-15 07:09:36 +00:00
Peter von der Ahé bb9af782a7 Correct type arguments for NSM
Change-Id: I28623bed9d5d203e82d50c4b057803a89e76757d
Reviewed-on: https://dart-review.googlesource.com/33380
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
2018-01-10 07:13:30 +00:00
Aske Simon Christensen 0c03458717 Reland "Treat most warnings as errors in strong mode."
Reland of https://dart-review.googlesource.com/c/sdk/+/29160

Adds a 'severity' field to diagnostic messages and replaces all
addWarning and addNit functions by a generic addProblem, which uses
the intrinsic severity of the message. Eventually, errors should
also be reported this way.

A special severity value maps into either warning or error for Dart 1
and Dart 2, respectively. Most Dart 1 warnings are in this category.

Fixes some 320 failures of DDK test expecting a compile-time error.
These were previously masked by a workaround in the DDC error handler
which has now been removed.

Closes https://github.com/dart-lang/sdk/issues/31286

Change-Id: Id3b3b7f1fc6a101639fc908c90f3ec7d304a7b4b
Reviewed-on: https://dart-review.googlesource.com/32580
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
2018-01-08 09:20:02 +00:00
Paul Berry 879badb850 Implement method type override checking rules in front_end.
Test failures introduced by this change have been marked with issue #31616.

Change-Id: Iddbcedb972b5ad2cf12e3fe588bd38aec76816df
Reviewed-on: https://dart-review.googlesource.com/29742
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2018-01-04 22:46:26 +00:00
Aske Simon Christensen 5402f02cbc Revert "Treat most warnings as errors in strong mode."
This reverts commit 3303df8102.

Reason for revert: Tests failing

TBR=ahe@google.com,askesc@google.com

Change-Id: Ifc8c9def6d134ab1b0c5f094a02a4f57a3581f19
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/32360
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
2018-01-04 15:35:17 +00:00
Aske Simon Christensen 3303df8102 Treat most warnings as errors in strong mode.
Adds a 'severity' field to diagnostic messages and replaces all
addWarning and addNit functions by a generic addProblem, which uses
the intrinsic severity of the message. Eventually, errors should
also be reported this way.

A special severity value maps into either warning or error for Dart 1
and Dart 2, respectively. Most Dart 1 warnings are in this category.

Fixes some 320 failures of DDK test expecting a compile-time error.
These were previously masked by a workaround in the DDC error handler
which has now been removed.

Closes https://github.com/dart-lang/sdk/issues/31286

Change-Id: I6acea31b8cba7dec8b318e081d28f4eb4ebbf75c
Reviewed-on: https://dart-review.googlesource.com/29160
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
2018-01-04 14:56:46 +00:00
Dmitry Stefantsov 1f3b493dcc Add simple instantiate-to-bounds algorithm to the common front-end
Bug:
Change-Id: I65097b037f4b02f0a161c9c183844a3dc3339c77
Reviewed-on: https://dart-review.googlesource.com/29880
Reviewed-by: Paul Berry <paulberry@google.com>
2018-01-04 11:31:08 +00:00
Kevin Millikin 6fa813d818 Change handling of Kernel static errors
Before: Kernel static errors were represented by throwing a distinguished
error or else by calling a distinguished library const constructor.

Now: Kernel static errors are represented by InvalidExpression.  To support
error reporting, InvalidExpression has an optional message and a file
offset.  A back end can choose to signal these errors at any time; for
example, when deserializing the binary, or when compiling the procedure
containing the static error, or when the erroneous expression is evaluated
at run time.

InvalidStatement is removed because it can be encoded as ExpressionStatement
of InvalidExpression.

Future work:

* supporting static errors where an expression cannot appear in the AST
* allowing InvalidExpression to contain an Expression for error recovery
* adding a top-level list of static errors and warnings to the binary

Bug: https://github.com/dart-lang/sdk/issues/29840
Change-Id: Ifdfe9a76cee6cefed28061bf245be70531d2f413
Reviewed-on: https://dart-review.googlesource.com/31320
Commit-Queue: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2018-01-04 11:00:25 +00:00
Paul Berry ae9b0c42d7 Add type inference code to generate Instantiation nodes.
Fixes #31586.

Note that none of the back-ends handle Instantiation nodes yet, so the
language_2 tests added in this CL
(instantiate_tearoff_after_contravariance_check_test,
instantiate_tearoff_of_call_test, and instantiate_tearoff_test) fail
pretty much across the board right now.

Includes two fixes to Instantiation.getStaticType and the kernel type checker:

- Previously, they attempted to perform substitution on the full
  function type, which had no effect because the type parameters were
  bound.

- The type checker was not checking that type parameter bounds were
  satisfied.

Note that the front end doesn't yet check that type parameter bounds
are satisfied by the inferred type parameters.  I will address that in
a follow-up CL.

Change-Id: Ib0ad7a5fc5f4a2fdc8c99abe1f2d3d15b21a4974
Reviewed-on: https://dart-review.googlesource.com/29744
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-12-15 20:41:43 +00:00
Peter von der Ahé 7a40a6c3da Report an error on all classes involved in a cycle
Change-Id: I80221caf1f17acfe50b3c77da8e86e1bff54c67f
Reviewed-on: https://dart-review.googlesource.com/28724
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
2017-12-14 08:47:25 +00:00
Paul Berry 7b9025b407 Report errors when type inference fails due to a circularity.
Change-Id: I48e75d86140483d5f3b9c3ad17e47fe2dfdb722e
Reviewed-on: https://dart-review.googlesource.com/28361
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-12-11 21:24:13 +00:00
Paul Berry 1c6e907fc8 Report errors when type inference fails due to inconsistent overrides.
I will have a follow-up CL to cover type inference failures due to
circularities.

Change-Id: I8c9af501c150d4707ad06e6bbcdc3cabdfbf9207
Reviewed-on: https://dart-review.googlesource.com/28180
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
2017-12-11 17:02:45 +00:00
Paul Berry 12dc862d9e When type inferring closures, change Null arguments to Object.
Fixes #31546.

Change-Id: I1c69947f4589b6901ac11b2e6c9f6c3624678ad4
Reviewed-on: https://dart-review.googlesource.com/27411
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-08 00:05:39 +00:00
Paul Berry b75502513a Fix type inference of closures using '=>' syntax.
This CL fixes type inference of closures using '=>' syntax so that
they infer consistently with an equivalent closure defined using block
syntax ('{}').

Fixes #31436.

Change-Id: I5463dd0ba986e9953ebabbc24ce3ced9a7220007
Reviewed-on: https://dart-review.googlesource.com/27084
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-07 04:52:10 +00:00
Paul Berry 115d54f0b4 Implement strong mode "invalid cast" rules.
When an implicit cast can be proven by the front end to always fail,
due to the form of the expression being cast, the front end now
reports this as a compile-time error.  (This feature is not new--it is
part of the analyzer's implementation of strong mode).

Newly failing tests are marked with issue #31537.

Change-Id: Ib3fc068352bb91dd283fa4b81d8104fa213eafe9
Reviewed-on: https://dart-review.googlesource.com/26420
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-12-06 20:01:02 +00:00
Paul Berry e3308c2023 Fix overzealous inference of setter parameter types.
Previous to this CL, if a setter had an implicit return type, we
inferred both the return type of the setter and the parameter type,
even if the parameter type was specified.

Change-Id: I24ca8ceddbe021f0d779ffcad4bc63052ed5d87b
Reviewed-on: https://dart-review.googlesource.com/26565
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-06 13:59:14 +00:00
Paul Berry e8091b27b1 Implement "unknown getter/setter/method" compile time errors in the front end.
Fixes #21938 (Front end does not warn on function calls on Object).

A small number of tests begin failing with this change--these tests
have been marked with issue #31533 for later triage.

Change-Id: I3a956410a6780772fe90098d8604fb10718504df
Reviewed-on: https://dart-review.googlesource.com/26045
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-12-05 00:14:54 +00:00
Paul Berry c800a1cc29 Fix error recovery for invalid assignment.
Previously, the front end recovered from an invalid assignment by
producing an "as" expression, e.g.:

    int x;
    String y;
    x = y;

Would produce an "invalid assignment" error, as well as this kernel
code:

    int x;
    String y;
    x = y as{TypeError} int;

The rationale was that the "as" check was guaranteed to fail, so this
code would produce a runtime error at the correct location.  However,
there were two problems:

1. (Minor problem) the "as" doesn't actually fail if the RHS is null.

2. (Major problem) for type inference, the type of an assignment
expression is defined to be the type of the RHS.  This means that if
the invalid assignment gets used for type inference, we generate
mal-typed kernel code, e.g.:

    int x;
    String y;
    var z = (x = y);

Gets compiled to:

    int x;
    String y;
    String z = (x = y as{TypeError} int);

This CL addresses both problems by changing the kernel representation
so that it evaluates the RHS and then throws an exception.  Since a
"throw" expression has type Bottom, the kernel representation is
guaranteed to be properly typed.  This also ensures that an exception
gets thrown if the RHS is null.  Finally, as a side bonus, it makes
the error-recovered kernel code more similar to the kernel code we
generate in other error recovery scenarios.

Change-Id: Iac74e0c726ce029ac0560d271413e85c15bfec5c
Reviewed-on: https://dart-review.googlesource.com/24140
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-04 14:38:04 +00:00
Samir Jindel bf797e6507 [kernel] Re-land assert initializers.
This change updates Dart2js and DDC.
Thanks to johnniwinther@ for the Dart2js updates.

The original revision is in patchset 2.

Change-Id: I26db33312f003f88ccccb67b27998ef21a1f667f
Reviewed-on: https://dart-review.googlesource.com/25820
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Samir Jindel <sjindel@google.com>
2017-12-04 11:22:34 +00:00
Paul Berry 7d65fec76e Reland "Route all messages through Loader."
This is the same as https://dart-review.googlesource.com/24481, but
with additional status file fixes.

Change-Id: Ic076c4dbf9c07e0fdf316298ca1ee1b6ce25002b
Reviewed-on: https://dart-review.googlesource.com/25508
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-01 22:47:06 +00:00
Ryan Macnak a646f51a5b Revert "Route all messages through Loader."
This reverts commit 8e4b0bda23.

Reason for revert: Failures on most kernel bots

Original change's description:
> Route all messages through Loader.
> 
> This ensures that all messages are passed to instrumentation.
> 
> Issues addressed in this CL:
> 
> * When I added addCompileTimeError, I forgot to remove addError.
> 
> * All messages now all arrive in a single location (Loader). SourceLoader adds instrumentation by overriding recordMessage.
> 
> * As I changed the type inferrer to use addCompileTimeError, I broke DDC. This is because the front_end API (generateKernelInternal in kernel_generator_impl.dart) returns null if there are any errors reported via addCompileTimeError (and this didn't happen with addError, that shouldn't have been there anyways).
> 
> * Due to the previous problem, I changed generateKernelInternal to ignore errors, but then I started getting missing compile-time errors. This turned out to be due to the the silent parameter used during outline- and diet-parsing.
> 
> * I've removed all the "silent" parameters. This didn't work reliably and have been confusing Brian, Dan, and me several times when making parser changes. Instead we detect duplicated messages and avoid reporting them more than once.
> 
> * Types in error messages got names that where using a global object (globalDebuggingNames in pkg/kernel/lib/text/ast_to_text.dart). This meant that the #lib prefix would vary depending on how many tests were run which affected the serialized error message in pkg/front_end/testcases/invalid_assignment.dart.strong.expect.
> 
> Change-Id: I3d89372d6593a6e7e50cce733f61eedb881e15ed
> Reviewed-on: https://dart-review.googlesource.com/24481
> Commit-Queue: Peter von der Ahé <ahe@google.com>
> Reviewed-by: Paul Berry <paulberry@google.com>
> Reviewed-by: Kevin Millikin <kmillikin@google.com>

TBR=paulberry@google.com,ahe@google.com,kmillikin@google.com

Change-Id: I9f7b345a8ff040fc7aa73c5cb605190e47fd284b
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/25660
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2017-12-01 20:37:45 +00:00
Samir Jindel 48a927acb2 Revert "[kernel] Introduce assert initializers."
Reverting due to several test failures.

This reverts commit 67adfe741b.

Bug:
Change-Id: Idd1aa15d47df68f2938285468dfa3d5043d8dae2
Reviewed-on: https://dart-review.googlesource.com/25520
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2017-12-01 17:46:05 +00:00
Paul Berry ef25e491a2 Improve type inference for for-in statements.
Fixes #31440.

There is a minor change outside of type inference: the body builder
now stores the synthetic assignment (used for for-in loops that don't
declare their own variable) in ShadowForInStatement so that type
inference doesn't have to dig through the desugared kernel objects in
order to find it.

Change-Id: I6520695336560883e2aa07bb110378b7846c2e11
Reviewed-on: https://dart-review.googlesource.com/25040
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-12-01 16:53:47 +00:00
Samir Jindel 67adfe741b [kernel] Introduce assert initializers.
Assert initializers in Dart may be compiled directly to this form of initializer,
rather than through local initializers as is done now.

Bug:
Change-Id: Ia149ea3d1df5d1dc18be5636801604ffaf7ca7d8
Reviewed-on: https://dart-review.googlesource.com/14760
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2017-12-01 14:04:06 +00:00
Peter von der Ahé 8e4b0bda23 Route all messages through Loader.
This ensures that all messages are passed to instrumentation.

Issues addressed in this CL:

* When I added addCompileTimeError, I forgot to remove addError.

* All messages now all arrive in a single location (Loader). SourceLoader adds instrumentation by overriding recordMessage.

* As I changed the type inferrer to use addCompileTimeError, I broke DDC. This is because the front_end API (generateKernelInternal in kernel_generator_impl.dart) returns null if there are any errors reported via addCompileTimeError (and this didn't happen with addError, that shouldn't have been there anyways).

* Due to the previous problem, I changed generateKernelInternal to ignore errors, but then I started getting missing compile-time errors. This turned out to be due to the the silent parameter used during outline- and diet-parsing.

* I've removed all the "silent" parameters. This didn't work reliably and have been confusing Brian, Dan, and me several times when making parser changes. Instead we detect duplicated messages and avoid reporting them more than once.

* Types in error messages got names that where using a global object (globalDebuggingNames in pkg/kernel/lib/text/ast_to_text.dart). This meant that the #lib prefix would vary depending on how many tests were run which affected the serialized error message in pkg/front_end/testcases/invalid_assignment.dart.strong.expect.

Change-Id: I3d89372d6593a6e7e50cce733f61eedb881e15ed
Reviewed-on: https://dart-review.googlesource.com/24481
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2017-12-01 11:38:26 +00:00
Paul Berry 327adac235 Insert implicit downcasts for function expressions.
Note that there are currently some inconsistencies between how
function expressions are inferred depending whether they are defined
using `{}` or `=>` (see issue #31436).  This CL preserves the existing
inconsistencies.  Once we decide how we want to resolve issue #31436,
I'll revisit this code to ensure that it is still correct.

Change-Id: I3926a4b3dc51155d8f03adaae380b50aab39ca60
Reviewed-on: https://dart-review.googlesource.com/24622
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-29 22:24:31 +00:00
Paul Berry d358897ab2 Insert implicit downcasts for for-in loops.
Note that this CL makes a minor change outside of type inference: it
changes the BodyBuilder so that when it desugars a for-in loop that
assigns to a variable declared elsewhere, the desugared assignment is
expressed using shadow objects; this is necessary to ensure that the
type inference engine can walk the desugared assignment and insert an
implicit downcast if necessary.

Change-Id: I4d87f83b8a4b3b72e7ba8042ccd711f0d012fac0
Reviewed-on: https://dart-review.googlesource.com/24340
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-11-29 19:20:31 +00:00
Paul Berry 2b567c53d4 Insert implicit downcasts for parameter default values.
No language_2 tests are added to validate this behavior yet, because
we are still deciding what we want the semantics to be.  I will follow
up with language_2 tests once the semantics have been decided upon.

Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: Ia24c9789220d09682b4b3ade9374d279ff2a4b6e
Reviewed-on: https://dart-review.googlesource.com/24320
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-29 00:00:09 +00:00
Paul Berry a36da30529 Insert implicit downcasts for indexed assignments.
Change-Id: Ic6b5732100908fe6ce5abfc8c577e9f5ad8245b7
Reviewed-on: https://dart-review.googlesource.com/24021
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-28 01:28:06 +00:00
Paul Berry 9693e47d89 Insert implicit downcasts for the expressions in a return or yield statement.
Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: Id570bf354583a3780087ffc820eefc3619573af4
Reviewed-on: https://dart-review.googlesource.com/22842
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-11-22 15:33:07 +00:00
Paul Berry ffdae2fd4d Insert implicit downcast checks for the expressions in a map literal.
Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: I40b4b45d5ea32dc34aee68bfe39912141e4d7d35
Reviewed-on: https://dart-review.googlesource.com/22806
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-22 01:18:38 +00:00
Paul Berry 2d00ba15b3 Insert implicit downcast checks for the expressions in a list literal.
Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: I1a4a2eed0f7b8ebb5cab0a993d7cf26e925b9425
Reviewed-on: https://dart-review.googlesource.com/22802
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-11-22 00:03:56 +00:00
Paul Berry 00bf0d3136 Insert implicit downcast checks for the argument to a combiner in a compound assignment.
Change-Id: I4827013dc060f530e553b95932db8cbacebc2bfc
Reviewed-on: https://dart-review.googlesource.com/22603
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-21 20:03:31 +00:00
Paul Berry 8cdd9d323c Insert implicit downcast checks for invocation arguments.
Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: I1fa7490f6143bd6ceca80f831e0196b16c497966
Reviewed-on: https://dart-review.googlesource.com/20907
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2017-11-21 00:17:37 +00:00
Paul Berry a595dc2af5 Move isTopLevel check inside checkAssignability.
We never need to add assignability checks when doing top level
inference; putting the check inside checkAssignability avoids the need
to remember to put it at every call site.

In order to keep type inference consistent between top level and local
type inference, I've modified the handling of assignments so that the
computations performed by checkAssignability do not influence the
inferred types.  For example, when performing type inference on `a =
b`, we used to consider the resulting expression to have the type of
`a` if a downcast was required, otherwise the type of `b`.  Now we
always consider the type of the assignment to be the type of `b`.
This is consistent with the informal spec of type inference.  This
change introduces some mal-typed kernel nodes in error recovery
situations, which I will fix in a future CL--see issue #31417.

Change-Id: I02e8dff54e2184e6f059d1339e51edf42c4cd058
Reviewed-on: https://dart-review.googlesource.com/22260
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-20 23:18:11 +00:00
Paul Berry f043446962 Insert implicit downcast checks for the RHS of variable declarations.
Tests that have begun failing due to this change are marked with a
reference to issue #31402.

Change-Id: I5be5fb6f47430d390d53d9f195b6a75ca566f8b9
Reviewed-on: https://dart-review.googlesource.com/21701
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
2017-11-18 15:35:45 +00:00
Paul Berry 18fd8b75bd Change the representation of ShadowSyntheticExpression to allow replacement.
Previously, a ShadowSyntheticExpression was its own kind of Expression
unrelated to any of the Expression types defined in the kernel.  It
responded to visit requests by forwarding the visit request to the
desugared expression.  This had the advantage that for serialization
purposes, ShadowSyntheticExpressions would automatically disappear.
But it had the disadvantage that if a ShadowSyntheticExpression ever
needed to be replaced with another node (e.g. because an implicit
downcast was needed), the _ChildReplacer would get confused by the
visitor forwarding and fail to replace the node properly.

This CL fixes the problem by changing ShadowSyntheticExpression to a
Let node of the form `let _ = null in desugaredExpression`.  Since
this is a genuine kernel expression, it no longer needs special
visiting semantics, and node replacement works properly.

In most circumstances, we replace the ShadowSyntheticExpression with
its desugared equivalent during type inference, so the final
serialized kernel representation is unchanged.  However, in a few rare
circumstances involving error recovery, a ShadowSyntheticExpression
remains in the tree.  Semantically this shouldn't be a problem, since
the behavior of `let _ = null in x` is the same as the behavior of
`x`.  Nonetheless, I hope to get rid of these rare circumstances in
follow up CLs.

Change-Id: Iacf8c0028c424ac9ef98ef8302680e289bf7a017
Reviewed-on: https://dart-review.googlesource.com/21571
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-17 12:18:53 +00:00
Kevin Millikin 02511ceeb4 Fix the precedence of FunctionExpression
FunctionExpression should have a low precedence to ensure that it is
properly parenthesized.

Fixes https://github.com/dart-lang/sdk/issues/31380

Bug:
Change-Id: I2ca2bb728973c5b374411dc07fdadc4dda8c707b
Reviewed-on: https://dart-review.googlesource.com/21343
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
2017-11-16 10:38:12 +00:00
Paul Berry b78847dcd5 Fix type inference of super property get, and improve tests
Previously, we were inferring super property gets as though they were
`this` property gets.

Change-Id: Ic82ea6a400c71ef1413870d9adce6202666bb126
Reviewed-on: https://dart-review.googlesource.com/19763
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-09 21:18:57 +00:00
Paul Berry a4d8739e15 Fix type argument substitution in super initializer calls.
Also add test cases to verify that type argument substitution works
properly for other kinds of super calls.

Change-Id: I7a04c85cd13e83403a0e86efa82f30ae71dc0b15
Reviewed-on: https://dart-review.googlesource.com/19621
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2017-11-09 20:16:08 +00:00