(node *ast.Node)
| 3217 | } |
| 3218 | |
| 3219 | func (c *Checker) checkTupleType(node *ast.Node) { |
| 3220 | seenOptionalElement := false |
| 3221 | seenRestElement := false |
| 3222 | elements := node.Elements() |
| 3223 | for _, e := range elements { |
| 3224 | flags := c.getTupleElementFlags(e) |
| 3225 | if flags&ElementFlagsVariadic != 0 { |
| 3226 | t := c.getTypeFromTypeNode(e.Type()) |
| 3227 | if !c.isArrayLikeType(t) { |
| 3228 | c.error(e, diagnostics.A_rest_element_type_must_be_an_array_type) |
| 3229 | break |
| 3230 | } |
| 3231 | if c.isArrayType(t) || isTupleType(t) && t.TargetTupleType().combinedFlags&ElementFlagsRest != 0 { |
| 3232 | flags |= ElementFlagsRest |
| 3233 | } |
| 3234 | } |
| 3235 | if flags&ElementFlagsRest != 0 { |
| 3236 | if seenRestElement { |
| 3237 | c.grammarErrorOnNode(e, diagnostics.A_rest_element_cannot_follow_another_rest_element) |
| 3238 | break |
| 3239 | } |
| 3240 | seenRestElement = true |
| 3241 | } else if flags&ElementFlagsOptional != 0 { |
| 3242 | if seenRestElement { |
| 3243 | c.grammarErrorOnNode(e, diagnostics.An_optional_element_cannot_follow_a_rest_element) |
| 3244 | break |
| 3245 | } |
| 3246 | seenOptionalElement = true |
| 3247 | } else if flags&ElementFlagsRequired != 0 && seenOptionalElement { |
| 3248 | c.grammarErrorOnNode(e, diagnostics.A_required_element_cannot_follow_an_optional_element) |
| 3249 | break |
| 3250 | } |
| 3251 | } |
| 3252 | c.checkSourceElements(elements) |
| 3253 | c.getTypeFromTypeNode(node) |
| 3254 | } |
| 3255 | |
| 3256 | func (c *Checker) checkUnionOrIntersectionType(node *ast.Node) { |
| 3257 | node.ForEachChild(c.checkSourceElement) |
no test coverage detected