[NFC] Add type for ModuleDecl::getImplicitImports()

This doesn’t really change the design yet.
This commit is contained in:
Brent Royal-Gordon
2020-09-25 16:26:39 -07:00
parent 8070e8aaed
commit d55c5bd549
9 changed files with 45 additions and 21 deletions

View File

@@ -22,7 +22,7 @@ SWIFT_TYPEID(BodyInitKindAndExpr)
SWIFT_TYPEID(CtorInitializerKind) SWIFT_TYPEID(CtorInitializerKind)
SWIFT_TYPEID(FunctionBuilderBodyPreCheck) SWIFT_TYPEID(FunctionBuilderBodyPreCheck)
SWIFT_TYPEID(GenericSignature) SWIFT_TYPEID(GenericSignature)
SWIFT_TYPEID(ImplicitImport) SWIFT_TYPEID(ImplicitImportList)
SWIFT_TYPEID(ImplicitMemberAction) SWIFT_TYPEID(ImplicitMemberAction)
SWIFT_TYPEID(ParamSpecifier) SWIFT_TYPEID(ParamSpecifier)
SWIFT_TYPEID(PropertyWrapperBackingPropertyInfo) SWIFT_TYPEID(PropertyWrapperBackingPropertyInfo)

View File

@@ -42,7 +42,7 @@ class GenericTypeParamType;
class InfixOperatorDecl; class InfixOperatorDecl;
class IterableDeclContext; class IterableDeclContext;
class ModuleDecl; class ModuleDecl;
struct ImplicitImport; struct ImplicitImportList;
class NamedPattern; class NamedPattern;
class NominalTypeDecl; class NominalTypeDecl;
class OperatorDecl; class OperatorDecl;

View File

@@ -565,6 +565,7 @@ enum class ImplicitStdlibKind {
Stdlib Stdlib
}; };
/// Represents unprocessed options for implicit imports.
struct ImplicitImportInfo { struct ImplicitImportInfo {
/// The implicit stdlib to import. /// The implicit stdlib to import.
ImplicitStdlibKind StdlibKind; ImplicitStdlibKind StdlibKind;
@@ -589,6 +590,20 @@ struct ImplicitImportInfo {
ShouldImportUnderlyingModule(false) {} ShouldImportUnderlyingModule(false) {}
}; };
/// Contains names of and pointers to modules that must be implicitly imported.
struct ImplicitImportList {
ArrayRef<ImplicitImport> imports;
friend bool operator==(const ImplicitImportList &lhs,
const ImplicitImportList &rhs) {
return lhs.imports == rhs.imports;
}
};
/// A list of modules to implicitly import.
void simple_display(llvm::raw_ostream &out,
const ImplicitImportList &importList);
} }
// MARK: - DenseMapInfo // MARK: - DenseMapInfo

View File

@@ -56,7 +56,6 @@ namespace swift {
class FuncDecl; class FuncDecl;
class InfixOperatorDecl; class InfixOperatorDecl;
class LinkLibrary; class LinkLibrary;
struct ImplicitImport;
class ModuleLoader; class ModuleLoader;
class NominalTypeDecl; class NominalTypeDecl;
class EnumElementDecl; class EnumElementDecl;
@@ -278,7 +277,7 @@ public:
/// Retrieve a list of modules that each file of this module implicitly /// Retrieve a list of modules that each file of this module implicitly
/// imports. /// imports.
ArrayRef<ImplicitImport> getImplicitImports() const; ImplicitImportList getImplicitImports() const;
ArrayRef<FileUnit *> getFiles() { ArrayRef<FileUnit *> getFiles() {
assert(!Files.empty() || failedToLoad()); assert(!Files.empty() || failedToLoad());

View File

@@ -2498,7 +2498,7 @@ public:
/// of a given module. /// of a given module.
class ModuleImplicitImportsRequest class ModuleImplicitImportsRequest
: public SimpleRequest<ModuleImplicitImportsRequest, : public SimpleRequest<ModuleImplicitImportsRequest,
ArrayRef<ImplicitImport>(ModuleDecl *), ImplicitImportList(ModuleDecl *),
RequestFlags::Cached> { RequestFlags::Cached> {
public: public:
using SimpleRequest::SimpleRequest; using SimpleRequest::SimpleRequest;
@@ -2506,8 +2506,7 @@ public:
private: private:
friend SimpleRequest; friend SimpleRequest;
ArrayRef<ImplicitImport> ImplicitImportList evaluate(Evaluator &evaluator, ModuleDecl *module) const;
evaluate(Evaluator &evaluator, ModuleDecl *module) const;
public: public:
// Cached. // Cached.

View File

@@ -148,7 +148,7 @@ SWIFT_REQUEST(TypeChecker, ValidatePrecedenceGroupRequest,
SWIFT_REQUEST(TypeChecker, MangleLocalTypeDeclRequest, SWIFT_REQUEST(TypeChecker, MangleLocalTypeDeclRequest,
std::string(const TypeDecl *), Cached, NoLocationInfo) std::string(const TypeDecl *), Cached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, ModuleImplicitImportsRequest, SWIFT_REQUEST(TypeChecker, ModuleImplicitImportsRequest,
ArrayRef<ImplicitImport>(ModuleDecl *), Cached, NoLocationInfo) ImplicitImportList(ModuleDecl *), Cached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, NamingPatternRequest, SWIFT_REQUEST(TypeChecker, NamingPatternRequest,
NamedPattern *(VarDecl *), SeparatelyCached, NoLocationInfo) NamedPattern *(VarDecl *), SeparatelyCached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, OpaqueReadOwnershipRequest, SWIFT_REQUEST(TypeChecker, OpaqueReadOwnershipRequest,

View File

@@ -487,14 +487,13 @@ ModuleDecl::ModuleDecl(Identifier name, ASTContext &ctx,
Bits.ModuleDecl.HasIncrementalInfo = 0; Bits.ModuleDecl.HasIncrementalInfo = 0;
} }
ArrayRef<ImplicitImport> ModuleDecl::getImplicitImports() const { ImplicitImportList ModuleDecl::getImplicitImports() const {
auto &evaluator = getASTContext().evaluator; auto &evaluator = getASTContext().evaluator;
auto *mutableThis = const_cast<ModuleDecl *>(this); auto *mutableThis = const_cast<ModuleDecl *>(this);
return evaluateOrDefault(evaluator, ModuleImplicitImportsRequest{mutableThis}, return evaluateOrDefault(evaluator, ModuleImplicitImportsRequest{mutableThis},
{}); {});
} }
void ModuleDecl::addFile(FileUnit &newFile) { void ModuleDecl::addFile(FileUnit &newFile) {
// If this is a LoadedFile, make sure it loaded without error. // If this is a LoadedFile, make sure it loaded without error.
assert(!(isa<LoadedFile>(newFile) && assert(!(isa<LoadedFile>(newFile) &&

View File

@@ -1397,6 +1397,14 @@ void swift::simple_display(llvm::raw_ostream &out,
simple_display(out, import.Module); simple_display(out, import.Module);
} }
void swift::simple_display(llvm::raw_ostream &out,
const ImplicitImportList &importList) {
llvm::interleaveComma(importList.imports, out,
[&](const auto &import) {
simple_display(out, import);
});
}
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
// ResolveTypeRequest computation. // ResolveTypeRequest computation.
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//

View File

@@ -174,15 +174,7 @@ public:
addImplicitImports(); addImplicitImports();
} }
void addImplicitImports() { void addImplicitImports();
// TODO: Support cross-module imports.
for (auto &import : SF.getParentModule()->getImplicitImports()) {
assert(!(SF.Kind == SourceFileKind::SIL &&
import.Module->isStdlibModule()));
ImportedModule importedMod{ImportPath::Access(), import.Module};
boundImports.emplace_back(importedMod, import.Options);
}
}
/// Retrieve the finalized imports. /// Retrieve the finalized imports.
ArrayRef<AttributedImport<ImportedModule>> getFinishedImports() const { ArrayRef<AttributedImport<ImportedModule>> getFinishedImports() const {
@@ -400,7 +392,7 @@ UnboundImport::getTopLevelModule(ModuleDecl *M, SourceFile &SF) {
// MARK: Implicit imports // MARK: Implicit imports
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
ArrayRef<ImplicitImport> ImplicitImportList
ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator, ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
ModuleDecl *module) const { ModuleDecl *module) const {
SmallVector<ImplicitImport, 4> imports; SmallVector<ImplicitImport, 4> imports;
@@ -468,7 +460,19 @@ ModuleImplicitImportsRequest::evaluate(Evaluator &evaluator,
} }
} }
return ctx.AllocateCopy(imports); return { ctx.AllocateCopy(imports) };
}
void ImportResolver::addImplicitImports() {
auto implicitImports = SF.getParentModule()->getImplicitImports();
// TODO: Support cross-module imports.
for (auto &import : implicitImports.imports) {
assert(!(SF.Kind == SourceFileKind::SIL &&
import.Module->isStdlibModule()));
ImportedModule importedMod{ImportPath::Access(), import.Module};
boundImports.emplace_back(importedMod, import.Options);
}
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//