Skip to content

Commit a4fcd26

Browse files
authored
Merge pull request #27466 from rintaro/syntaxparse-type
[SyntaxParse] Finish type parsing
2 parents 88ecae4 + f88fb20 commit a4fcd26

23 files changed

+1003
-755
lines changed

include/swift/Parse/ASTGen.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ class ASTGen {
3737

3838
// FIXME: remove when Syntax can represent all types and ASTGen can handle
3939
// them
40-
/// Types that cannot be represented by Syntax or generated by ASTGen.
41-
llvm::DenseMap<SourceLoc, TypeRepr *> Types;
42-
40+
/// Decl attributes that cannot be represented by Syntax or generated by
41+
/// ASTGen.
4342
llvm::DenseMap<SourceLoc, DeclAttributes> ParsedDeclAttrs;
4443

4544
public:
@@ -103,7 +102,8 @@ class ASTGen {
103102
//===--------------------------------------------------------------------===//
104103
// Types.
105104

106-
TypeRepr *generate(const syntax::TypeSyntax &Type, const SourceLoc Loc);
105+
TypeRepr *generate(const syntax::TypeSyntax &Type, const SourceLoc Loc,
106+
bool IsSILFuncDecl = false);
107107
TypeRepr *generate(const syntax::SomeTypeSyntax &Type, const SourceLoc Loc);
108108
TypeRepr *generate(const syntax::CompositionTypeSyntax &Type,
109109
const SourceLoc Loc);
@@ -127,11 +127,19 @@ class ASTGen {
127127
const SourceLoc Loc);
128128
TypeRepr *generate(const syntax::ClassRestrictionTypeSyntax &Type,
129129
const SourceLoc Loc);
130+
TypeRepr *generate(const syntax::SILBoxTypeSyntax &Type, const SourceLoc Loc,
131+
bool IsSILFuncDecl);
132+
TypeRepr *generate(const syntax::SILFunctionTypeSyntax &Type,
133+
const SourceLoc Loc, bool IsSILFuncDecl);
130134
TypeRepr *generate(const syntax::CodeCompletionTypeSyntax &Type,
131135
const SourceLoc Loc);
132136
TypeRepr *generate(const syntax::UnknownTypeSyntax &Type,
133137
const SourceLoc Loc);
134138

139+
TypeAttributes
140+
generateTypeAttributes(const syntax::AttributeListSyntax &syntax,
141+
const SourceLoc Loc);
142+
135143
private:
136144
TupleTypeRepr *
137145
generateTuple(const syntax::TokenSyntax &LParen,
@@ -196,10 +204,6 @@ class ASTGen {
196204
TypeRepr *lookupType(syntax::TypeSyntax Type);
197205

198206
public:
199-
void addType(TypeRepr *Type, const SourceLoc Loc);
200-
bool hasType(const SourceLoc Loc) const;
201-
TypeRepr *getType(const SourceLoc Loc) const;
202-
203207
void addDeclAttributes(DeclAttributes attrs, const SourceLoc Loc);
204208
bool hasDeclAttributes(SourceLoc Loc) const;
205209
DeclAttributes getDeclAttributes(const SourceLoc Loc) const;

include/swift/Parse/ParsedRawSyntaxNode.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,20 @@ class ParsedRawSyntaxNode {
119119
assert(getTokenKind() == tokKind && "Token kind with too large value!");
120120
}
121121

122+
#ifndef NDEBUG
123+
bool ensureDataIsNotRecorded() {
124+
if (DK != DataKind::Recorded)
125+
return true;
126+
llvm::dbgs() << "Leaking node: ";
127+
dump(llvm::dbgs());
128+
llvm::dbgs() << "\n";
129+
return false;
130+
}
131+
#endif
132+
122133
ParsedRawSyntaxNode &operator=(ParsedRawSyntaxNode &&other) {
123-
assert(DK != DataKind::Recorded);
134+
assert(ensureDataIsNotRecorded() &&
135+
"recorded data is being destroyed by assignment");
124136
switch (other.DK) {
125137
case DataKind::Null:
126138
break;
@@ -145,7 +157,7 @@ class ParsedRawSyntaxNode {
145157
*this = std::move(other);
146158
}
147159
~ParsedRawSyntaxNode() {
148-
assert(DK != DataKind::Recorded);
160+
assert(ensureDataIsNotRecorded() && "recorded data is being destructed");
149161
}
150162

151163
syntax::SyntaxKind getKind() const { return syntax::SyntaxKind(SynKind); }

include/swift/Parse/Parser.h

Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,24 +1082,13 @@ class Parser {
10821082
/// an error parsing.
10831083
bool parseVersionTuple(llvm::VersionTuple &Version, SourceRange &Range,
10841084
const Diagnostic &D);
1085-
10861085
bool parseTypeAttributeList(ParamDecl::Specifier &Specifier,
10871086
SourceLoc &SpecifierLoc,
1088-
TypeAttributes &Attributes) {
1089-
if (Tok.isAny(tok::at_sign, tok::kw_inout) ||
1090-
(Tok.is(tok::identifier) &&
1091-
(Tok.getRawText().equals("__shared") ||
1092-
Tok.getRawText().equals("__owned"))))
1093-
return parseTypeAttributeListPresent(Specifier, SpecifierLoc, Attributes);
1094-
return false;
1095-
}
1096-
bool parseTypeAttributeListPresent(ParamDecl::Specifier &Specifier,
1097-
SourceLoc &SpecifierLoc,
1098-
TypeAttributes &Attributes);
1099-
bool parseTypeAttribute(TypeAttributes &Attributes, SourceLoc AtLoc,
1100-
bool justChecking = false);
1101-
1102-
1087+
TypeAttributes &Attributes);
1088+
ParserStatus parseTypeAttributeListSyntax(Optional<ParsedTokenSyntax> &specifier,
1089+
Optional<ParsedAttributeListSyntax> &attrs);
1090+
ParsedSyntaxResult<ParsedAttributeSyntax> parseTypeAttributeSyntax();
1091+
11031092
ParserResult<ImportDecl> parseDeclImport(ParseDeclOptions Flags,
11041093
DeclAttributes &Attributes);
11051094
ParserStatus parseInheritance(MutableArrayRef<TypeLoc> &Inherited,
@@ -1190,44 +1179,47 @@ class Parser {
11901179
//===--------------------------------------------------------------------===//
11911180
// Type Parsing
11921181

1193-
using TypeASTResult = ParserResult<TypeRepr>;
1194-
using TypeResult = ParsedSyntaxResult<ParsedTypeSyntax>;
1182+
ParserResult<TypeRepr> parseType();
1183+
ParserResult<TypeRepr> parseType(Diag<> MessageID,
1184+
bool HandleCodeCompletion = true,
1185+
bool IsSILFuncDecl = false);
1186+
ParserStatus parseGenericArguments(llvm::SmallVectorImpl<TypeRepr *> &ArgsAST,
1187+
SourceLoc &LAngleLoc,
1188+
SourceLoc &RAngleLoc);
1189+
TypeRepr *applyAttributeToType(TypeRepr *Ty, const TypeAttributes &Attr,
1190+
ParamDecl::Specifier Specifier,
1191+
SourceLoc SpecifierLoc);
1192+
ParserResult<TypeRepr> parseAnyTypeAST();
11951193

11961194
ParsedSyntaxResult<ParsedLayoutConstraintSyntax>
11971195
parseLayoutConstraintSyntax();
11981196

1199-
TypeResult parseTypeSyntax();
1200-
TypeResult parseTypeSyntax(Diag<> MessageID, bool HandleCodeCompletion = true,
1201-
bool IsSILFuncDecl = false);
1202-
1203-
TypeASTResult parseType();
1204-
TypeASTResult parseType(Diag<> MessageID, bool HandleCodeCompletion = true,
1205-
bool IsSILFuncDecl = false);
1206-
ParserStatus
1207-
parseGenericArgumentsAST(llvm::SmallVectorImpl<TypeRepr *> &ArgsAST,
1208-
SourceLoc &LAngleLoc, SourceLoc &RAngleLoc);
1209-
TypeASTResult parseSILBoxType(GenericParamList *generics,
1210-
const TypeAttributes &attrs,
1211-
Optional<Scope> &GenericsScope);
1212-
TypeASTResult parseTypeSimpleOrCompositionAST(Diag<> MessageID,
1213-
bool HandleCodeCompletion);
1214-
TypeASTResult parseAnyTypeAST();
1197+
ParsedSyntaxResult<ParsedTypeSyntax> parseTypeSyntax();
1198+
ParsedSyntaxResult<ParsedTypeSyntax>
1199+
parseTypeSyntax(Diag<> MessageID, bool HandleCodeCompletion = true,
1200+
bool IsSILFuncDecl = false);
12151201

12161202
ParsedSyntaxResult<ParsedGenericArgumentClauseSyntax>
12171203
parseGenericArgumentClauseSyntax();
12181204

1219-
TypeResult parseTypeSimple(Diag<> MessageID, bool HandleCodeCompletion);
1220-
TypeResult parseTypeSimpleOrComposition(Diag<> MessageID, bool HandleCodeCompletion);
1221-
TypeResult parseTypeIdentifier();
1222-
TypeResult parseAnyType();
1223-
TypeResult parseTypeTupleBody();
1224-
TypeResult parseTypeCollection();
1225-
TypeResult parseMetatypeType(ParsedTypeSyntax Base);
1226-
TypeResult parseOptionalType(ParsedTypeSyntax Base);
1227-
TypeResult parseImplicitlyUnwrappedOptionalType(ParsedTypeSyntax Base);
1228-
1229-
TypeResult parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc);
1230-
TypeResult parseOldStyleProtocolComposition();
1205+
ParsedSyntaxResult<ParsedTypeSyntax>
1206+
parseTypeSimple(Diag<> MessageID, bool HandleCodeCompletion);
1207+
ParsedSyntaxResult<ParsedTypeSyntax>
1208+
parseTypeSimpleOrComposition(Diag<> MessageID, bool HandleCodeCompletion);
1209+
ParsedSyntaxResult<ParsedTypeSyntax> parseTypeIdentifier();
1210+
ParsedSyntaxResult<ParsedTypeSyntax> parseAnyType();
1211+
ParsedSyntaxResult<ParsedTypeSyntax> parseTypeTupleBody();
1212+
ParsedSyntaxResult<ParsedTypeSyntax> parseTypeCollection();
1213+
ParsedSyntaxResult<ParsedTypeSyntax> parseMetatypeType(ParsedTypeSyntax Base);
1214+
ParsedSyntaxResult<ParsedTypeSyntax> parseOptionalType(ParsedTypeSyntax Base);
1215+
ParsedSyntaxResult<ParsedTypeSyntax>
1216+
parseImplicitlyUnwrappedOptionalType(ParsedTypeSyntax Base);
1217+
ParsedSyntaxResult<ParsedTypeSyntax> parseSILBoxTypeSyntax(
1218+
Optional<ParsedGenericParameterClauseListSyntax> genericParams);
1219+
1220+
ParsedSyntaxResult<ParsedTypeSyntax> parseTypeArray(ParsedTypeSyntax Base,
1221+
SourceLoc BaseLoc);
1222+
ParsedSyntaxResult<ParsedTypeSyntax> parseOldStyleProtocolComposition();
12311223

12321224
bool isOptionalToken(const Token &T) const;
12331225
ParsedTokenSyntax consumeOptionalTokenSyntax();
@@ -1237,9 +1229,10 @@ class Parser {
12371229
ParsedTokenSyntax consumeImplicitlyUnwrappedOptionalTokenSyntax();
12381230
SourceLoc consumeImplicitlyUnwrappedOptionalToken();
12391231

1240-
TypeRepr *applyAttributeToType(TypeRepr *Ty, const TypeAttributes &Attr,
1241-
ParamDecl::Specifier Specifier,
1242-
SourceLoc SpecifierLoc);
1232+
ParsedSyntaxResult<ParsedTypeSyntax>
1233+
applyAttributeToTypeSyntax(ParsedSyntaxResult<ParsedTypeSyntax> &&ty,
1234+
Optional<ParsedTokenSyntax> specifier,
1235+
Optional<ParsedAttributeListSyntax> attrs);
12431236

12441237
//===--------------------------------------------------------------------===//
12451238
// Pattern Parsing

0 commit comments

Comments
 (0)