Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Unified Diff: docs/language/informal/optional-new.md

Issue 3005833002: Adjusted the optional-const/new specs. (Closed)
Patch Set: Review response Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « docs/language/informal/optional-const.md ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: docs/language/informal/optional-new.md
diff --git a/docs/language/informal/optional-new.md b/docs/language/informal/optional-new.md
index 0eddb49bdba6b95836320cf730cff2c5141a5978..2723560469a44604f74bc91b2311bcedf61a0067 100644
--- a/docs/language/informal/optional-new.md
+++ b/docs/language/informal/optional-new.md
@@ -2,20 +2,21 @@
Author: eernst@.
-Version: 0.1 (2017-08-15)
+Version: 0.2 (2017-08-30)
-Status: Under discussion
+Status: Under implementation.
**This document** is an informal specification of the *optional new* feature.
**The feature** adds support for omitting the reserved word `new` in instance
creation expressions.
-This feature relies on
-[optional const](https://gist.github.com/eernstg/4f498836e73d5f003928e8bbe1683d68),
-and it is assumed that the reader knows the optional const feature. Otherwise,
-this informal specification is derived from a
+This feature extends and includes the
+[optional const feature](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md),
+and it is assumed that the reader knows about optional const. Beyond
+that, this informal specification is derived from a
[combined proposal](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-new-const.md)
-which presents optional new and several other features.
+which presents optional new together with several other features.
+
## Motivation
@@ -23,18 +24,16 @@ In Dart without optional new, the reserved word `new` is present in every
expression whose evaluation invokes a constructor (except constant
expressions). These expressions are known as *instance creation expressions*. If
`new` is removed from such an instance creation expression, the remaining phrase
-is still syntactically correct in almost all cases, and the required grammar
-update that makes them all syntactically correct is exactly the one that is
-specified for
-[optional const](https://gist.github.com/eernstg/4f498836e73d5f003928e8bbe1683d68).
-
-Assuming the grammar update in
-[optional const](https://gist.github.com/eernstg/4f498836e73d5f003928e8bbe1683d68),
-all instance creation expressions can technically omit the `new` because tools
-(compilers, analyzers) are able to parse these expressions, and they are able
-to recognize that they denote instance creations (rather than, say, static
-function invocations), because the part before the left parenthesis is
-statically known to denote a constructor.
+is still syntactically correct in almost all cases. The required grammar
+update that makes them all syntactically correct is a superset of the one that
+is specified for
+[optional const](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md).
+
+With that grammar update, all instance creation expressions can technically
+omit the `new` because tools (compilers, analyzers) are able to parse these
+expressions, and they are able to recognize that they denote instance creations
+(rather than, say, static function invocations), because the part before the
+left parenthesis is statically known to denote a constructor.
For instance, `p.C.foo` may resolve statically to a constructor named `foo` in
a class `C` imported with prefix `p`. Similarly, `D` may resolve to a class, in
@@ -48,8 +47,8 @@ For human readers, it may be helpful to document that a particular expression
is guaranteed to yield a fresh instance, and this is the most common argument
why `new` should *not* be omitted. However, Dart already allows instance
creation expressions to invoke a factory constructor, so Dart developers never
-had any local guarantees that any particular expression would yield a fresh
-object.
+had any firm local guarantees that any particular expression would yield a
+fresh object.
Developers may thus prefer to omit `new` in order to obtain more concise code,
and possibly also in order to achieve greater uniformity among invocations of
@@ -60,6 +59,7 @@ the `new` in all cases, but also preserves the permission to include `new` in
all cases. It is a matter of style to use `new` in a manner that developers
find helpful.
+
## Syntax
The syntax changes associated with this feature are the following:
@@ -73,41 +73,50 @@ constructorInvocation ::= // NEW
typeName typeArguments '.' identifier arguments
assignableExpression ::=
SUPER unconditionalAssignableSelector |
- typeName typeArguments '.' identifier arguments
- (arguments* assignableSelector)+ | // NEW
+ constructorInvocation (arguments* assignableSelector)+ | // NEW
identifier |
primary (arguments* assignableSelector)+
```
-This grammar update is identical to the grammar update for optional const.
-For more information including a complete grammar, please consult
-[that specification](https://gist.github.com/eernstg/4f498836e73d5f003928e8bbe1683d68).
+*As mentioned, this grammar update is a superset of the grammar updates for
+[optional const](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md).*
+
## Static analysis
-We specify a type directed source code transformation which eliminates the
-feature. The static analysis proceeds to work on the transformed program.
+We specify a type directed source code transformation which eliminates the
+feature by expressing the same semantics with different syntax. The static
+analysis proceeds to work on the transformed program.
*Similarly to optional const, this means that the feature is "static semantic
sugar". We do not specify the dynamic semantics for this feature, because the
feature is eliminated in this transformation step.*
We need to treat expressions differently in different locations, hence the
-following definition: An expression _e_ is said to *occur in a constant
-context*,
+following definition, which is identical to the one in
+[optional const](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md):
+An expression _e_ is said to *occur in a constant context*,
-- if _e_ is an immediate subexpression of a constant list literal or a constant
- map literal.
+- if _e_ is an immediate subexpression of a constant list literal or a
+ constant map literal.
- if _e_ is an immediate subexpression of a constant object expression.
- if _e_ is the initializing expression of a constant variable declaration.
-- if _e_ is the default value of a formal parameter. **[This case is under discussion and may be removed]**
- if _e_ is an immediate subexpression of an expression which occurs in a
constant context.
We define *new/const insertion* as the following transformation:
-- if _e_ occurs in a constant context, replace `e` by `const e`.
-- otherwise, replace `e` by `new e`
+- if the expression _e_ occurs in a constant context, replace _e_ by
+ `const` _e_,
+- otherwise replace _e_ by `new` _e_.
+
+For the purposes of describing the main transformation we need the following
+syntactic entity:
+
+```
+assignableExpressionTail ::=
+ arguments assignableSelector (arguments* assignableSelector)*
+```
An expression on one of the following forms must be modified to be or
contain a `constantObjectExpression` or `newExpression` as described:
@@ -125,29 +134,63 @@ With a `postfixExpression` _e_,
a class and `identifier2` is the name of a named constructor in that class,
or `identifier1` denotes a prefix for a library _L_ and `identifier2` denotes
a class exported by _L_, perform new/const insertion on _e_.
-- if _e_ is on the form
- `identifier1 '.' typeIdentifier '.' identifier2 arguments` where
+- if _e_ is on the form
+ `identifier1 '.' typeIdentifier '.' identifier2 arguments` where
`identifier1` denotes a library prefix for a library _L_, `typeIdentifier`
denotes a class _C_ exported by _L_, and `identifier2` is the name of a named
constructor in _C_, perform new/const insertion on _e_.
+With an `assignableExpression` _e_,
+
+- if _e_ is on the form
+ `constructorInvocation (arguments* assignableSelector)+`
+ then replace _e_ by `new` _e_.
+- if _e_ is on the form
+ `typeIdentifier assignableExpressionTail`
+ where `typeIdentifier` denotes a class then replace _e_ by `new` _e_.
+- if _e_ is on the form
+ `identifier1 '.' identifier2 assignableExpressionTail`
+ where `identifier1` denotes a class and `identifier2` is the name of
+ a named constructor in that class, or `identifier1` denotes a prefix
+ for a library _L_ and `identifier2` denotes a class exported by _L_
+ then replace _e_ by `new` _e_.
+- if _e_ is on the form
+ `identifier1 '.' typeIdentifier '.' identifier2 assignableExpressionTail`
+ where `identifier1` denotes a library prefix for a library _L_,
+ `typeIdentifier` denotes a class _C_ exported by _L_, and `identifier2`
+ is the name of a named constructor in _C_ then replace _e_ by `new` _e_.
+
+*In short, add `const` in const contexts and otherwise add `new`. With
+`assignableExpression` we always add `new`, because such an expression
+can never be a subexpression of a correct constant expression. It is easy
+to verify that each of the replacements can be derived from
+`postfixExpression` via `primary selector*` and similarly for
+`assignableExpression`. Hence, the transformation preserves syntactic
+correctness.*
+
+
## Dynamic Semantics
There is no dynamic semantics to specify for this feature because it is
eliminated by code transformation.
+
## Interplay with optional const
-The optional new and optional const feature can easily be introduced at the same
-time: Just update the grammar as specified for optional const (and mentioned
-again here) and use the program transformation specified in this document. The
-program transformation in this document subsumes the program transformation
-specified for optional const, and hence this will provide support for both
-features.
+This informal specification includes optional const as well as optional new,
+that is, if this specification is implemented then
+[optional const](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-const.md)
+may be considered as background material.
+
## Revisions
-- 0.1 (2017-08-15) Stand-alone proposal for optional new created, using version
- 0.8 of the combined proposal
+- 0.2 (2017-07-30) Updated the document to specify the previously missing
+ transformations for `assignableExpression`, and to specify a no-magic
+ approach (where no `const` is introduced except when forced by the
+ syntactic context).
+
+- 0.1 (2017-08-15) Stand-alone informal specification for optional new created,
+ using version 0.8 of the combined proposal
[optional-new-const.md](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/optional-new-const.md)
as the starting point.
« no previous file with comments | « docs/language/informal/optional-const.md ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698