From 8c95f1fb4fdbada3d378459764f4b5697093556e Mon Sep 17 00:00:00 2001 From: arai Date: Fri, 27 Jul 2018 16:48:11 +0900 Subject: [PATCH] Add AssertedPositionalParameterName and AssertedParameterName (fixes #50) --- spec.html | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/spec.html b/spec.html index 0f7728b..76094d6 100644 --- a/spec.html +++ b/spec.html @@ -115,6 +115,21 @@

Tree Grammar

attribute boolean isCaptured; }; +interface AssertedPositionalParameterName { + attribute unsigned short index; + attribute IdentifierName name; + attribute boolean isCaptured; +}; + +interface AssertedParameterName { + attribute IdentifierName name; + attribute boolean isCaptured; +}; + +typedef (AssertedPositionalParameterName or + AssertedParameterName) + AssertedMaybePositionalParameterName; + interface AssertedBoundName { attribute IdentifierName name; attribute boolean isCaptured; @@ -136,9 +151,8 @@

Tree Grammar

}; interface AssertedParameterScope { - attribute FrozenArray<AssertedBoundName> boundNames; + attribute FrozenArray paramNames; attribute boolean hasDirectEval; - attribute boolean isSimpleParameterList; }; interface AssertedBoundNamesScope { @@ -2931,6 +2945,32 @@

CheckParameterNames ( _expectedParams0_, _actualParams_ )

+ +

CheckPositionalParameterIndices ( _expectedParams_, _positionalParamNames_ )

+ + 1. Let _paramIndices_ be CreatePositionalParameterIndices(_positionalParamNames_). + 1. For each _p_ in _expectedParams_, do + 1. If _p_ is an `AssertedPositionalParameterName`, then + 1. If _paramIndices_ contains an item _item_ where _item_.[[Name]] is _p_`.name` and _item_.[[Index]] is _p_`.index`, then + 1. Remove _item_ from _paramIndices_. + 1. Else, + 1. throw a *SyntaxError* exception. + 1. If _paramIndices_ is not empty, throw *SyntaxError* exception. + +
+ + +

CreatePositionalParameterIndices (_positionalParamNames_ )

+ + 1. Let _paramIndices_ be a new empty List. + 1. Let _idx_ be 0. + 1. For each _p_ in _positionalParamNames_ in List order, do + 1. If _p_ is not an empty string, then + 1. Append Record {[[Name]]: _p_, [[Index]]: _idx_} to _paramIndices_. + 1. Return _paramIndices_. + +
+

CheckBoundNames ( _expectedBound_, _actualBound_ )

@@ -2966,8 +3006,9 @@

CheckAssertedScope ( _scope_ , _parseTree_ )

1. Else if _scope_ is an `AssertedParameterScope`, then 1. NOTE: The positions as well as the names of parameters must match. 1. Let _paramNames_ be the BoundNames of _parseTree_. - 1. Perform ? CheckParameterNames(_scope_`.boundNames`, _boundNames_). - 1. If _scope_`.isSimpleParameterList` is not the same value as IsSimpleParameterList of _parseTree_, then throw a *SyntaxError* exception. + 1. Perform ? CheckParameterNames(_scope_`.paramNames`, _paramNames_). + 1. Let _positionalParamNames_ be the PositionalParameterNames of _parseTree_. + 1. Perform ? CheckPositionalParameterIndices(_scope_`.paramNames`, _positionalParamNames_). 1. Else, 1. Let _boundNames_ be the BoundNames of _parseTree_. 1. Perform ? CheckBoundNames(_scope_`.boundNames`, _boundNames_). @@ -2981,6 +3022,8 @@

CheckAssertedScope ( _scope_ , _parseTree_ )

1. Let _enclosingScope_ be _scopeNode_.[[Enclosing]].[[AssertedScope]]. 1. If _scope_ is an `AssertedBlockScope` or an `AssertedScriptGlobalScope` or an `AssertedVarScope`, then 1. Let _enclosingDeclaredOrBoundNames_ be _enclosingScope_`.declaredNames`. + 1. Else if _scope_ is an `AssertedParameterScope`, then, + 1. Let _enclosingDeclaredOrBoundNames_ be _enclosingScope_`.paramNames`. 1. Else, 1. Let _enclosingDeclaredOrBoundNames_ be _enclosingScope_`.boundNames`. 1. For each _d_ in _enclosingDeclaredOrBoundNames_, do @@ -3211,6 +3254,75 @@

Static Semantics: HasFreeThis

1. Return *false*.
+ + +

Static Semantics: PositionalParameterNames

+ +

Collect the positional formal parameter names.

+

With parameters _formalParameters_.

+ + FormalParameters : [empty] + + 1. Return a new empty List. + + + FormalParameters : FunctionRestParameter + + 1. Return a new empty List. + + + FormalParameters : FormalParameterList + + 1. Return the PositionalParameterNames of |FormalParameterList|. + + + FormalParameters : FormalParameterList, + + 1. Return the PositionalParameterNames of |FormalParameterList|. + + + FormalParameters : FormalParameterList, FunctionRestParameter + + 1. Return the PositionalParameterNames of |FormalParameterList|. + + + FormalParameterList : FormalParameter + + 1. Return the PositionalParameterNames of |FormalParameter|. + + + FormalParameterList : FormalParameterList, FormalParameter + + 1. Let _params_ be PositionalParameterNames of |FormalParameterList|. + 1. Append to _params_ the PositionalParameterNames of |FormalParameter|. + 1. Return _params_ + + + FormalParameter : BindingIdentifier Initializer_opt + + 1. Return the PositionalParameterNames of |BindingIdentifier|. + + + FormalParameter : Identifier + + 1. Return a new List containing the StringValue of |Identifier|. + + + FormalParameter : `yield` + + 1. Return a new List containing `"yield"`. + + + FormalParameter : `await` + + 1. Return a new List containing `"await"`. + + + FormalParameter : BindingPattern Initializer_opt + + 1. Return a new List containing an empty string. + +