mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 08:24:39 +00:00
![Erik Ernst](/assets/img/avatar_default.png)
This CL is using an approach that does not rely on program transformations (based on the idea in CL 50221 from Lasse). I have taken the approach to make `constant list literal`, `constant object expression` the higher level concepts, and define the notion of a `constant context` in terms of the syntax (so it requires an actual `\CONST{}` or a switch case in the enclosing syntax). Doing this work, I encountered the section about postfix expressions, and (like several times before), I noted that there was no specification of the static analysis at all. So I cleaned up that section, at the time where I needed to edit it already, because of the new `constructorInvocation` syntax. If that is helpful, I could split this CL into a pure "implicit creation" CL and another "fix up postfix expressions" CL. Change-Id: I669ce942f698ca2fbb47ea60c58f4f05304ae66d Reviewed-on: https://dart-review.googlesource.com/c/93432 Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
349 lines
13 KiB
TeX
349 lines
13 KiB
TeX
\def\builtinId#1{\textsf{\textbf{#1}}}
|
|
\def\keyword#1{\textsf{\textbf{#1}}}
|
|
\def\metavar#1{\ensuremath{\mathit{#1}}}
|
|
|
|
\def\ABSTRACT{\builtinId{abstract}}
|
|
\def\AS{\builtinId{as}}
|
|
\def\COVARIANT{\builtinId{covariant}}
|
|
\def\DEFERRED{\builtinId{deferred}}
|
|
\def\DYNAMIC{\builtinId{dynamic}}
|
|
\def\EXPORT{\builtinId{export}}
|
|
\def\EXTERNAL{\builtinId{external}}
|
|
\def\FACTORY{\builtinId{factory}}
|
|
\def\FUNCTION{\builtinId{Function}}
|
|
\def\GET{\builtinId{get}}
|
|
\def\IMPLEMENTS{\builtinId{implements}}
|
|
\def\IMPORT{\builtinId{import}}
|
|
\def\INTERFACE{\builtinId{interface}}
|
|
\def\LIBRARY{\builtinId{library}}
|
|
\def\MIXIN{\builtinId{mixin}}
|
|
\def\OPERATOR{\builtinId{operator}}
|
|
\def\PART{\builtinId{part}}
|
|
\def\SET{\builtinId{set}}
|
|
\def\STATIC{\builtinId{static}}
|
|
\def\TYPEDEF{\builtinId{typedef}}
|
|
|
|
\def\ASSERT{\keyword{assert}}
|
|
\def\ASYNC{\keyword{async}}
|
|
\def\AWAIT{\keyword{await}}
|
|
\def\BREAK{\keyword{break}}
|
|
\def\CASE{\keyword{case}}
|
|
\def\CATCH{\keyword{catch}}
|
|
\def\CLASS{\keyword{class}}
|
|
\def\CONST{\keyword{const}}
|
|
\def\CONTINUE{\keyword{continue}}
|
|
\def\DEFAULT{\keyword{default}}
|
|
\def\DO{\keyword{do}}
|
|
\def\ELSE{\keyword{else}}
|
|
\def\ENUM{\keyword{enum}}
|
|
\def\EXTENDS{\keyword{extends}}
|
|
\def\FALSE{\keyword{false}}
|
|
\def\FINAL{\keyword{final}}
|
|
\def\FINALLY{\keyword{finally}}
|
|
\def\FOR{\keyword{for}}
|
|
\def\HIDE{\keyword{hide}}
|
|
\def\IF{\keyword{if}}
|
|
\def\IN{\keyword{in}}
|
|
\def\IS{\keyword{is}}
|
|
\def\NEW{\keyword{new}}
|
|
\def\NULL{\keyword{null}}
|
|
\def\OF{\keyword{of}}
|
|
\def\ON{\keyword{on}}
|
|
\def\RETHROW{\keyword{rethrow}}
|
|
\def\RETURN{\keyword{return}}
|
|
\def\SHOW{\keyword{show}}
|
|
\def\SUPER{\keyword{super}}
|
|
\def\SWITCH{\keyword{switch}}
|
|
\def\SYNC{\keyword{sync}}
|
|
\def\THIS{\keyword{this}}
|
|
\def\THROW{\keyword{throw}}
|
|
\def\TRUE{\keyword{true}}
|
|
\def\TRY{\keyword{try}}
|
|
\def\VAR{\keyword{var}}
|
|
\def\VOID{\keyword{void}}
|
|
\def\WHILE{\keyword{while}}
|
|
\def\WITH{\keyword{with}}
|
|
\def\YIELD{\keyword{yield}}
|
|
|
|
% Used for inline code snippets.
|
|
\def\code#1{\texttt{#1}}
|
|
|
|
% `call` has no special lexical status, so we just use \code{}.
|
|
\def\CALL{\code{call}}
|
|
|
|
% Define commands for `<<`, `>>`, `>>>` that avoid introducing guillemets.
|
|
\def\ltlt{<\mbox <}
|
|
\def\gtgt{>\mbox >}
|
|
\def\gtgtgt{>\mbox >\mbox >}
|
|
|
|
% Used as line break in the right hand side of a grammar
|
|
% alternative, that is, when starting a "continuation line".
|
|
\newcommand{\gnewline}{\leavevmode\\}
|
|
|
|
% Metavariables for argument lists.
|
|
\newcommand{\argumentList}[1]{\metavar{{#1}s}}
|
|
\newcommand{\parameterList}[1]{\metavar{{#1}s}}
|
|
|
|
% Colors used for for different kinds of text.
|
|
\definecolor{normativeColor}{rgb}{0,0,0}
|
|
\definecolor{commentaryColor}{rgb}{0.5,0.5,0.5}
|
|
\definecolor{rationaleColor}{rgb}{0.5,0.5,0.5}
|
|
|
|
% Environments for different kinds of text.
|
|
\newenvironment{Q}[1]{{\bf{}Upcoming: {#1}}}{}
|
|
\newenvironment{rationale}[1]{{\color{rationaleColor}\it{#1}}}{}
|
|
\newenvironment{commentary}[1]{{\color{commentaryColor}\sf{#1}}}{}
|
|
|
|
% Auxiliary functions.
|
|
\newcommand{\flatten}[1]{\ensuremath{\mbox{\it flatten}({#1})}}
|
|
\newcommand{\futureOrBase}[1]{\ensuremath{\mbox{\it futureOrBase}({#1})}}
|
|
\newcommand{\overrides}[1]{\ensuremath{\mbox{\it overrides}({#1})}}
|
|
\newcommand{\inherited}[1]{\ensuremath{\mbox{\it inherited}({#1})}}
|
|
|
|
% Used as a mini-section marker, indicating visibly that a range of
|
|
% text (usually just a couple of paragraphs) are concerned with one
|
|
% specific topic in a list of similar topics (like many forms of
|
|
% expressions of a similar nature).
|
|
\newcommand{\Case}[1]{\textbf{Case }$\langle\hspace{0.1em}${#1}$\hspace{0.1em}\rangle$\textbf{.}}
|
|
\newcommand{\EndCase}{\mbox{}\hfill$\scriptscriptstyle\Box$\xspace}
|
|
|
|
\newenvironment{dartCode}[1][!ht] {%
|
|
\def\@programcr{\@addfield\strut}%
|
|
\let\\=\@programcr%
|
|
\relax\@vobeyspaces\obeylines%
|
|
\ttfamily\color{commentaryColor}%
|
|
\vspace{1em}%
|
|
}{\normalcolor\vspace{1em}}
|
|
|
|
\newenvironment{normativeDartCode}[1][!ht] {%
|
|
\def\@programcr{\@addfield\strut}%
|
|
\let\\=\@programcr%
|
|
\relax\@vobeyspaces\obeylines%
|
|
\ttfamily\color{normativeColor}%
|
|
\vspace{1em}%
|
|
}{\normalcolor\vspace{1em}}
|
|
|
|
% Used for comments in a code context.
|
|
\def\comment#1{\textsf{#1}}
|
|
|
|
% A commonly used metavariable for an identifier, operator.
|
|
\newcommand{\id}{\metavar{id}}
|
|
\newcommand{\op}{\metavar{op}}
|
|
|
|
% Used for defining occurrence of phrase, with customized index entry.
|
|
\newcommand{\IndexCustom}[2]{%
|
|
\leavevmode\marginpar{\ensuremath{\diamond}}\emph{#1}\index{#2}}
|
|
|
|
% Used when one concept should have >1 entry in the index. Does not add
|
|
% the diamond in the margin and shows no text where the command occurs.
|
|
% Intended to be used immediately after another \Index... command.
|
|
\newcommand{\IndexExtraEntry}[1]{\index{#1}}
|
|
|
|
% Used for a defining occurrence of a phrase, adding it to the index.
|
|
\newcommand{\Index}[1]{\IndexCustom{#1}{#1}}
|
|
|
|
% Same appearance, but not adding an entry to the index.
|
|
\newcommand{\NoIndex}[1]{%
|
|
\leavevmode\marginpar{\ensuremath{\diamond}}\emph{#1}}
|
|
|
|
% Used to specify comma separated lists of similar symbols.
|
|
\newcommand{\List}[3]{\ensuremath{{#1}_{#2},\,\ldots,\ {#1}_{#3}}}
|
|
|
|
% Used to specify comma separated lists of pairs of similar symbols,
|
|
% as needed, e.g., for declarations of formal parameters.
|
|
% Parameters: Name of first part of pair, name of second part,
|
|
% index at start, index at end.
|
|
\newcommand{\PairList}[4]{\ensuremath{%
|
|
{#1}_{#3}\ {#2}_{#3},\,\ldots,\ {#1}_{#4}\ {#2}_{#4}}}
|
|
|
|
% Used to specify comma separated lists of triples of similar symbols,
|
|
% as needed, e.g., for declarations of formal parameters with defaults.
|
|
% Parameters: Name of first part of triple, name of second part,
|
|
% name of third part, index at start, index at end.
|
|
\newcommand{\TripleList}[5]{\ensuremath{%
|
|
{#1}_{#4}\ {#2}_{#4}\ {#3}_{#4},\,\ldots,\ {#1}_{#5}\ {#2}_{#5}\ {#3}_{#5}}}
|
|
|
|
% Used to abbreviate \EXTENDS{} in function types.
|
|
\newcommand{\FunctionTypeExtends}{\ensuremath{\triangleleft}}
|
|
|
|
% Used to specify comma separated lists of pairs of symbols
|
|
% separated by \EXTENDS{}, as needed for type parameter declarations.
|
|
% Parameters: Type parameter name, bound name, number of type parameters.
|
|
\newcommand{\TypeParameters}[3]{\ensuremath{%
|
|
{#1}_1\,\EXTENDS\,{#2}_1,\,\ldots,\ %
|
|
{#1}_{#3}\,\EXTENDS\,{#2}_{#3}}}
|
|
|
|
% Used to specify comma separated lists of symbols followed by
|
|
% \EXTENDS{}, as needed for type parameter declarations where we do
|
|
% not intend to refer explicitly to the bounds.
|
|
% Parameters: Type parameter name, number of type parameters.
|
|
\newcommand{\TypeParametersNoBounds}[2]{\ensuremath{%
|
|
{#1}_1\,\EXTENDS\,\ldots,\ \ldots,\ {#1}_{#2}\,\EXTENDS\,\ldots}}
|
|
|
|
% For consistency, we may as well use this whenever possible.
|
|
\newcommand{\TypeParametersStd}{\TypeParameters{X}{B}{s}}
|
|
|
|
% Used to specify comma separated lists of pairs of symbols
|
|
% separated by \EXTENDS{}, as needed for type parameter declarations.
|
|
% Parameters: Type parameter name, bound name, number of type parameters.
|
|
\newcommand{\FTTypeParameters}[3]{\ensuremath{%
|
|
{#1}_1\FunctionTypeExtends{#2}_1,\,\ldots,\ %
|
|
{#1}_{#3}\FunctionTypeExtends{#2}_{#3}}}
|
|
|
|
% Used to specify simple non-generic function types: Same syntax as in source.
|
|
% Arguments: Return type, formal parameter declarations.
|
|
\newcommand{\FunctionTypeSimple}[2]{\code{\ensuremath{#1}\ \FUNCTION({#2})}}
|
|
|
|
% Used to specify simple generic function types: Same syntax as in source.
|
|
% Arguments: Return type, formal parameter declarations.
|
|
\newcommand{\FunctionTypeSimpleGeneric}[3]{\code{%
|
|
\ensuremath{#1}\ \FUNCTION<{#2}>({#3})}}
|
|
|
|
% Used to specify function types: Same syntax as in source.
|
|
% Arguments: Return type, spacer, type parameter name, bound name,
|
|
% number of type parameters, formal parameter declarations.
|
|
\newcommand{\FunctionType}[6]{\leavevmode\par\noindent\code{%
|
|
\ensuremath{#1}{#2}\FUNCTION<\FTTypeParameters{#3}{#4}{#5}>({#6})}}
|
|
|
|
% Same as \FunctionType except suitable for inline usage, hence omitting
|
|
% the spacer argument.
|
|
\newcommand{\RawFunctionType}[5]{\code{%
|
|
\ensuremath{#1}\ \FUNCTION<\FTTypeParameters{#2}{#3}{#4}>({#5})}}
|
|
|
|
% Used to specify function type parameter lists with positional optionals.
|
|
% Arguments: Parameter type, number of required parameters,
|
|
% number of optional parameters.
|
|
\newcommand{\FunctionTypePositionalArguments}[3]{%
|
|
\List{#1}{1}{#2},\ [\List{#1}{{#2}+1}{{#2}+{#3}}]}
|
|
|
|
\newcommand{\FunctionTypePositionalArgumentsStd}{%
|
|
\FunctionTypePositionalArguments{T}{n}{k}}
|
|
|
|
% Used to specify function types with positional optionals:
|
|
% Arguments: Return type, spacer, type parameter name, bound name,
|
|
% number of type parameters, parameter type, number of required parameters,
|
|
% number of optional parameters.
|
|
\newcommand{\FunctionTypePositional}[8]{%
|
|
\FunctionType{#1}{#2}{#3}{#4}{#5}{%
|
|
\FunctionTypePositionalArguments{#6}{#7}{#8}}}
|
|
|
|
% Same as \FunctionTypePositional except suitable for inline usage,
|
|
% hence omitting the spacer argument.
|
|
\newcommand{\RawFunctionTypePositional}[7]{%
|
|
\RawFunctionType{#1}{#2}{#3}{#4}{%
|
|
\FunctionTypePositionalArguments{#5}{#6}{#7}}}
|
|
|
|
% Used to specify function type parameter lists with named optionals.
|
|
% Arguments: Parameter type, number of required parameters,
|
|
% name of optional parameters, number of optional parameters.
|
|
\newcommand{\FunctionTypeNamedArguments}[4]{%
|
|
\List{#1}{1}{#2},\ \{\PairList{#1}{#3}{{#2}+1}{{#2}+{#4}}\}}
|
|
|
|
\newcommand{\FunctionTypeNamedArgumentsStd}{%
|
|
\FunctionTypeNamedArguments{T}{n}{x}{k}}
|
|
|
|
% Used to specify function types with named parameters:
|
|
% Arguments: Return type, spacer, type parameter name, bound name,
|
|
% number of type parameters, parameter type, number of required parameters,
|
|
% name of optional parameters, number of optional parameters.
|
|
\newcommand{\FunctionTypeNamed}[9]{%
|
|
\FunctionType{#1}{#2}{#3}{#4}{#5}{%
|
|
\FunctionTypeNamedArguments{#6}{#7}{#8}{#9}}}
|
|
|
|
% Same as \FunctionType except suitable for inline usage, hence omitting
|
|
% the spacer argument.
|
|
\newcommand{\RawFunctionTypeNamed}[8]{%
|
|
\RawFunctionType{#1}{#2}{#3}{#4}{%
|
|
\FunctionTypeNamedArguments{#5}{#6}{#7}{#8}}}
|
|
|
|
% Used to specify function types with no optional parameters:
|
|
% Arguments: Return type, spacer, type parameter name, bound name,
|
|
% number of type parameters, parameter type,
|
|
% number of parameters (all required).
|
|
\newcommand{\FunctionTypeAllRequired}[7]{%
|
|
\FunctionType{#1}{#2}{#3}{#4}{#5}{\List{#6}{1}{#7}}}
|
|
|
|
\newcommand{\FunctionTypePositionalStd}[1]{%
|
|
\FunctionTypePositional{#1}{ }{X}{B}{s}{T}{n}{k}}
|
|
|
|
\newcommand{\RawFunctionTypePositionalStd}[1]{%
|
|
\RawFunctionTypePositional{#1}{X}{B}{s}{T}{n}{k}}
|
|
|
|
\newcommand{\FunctionTypeNamedStd}[1]{%
|
|
\FunctionTypeNamed{#1}{ }{X}{B}{s}{T}{n}{x}{k}}
|
|
|
|
\newcommand{\RawFunctionTypeNamedStd}[1]{%
|
|
\RawFunctionTypeNamed{#1}{X}{B}{s}{T}{n}{x}{k}}
|
|
|
|
\newcommand{\FunctionTypeAllRequiredStd}[1]{%
|
|
\FunctionTypeAllRequired{#1}{ }{X}{B}{s}{T}{n}}
|
|
|
|
\newcommand{\FunctionTypePositionalStdCr}[1]{%
|
|
\FunctionTypePositional{#1}{\\}{X}{B}{s}{T}{n}{k}}
|
|
|
|
\newcommand{\FunctionTypeNamedStdCr}[1]{%
|
|
\FunctionTypeNamed{#1}{\\}{X}{B}{s}{T}{n}{x}{k}}
|
|
|
|
\newcommand{\FunctionTypeAllRequiredStdCr}[1]{%
|
|
\FunctionTypeAllRequired{#1}{\\}{X}{B}{s}{T}{n}}
|
|
|
|
\newcommand{\MoreSignatureSpecificSymbol}{\ensuremath{\preceq}}
|
|
\newcommand{\NotMoreSignatureSpecificSymbol}{\ensuremath{\not\preceq}}
|
|
\newcommand{\LessSignatureSpecificSymbol}{\ensuremath{\succeq}}
|
|
|
|
\newcommand{\MoreSignatureSpecific}[2]{%
|
|
\ensuremath{{#1}\MoreSignatureSpecificSymbol{#2}}}
|
|
\newcommand{\NotMoreSignatureSpecific}[2]{%
|
|
\ensuremath{{#1}\NotMoreSignatureSpecificSymbol{#2}}}
|
|
|
|
% Judgment expressing that a subtype relation exists.
|
|
\newcommand{\Subtype}[3]{\ensuremath{{#1}\vdash{#2}\,<:\,{#3}}}
|
|
\newcommand{\SubtypeStd}[2]{\Subtype{\Gamma}{#1}{#2}}
|
|
% Subtype judgment where the environment is omitted (NE: "no environment").
|
|
\newcommand{\SubtypeNE}[2]{\ensuremath{{#1}\,<:\,{#2}}}
|
|
|
|
% Judgment expressing that a supertype relation exists.
|
|
\newcommand{\Supertype}[3]{\ensuremath{{#1}\vdash{#2}\,:>\,{#3}}}
|
|
\newcommand{\SupertypeStd}[2]{\Supertype{\Gamma}{#1}{#2}}
|
|
|
|
% Judgment expressing that an assignability relation exists.
|
|
\newcommand{\AssignableRelationSymbol}{\ensuremath{\Longleftrightarrow}}
|
|
\newcommand{\Assignable}[3]{%
|
|
\ensuremath{{#1}\vdash{#2}\,\AssignableRelationSymbol\,{#3}}}
|
|
\newcommand{\AssignableStd}[2]{\Assignable{\Gamma}{#1}{#2}}
|
|
|
|
% Semantic function delivering the superinterfaces of a class.
|
|
\newcommand{\Superinterfaces}[1]{\ensuremath{\metavar{Superinterfaces}({#1})}}
|
|
\newcommand{\Superinterface}[2]{{#1}\in\Superinterfaces{#2}}
|
|
|
|
% ----------------------------------------------------------------------
|
|
% Support for hash valued Location Markers
|
|
|
|
% very small font, to enable 40 char hash values in the margin
|
|
\makeatletter
|
|
\ifcase \@ptsize \relax% 10pt
|
|
\newcommand{\miniscule}{\@setfontsize\miniscule{2}{3}}% \tiny: 5/6
|
|
\or% 11pt
|
|
\newcommand{\miniscule}{\@setfontsize\miniscule{3}{4}}% \tiny: 6/7
|
|
\or% 12pt
|
|
\newcommand{\miniscule}{\@setfontsize\miniscule{3}{4}}% \tiny: 6/7
|
|
\fi
|
|
\makeatother
|
|
|
|
% white: location markers should not create visual noise
|
|
\definecolor{LMdim}{gray}{1.0}
|
|
|
|
% insert location marker showing hash value of following paragraph
|
|
\newcommand{\LMHash}[1]{\leavevmode\marginpar{\quad%
|
|
\raisebox{0.5ex}{\miniscule{\color{LMdim}#1}}\vspace{-2\baselineskip}}%
|
|
\color{normativeColor}}
|
|
|
|
% support convenient renewcommand
|
|
\let\OriginalLMHash\LMHash
|
|
|
|
% define a label, and show the associated logical location marker
|
|
\newcommand{\LMLabel}[1]{%
|
|
\vspace{-\baselineskip}\leavevmode\OriginalLMHash{\raisebox{10ex}{#1}}%
|
|
\label{#1}}
|
|
% ----------------------------------------------------------------------
|