@@ -274,25 +274,31 @@ ParserStatus Parser::parseGenericWhereClause(
274274 SyntaxKind::GenericRequirementList);
275275 bool HasNextReq;
276276 do {
277- SyntaxParsingContext ReqContext (SyntaxContext, SyntaxContextKind::Syntax);
277+ SyntaxParsingContext ReqContext (SyntaxContext,
278+ SyntaxKind::GenericRequirement);
279+ Optional<SyntaxParsingContext> BodyContext;
280+ BodyContext.emplace (SyntaxContext);
281+
278282 // Parse the leading type. It doesn't necessarily have to be just a type
279283 // identifier if we're dealing with a same-type constraint.
280284 ParserResult<TypeRepr> FirstType = parseType ();
281285
282286 if (FirstType.hasCodeCompletion ()) {
287+ BodyContext->setTransparent ();
283288 Status.setHasCodeCompletion ();
284289 FirstTypeInComplete = true ;
285290 }
286291
287292 if (FirstType.isNull ()) {
293+ BodyContext->setTransparent ();
288294 Status.setIsParseError ();
289295 break ;
290296 }
291297
292298 if (Tok.is (tok::colon)) {
293299 // A conformance-requirement.
294300 SourceLoc ColonLoc = consumeToken ();
295- ReqContext. setCreateSyntax (SyntaxKind::ConformanceRequirement);
301+ BodyContext-> setCreateSyntax (SyntaxKind::ConformanceRequirement);
296302 if (Tok.is (tok::identifier) &&
297303 getLayoutConstraint (Context.getIdentifier (Tok.getText ()), Context)
298304 ->isKnownLayout ()) {
@@ -332,7 +338,7 @@ ParserStatus Parser::parseGenericWhereClause(
332338 }
333339 } else if ((Tok.isAnyOperator () && Tok.getText () == " ==" ) ||
334340 Tok.is (tok::equal)) {
335- ReqContext. setCreateSyntax (SyntaxKind::SameTypeRequirement);
341+ BodyContext-> setCreateSyntax (SyntaxKind::SameTypeRequirement);
336342 // A same-type-requirement
337343 if (Tok.is (tok::equal)) {
338344 diagnose (Tok, diag::requires_single_equal)
@@ -354,10 +360,12 @@ ParserStatus Parser::parseGenericWhereClause(
354360 EqualLoc,
355361 SecondType.get ()));
356362 } else {
363+ BodyContext->setTransparent ();
357364 diagnose (Tok, diag::expected_requirement_delim);
358365 Status.setIsParseError ();
359366 break ;
360367 }
368+ BodyContext.reset ();
361369 HasNextReq = consumeIf (tok::comma);
362370 // If there's a comma, keep parsing the list.
363371 } while (HasNextReq);
0 commit comments