Frontend: Make lazy typechecking a TC opt instead of a frontend action.

This commit is contained in:
Allan Shortlidge
2023-08-25 09:26:08 -07:00
parent 537770cc9d
commit 3a02629be4
12 changed files with 35 additions and 47 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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">;

View File

@@ -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]>;

View File

@@ -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))

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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:

View File

@@ -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) {

View File

@@ -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

View 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

View File

@@ -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: ]