Skip to content

Commit b234b79

Browse files
authored
Merge pull request #68021 from tshortli/experimental-lazy-typecheck
Frontend: Introduce -experimental-lazy-typecheck action
2 parents a994e62 + c05b3e4 commit b234b79

File tree

9 files changed

+53
-6
lines changed

9 files changed

+53
-6
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) {

test/Driver/emit-interface.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,9 @@
2626
// CHECK-FILELIST: swift{{(-frontend|c)?(\.exe)?"?}} -frontend
2727
// CHECK-FILELIST-SAME: -supplementary-output-file-map
2828
// CHECK-FILELIST-NOT: emit-interface.swift{{ }}
29+
30+
// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.9 -experimental-lazy-typecheck %s -emit-module-interface -o %t/foo 2>&1 | %FileCheck -check-prefix=CHECK-LAZY-TYPECHECK %s
31+
32+
// CHECK-LAZY-TYPECHECK: swift{{(-frontend|c)?(\.exe)?"?}} -frontend
33+
// CHECK-LAZY-TYPECHECK-SAME: -experimental-lazy-typecheck
34+
// CHECK-LAZY-TYPECHECK-SAME: emit-interface.swift

test/ModuleInterface/resolve-imports.swift renamed to test/ModuleInterface/lazy-typecheck.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: %empty-directory(%t)
22

33
// RUN: %target-swift-frontend -resolve-imports %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
4+
// RUN: %target-swift-frontend -experimental-lazy-typecheck %s -emit-module-interface-path %t/main.swiftinterface -enable-library-evolution
45
// RUN: %FileCheck %s < %t/main.swiftinterface
56

67
// CHECK: import Swift
@@ -22,4 +23,4 @@ public class C {}
2223
// CHECK: }
2324

2425
// Globals
25-
public var year = 2023
26+
public var year = 2023

test/TBD/resolve_imports.swift renamed to test/TBD/lazy_typecheck.swift

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swift-frontend -resolve-imports -emit-tbd -emit-tbd-path %t/resolve_imports.tbd %s -disable-availability-checking
3+
// RUN: %target-swift-frontend -experimental-lazy-typecheck -emit-tbd -emit-tbd-path %t/lazy_typecheck.tbd %s -disable-availability-checking
34
// RUN: %FileCheck %s < %t/resolve_imports.tbd
5+
// RUN: %FileCheck %s < %t/lazy_typecheck.tbd
46

57
// REQUIRES: OS=macosx
68

@@ -27,8 +29,17 @@ extension PrivateProto {
2729

2830
public struct S: PrivateProto {}
2931

30-
// CHECK: symbols: [ '_$s15resolve_imports1CCMa', '_$s15resolve_imports1CCMm',
31-
// CHECK-NEXT: '_$s15resolve_imports1CCMn', '_$s15resolve_imports1CCN', '_$s15resolve_imports1CCfD',
32-
// CHECK-NEXT: '_$s15resolve_imports1CCfd', '_$s15resolve_imports1SVMa',
33-
// CHECK-NEXT: '_$s15resolve_imports1SVMn', '_$s15resolve_imports1SVN', '_$s15resolve_imports1SVSQAAMc',
34-
// CHECK-NEXT: '_$s15resolve_imports1SVSQAASQ2eeoiySbx_xtFZTW', _main ]
32+
// CHECK: symbols: [
33+
// CHECK: '_$s14lazy_typecheck1CCMa',
34+
// CHECK: '_$s14lazy_typecheck1CCMm',
35+
// CHECK: '_$s14lazy_typecheck1CCMn',
36+
// CHECK: '_$s14lazy_typecheck1CCN',
37+
// CHECK: '_$s14lazy_typecheck1CCfD',
38+
// CHECK: '_$s14lazy_typecheck1CCfd',
39+
// CHECK: '_$s14lazy_typecheck1SVMa',
40+
// CHECK: '_$s14lazy_typecheck1SVMn',
41+
// CHECK: '_$s14lazy_typecheck1SVN',
42+
// CHECK: '_$s14lazy_typecheck1SVSQAAMc',
43+
// CHECK: '_$s14lazy_typecheck1SVSQAASQ2eeoiySbx_xtFZTW',
44+
// CHECK: _main
45+
// CHECK: ]

0 commit comments

Comments
 (0)