Chromium Code Reviews| Index: docs/language/dartLangSpec.tex |
| diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex |
| index 5e009e68e58821021103639481f9a7b6f746d0a6..da2809692bb0a7788df5a71795c05f9c9901d896 100644 |
| --- a/docs/language/dartLangSpec.tex |
| +++ b/docs/language/dartLangSpec.tex |
| @@ -928,7 +928,7 @@ It is a compile-time error if a class has an instance member and a static member |
| \CLASS{} A \{ |
| \VAR{} i = 0; |
| \VAR{} j; |
| - f(x) =$>$ 3; |
| + f(x) $=$> 3; |
|
eernst
2016/11/09 11:35:37
Oops, that wouldn't work! `$>$` may be needed (rat
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Ack, yes, that's just me not reading what the orig
|
| \} |
| \CLASS{} B \EXTENDS{} A \{ |
| @@ -937,7 +937,7 @@ It is a compile-time error if a class has an instance member and a static member |
| //instance getter \& setter |
| /* compile-time error: static method conflicts with instance method */ |
| - \STATIC{} f(x) =$>$ 3; |
| + \STATIC{} f(x) $=$> 3; |
|
eernst
2016/11/09 11:35:37
`$>$`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Acknowledged.
|
| \} |
| \end{dartCode} |
| @@ -3821,36 +3821,41 @@ Method invocation can take several forms as specified below. |
| An ordinary method invocation can be {\em conditional} or {\em unconditional}. |
| \LMHash{} |
| -Evaluation of a {\em conditional ordinary method invocation} $e$ of the form |
| +Evaluation of a {\em conditional ordinary method invocation} $i$ of the form |
| \LMHash{} |
| -$o?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ |
| +$e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ |
| \LMHash{} |
| -is equivalent to the evaluation of the expression |
| +proceeds as follows: |
| + |
| +\LMHash{} |
| +If $e$ is a type literal, $i$ is equivalent to \code{$e$.$m$($a_1$, \ldots , $a_n$, $x_{n+1}$: $a_{n+1}$, \ldots , $x_{n+k}$: $a_{n+k}$)}. |
| \LMHash{} |
| -$((x) => x == \NULL ? \NULL : x.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k}))(o)$. |
| +Otherwise, evaluate $e$ to an object $o$. |
| +If $o$ is the null value, $i$ evaluates to the null value. |
| +Otherwise let $v$ be a fresh variable bound to $o$ and evaluate |
| +\code{$v$.$m$($a_1$, $\ldots$ , $a_n$, $x_{n+1}$: $a_{n+1}$, $\ldots$ , $x_{n+k}$: $a_{n+k}$))} to a value $r$, and then $e$ evaluates to $r$. |
| -unless $o$ is a type literal, in which case it is equivalent to $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. |
| \LMHash{} |
| -The static type of $e$ is the same as the static type of $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Exactly the same static warnings that would be caused by $o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ are also generated in the case of $o?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. |
| +The static type of $i$ is the same as the static type of $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. Exactly the same static warnings that would be caused by $e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ are also generated in the case of $e?.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. |
| \LMHash{} |
| An {\em unconditional ordinary method invocation} $i$ has the form |
| -$o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. |
| +$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. |
| \LMHash{} |
| Evaluation of an unconditional ordinary method invocation $i$ of the form |
| -$o.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ |
| +$e.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ |
| proceeds as follows: |
| \LMHash{} |
| -First, the expression $o$ is evaluated to a value $v_o$. Next, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k}$. Let $f$ be the result of looking up (\ref{methodLookup}) method $m$ in $v_o$ with respect to the current library $L$. |
| +First, the expression $e$ is evaluated to a value $o$. Next, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k}$. Let $f$ be the result of looking up (\ref{methodLookup}) method $m$ in $o$ with respect to the current library $L$. |
| \LMHash{} |
| Let $p_1 \ldots p_h$ be the required parameters of $f$, let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the optional parameters declared by $f$. |
| @@ -3860,15 +3865,15 @@ We have an argument list consisting of $n$ positional arguments and $k$ named ar |
| } |
| \LMHash{} |
| -If $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n+1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails. If $v_o$ is an instance of \code{Type} but $o$ is not a constant type literal, then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails. Otherwise method lookup has succeeded. |
| +If $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n+1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m+1}, \ldots, p_{h+l}\}$ or the method lookup also fails. If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails. Otherwise method lookup has succeeded. |
| \LMHash{} |
| -If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to $v_o$. The value of $i$ is the value returned after $f$ is executed. |
| +If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{} bound to $o$. The value of $i$ is the value returned after $f$ is executed. |
| \LMHash{} |
| -If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $v_o$ with respect to $L$. |
| -If $v_o$ is an instance of \code{Type} but $o$ is not a constant type literal, then if $g$ is a getter that forwards to a static getter, getter lookup fails. |
| -If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $o.m$. Then the value of $i$ is the result of invoking |
| +If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $o$ with respect to $L$. |
| +If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $g$ is a getter that forwards to a static getter, getter lookup fails. |
| +If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $e.m$. Then the value of $i$ is the result of invoking |
| the static method \code{Function.apply()} with arguments $v.g, [o_1, \ldots , o_n], \{\#x_{n+1}: o_{n+1}, \ldots , \#x_{n+k}: o_{n+k}\}$. |
| \LMHash{} |
| @@ -3925,8 +3930,8 @@ It is a compile-time error to invoke any of the methods of class \cd{Object} on |
| \LMLabel{cascadedInvocations} |
| \LMHash{} |
| -A {\em cascaded method invocation} has the form {\em e..suffix} |
| -where $e$ is an expression and {\em suffix} is a sequence of operator, method, getter or setter invocations. |
| +A {\em cascaded method invocation} has the form \code{$e$..\metavar{suffix}} |
| +where $e$ is an expression and \metavar{suffix} is a sequence of operator, method, getter or setter invocations. |
| \begin{grammar} |
| {\bf cascadeSection:} |
| @@ -3939,10 +3944,15 @@ where $e$ is an expression and {\em suffix} is a sequence of operator, method, g |
| \end{grammar} |
| \LMHash{} |
| -A cascaded method invocation expression of the form {\em e..suffix} is equivalent to the expression \code{(t)\{t.{\em suffix}; \RETURN{} t;\}($e$)}. |
| +Evaluation of a cascaded method invocation expression $e$ of the form \code{$e$..\metavar{suffix}} proceeds as follows: |
| + |
| +Evaluate $e$ to an object $o$. |
| +Let $t$ be a fresh variable bound to $o$. |
| +Evaluate \code{$t$.\metavar{suffix}} to an object. |
| +Then $e$ evaluates to $o$. |
| \rationale{ |
| -With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well. One might define {\em e?..suffix} to be equivalent to the expression \code{(t)\{t?.{\em suffix}; \RETURN{} t;\}($e$)}. |
| +With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well. One might define \code{$e$?..\metavar{suffix}} to be equivalent to the expression \code{$t$ == null ? null : $t$.\metavar{suffix}} where \code{t} is a fresh variable bound to the value of $e$. |
|
eernst
2016/11/09 11:35:37
`where $t$ is`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| The present specification has not added such a construct, in the interests of simplicity and rapid language evolution. However, Dart implementations may experiment with such constructs, as noted in section \ref{ecmaConformance}. |
| } |
| @@ -4029,10 +4039,22 @@ A property extraction can be either: |
| Property extraction can be either {\em conditional} or {\em unconditional}. |
| -Evaluation of a {\em conditional property extraction expression} $e$ of the form $e_1?.id$ is equivalent to the evaluation of the expression $((x) => x == \NULL ? \NULL : x.id)(e_1)$. |
| -unless $e_1$ is a type literal, in which case it is equivalent to $e_1.m$. |
| +\LMHash{} |
| +Evaluation of a {\em conditional property extraction expression} $e$ |
| +of the form \code{$e_1$?.\metavar{id}} proceeds as follows: |
| + |
| +\LMHash{} |
| +If $e_1$ is a type literal, $e$ is equivalent to $e_1.m$. |
|
eernst
2016/11/09 11:35:37
I believe it has to be `\code{$e_1$.\metavar{id}}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| + |
| +\LMHash{} |
| +Otherwise evaluate $e_1$ to an object $o$. |
| +If $o$ is the null value, $e$ evaluates to the null value. |
| +Otherwise let $x$ be a fresh variable bound to $o$ |
| +and evaluate \code{$x$.\metavar{id}} to a value $r$. |
| +Then $e$ evaluates to $r$. |
| + |
| -The static type of $e$ is the same as the static type of $e_1.id$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by $y.id$ are also generated in the case of $e_1?.id$. |
| +The static type of $e$ is the same as the static type of \code{$e_1$.\metavar{id}}. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by \code{$y$.\metavar{id}} are also generated in the case of \code{$e_1$?.\metavar{id}}. |
| \LMHash{} |
| Unconditional property extraction has one of two syntactic forms: $e.m$ (\ref{getterAccessAndMethodExtraction}) or $\SUPER.m$ (\ref{superGetterAccessAndMethodClosurization}), where $e$ is an expression and $m$ is an identifier. |
| @@ -4163,7 +4185,7 @@ $(r_1, \ldots, r_n, [p_1 = d_1, \ldots , p_k = d_k])$\{ |
| \} |
| \end{dartCode} |
| if $f$ is named $m$ and has required parameters $r_1, \ldots, r_n$, and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$. |
| -%\end{itemize} |
| +\end{itemize} |
| \LMHash{} |
| Except that iff \code{identical($o_1, o_2$)} then \cd{$o_1.m$ == $o_2.m$}. |
| @@ -4263,12 +4285,24 @@ In checked mode, it is a dynamic type error if $o$ is not \NULL{} and the interf |
| It is a static type warning if the static type of $e$ may not be assigned to the static type of $v$. The static type of the expression $v$ \code{=} $e$ is the static type of $e$. |
| \LMHash{} |
| -Evaluation of an assignment $a$ of the form $e_1?.v$ \code{=} $e_2$ is equivalent to the evaluation of the expression $((x) => x == \NULL? \NULL: x.v = e_2)(e_1)$ |
| - unless $e_1$ is a type literal, in which case it is equivalent to $e_1.v$ \code{=} $e_2$. |
| -. The static type of $a$ is the static type of $e_2$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by $y.v = e_2$ are also generated in the case of $e_1?.v$ \code{=} $e_2$. |
| +Evaluation of an assignment $a$ of the form \code{$e_1$?.$v$ = $e_2$} |
| +proceeds as follows: |
| + |
| +\LMHash |
| +If $e_1$ is a type literal, $a$ is equivalent to \code{$e_1$.$v$ = $e_2$}. |
| \LMHash{} |
| -Evaluation of an assignment of the form $e_1.v$ \code{=} $e_2$ proceeds as follows: |
| +Otherwise evaluate $e_1$ to an object $o$. |
| +If $o$ is the null value, $a$ evaluates to the null value. |
| +Otherwise let $x$ be a fresh variable bound to $o$ |
| +and evaluate \code{$x$.$v$ = $e_2$} to an object $r$. |
| +Then $a$ evaluates to $r$. |
| + |
| +\LMHash{} |
| +The static type of $a$ is the static type of $e_2$. Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$. Exactly the same static warnings that would be caused by \code{$y$.$v$ = $e_2$} are also generated in the case of \code{$e_1$?.$v$ = $e_2$}. |
| + |
| +\LMHash{} |
| +Evaluation of an assignment of the form \code{$e_1$.$v$ = $e_2$} proceeds as follows: |
| \LMHash{} |
| The expression $e_1$ is evaluated to an object $o_1$. Then, the expression $e_2$ is evaluated to an object $o_2$. Then, the setter $v=$ is looked up (\ref{getterAndSetterLookup}) in $o_1$ with respect to the current library. If $o_1$ is an instance of \code{Type} but $e_1$ is not a constant type literal, then if $v=$ is a setter that forwards (\ref{functionDeclarations}) to a static setter, setter lookup fails. Otherwise, the body of $v=$ is executed with its formal parameter bound to $o_2$ and \THIS{} bound to $o_1$. |
| @@ -4354,10 +4388,17 @@ It is a static type warning if the static type of $e$ may not be assigned to the |
| \LMHash{} |
| -Evaluation of an assignment of the form $e_1[e_2]$ \code{=} $e_3$ is equivalent to the evaluation of the expression \code{(a, i, e)\{a.[]=(i, e); \RETURN{} e; \} ($e_1, e_2, e_3$)}. The static type of the expression $e_1[e_2]$ \code{=} $e_3$ is the static type of $e_3$. |
| +Evaluation of an assignment $e$ of the form \code{$e_1$[$e_2$] = $e_3$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:38
Add a new line with `\LMHash{}` after this line.
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate $e_1$ to an object $a$, then evaluate $e_2$ to an object $i$, and finally evaluate $e_3$ to an object $v$. |
| +Call the method \code{[]=} on $a$ with $i$ as first argument and $v$ as second argument. |
| +Then $e$ evaluates to $v$. |
| + |
|
eernst
2016/11/09 11:35:37
Add an `\LMHash{}` line.
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +The static type of the expression \code{$e_1$[$e_2$] = $e_3$} is the static type of $e_3$. |
| \LMHash{} |
| -An assignment of the form $\SUPER[e_1]$ \code{=} $e_2$ is equivalent to the expression $\SUPER.[e_1]$ \code{=} $e_2$. The static type of the expression $\SUPER[e_1]$ \code{=} $e_2$ is the static type of $e_2$. |
| +An assignment of the form \code{\SUPER[$e_1$] = $e_2$} is equivalent to the expression \code{\SUPER.[$e_1$] = $e_2$}. The static type of the expression \code{\SUPER[$e_1$] = $e_2$} is the static type of $e_2$. |
| % Should we add: It is a dynamic error if $e_1$ evaluates to an constant list or map. |
| @@ -4374,27 +4415,67 @@ It is a compile-time error to invoke any of the setters of class \cd{Object} on |
| \LMLabel{compoundAssignment} |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $v$ {\em ??=} $e$ is equivalent to the evaluation of the expression $((x) => x == \NULL{}$ ? $v=e : x)(v)$ where $x$ is a fresh variable that is not used in $e$. |
| +Evaluation of a compound assignment $a$ of the form \code{$v$ ??= $e$} |
| +proceeds as follows: |
| + |
| +Evaluate $v$ to an object $o$. |
| +If $o$ is not the null value, $a$ evaluates to $o$. |
| +Otherwise evaluate \code{$v$ = $e$} to a value $r$, |
| +and then $a$ evaluates to $r$. |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $C.v$ {\em ??=} $e$, where $C$ is a type literal, is equivalent to the evaluation of the expression $((x) => x == \NULL{}$? $C.v=e: x)(C.v)$ where $x$ is a fresh variable that is not used in $e$. |
| +Evaluation of a compound assignment, $a$ of the form \code{$C$.$v$ ??= $e$}, where $C$ is a type literal, proceeds as follow: |
| + |
| +Evaluate $C.v$ to an object $o$. |
| +If $o$ is not the null value, $a$ evaluates to $o$. |
| +Otherwise evaluate \code{$C.v$ = $e$} to a value $r$, |
|
eernst
2016/11/09 11:35:38
Might as well use `$C$.$v$` now that so many other
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +and then $a$ evaluates to $r$. |
| \commentary { |
| The two rules above also apply when the variable v or the type C is prefixed. |
| } |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $e_1.v$ {\em ??=} $e_2$ is equivalent to the evaluation of the expression $((x) =>((y) => y == \NULL{}$ ? $ x.v = e_2: y)(x.v))(e_1)$ where $x$ and $y$ are distinct fresh variables that are not used in $e_2$. |
| +Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ ??= $e_2$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +Evaluate $e_1$ to an object $u$. |
| +Let $x$ be a fresh variable bound to $u$. |
| +Evalute \code{$x$.$v$} to an object $o$. |
| +If $o$ is not the null value, $a$ evaluates to $o$. |
| +Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$, |
| +and then $a$ evaluates to $r$. |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $e_1[e_2]$ {\em ??=} $e_3$ is equivalent to the evaluation of the expression |
| -$((a, i) => ((x) => x == \NULL{}$ ? $a[i] = e_3: x)(a[i]))(e_1, e_2)$ where $x$, $a$ and $i$ are distinct fresh variables that are not used in $e_3$. |
| +Evaluation of a compound assignment $a$ of the form \code{$e_1$[$e_2$] ??= $e_3$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate $e_1$ to an object $u$ and then evaluate $e_2$ to an object $i$. |
| +Call the \code{[]} method on $u$ with argument $i$, and let $o$ be the returned value. |
| +If $o$ is not the null value, $a$ evaluates to $o$. |
| +Otherwise evaluate $e_3$ to an object $v$ |
| +and then call the \code{[]=} method on $u$ with $i$ as first argument and $v$ as second argument. |
| +Then $a$ evaluates to $v$. |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $\SUPER.v$ {\em ??=} $e$ is equivalent to the evaluation of the expression $((x) => x == \NULL{}$ ? $\SUPER.v = e: x)(\SUPER.v)$ where $x$ is a fresh variable that is not used in $e$. |
| +Evaluation of a compound assignment $a$ of the form \code{\SUPER.$v$ ??= $e$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:36
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate \code{\SUPER.$v$} to an object $o$. |
| +If $o$ is not the null value then $a$ evaluats to $o$. |
| +Otherwise evaluate \code{\SUPER.$v$ = $e$} to an object $r$, |
| +and then $a$ evaluates to $r$. |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $e_1?.v$ {\em ??=} $e_2$ is equivalent to the evaluation of the expression \code{((x) $=>$ x == \NULL{} ? \NULL: $x.v ??= e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$. |
| +Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ ??= $e_2$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$} to an object $o$. |
| +If $o$ is not the null value then $a$ evaluates to $o$. |
| +Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$, |
| +and then $a$ evaluates to $r$. |
| + |
| % But what about C?.v ??= e |
| \LMHash{} |
| @@ -4417,11 +4498,29 @@ The static type of a compound assignment of the form $e_1[e_2]$ {\em ??=} $e_3$ |
| The static type of a compound assignment of the form $\SUPER.v$ {\em ??=} $e$ is the least upper bound of the static type of $\SUPER.v$ and the static type of $e$. Exactly the same static warnings that would be caused by $\SUPER.v = e$ are also generated in the case of $\SUPER.v$ {\em ??=} $e$. |
| \LMHash{} |
| -For any other valid operator $op$, a compound assignment of the form $v$ $op\code{=} e$ is equivalent to $v \code{=} v$ $op$ $e$. A compound assignment of the form $C.v$ $op \code{=} e$ is equivalent to $C.v \code{=} C.v$ $op$ $e$. A compound assignment of the form $e_1.v$ $op = e_2$ is equivalent to \code{((x) $=>$ x.v = x.v $op$ $e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$. A compound assignment of the form $e_1[e_2]$ $op\code{=} e_3$ is equivalent to |
| -\code{((a, i) $=>$ a[i] = a[i] $op$ $e_3$)($e_1, e_2$)} where $a$ and $i$ are a variables that are not used in $e_3$. |
| +For any other valid operator $op$, a compound assignment of the form \code{$v$ $op$= $e$} is equivalent to \code{$v$ = $v$ $op$ $e$}. A compound assignment of the form \code{$C$.$v$ $op$= $e$} is equivalent to \code{$C$.$v$ = $C$.$v$ $op$ $e$}. |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ $op$= $e_2$} proceeds as follows: |
| +Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$ = $x$.$v$ $op$ $e_2$} to an object $r$ |
| +and then $a$ evaluates to $r$. |
| + |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluation of s compound assignment $a$ of the form \code{$e_1$[$e_2$] $op$= $e_3$} proceeds as follows: |
| +Evaluate $e_1$ to an object $u$ and evaluate $e_2$ to an object $v$. |
| +Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively. |
| +Evaluate \code{$a$[$i$] = $a$[$i$] $op$ $e_3$} to an object $r$, |
| +and then $a$ evaluates to $r$. |
| \LMHash{} |
| -Evaluation of a compound assignment of the form $e_1?.v$ $op = e_2$ is equivalent to \code{((x) $=>$ x?.v = x.v $op$ $e_2$)($e_1$)} where $x$ is a variable that is not used in $e_2$. The static type of $e_1?.v$ $op = e_2$ is the static type of $e_1.v$ $op$ $e_2$. Exactly the same static warnings that would be caused by $e_1.v$ $op = e_2$ are also generated in the case of $e_1?.v$ $op = e_2$. |
| +Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ $op$ = $e_2$} proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +Evaluate $e_1$ to an object $u$. |
| +If $u$ is the null value, then $a$ evaluates to the null value. |
| +Otherwise let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$ $op$= $e_2$} to an object $r$. |
| +Then $a$ evaluates to $r$. |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +The static type of \code{$e_1$?.$v$ $op$= $e_2$} is the static type of \code{$e_1$.$v$ $op$ $e_2$}. Exactly the same static warnings that would be caused by \code{$e_1$.$v$ $op$= $e_2$} are also generated in the case of \code{$e_1$?.$v$ $op$= $e_2$}. |
| \LMHash{} |
| A compound assignment of the form $C?.v$ $op = e_2$ is equivalent to the expression |
| @@ -4489,7 +4588,15 @@ then the type of $v$ is known to be $T$ in $e_2$. |
| \end{grammar} |
| \LMHash{} |
| -Evaluation of an if-null expression $e$ of the form $e_1??e_2 $ is equivalent to the evaluation of the expression $((x) => x == \NULL? e_2: x)(e_1)$. The static type of $e$ is least upper bound (\ref{leastUpperBounds}) of the static type of $e_1$ and the static type of $e_2$. |
| +Evaluation of an if-null expression $e$ of the form \code{$e_1$ ?? $e_2$} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate $e_1$ to an object $o$. |
| +If $o$ is not the null value, then $e$ evaluates to $o$. |
| +Otherwise evaluate $e_2$ to an object $r$, |
| +and then $e$ evaluates to $r$. |
| + |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +The static type of $e$ is least upper bound (\ref{leastUpperBounds}) of the static type of $e_1$ and the static type of $e_2$. |
|
eernst
2016/11/09 11:35:38
`is least` --> `is the least`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| \subsection{ Logical Boolean Expressions} |
| @@ -4860,7 +4967,11 @@ Postfix expressions invoke the postfix operators on objects. |
| A {\em postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$v$++}, where $v$ is an identifier, is equivalent to executing \code{()\{\VAR{} r = $v$; $v$ = r + 1; \RETURN{} r\}()}. |
| +Evaluation of a postfix expression $e$ of the form \code{$v$++}, where $v$ is an identifier, proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate $v$ to an object $r$ and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$v$ = $y$ + 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| The static type of such an expression is the static type of $v$. |
| @@ -4870,86 +4981,130 @@ The static type of such an expression is the static type of $v$. |
| } |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$C.v$ ++} is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$C$.$v$++} |
| +proceeds as follows: |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| -\code{()\{\VAR{} r = $C.v$; $C.v$ = r + 1; \RETURN{} r\}()}. |
| +Evaluate $C.v$ to a value $r$ and let $y$ be a fresh variable bound to $r$. |
|
eernst
2016/11/09 11:35:38
Well, `\code{$C$.$v$}` would be the strictly consi
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate \code{$C.v$ = $y$ + 1}. |
|
eernst
2016/11/09 11:35:37
`$C$.$v$`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $C.v$. |
| +The static type of such an expression is the static type of \code{$C$.$v$}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1.v$++} is equivalent to executing |
| +Evaluating of a postfix expression $e$ of the form \code{$e_1$.$v$++} |
|
eernst
2016/11/09 11:35:37
`Evaluating` --> `Evaluation`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +proceeds as follows: |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| -\code{(x)\{\VAR{} r = x.v; x.v = r + 1; \RETURN{} r\}($e_1$)}. |
| +Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$} to a value $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$x$.$v$ = $y$ + 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1.v$. |
| +The static type of such an expression is the static type of \code{$e_1$.$v$}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1[e_2]$++}, is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]++} |
| +proceeds as follows: |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| -\code{(a, i)\{\VAR{} r = a[i]; a[i] = r + 1; \RETURN{} r\}($e_1$, $e_2$)}. |
| +Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$. |
| +Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively. |
| +Evaluate \code{$a$[$i$]} to an object $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$a$[$i$] = $y$ + 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1[e_2]$. |
| +The static type of such an expression is the static type of \code{$e_1$[$e_2$]}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$v$-{}-}, where $v$ is an identifier, is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$v$-{}-}, where $v$ is an identifier, proceeds as follows: |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| -\code{()\{\VAR{} r = $v$; $v$ = r - 1; \RETURN{} r\}()}. |
| +Evaluate the expression $v$ to an object $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$v$ = $y$ - 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| The static type of such an expression is the static type of $v$. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$C.v$-{}-} is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$C$.$v$-{}-} |
| +proceeds as follows: |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| -\code{()\{\VAR{} r = $C.v$; $C.v$ = r - 1; \RETURN{} r\}()}. |
| +Evaluate \code{$C$.$v$} to a value $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$C$.$v$ = $y$ - 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $C.v$. |
| +The static type of such an expression is the static type of \code{$C$.$v$}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1.v$-{}-} is equivalent to executing |
| +Evaluation of a postfix expression of the form \code{$e_1$.$v$-{}-} |
| +proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$} to a value $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$x$.$v$ = $y$ - 1}. |
| +Then $e$ evaluates to $r$. |
| -\code{(x)\{\VAR{} r = x.v; x.v = r - 1; \RETURN{} r\}($e_1$)}. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1.v$. |
| +The static type of such an expression is the static type of \code{$e_1$.$v$}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1[e_2]$-{}-}, is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]-{}-} |
| +proceeds as follows: |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| -\code{(a, i)\{\VAR{} r = a[i]; a[i] = r - 1; \RETURN{} r\}($e_1$, $e_2$)}. |
| +Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$. |
| +Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively. |
| +Evaluate \code{$a$[$i$]} to an object $r$ |
| +and let $y$ be a fresh variable bound to $r$. |
| +Evaluate \code{$a$[$i$] = $y$ - 1}. |
| +Then $e$ evaluates to $r$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1[e_2]$. |
| +The static type of such an expression is the static type of \code{$e_1$[$e_2$]}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1?.v$++} is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$++} |
| +where $e_1$ is not a type literal, proceeds as follows: |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| -\code{((x) =$>$ x == \NULL? \NULL : x.v++)($e_1$)} |
| -unless $e_1$ is a type literal, in which case it is equivalent to \code{$e_1.v$++} |
| -. |
| +If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$v$++}. |
| + |
|
eernst
2016/11/09 11:35:38
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +Otherwise evaluate $e_1$ to an object $u$. |
| +if $u$ is the null value, $e$ evaluates to the null value. |
| +Otherwise let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$++} to an object $o$. |
| +Then $e$ evaluates to $o$. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1.v$. |
| +The static type of such an expression is the static type of \code{$e_1$.$v$}. |
| \LMHash{} |
| -Execution of a postfix expression of the form \code{$e_1?.v$-{}-} is equivalent to executing |
| +Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$-{}-} |
| +where $e_1$ is not a type literal, proceeds as follows: |
| + |
|
eernst
2016/11/09 11:35:37
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| +If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$v$-{}-}. |
| + |
|
eernst
2016/11/09 11:35:36
`\LMHash{}`
Lasse Reichstein Nielsen
2016/11/09 12:31:55
Done.
|
| +Otherwise evaluate $e_1$ to an object $u$. |
| +If $u$ is the null value, $e$ evalkuates to the null value. |
| +Otherwise let $x$ be a fresh variable bound to $u$. |
| +Evaluate \code{$x$.$v$-{}-} to an object $o$. |
| +Then $e$ evaluates to $o$. |
| -\code{((x) =$>$ x == \NULL? \NULL : x.v-{}-)($e_1$)} |
| -unless $e_1$ is a type literal, in which case it is equivalent to \code{$e_1.v$-{}-} |
| -. |
| \LMHash{} |
| -The static type of such an expression is the static type of $e_1.v$. |
| +The static type of such an expression is the static type of \code{$e_1$.$v$}. |
| \subsection{ Assignable Expressions} |
| @@ -5217,7 +5372,6 @@ In all other cases, a \code{CastError} is thrown. |
| \LMHash{} |
| The static type of a cast expression \code{$e$ \AS{} $T$} is $T$. |
|
eernst
2016/11/09 11:35:38
Actually the spec is not at all as consistent as I
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Acknowledged.
|
| - |
| \section{Statements} |
| \LMLabel{statements} |
| @@ -5353,7 +5507,7 @@ A function declaration statement of one of the forms $id$ $signature$ $\{ statem |
| } |
| \begin{dartCode} |
| -f(x) =$>$ x++; // a top level function |
| +f(x) $=$> x++; // a top level function |
|
eernst
2016/11/09 11:35:37
Revert to `=$>$`, or just omit all `$`s if that wo
Lasse Reichstein Nielsen
2016/11/09 12:31:56
Done.
|
| top() \{ // another top level function |
| f(3); // illegal |
| f(x) $=>$ x $>$ 0? x*f(x-1): 1; // recursion is legal |
| @@ -5949,7 +6103,8 @@ Otherwise $m$ terminates. |
| Otherwise, execution resumes at the end of the try statement. |
| \LMHash{} |
| -Execution of an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$)} $s$ of a try statement $t$ proceeds as follows: The statement $s$ is executed in the dynamic scope of the exception handler defined by the finally clause of $t$. Then, the current exception and active stack trace both become undefined. |
| +Execution of an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$)} $s$ of a try statement $t$ proceeds as follows: |
| +The statement $s$ is executed in the dynamic scope of the exception handler defined by the finally clause of $t$. Then, the current exception and active stack trace both become undefined. |
| \LMHash{} |
| Execution of a \FINALLY{} clause \FINALLY{} $s$ of a try statement proceeds as follows: |