@@ -22,6 +22,7 @@ import { ModeChecker } from './effects/modeChecker'
22
22
import { QuintError } from './quintError'
23
23
import { errorTreeToString } from './errorTree'
24
24
import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker'
25
+ import { TypeApplicationResolver } from './types/typeApplicationResolution'
25
26
26
27
/* Products from static analysis */
27
28
export type AnalysisOutput = {
@@ -42,7 +43,7 @@ export type AnalysisResult = [QuintError[], AnalysisOutput]
42
43
*/
43
44
export function analyzeModules ( lookupTable : LookupTable , quintModules : QuintModule [ ] ) : AnalysisResult {
44
45
const analyzer = new QuintAnalyzer ( lookupTable )
45
- quintModules . map ( m => analyzer . analyzeDeclarations ( m . declarations ) )
46
+ quintModules . forEach ( m => ( m . declarations = analyzer . analyzeDeclarations ( m . declarations ) ) )
46
47
return analyzer . getResult ( )
47
48
}
48
49
@@ -75,6 +76,7 @@ export function analyzeInc(
75
76
* @param previousOutput - The previous analysis output to be used as a starting point.
76
77
*/
77
78
class QuintAnalyzer {
79
+ private typeApplicationResolver : TypeApplicationResolver
78
80
private effectInferrer : EffectInferrer
79
81
private typeInferrer : TypeInferrer
80
82
private modeChecker : ModeChecker
@@ -84,17 +86,20 @@ class QuintAnalyzer {
84
86
private output : AnalysisOutput = { types : new Map ( ) , effects : new Map ( ) , modes : new Map ( ) }
85
87
86
88
constructor ( lookupTable : LookupTable , previousOutput ?: AnalysisOutput ) {
89
+ this . typeApplicationResolver = new TypeApplicationResolver ( lookupTable )
87
90
this . typeInferrer = new TypeInferrer ( lookupTable , previousOutput ?. types )
88
91
this . effectInferrer = new EffectInferrer ( lookupTable , previousOutput ?. effects )
89
92
this . multipleUpdatesChecker = new MultipleUpdatesChecker ( )
90
93
this . modeChecker = new ModeChecker ( previousOutput ?. modes )
91
94
}
92
95
93
- analyzeDeclarations ( decls : QuintDeclaration [ ] ) : void {
94
- const [ typeErrMap , types ] = this . typeInferrer . inferTypes ( decls )
95
- const [ effectErrMap , effects ] = this . effectInferrer . inferEffects ( decls )
96
+ analyzeDeclarations ( decls : QuintDeclaration [ ] ) : QuintDeclaration [ ] {
97
+ const resolvedDecls = this . typeApplicationResolver . resolveTypeApplications ( decls )
98
+
99
+ const [ typeErrMap , types ] = this . typeInferrer . inferTypes ( resolvedDecls )
100
+ const [ effectErrMap , effects ] = this . effectInferrer . inferEffects ( resolvedDecls )
96
101
const updatesErrMap = this . multipleUpdatesChecker . checkEffects ( [ ...effects . values ( ) ] )
97
- const [ modeErrMap , modes ] = this . modeChecker . checkModes ( decls , effects )
102
+ const [ modeErrMap , modes ] = this . modeChecker . checkModes ( resolvedDecls , effects )
98
103
99
104
const errorTrees = [ ...typeErrMap , ...effectErrMap ]
100
105
@@ -114,6 +119,8 @@ class QuintAnalyzer {
114
119
effects : new Map ( [ ...this . output . effects , ...effects ] ) ,
115
120
modes : new Map ( [ ...this . output . modes , ...modes ] ) ,
116
121
}
122
+
123
+ return resolvedDecls
117
124
}
118
125
119
126
getResult ( ) : AnalysisResult {
0 commit comments