@@ -84,7 +84,7 @@ class IncludeTreePPActions final : public PPCachedActions {
84
84
return IncludeInfo.Tree .getCheckResult (Index);
85
85
}
86
86
87
- std::variant<std::monostate, IncludeFile, IncludeModule>
87
+ std::variant<std::monostate, IncludeFile, IncludeModule, SpuriousImport >
88
88
handleIncludeDirective (Preprocessor &PP, SourceLocation IncludeLoc,
89
89
SourceLocation AfterDirectiveLoc) override {
90
90
if (HasCASErrorOccurred)
@@ -116,65 +116,89 @@ class IncludeTreePPActions final : public PPCachedActions {
116
116
if (!Node)
117
117
return reportError (Node.takeError ());
118
118
119
- if (Node->getKind () == cas::IncludeTree::NodeKind::ModuleImport) {
120
- cas::IncludeTree::ModuleImport Import = Node->getModuleImport ();
119
+ auto MakeModuleImport = [&](cas::IncludeTree::ModuleImport Import) {
121
120
SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2 > Path;
122
121
SmallVector<StringRef, 2 > ModuleComponents;
123
122
Import.getModuleName ().split (ModuleComponents, ' .' );
124
123
for (StringRef Component : ModuleComponents)
125
124
Path.emplace_back (PP.getIdentifierInfo (Component), IncludeLoc);
126
125
return IncludeModule{std::move (Path), Import.visibilityOnly ()};
127
- }
128
-
129
- assert (Node->getKind () == cas::IncludeTree::NodeKind::Tree);
130
-
131
- cas::IncludeTree EnteredTree = Node->getIncludeTree ();
132
- auto File = EnteredTree.getBaseFile ();
133
- if (!File)
134
- return reportError (File.takeError ());
135
- auto FilenameBlob = File->getFilename ();
136
- if (!FilenameBlob)
137
- return reportError (FilenameBlob.takeError ());
126
+ };
138
127
139
- SourceManager &SM = PP.getSourceManager ();
140
- Expected<FileEntryRef> FE =
141
- SM.getFileManager ().getFileRef (FilenameBlob->getData (),
142
- /* OpenFile=*/ true );
143
- if (!FE)
144
- return reportError (FE.takeError ());
145
- FileID FID =
146
- SM.createFileID (*FE, IncludeLoc, EnteredTree.getFileCharacteristic ());
147
- PP.markIncluded (*FE);
148
- IncludeStack.push_back (
149
- {std::move (EnteredTree), SM.getLocForStartOfFile (FID)});
150
-
151
- Module *M = nullptr ;
152
- auto SubmoduleName = EnteredTree.getSubmoduleName ();
153
- if (!SubmoduleName)
154
- return reportError (SubmoduleName.takeError ());
155
- if (*SubmoduleName) {
156
- SmallVector<StringRef> ModuleComponents;
157
- (*SubmoduleName)->split (ModuleComponents, ' .' );
158
- M = PP.getHeaderSearchInfo ().lookupModule (
159
- ModuleComponents[0 ], IncludeLoc,
160
- /* AllowSearch=*/ false , /* AllowExtraModuleMapSearch=*/ false );
161
- if (!M)
162
- return reportErrorTwine (llvm::Twine (" failed to find module '" ) +
163
- ModuleComponents[0 ] + " '" );
164
- for (StringRef Sub : ArrayRef (ModuleComponents).drop_front ()) {
165
- M = M->findOrInferSubmodule (Sub);
128
+ auto MakeIncludeTree = [&](cas::IncludeTree EnteredTree)
129
+ -> std::variant<std::monostate, IncludeFile> {
130
+ auto File = EnteredTree.getBaseFile ();
131
+ if (!File)
132
+ return reportError (File.takeError ());
133
+ auto FilenameBlob = File->getFilename ();
134
+ if (!FilenameBlob)
135
+ return reportError (FilenameBlob.takeError ());
136
+
137
+ SourceManager &SM = PP.getSourceManager ();
138
+ Expected<FileEntryRef> FE =
139
+ SM.getFileManager ().getFileRef (FilenameBlob->getData (),
140
+ /* OpenFile=*/ true );
141
+ if (!FE)
142
+ return reportError (FE.takeError ());
143
+ FileID FID =
144
+ SM.createFileID (*FE, IncludeLoc, EnteredTree.getFileCharacteristic ());
145
+ PP.markIncluded (*FE);
146
+ IncludeStack.push_back (
147
+ {std::move (EnteredTree), SM.getLocForStartOfFile (FID)});
148
+
149
+ Module *M = nullptr ;
150
+ auto SubmoduleName = EnteredTree.getSubmoduleName ();
151
+ if (!SubmoduleName)
152
+ return reportError (SubmoduleName.takeError ());
153
+ if (*SubmoduleName) {
154
+ SmallVector<StringRef> ModuleComponents;
155
+ (*SubmoduleName)->split (ModuleComponents, ' .' );
156
+ M = PP.getHeaderSearchInfo ().lookupModule (
157
+ ModuleComponents[0 ], IncludeLoc,
158
+ /* AllowSearch=*/ false , /* AllowExtraModuleMapSearch=*/ false );
166
159
if (!M)
167
- return reportErrorTwine (
168
- llvm::Twine (" failed to find or infer submodule '" ) + Sub + " '" );
160
+ return reportErrorTwine (llvm::Twine (" failed to find module '" ) +
161
+ ModuleComponents[0 ] + " '" );
162
+ for (StringRef Sub : ArrayRef (ModuleComponents).drop_front ()) {
163
+ M = M->findOrInferSubmodule (Sub);
164
+ if (!M)
165
+ return reportErrorTwine (
166
+ llvm::Twine (" failed to find or infer submodule '" ) + Sub + " '" );
167
+ }
168
+
169
+ // Add to known headers for the module.
170
+ ModuleMap &MMap = PP.getHeaderSearchInfo ().getModuleMap ();
171
+ Module::Header H{" " , " " , *FE};
172
+ MMap.addHeader (M, std::move (H), ModuleMap::NormalHeader);
169
173
}
170
174
171
- // Add to known headers for the module.
172
- ModuleMap &MMap = PP.getHeaderSearchInfo ().getModuleMap ();
173
- Module::Header H{" " , " " , *FE};
174
- MMap.addHeader (M, std::move (H), ModuleMap::NormalHeader);
175
- }
175
+ return IncludeFile{FID, M};
176
+ };
176
177
177
- return IncludeFile{FID, M};
178
+ switch (Node->getKind ()) {
179
+ case cas::IncludeTree::NodeKind::ModuleImport:
180
+ return MakeModuleImport (Node->getModuleImport ());
181
+ case cas::IncludeTree::NodeKind::Tree: {
182
+ auto IncludeTree = MakeIncludeTree (Node->getIncludeTree ());
183
+ if (std::holds_alternative<std::monostate>(IncludeTree))
184
+ return std::monostate{};
185
+ return std::get<IncludeFile>(IncludeTree);
186
+ }
187
+ case cas::IncludeTree::NodeKind::SpuriousImport: {
188
+ auto SpuriousImportNode = Node->getSpuriousImport ();
189
+ auto ModuleImportNode = SpuriousImportNode.getModuleImport ();
190
+ if (!ModuleImportNode)
191
+ return reportError (ModuleImportNode.takeError ());
192
+ auto IncludeTreeNode = SpuriousImportNode.getIncludeTree ();
193
+ if (!IncludeTreeNode)
194
+ return reportError (IncludeTreeNode.takeError ());
195
+ auto ModuleImport = MakeModuleImport (*ModuleImportNode);
196
+ auto IncludeTree = MakeIncludeTree (*IncludeTreeNode);
197
+ if (std::holds_alternative<std::monostate>(IncludeTree))
198
+ return std::monostate{};
199
+ return SpuriousImport{ModuleImport, std::get<IncludeFile>(IncludeTree)};
200
+ }
201
+ }
178
202
}
179
203
180
204
void exitedFile (Preprocessor &PP, FileID FID) override {
0 commit comments