Tuesday, October 23, 2012

Dart syntax changes landing soon, update your code

With the release of M1, the Dart team is preparing to remove some of the old syntax that was deprecated. Kasper Lund, engineer on Dart, writes about the upcoming changes and how you can migrate your code.

Note: Dart Editor has a nice Clean Up feature that can automatically update your code for many situations.



Kasper writes:

We're ready to start removing the syntax we deprecated in M1. The
annoying thing is that you may have to update your code. The good
thing is that the replacement syntax is already in place and you can
use it today. Here's a brief list of the deprecated syntax that we
will be removing shortly.


Remove old getter syntax

We're getting rid of the old getter syntax so going forward you will
no longer be allowed to have parentheses after your getters. If you
use:

   get length() => 42;

you'll need to change that to:

   get length => 42;


Remove member/constructor conflict support

Your named constructors can no longer have the same name as a member
of your class. They share a namespace. If you have code like this:

   class C {
     C.named();
     named();
   }

then you'll need to rename one of them.


Remove old optional parameter syntax

You will no longer be able to pass optional parameters that are put in
[brackets] by name; they can only be passed positional. If you want to
have named optional parameters you need to put them in {braces} in
your method declaration. Be aware that the parameter names become part
of you API so try to spend as much time on picking good names for your
optional named parameters as you spend on picking good method names.
See Régis' write up for more info.



Remove abstract modifier on methods

Methods are abstract if they do not have an implementation (does not
apply to constructors). You should be able to just remove the abstract
keyword in front of your methods.


Remove interface declarations

The support for explicit interfaces has been replaced by implied
interfaces -- usually of abstract classes. If you have an interface in
your code like this:

   interface I {
     foo();
     bar();
   }

you should be able to replace that with an abstract class (its
interface will still be implementable):

   abstract class I {
     foo();
     bar();
   }


Remove old library/import/source syntax

The old #library, #import, and #source directives have been replaced
by library, import, and part. Additionally, you'll need to mark your
part files as parts using the 'part of' syntax. If you had something
like this before:

   #library('whatnot');
   #import('other.dart', prefix: 'other');
   #source('src.dart');

you will have to change it to:

   library whatnot;
   import 'other.dart' as other;
   part 'src.dart';

and you'll have to add a line to the beginning of src.dart:

   part of whatnot;
   ...


Remove ===

The support for === and !== is about to go away. If you have an expression like:

   (a === b) && (c !== d)

you can change it to:

   identical(a, b) && !identical(c, d)

The identical function is defined in the dart:core library which is
automatically imported everywhere. We usually prefer using the ==
operator instead of calling the identical function, so unless you're
really going for an identity check you may want to translate uses of
=== to ==.


Remove Dynamic

The special Dynamic type has been renamed to dynamic.

You can read more about these and other M1 language changes. As always, we encourage you to join our mailing list, ask questions on Stack Overflow, and file feature requests and bug reports.