Skip to content

Commit 54435ac

Browse files
committed
Frontend: Introduce -experimental-lazy-typecheck action.
This action is currently just an alias of the `-resolve-imports` action. However, it's named to more clearly reflect the purpose which is to do the minimal typechecking needed in order to emit the requested outputs. This mode is intended to improve performance when emitting `.swiftinterface` and `.tbd` files.
1 parent 0c957a2 commit 54435ac

File tree

6 files changed

+29
-0
lines changed

6 files changed

+29
-0
lines changed

include/swift/Frontend/FrontendOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class FrontendOptions {
155155
NoneAction, ///< No specific action
156156
Parse, ///< Parse only
157157
ResolveImports, ///< Parse and resolve imports only
158+
LazyTypecheck, ///< Parse and then do minimal type-checking for outputs
158159
Typecheck, ///< Parse and type-check only
159160
DumpParse, ///< Parse only and dump AST
160161
DumpInterfaceHash, ///< Parse and dump the interface token hash.

include/swift/Option/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,9 @@ def resolve_imports : Flag<["-"], "resolve-imports">,
11601160
def typecheck : Flag<["-"], "typecheck">,
11611161
HelpText<"Parse and type-check input file(s)">, ModeOpt,
11621162
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;
1163+
def experimental_lazy_typecheck : Flag<["-"], "experimental-lazy-typecheck">,
1164+
HelpText<"Parse input file(s), then type-check lazily as needed to produce requested outputs">, ModeOpt,
1165+
Flags<[FrontendOption, NoInteractiveOption, HelpHidden, DoesNotAffectIncrementalBuild]>;
11631166
def dump_parse : Flag<["-"], "dump-parse">,
11641167
HelpText<"Parse input file(s) and dump AST(s)">, ModeOpt,
11651168
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild]>;

lib/Driver/Driver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,7 @@ void Driver::buildOutputInfo(const ToolChain &TC, const DerivedArgList &Args,
16071607

16081608
case options::OPT_parse:
16091609
case options::OPT_resolve_imports:
1610+
case options::OPT_experimental_lazy_typecheck:
16101611
case options::OPT_typecheck:
16111612
case options::OPT_dump_parse:
16121613
case options::OPT_print_ast:

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@ ArgsToFrontendOptionsConverter::determineRequestedAction(const ArgList &args) {
552552
return FrontendOptions::ActionType::Parse;
553553
if (Opt.matches(OPT_resolve_imports))
554554
return FrontendOptions::ActionType::ResolveImports;
555+
if (Opt.matches(OPT_experimental_lazy_typecheck))
556+
return FrontendOptions::ActionType::LazyTypecheck;
555557
if (Opt.matches(OPT_typecheck))
556558
return FrontendOptions::ActionType::Typecheck;
557559
if (Opt.matches(OPT_dump_parse))

lib/Frontend/FrontendOptions.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ bool FrontendOptions::needsProperModuleName(ActionType action) {
3333
case ActionType::NoneAction:
3434
case ActionType::Parse:
3535
case ActionType::ResolveImports:
36+
case ActionType::LazyTypecheck:
3637
case ActionType::Typecheck:
3738
case ActionType::DumpParse:
3839
case ActionType::DumpAST:
@@ -104,6 +105,7 @@ bool FrontendOptions::doesActionRequireSwiftStandardLibrary(ActionType action) {
104105
case ActionType::PrintFeature:
105106
return false;
106107
case ActionType::ResolveImports:
108+
case ActionType::LazyTypecheck:
107109
case ActionType::Typecheck:
108110
case ActionType::DumpAST:
109111
case ActionType::PrintAST:
@@ -149,6 +151,7 @@ bool FrontendOptions::doesActionRequireInputs(ActionType action) {
149151
case ActionType::CompileModuleFromInterface:
150152
case ActionType::TypecheckModuleFromInterface:
151153
case ActionType::ResolveImports:
154+
case ActionType::LazyTypecheck:
152155
case ActionType::Typecheck:
153156
case ActionType::DumpAST:
154157
case ActionType::PrintAST:
@@ -191,6 +194,7 @@ bool FrontendOptions::doesActionPerformEndOfPipelineActions(ActionType action) {
191194
case ActionType::CompileModuleFromInterface:
192195
case ActionType::TypecheckModuleFromInterface:
193196
case ActionType::ResolveImports:
197+
case ActionType::LazyTypecheck:
194198
case ActionType::Typecheck:
195199
case ActionType::DumpAST:
196200
case ActionType::PrintAST:
@@ -230,6 +234,7 @@ bool FrontendOptions::supportCompilationCaching(ActionType action) {
230234
case ActionType::EmitImportedModules:
231235
case ActionType::ScanDependencies:
232236
case ActionType::ResolveImports:
237+
case ActionType::LazyTypecheck:
233238
case ActionType::Typecheck:
234239
case ActionType::DumpAST:
235240
case ActionType::PrintAST:
@@ -290,6 +295,7 @@ FrontendOptions::formatForPrincipalOutputFileForAction(ActionType action) {
290295

291296
case ActionType::Parse:
292297
case ActionType::ResolveImports:
298+
case ActionType::LazyTypecheck:
293299
case ActionType::Typecheck:
294300
case ActionType::TypecheckModuleFromInterface:
295301
case ActionType::DumpParse:
@@ -377,6 +383,7 @@ bool FrontendOptions::canActionEmitDependencies(ActionType action) {
377383
case ActionType::PrintFeature:
378384
return false;
379385
case ActionType::ResolveImports:
386+
case ActionType::LazyTypecheck:
380387
case ActionType::Typecheck:
381388
case ActionType::MergeModules:
382389
case ActionType::EmitModuleOnly:
@@ -403,6 +410,7 @@ bool FrontendOptions::canActionEmitReferenceDependencies(ActionType action) {
403410
case ActionType::NoneAction:
404411
case ActionType::Parse:
405412
case ActionType::ResolveImports:
413+
case ActionType::LazyTypecheck:
406414
case ActionType::DumpParse:
407415
case ActionType::DumpInterfaceHash:
408416
case ActionType::DumpAST:
@@ -445,6 +453,7 @@ bool FrontendOptions::canActionEmitModuleSummary(ActionType action) {
445453
case ActionType::NoneAction:
446454
case ActionType::Parse:
447455
case ActionType::ResolveImports:
456+
case ActionType::LazyTypecheck:
448457
case ActionType::DumpParse:
449458
case ActionType::DumpInterfaceHash:
450459
case ActionType::DumpAST:
@@ -506,6 +515,7 @@ bool FrontendOptions::canActionEmitClangHeader(ActionType action) {
506515
case ActionType::PrintVersion:
507516
case ActionType::PrintFeature:
508517
return false;
518+
case ActionType::LazyTypecheck:
509519
case ActionType::Typecheck:
510520
case ActionType::MergeModules:
511521
case ActionType::EmitModuleOnly:
@@ -547,6 +557,7 @@ bool FrontendOptions::canActionEmitLoadedModuleTrace(ActionType action) {
547557
case ActionType::PrintFeature:
548558
return false;
549559
case ActionType::ResolveImports:
560+
case ActionType::LazyTypecheck:
550561
case ActionType::Typecheck:
551562
case ActionType::MergeModules:
552563
case ActionType::EmitModuleOnly:
@@ -576,6 +587,7 @@ bool FrontendOptions::canActionEmitModuleSemanticInfo(ActionType action) {
576587
case ActionType::NoneAction:
577588
case ActionType::Parse:
578589
case ActionType::ResolveImports:
590+
case ActionType::LazyTypecheck:
579591
case ActionType::DumpParse:
580592
case ActionType::DumpInterfaceHash:
581593
case ActionType::DumpAST:
@@ -619,6 +631,7 @@ bool FrontendOptions::canActionEmitConstValues(ActionType action) {
619631
case ActionType::NoneAction:
620632
case ActionType::Parse:
621633
case ActionType::ResolveImports:
634+
case ActionType::LazyTypecheck:
622635
case ActionType::DumpParse:
623636
case ActionType::DumpInterfaceHash:
624637
case ActionType::DumpAST:
@@ -660,6 +673,7 @@ bool FrontendOptions::canActionEmitModule(ActionType action) {
660673
case ActionType::NoneAction:
661674
case ActionType::Parse:
662675
case ActionType::ResolveImports:
676+
case ActionType::LazyTypecheck:
663677
case ActionType::Typecheck:
664678
case ActionType::DumpParse:
665679
case ActionType::DumpInterfaceHash:
@@ -727,6 +741,7 @@ bool FrontendOptions::canActionEmitInterface(ActionType action) {
727741
case ActionType::PrintFeature:
728742
return false;
729743
case ActionType::ResolveImports:
744+
case ActionType::LazyTypecheck:
730745
case ActionType::Typecheck:
731746
case ActionType::MergeModules:
732747
case ActionType::EmitModuleOnly:
@@ -747,6 +762,7 @@ bool FrontendOptions::doesActionProduceOutput(ActionType action) {
747762
switch (action) {
748763
case ActionType::Parse:
749764
case ActionType::ResolveImports:
765+
case ActionType::LazyTypecheck:
750766
case ActionType::Typecheck:
751767
case ActionType::DumpParse:
752768
case ActionType::DumpAST:
@@ -805,6 +821,7 @@ bool FrontendOptions::doesActionProduceTextualOutput(ActionType action) {
805821

806822
case ActionType::Parse:
807823
case ActionType::ResolveImports:
824+
case ActionType::LazyTypecheck:
808825
case ActionType::Typecheck:
809826
case ActionType::DumpParse:
810827
case ActionType::DumpInterfaceHash:
@@ -834,6 +851,7 @@ bool FrontendOptions::doesActionGenerateSIL(ActionType action) {
834851
case ActionType::NoneAction:
835852
case ActionType::Parse:
836853
case ActionType::ResolveImports:
854+
case ActionType::LazyTypecheck:
837855
case ActionType::Typecheck:
838856
case ActionType::DumpParse:
839857
case ActionType::DumpInterfaceHash:
@@ -885,6 +903,7 @@ bool FrontendOptions::doesActionGenerateIR(ActionType action) {
885903
case ActionType::DumpTypeInfo:
886904
case ActionType::CompileModuleFromInterface:
887905
case ActionType::TypecheckModuleFromInterface:
906+
case ActionType::LazyTypecheck:
888907
case ActionType::Typecheck:
889908
case ActionType::ResolveImports:
890909
case ActionType::MergeModules:

lib/FrontendTool/FrontendTool.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,6 +1359,9 @@ static bool performAction(CompilerInstance &Instance,
13591359
return performParseOnly(*Instance.getMainModule());
13601360
case FrontendOptions::ActionType::ResolveImports:
13611361
return Instance.performParseAndResolveImportsOnly();
1362+
case FrontendOptions::ActionType::LazyTypecheck:
1363+
// For now, this action is just an alias of ResolveImports.
1364+
return Instance.performParseAndResolveImportsOnly();
13621365
case FrontendOptions::ActionType::Typecheck:
13631366
return withSemanticAnalysis(Instance, observer,
13641367
[](CompilerInstance &Instance) {

0 commit comments

Comments
 (0)