ad589f4bba968e0869e9530ad0f0cedd3d1a295c5418bf3ebdcf624dcf0f66d6.tri (9265B)
1 !import prelude * 2 !import parser * 3 !import graph * 4 !import source_program * 5 !import source_resolve * 6 !import source_ast * 7 !import source_equations * 8 !export * 9 10 sourceFindDefinition_ self definitions name = 11 lazyList 12 (_ : nothing) 13 (definition rest : 14 lazyBool 15 (_ : just definition) 16 (_ : self rest name) 17 (equal? (sourceDefinitionName definition) name)) 18 definitions 19 20 sourceFindDefinition = (definitions name : 21 y sourceFindDefinition_ definitions name) 22 23 -- Free-name collection returns located name AST nodes, so a missing-name 24 -- diagnostic retains the original source position rather than a string key. 25 sourceFreeList_ self elements visit bound = 26 lazyList 27 (_ : t) 28 (element rest : append (visit element bound) (self rest visit bound)) 29 elements 30 31 sourceFreeList = (elements visit bound : 32 y sourceFreeList_ elements visit bound) 33 34 sourceFreeEquations_ self equations visit bound = (lazyList (_ : t) 35 (equation rest : append 36 (append (sourceFreeList 37 (sourceEquationCollect (fst equation) sourceEquationPins) visit bound) 38 (visit (snd equation) 39 (append (reverse (sourceEquationCollect (fst equation) sourceEquationCaptures)) bound))) 40 (self rest visit bound)) equations) 41 sourceFreeEquations equations visit bound = y sourceFreeEquations_ equations visit bound 42 43 sourceFreeNames_ self node bound = 44 lazyBool 45 (_ : lazyMaybe 46 (_ : pair node t) 47 (index : t) 48 (sourceFindBinder bound (sourceAstPayload node))) 49 (_ : lazyBool 50 (_ : append 51 (self (fst (sourceAstPayload node)) bound) 52 (self (snd (sourceAstPayload node)) bound)) 53 (_ : lazyBool 54 (_ : self (snd (sourceAstPayload node)) 55 (pair (fst (sourceAstPayload node)) bound)) 56 (_ : lazyBool 57 (_ : self (sourceAstPayload node) bound) 58 (_ : lazyBool 59 (_ : sourceFreeList (sourceAstPayload node) self bound) 60 (_ : lazyBool 61 (_ : append 62 (self (sourceAstLetValue node) bound) 63 (self (sourceAstLetBody node) 64 (pair (sourceAstLetName node) bound))) 65 (_ : lazyBool 66 (_ : append 67 (self (sourceAstPipeLeft node) bound) 68 (self (sourceAstPipeRight node) bound)) 69 (_ : lazyBool 70 (_ : self (sourceAstDoLower node) bound) 71 (_ : lazyBool 72 (_ : sourceFreeEquations (sourceAstPayload node) self bound) 73 (_ : t) (equal? (sourceAstKind node) sourceAstEquationsKind)) 74 (equal? (sourceAstKind node) sourceAstDoKind)) 75 (equal? (sourceAstKind node) sourceAstPipeKind)) 76 (equal? (sourceAstKind node) sourceAstLetKind)) 77 (equal? (sourceAstKind node) sourceAstListKind)) 78 (equal? (sourceAstKind node) sourceAstGroupKind)) 79 (equal? (sourceAstKind node) sourceAstLambdaKind)) 80 (equal? (sourceAstKind node) sourceAstApplyKind)) 81 (equal? (sourceAstKind node) sourceAstNameKind) 82 83 sourceFreeNames = (node : y sourceFreeNames_ node t) 84 85 sourceCheckDuplicates_ self definitions seen = 86 lazyList 87 (_ : ok t t) 88 (definition rest : 89 lazyMaybe 90 (_ : self rest (pair definition seen)) 91 (prior : err 92 (parserDiagnostic 30 (sourceDefinitionName definition) 93 (sourceDefinitionName prior) 94 (sourceDefinitionPosition definition) t) 95 definition) 96 (sourceFindDefinition seen (sourceDefinitionName definition))) 97 definitions 98 99 sourceCheckDuplicates = (definitions : y sourceCheckDuplicates_ definitions t) 100 101 sourceCheckNames_ self names definitions environment = 102 lazyList 103 (_ : ok t t) 104 (node rest : 105 lazyMaybe 106 (_ : lazyMaybe 107 (_ : err 108 (parserDiagnostic 20 (sourceAstPayload node) t 109 (sourceAstStart node) t) 110 node) 111 (value : self rest definitions environment) 112 (sourceFindExternal environment (sourceAstPayload node))) 113 (definition : self rest definitions environment) 114 (sourceFindDefinition definitions (sourceAstPayload node))) 115 names 116 117 sourceCheckNames = (names definitions environment : 118 y sourceCheckNames_ names definitions environment) 119 120 sourceCheckDefinitionNames_ self pending definitions environment = 121 lazyList 122 (_ : ok t t) 123 (definition rest : 124 lazyResult 125 (diagnostic node : err diagnostic node) 126 (ignored unused : self rest definitions environment) 127 (lazyResult (diagnostic remainder : err diagnostic remainder) 128 (_ unused : sourceCheckNames (sourceFreeNames (sourceDefinitionBody definition)) 129 definitions environment) 130 (sourceEquationValidate (sourceDefinitionBody definition)))) 131 pending 132 133 sourceCheckDefinitionNames = (definitions environment : 134 y sourceCheckDefinitionNames_ definitions definitions environment) 135 136 sourceCheckFinalNames final definitions environment = 137 lazyMaybe 138 (_ : ok t t) 139 (expression : lazyResult (diagnostic remainder : err diagnostic remainder) 140 (_ unused : sourceCheckNames (sourceFreeNames expression) definitions environment) 141 (sourceEquationValidate expression)) 142 final 143 144 sourceDependencyNames_ self names definitions = 145 lazyList 146 (_ : t) 147 (node rest : 148 lazyMaybe 149 (_ : self rest definitions) 150 (definition : pair (sourceAstPayload node) (self rest definitions)) 151 (sourceFindDefinition definitions (sourceAstPayload node))) 152 names 153 154 sourceDependencyNames = (names definitions : 155 y sourceDependencyNames_ names definitions) 156 157 sourceDefinitionGraph_ self pending definitions = 158 lazyList 159 (_ : t) 160 (definition rest : 161 pair 162 (pair (sourceDefinitionName definition) 163 (sourceDependencyNames 164 (sourceFreeNames (sourceDefinitionBody definition)) definitions)) 165 (self rest definitions)) 166 pending 167 168 sourceDefinitionGraph = (definitions : 169 y sourceDefinitionGraph_ definitions definitions) 170 171 -- Validate each located free name and retain its local edge in the same pass. 172 -- Do not deduplicate/reorder edges: their order determines cycle witnesses. 173 -- A local definition wins over an external with the same spelling. 174 sourceAnalyzeNames_ self names definitions environment = (lazyList 175 (_ : ok t t) 176 (node rest : lazyMaybe 177 (_ : lazyMaybe 178 (_ : err (parserDiagnostic 20 (sourceAstPayload node) t 179 (sourceAstStart node) t) node) 180 (_ : self rest definitions environment) 181 (sourceFindExternal environment (sourceAstPayload node))) 182 (_ : lazyResult 183 (diagnostic missing : err diagnostic missing) 184 (dependencies unused : ok (pair (sourceAstPayload node) dependencies) t) 185 (self rest definitions environment)) 186 (sourceFindDefinition definitions (sourceAstPayload node))) names) 187 sourceAnalyzeNames names definitions environment = 188 y sourceAnalyzeNames_ names definitions environment 189 190 -- Equation validation still precedes names in each definition. Only after all 191 -- definitions succeed may final-expression validation and graph sorting run. 192 -- The reversed accumulator is constructor-only; reverse once on completion. 193 sourceAnalyzeDefinitions_ self pending definitions environment reversed = (lazyList 194 (_ : ok (reverse reversed) t) 195 (definition rest : lazyResult 196 (diagnostic remainder : err diagnostic remainder) 197 (_ unused : lazyResult 198 (diagnostic missing : err diagnostic missing) 199 (dependencies unused : self rest definitions environment 200 (pair (pair (sourceDefinitionName definition) dependencies) reversed)) 201 (sourceAnalyzeNames (sourceFreeNames (sourceDefinitionBody definition)) 202 definitions environment)) 203 (sourceEquationValidate (sourceDefinitionBody definition))) pending) 204 sourceAnalyzeDefinitions definitions environment = 205 y sourceAnalyzeDefinitions_ definitions definitions environment t 206 207 sourceOrderCycle definitions name = 208 lazyMaybe 209 (_ : parserDiagnostic 31 "acyclic" name t (pair name t)) 210 (definition : parserDiagnostic 31 "acyclic" name 211 (sourceDefinitionPosition definition) (pair name t)) 212 (sourceFindDefinition definitions name) 213 214 orderGateProgram environment program = 215 lazyResult 216 (diagnostic rest : err diagnostic rest) 217 (unused rest : 218 lazyResult 219 (diagnostic duplicate : err diagnostic duplicate) 220 (graph unused : 221 lazyResult 222 (diagnostic missing : err diagnostic missing) 223 (ignored unused : 224 lazyResult 225 (cycle unused : err (sourceOrderCycle 226 (sourceProgramDefinitions program) cycle) t) 227 (names unused : ok names t) 228 (graphSort graph)) 229 (sourceCheckFinalNames (sourceProgramFinal program) 230 (sourceProgramDefinitions program) environment)) 231 (sourceAnalyzeDefinitions 232 (sourceProgramDefinitions program) environment)) 233 (sourceCheckDuplicates (sourceProgramDefinitions program)) 234 235 orderGateSource environment characters = 236 parserMatchReply 237 (diagnostic rest consumed committed : err diagnostic rest) 238 (program rest consumed committed : orderGateProgram environment program) 239 (parseGateProgram characters) 240