mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Frontend: Make lazy typechecking a TC opt instead of a frontend action.
This commit is contained in:
@@ -802,6 +802,10 @@ namespace swift {
|
||||
|
||||
/// Defer typechecking of declarations to their use at runtime
|
||||
bool DeferToRuntime = false;
|
||||
|
||||
/// Allow request evalutation to perform type checking lazily, instead of
|
||||
/// eagerly typechecking source files after parsing.
|
||||
bool EnableLazyTypecheck = false;
|
||||
};
|
||||
|
||||
/// Options for controlling the behavior of the Clang importer.
|
||||
|
||||
@@ -155,7 +155,6 @@ public:
|
||||
NoneAction, ///< No specific action
|
||||
Parse, ///< Parse only
|
||||
ResolveImports, ///< Parse and resolve imports only
|
||||
LazyTypecheck, ///< Parse and then do minimal type-checking for outputs
|
||||
Typecheck, ///< Parse and type-check only
|
||||
DumpParse, ///< Parse only and dump AST
|
||||
DumpInterfaceHash, ///< Parse and dump the interface token hash.
|
||||
|
||||
@@ -406,6 +406,9 @@ def debug_forbid_typecheck_prefix : Separate<["-"], "debug-forbid-typecheck-pref
|
||||
HelpText<"Triggers llvm fatal_error if typechecker tries to typecheck a decl "
|
||||
"with the provided prefix name">;
|
||||
|
||||
def experimental_lazy_typecheck : Flag<["-"], "experimental-lazy-typecheck">,
|
||||
HelpText<"Type-check lazily as needed to produce requested outputs">;
|
||||
|
||||
def debug_emit_invalid_swiftinterface_syntax : Flag<["-"], "debug-emit-invalid-swiftinterface-syntax">,
|
||||
HelpText<"Write an invalid declaration into swiftinterface files">;
|
||||
|
||||
|
||||
@@ -1164,9 +1164,6 @@ def resolve_imports : Flag<["-"], "resolve-imports">,
|
||||
def typecheck : Flag<["-"], "typecheck">,
|
||||
HelpText<"Parse and type-check input file(s)">, ModeOpt,
|
||||
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;
|
||||
def experimental_lazy_typecheck : Flag<["-"], "experimental-lazy-typecheck">,
|
||||
HelpText<"Parse input file(s), then type-check lazily as needed to produce requested outputs">, ModeOpt,
|
||||
Flags<[FrontendOption, NoInteractiveOption, HelpHidden, DoesNotAffectIncrementalBuild]>;
|
||||
def dump_parse : Flag<["-"], "dump-parse">,
|
||||
HelpText<"Parse input file(s) and dump AST(s)">, ModeOpt,
|
||||
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;
|
||||
|
||||
@@ -552,8 +552,6 @@ ArgsToFrontendOptionsConverter::determineRequestedAction(const ArgList &args) {
|
||||
return FrontendOptions::ActionType::Parse;
|
||||
if (Opt.matches(OPT_resolve_imports))
|
||||
return FrontendOptions::ActionType::ResolveImports;
|
||||
if (Opt.matches(OPT_experimental_lazy_typecheck))
|
||||
return FrontendOptions::ActionType::LazyTypecheck;
|
||||
if (Opt.matches(OPT_typecheck))
|
||||
return FrontendOptions::ActionType::Typecheck;
|
||||
if (Opt.matches(OPT_dump_parse))
|
||||
|
||||
@@ -1423,6 +1423,8 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
|
||||
|
||||
Opts.DebugGenericSignatures |= Args.hasArg(OPT_debug_generic_signatures);
|
||||
|
||||
Opts.EnableLazyTypecheck |= Args.hasArg(OPT_experimental_lazy_typecheck);
|
||||
|
||||
return HadError;
|
||||
}
|
||||
|
||||
|
||||
@@ -1395,6 +1395,11 @@ bool CompilerInstance::performParseAndResolveImportsOnly() {
|
||||
void CompilerInstance::performSema() {
|
||||
performParseAndResolveImportsOnly();
|
||||
|
||||
// Skip eager type checking. Instead, let later stages of compilation drive
|
||||
// type checking as needed through request evaluation.
|
||||
if (getASTContext().TypeCheckerOpts.EnableLazyTypecheck)
|
||||
return;
|
||||
|
||||
FrontendStatsTracer tracer(getStatsReporter(), "perform-sema");
|
||||
|
||||
forEachFileToTypeCheck([&](SourceFile &SF) {
|
||||
|
||||
@@ -33,7 +33,6 @@ bool FrontendOptions::needsProperModuleName(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpAST:
|
||||
@@ -105,7 +104,6 @@ bool FrontendOptions::doesActionRequireSwiftStandardLibrary(ActionType action) {
|
||||
case ActionType::PrintFeature:
|
||||
return false;
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpAST:
|
||||
case ActionType::PrintAST:
|
||||
@@ -151,7 +149,6 @@ bool FrontendOptions::doesActionRequireInputs(ActionType action) {
|
||||
case ActionType::CompileModuleFromInterface:
|
||||
case ActionType::TypecheckModuleFromInterface:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpAST:
|
||||
case ActionType::PrintAST:
|
||||
@@ -194,7 +191,6 @@ bool FrontendOptions::doesActionPerformEndOfPipelineActions(ActionType action) {
|
||||
case ActionType::CompileModuleFromInterface:
|
||||
case ActionType::TypecheckModuleFromInterface:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpAST:
|
||||
case ActionType::PrintAST:
|
||||
@@ -234,7 +230,6 @@ bool FrontendOptions::supportCompilationCaching(ActionType action) {
|
||||
case ActionType::EmitImportedModules:
|
||||
case ActionType::ScanDependencies:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpAST:
|
||||
case ActionType::PrintAST:
|
||||
@@ -295,7 +290,6 @@ FrontendOptions::formatForPrincipalOutputFileForAction(ActionType action) {
|
||||
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::TypecheckModuleFromInterface:
|
||||
case ActionType::DumpParse:
|
||||
@@ -383,7 +377,6 @@ bool FrontendOptions::canActionEmitDependencies(ActionType action) {
|
||||
case ActionType::PrintFeature:
|
||||
return false;
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::MergeModules:
|
||||
case ActionType::EmitModuleOnly:
|
||||
@@ -410,7 +403,6 @@ bool FrontendOptions::canActionEmitReferenceDependencies(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
case ActionType::DumpAST:
|
||||
@@ -453,7 +445,6 @@ bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
case ActionType::DumpAST:
|
||||
@@ -515,7 +506,6 @@ bool FrontendOptions::canActionEmitClangHeader(ActionType action) {
|
||||
case ActionType::PrintVersion:
|
||||
case ActionType::PrintFeature:
|
||||
return false;
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::MergeModules:
|
||||
case ActionType::EmitModuleOnly:
|
||||
@@ -557,7 +547,6 @@ bool FrontendOptions::canActionEmitLoadedModuleTrace(ActionType action) {
|
||||
case ActionType::PrintFeature:
|
||||
return false;
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::MergeModules:
|
||||
case ActionType::EmitModuleOnly:
|
||||
@@ -587,7 +576,6 @@ bool FrontendOptions::canActionEmitModuleSemanticInfo(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
case ActionType::DumpAST:
|
||||
@@ -631,7 +619,6 @@ bool FrontendOptions::canActionEmitConstValues(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
case ActionType::DumpAST:
|
||||
@@ -673,7 +660,6 @@ bool FrontendOptions::canActionEmitModule(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
@@ -741,7 +727,6 @@ bool FrontendOptions::canActionEmitInterface(ActionType action) {
|
||||
case ActionType::PrintFeature:
|
||||
return false;
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::MergeModules:
|
||||
case ActionType::EmitModuleOnly:
|
||||
@@ -762,7 +747,6 @@ bool FrontendOptions::doesActionProduceOutput(ActionType action) {
|
||||
switch (action) {
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpAST:
|
||||
@@ -821,7 +805,6 @@ bool FrontendOptions::doesActionProduceTextualOutput(ActionType action) {
|
||||
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
@@ -851,7 +834,6 @@ bool FrontendOptions::doesActionGenerateSIL(ActionType action) {
|
||||
case ActionType::NoneAction:
|
||||
case ActionType::Parse:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::DumpParse:
|
||||
case ActionType::DumpInterfaceHash:
|
||||
@@ -903,7 +885,6 @@ bool FrontendOptions::doesActionGenerateIR(ActionType action) {
|
||||
case ActionType::DumpTypeInfo:
|
||||
case ActionType::CompileModuleFromInterface:
|
||||
case ActionType::TypecheckModuleFromInterface:
|
||||
case ActionType::LazyTypecheck:
|
||||
case ActionType::Typecheck:
|
||||
case ActionType::ResolveImports:
|
||||
case ActionType::MergeModules:
|
||||
|
||||
@@ -1359,9 +1359,6 @@ static bool performAction(CompilerInstance &Instance,
|
||||
return performParseOnly(*Instance.getMainModule());
|
||||
case FrontendOptions::ActionType::ResolveImports:
|
||||
return Instance.performParseAndResolveImportsOnly();
|
||||
case FrontendOptions::ActionType::LazyTypecheck:
|
||||
// For now, this action is just an alias of ResolveImports.
|
||||
return Instance.performParseAndResolveImportsOnly();
|
||||
case FrontendOptions::ActionType::Typecheck:
|
||||
return withSemanticAnalysis(Instance, observer,
|
||||
[](CompilerInstance &Instance) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
|
||||
// RUN: %target-swift-frontend -resolve-imports %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
|
||||
// RUN: %target-swift-frontend -experimental-lazy-typecheck %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
|
||||
// RUN: %FileCheck %s < %t/main.swiftinterface
|
||||
// RUN: %target-swift-frontend -swift-version 5 -parse-as-library -enable-library-evolution -module-name resolve_imports -resolve-imports %s -emit-module-interface-path %t/resolve_imports.swiftinterface
|
||||
// RUN: %FileCheck %s < %t/resolve_imports.swiftinterface
|
||||
// RUN: %target-swift-typecheck-module-from-interface(%t/resolve_imports.swiftinterface)
|
||||
|
||||
// CHECK: import Swift
|
||||
|
||||
@@ -21,6 +21,3 @@ public class C {}
|
||||
// CHECK: public class C {
|
||||
// CHECK: deinit
|
||||
// CHECK: }
|
||||
|
||||
// Globals
|
||||
public var year = 2023
|
||||
7
test/Sema/lazy-typecheck.swift
Normal file
7
test/Sema/lazy-typecheck.swift
Normal file
@@ -0,0 +1,7 @@
|
||||
// RUN: not %target-typecheck-verify-swift
|
||||
// RUN: %target-typecheck-verify-swift -experimental-lazy-typecheck
|
||||
|
||||
// With lazy typechecking enabled and no compiler outputs specified, no errors
|
||||
// should be emitted for this semantically invalid code.
|
||||
|
||||
var x: DoesNotExist
|
||||
@@ -1,8 +1,6 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: %target-swift-frontend -resolve-imports -emit-tbd -emit-tbd-path %t/resolve_imports.tbd %s -disable-availability-checking
|
||||
// RUN: %target-swift-frontend -experimental-lazy-typecheck -emit-tbd -emit-tbd-path %t/lazy_typecheck.tbd %s -disable-availability-checking
|
||||
// RUN: %FileCheck %s < %t/resolve_imports.tbd
|
||||
// RUN: %FileCheck %s < %t/lazy_typecheck.tbd
|
||||
|
||||
// REQUIRES: OS=macosx
|
||||
|
||||
@@ -30,16 +28,16 @@ extension PrivateProto {
|
||||
public struct S: PrivateProto {}
|
||||
|
||||
// CHECK: symbols: [
|
||||
// CHECK: '_$s14lazy_typecheck1CCMa',
|
||||
// CHECK: '_$s14lazy_typecheck1CCMm',
|
||||
// CHECK: '_$s14lazy_typecheck1CCMn',
|
||||
// CHECK: '_$s14lazy_typecheck1CCN',
|
||||
// CHECK: '_$s14lazy_typecheck1CCfD',
|
||||
// CHECK: '_$s14lazy_typecheck1CCfd',
|
||||
// CHECK: '_$s14lazy_typecheck1SVMa',
|
||||
// CHECK: '_$s14lazy_typecheck1SVMn',
|
||||
// CHECK: '_$s14lazy_typecheck1SVN',
|
||||
// CHECK: '_$s14lazy_typecheck1SVSQAAMc',
|
||||
// CHECK: '_$s14lazy_typecheck1SVSQAASQ2eeoiySbx_xtFZTW',
|
||||
// CHECK: '_$s15resolve_imports1CCMa',
|
||||
// CHECK: '_$s15resolve_imports1CCMm',
|
||||
// CHECK: '_$s15resolve_imports1CCMn',
|
||||
// CHECK: '_$s15resolve_imports1CCN',
|
||||
// CHECK: '_$s15resolve_imports1CCfD',
|
||||
// CHECK: '_$s15resolve_imports1CCfd',
|
||||
// CHECK: '_$s15resolve_imports1SVMa',
|
||||
// CHECK: '_$s15resolve_imports1SVMn',
|
||||
// CHECK: '_$s15resolve_imports1SVN',
|
||||
// CHECK: '_$s15resolve_imports1SVSQAAMc',
|
||||
// CHECK: '_$s15resolve_imports1SVSQAASQ2eeoiySbx_xtFZTW',
|
||||
// CHECK: _main
|
||||
// CHECK: ]
|
||||
Reference in New Issue
Block a user