Files
swift-mirror/include/swift/Sema/SourceLoader.h
Doug Gregor 33cdd61835 Fast dependency scanning for Swift
Implement a new "fast" dependency scanning option,
`-scan-dependencies`, in the Swift frontend that determines all
of the source file and module dependencies for a given set of
Swift sources. It covers four forms of modules:

1) Swift (serialized) module files, by reading the module header
2) Swift interface files, by parsing the source code to find imports
3) Swift source modules, by parsing the source code to find imports
4) Clang modules, using Clang's fast dependency scanning tool

A single `-scan-dependencies` operation maps out the full
dependency graph for the given Swift source files, including all
of the Swift and Clang modules that may need to be built, such
that all of the work can be scheduled up front by the Swift
driver or any other build system that understands this
option. The dependency graph is emitted as JSON, which can be
consumed by these other tools.
2020-04-24 12:58:41 -07:00

105 lines
3.4 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(Located<Identifier> named) 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,
ArrayRef<Located<Identifier>> 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) override {
// FIXME: Implement?
return None;
}
};
}
#endif