Skip to content

Add rules to allow omission of certain default values #4393

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 58 additions & 5 deletions working/augmentation-libraries/feature-specification.md
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ scope. *We could say that it attaches itself to the existing name.*

Augmentations aren't allowed to *replace* code, so they mostly add entirely new
declarations to the surrounding type. However, function and constructor
augmentations can fill in a body for an augmented declaration that is lacks one.
augmentations can fill in a body for an augmented declaration that lacks one.

More precisely, a function or constructor declaration (introductory or
augmenting) is *incomplete* if all of:
Expand Down Expand Up @@ -727,13 +727,45 @@ augment class Person {
}
```

A top-level function, static method, or instance method may be augmented to
provide default values for optional parameters:

```dart
class C {
void m1([int i]);
void m2({String name});
void m3({String otherName = "Smith"}); // OK, too.
}

augment class C {
augment m1([i = 1]) {}
augment m2({name = "John"}) {}
augment m3({otherName}) {}
}
```

An optional formal parameter has the default value _d_ if exactly one
declaration of that formal parameter in the augmentation chain specifies a
default value, and it is _d_. An optional formal parameter does not have an
explicitly specified default value if none of its declarations in the
augmentation chain specifies a default value; in this case, the default value
is introduced implicitly with the value null in the case where the parameter
has a nullable declared type, and no default values for that parameter are
specified in the augmentation chain.

It's a **compile-time** error if:

* The signature of the augmenting function does not [match][signature
matching] the signature of the augmented function.

* The augmenting function specifies any default values. *Default values are
defined solely by the introductory function.*
* The augmentation chain has two or more specifications of a default value
for the same optional parameter. This is an error even in the case where
all of them are identical. *Default values are defined by the introductory
function or an augmentation, but at most once.*

* The augmentation chain has no specifications of a default value for an
optional parameter whose declared type is potentially non-nullable, and
the declared function is not abstract.

* A function is not complete after all augmentations are applied, unless it
is in a context where it can be abstract. *Every function declaration
Expand Down Expand Up @@ -840,13 +872,27 @@ Augmenting constructors works similar to augmenting a function, with some extra
rules to handle features unique to constructors like redirections and
initializer lists.

It is **not** a compile-time error for an incomplete factory constructor to
omit default values. *That is, they are treated similarly to abstract
instance methods in this respect. This allows the augmenting declaration to
implement the constructor by adding a redirection or a body.*

It's a **compile-time error** if:

* The signature of the augmenting function does not [match][signature
matching] the signature of the augmented function.

* The augmenting constructor parameters specify any default values.
*Default values are defined solely by the introductory constructor.*
* The augmentation chain has two or more specifications of a default value
for the same optional parameter. This is an error even in the case where
all of them are identical. *Default values are defined by the introductory
declaration or an augmentation, but at most once.*

* The augmentation chain has exactly one specification of a default value
for an optional parameter, and the constructor is a redirecting factory.

* The augmentation chain has no specifications of a default value for an
optional parameter whose declared type is potentially non-nullable, and
the constructor is not a redirecting factory.

* The introductory constructor is `const` and the augmenting constructor
is not or vice versa. *An augmentation can't change whether or not a
Expand All @@ -858,6 +904,13 @@ It's a **compile-time error** if:
not a constructor is generative because that affects whether users are
allowed to call the constructor in a subclass's initializer list.*

* More than one constructor declaration in an augmentation chain specifies
a default value for the same parameter.

* A constructor declaration in an augmentation chain is a redirecting
factory, and some declaration in the chain specifies a default value
for one or more parameters.

An incomplete constructor can be completed by adding an initializer list and/or
a body, or by adding a redirection:

Expand Down