Add configurable imports to the language specification.

Change-Id: I0b36c187a1ec13fe4c65acab762b5f7d46869e39
Reviewed-on: https://dart-review.googlesource.com/46440
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
Reviewed-by: Erik Ernst <eernst@google.com>
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 17d6731..d48dbdc 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -47,6 +47,7 @@
 %   local function evaluates to the closurization of that declaration.
 % - Make `mixin` and `interface` built-in identifiers.
 % - Make `async` *not* a reserved word inside async functions.
+<<<<<<< HEAD
 % - Add 'Class Member Conflicts', simplifying and adjusting rules about
 %   member declaration conflicts beyond "`n` declared twice in one scope".
 % - Specify that integer literals are limited to signed 64-bit values,
@@ -55,6 +56,9 @@
 % - Specify variance and super-bounded types.
 % - Introduce `subterm` and `immediate subterm`.
 % - Introduce `top type`.
+=======
+% - Specify configurable imports.
+>>>>>>> Update changelog.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -8829,12 +8833,15 @@
 {\bf scriptTag:}`\#!' {\escapegrammar (\~{}NEWLINE)*} NEWLINE
   .
 
-{\bf libraryName:}metadata \LIBRARY{} identifier (`{\escapegrammar .}' identifier)* `{\escapegrammar ;}'
+{\bf libraryName:}metadata \LIBRARY{} dottedIdentifierList `{\escapegrammar ;}'
   .
 
 {\bf importOrExport:}libraryImport;
   libraryExport
   .
+
+{\bf dottedIdentifierList:} identifier (`{\escapegrammar .}' identifier)*
+  .
 \end{grammar}
 
 \LMHash{}
@@ -8891,7 +8898,7 @@
 {\bf libraryImport:}metadata importSpecification
   .
 
-{\bf importSpecification:}\IMPORT{} uri (\AS{} identifier)? combinator* `{\escapegrammar ;}';
+{\bf importSpecification:}\IMPORT{} configurableUri (\AS{} identifier)? combinator* `{\escapegrammar ;}';
   \IMPORT{} uri \DEFERRED{} \AS{} identifier combinator* `{\escapegrammar ;}'
   .
 
@@ -9156,7 +9163,7 @@
 The namespace that $L$ exports is known as its {\em exported namespace}.
 
 \begin{grammar}
-{\bf libraryExport:}metadata \EXPORT{} uri combinator* `{\escapegrammar ;}'
+{\bf libraryExport:}metadata \EXPORT{} configurableUri combinator* `{\escapegrammar ;}'
   .
 \end{grammar}
 
@@ -9318,12 +9325,50 @@
 \begin{grammar}
 {\bf uri:}stringLiteral
   .
+{\bf configurableUri:} uri configurationUri*
+  .
+{\bf configurationUri:} \IF{} `(' uriTest `)' uri
+  .
+{\bf uriTest:} dottedIdentifierList (`==' stringLiteral)?
+  .
 \end{grammar}
 
 \LMHash{}
 It is a compile-time error if the string literal $x$ that describes a URI is not a compile-time constant, or if $x$ involves string interpolation.
 
 \LMHash{}
+It is a compile-time error if the string literal $x$ that is used in a {\em uriTest} is not a compile-time constant, or if $x$ involves string interpolation.
+
+\LMHash{} A {\em configurable URI} $c$ of the form \code{\metavar{uri} $\metavar{configurationUri}_1$ \ldots $\metavar{configurationUri}_n$} {\em specifies a URI} as follows:
+\begin{itemize}
+\item{} Let $u$ be \metavar{uri}.
+\item{} For each of the following configuration URIs of the form \code{\IF{} ($\metavar{test}_i$) $\metavar{uri}_i$}, in source order, do the following.
+\begin{itemize}
+  \item{} If $\metavar{test}_i$ is \code{\metavar{ids}} with no \code{==} clause, it is
+  equivalent to \code{\metavar{ids} == "true"}.
+  \item{} If $\metavar{test}_i$ is \code{\metavar{ids} == \metavar{string}},
+  then create a string, \metavar{key}, from \metavar{ids}
+  by concatenating the identfiers and dots,
+  omitting any spaces between them that may occur in the source.
+  \item{} Look up \metavar{key} in the available compilation {\em environment}.
+  \commentary{
+  The compilation environment is provided by the platform.
+  It maps some string keys to string values,
+  and can be accessed programmatically using the
+  \code{const String.fromEnvironment} constructor.
+  Tools may choose to only make some parts of the compilation environment
+  available for choosing configuration URIs.
+  }
+  \item{} If the environment contains an entry for \metavar{key} and the
+  associated value is equal, as a constant string value, to the value of
+  the string literal \metavar{string},
+  then let $u$ be $\metavar{uri}_i$ and stop iterating the configuration URIs.
+  \item{} Otherwise proceed to the next configuration URI.
+\end{itemize}
+\item{} The URI specified by $c$ is $u$.
+\end{itemize}
+
+\LMHash{}
 This specification does not discuss the interpretation of URIs, with the following exceptions.
 
 \rationale{