Skip to content

Commit 60341ba

Browse files
committed
[SyntaxParse] Refactor generic requirement syntax structure
Re-apply a part of 0569cbf after reverting ASTGen changes. This is still an improvement.
1 parent 7be975c commit 60341ba

File tree

6 files changed

+46
-24
lines changed

6 files changed

+46
-24
lines changed

Diff for: cmake/modules/SwiftHandleGybSources.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ function(handle_gyb_sources dependency_out_var_name sources_var_name arch)
121121
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/DeclNodes.py"
122122
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/ExprNodes.py"
123123
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/GenericNodes.py"
124+
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/NodeSerializationCodes.py"
124125
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/PatternNodes.py"
125126
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/StmtNodes.py"
126127
"${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/TypeNodes.py"

Diff for: lib/Parse/ParseGeneric.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)