Files
swift-mirror/include/swift/Sema/SourceLoader.h
Xi Ge bbe5b83de9 Parser: teach canImport to take an additional parameter indicating the minimum module version
canImport should be able to take an additional parameter labeled by either version or
underlyingVersion. We need underlyingVersion for clang modules with Swift overlays because they
have separate version numbers. The library users are usually interested in checking the importability
of the underlying clang module instead of its Swift overlay.

Part of rdar://73992299
2021-05-02 17:47:44 -07:00

108 lines
3.6 KiB
C++

//===--- SourceLoader.h - Import .swift files as modules --------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SEMA_SOURCELOADER_H
#define SWIFT_SEMA_SOURCELOADER_H
#include "swift/AST/ModuleDependencies.h"
#include "swift/AST/ModuleLoader.h"
namespace swift {
class ASTContext;
class ModuleDecl;
/// Imports serialized Swift modules into an ASTContext.
class SourceLoader : public ModuleLoader {
private:
ASTContext &Ctx;
bool EnableLibraryEvolution;
explicit SourceLoader(ASTContext &ctx,
bool enableResilience,
DependencyTracker *tracker)
: ModuleLoader(tracker), Ctx(ctx),
EnableLibraryEvolution(enableResilience) {}
public:
static std::unique_ptr<SourceLoader>
create(ASTContext &ctx, bool enableResilience,
DependencyTracker *tracker = nullptr) {
return std::unique_ptr<SourceLoader>{
new SourceLoader(ctx, enableResilience, tracker)
};
}
SourceLoader(const SourceLoader &) = delete;
SourceLoader(SourceLoader &&) = delete;
SourceLoader &operator=(const SourceLoader &) = delete;
SourceLoader &operator=(SourceLoader &&) = delete;
/// Append visible module names to \p names. Note that names are possibly
/// duplicated, and not guaranteed to be ordered in any way.
void collectVisibleTopLevelModuleNames(
SmallVectorImpl<Identifier> &names) const override;
/// Check whether the module with a given name can be imported without
/// importing it.
///
/// Note that even if this check succeeds, errors may still occur if the
/// module is loaded in full.
virtual bool canImportModule(ImportPath::Element named,
llvm::VersionTuple version,
bool underlyingVersion) override;
/// Import a module with the given module path.
///
/// \param importLoc The location of the 'import' keyword.
///
/// \param path A sequence of (identifier, location) pairs that denote
/// the dotted module name to load, e.g., AppKit.NSWindow.
///
/// \returns the module referenced, if it could be loaded. Otherwise,
/// returns NULL.
virtual ModuleDecl *
loadModule(SourceLoc importLoc,
ImportPath::Module path) override;
/// Load extensions to the given nominal type.
///
/// \param nominal The nominal type whose extensions should be loaded.
///
/// \param previousGeneration The previous generation number. The AST already
/// contains extensions loaded from any generation up to and including this
/// one.
virtual void loadExtensions(NominalTypeDecl *nominal,
unsigned previousGeneration) override;
virtual void loadObjCMethods(
ClassDecl *classDecl,
ObjCSelector selector,
bool isInstanceMethod,
unsigned previousGeneration,
llvm::TinyPtrVector<AbstractFunctionDecl *> &methods) override
{
// Parsing populates the Objective-C method tables.
}
Optional<ModuleDependencies> getModuleDependencies(
StringRef moduleName, ModuleDependenciesCache &cache,
InterfaceSubContextDelegate &delegate) override {
// FIXME: Implement?
return None;
}
};
}
#endif