@@ -1088,11 +1088,30 @@ fun resolve-names(p :: A.Program, initial-env :: C.CompileEnvironment):
1088
1088
# names and atoms that will be exposed. The atoms will be used by code
1089
1089
# generation and by the type-checker/cross-module scope resolution to
1090
1090
# pick out information about the binding (e.g. flatness, etc)
1091
+ # The actual values in the dictionaries are triples of
1092
+ #
1093
+ # {Srcloc; Option<URI>; Atom}
1094
+ #
1095
+ # The location is the location of the provide clause, the URI is none if
1096
+ # the name is provided from this module, and some if it is re-provided
1097
+ # from another module
1091
1098
provided-modules = [ SD . mutable-string-dict:]
1092
1099
provided-values = [ SD . mutable-string-dict:]
1093
1100
provided-types = [ SD . mutable-string-dict:]
1094
1101
provided-datatypes = [ SD . mutable-string-dict:]
1095
1102
1103
+ fun is-hidden( hidden :: List <A . Name >, maybe-hidden-name :: String ) :
1104
+ for lists. any( h from hidden) :
1105
+ h. name == maybe-hidden-name
1106
+ end
1107
+ end
1108
+
1109
+ fun maybe-add( hidden, which-dict, maybe-add-name :: String , to-add) :
1110
+ when not ( is-hidden( hidden, maybe-add-name)) :
1111
+ which-dict. set-now( maybe-add-name, to-add)
1112
+ end
1113
+ end
1114
+
1096
1115
fun expand-name-spec( which-dict, which-bindings, which-env, spec, pre-path) :
1097
1116
cases ( A . NameSpec ) spec:
1098
1117
| s-star( shadow l, hidden) =>
@@ -1122,27 +1141,75 @@ fun resolve-names(p :: A.Program, initial-env :: C.CompileEnvironment):
1122
1141
end
1123
1142
end
1124
1143
end
1125
- fun expand-data-spec( spec, pre-path) :
1144
+ fun expand-data-spec( val-env, type-env, spec, pre-path, hidden ) :
1126
1145
cases ( A . NameSpec ) spec:
1127
- | s-star( shadow l, hidden ) =>
1146
+ | s-star( shadow l, _ ) => # NOTE(joe): Assumption is that this s-star's hiding is always empty for s-provide-data
1128
1147
for each( k from datatypes. keys-list-now()) :
1129
1148
data-expr = datatypes. get-value-now( k)
1149
+
1150
+ # NOTE(joe): Trying this as a nice collapsing of cases
1151
+ expand-data-spec( val-env, type-env, A . s-module-ref( l, [ list: data-expr. name] , none) , hidden)
1152
+
1130
1153
# TODO(joe): need to check datatypes from elsewhere with .new-definition?
1131
- provided-datatypes. set-now( data-expr. name, { l; maybe-uri-for-path( pre-path, initial-env, final-visitor. module-env) ; data-expr. namet} )
1154
+ # provided-datatypes.set-now(data-expr.name, {l; maybe-uri-for-path(pre-path, initial-env, final-visitor.module-env); data-expr.namet})
1132
1155
end
1133
1156
| s-module-ref( shadow l, path, as-name) =>
1134
1157
maybe-uri = path-uri( pre-path, path, initial-env, final-visitor. module-env)
1135
- { name; atom} = cases ( Option ) maybe-uri:
1136
- | none =>
1158
+ cases ( Option ) maybe-uri block:
1159
+ | none => # path must be a single element if there's no URI of a remote module
1160
+ # e.g. provide: D end NOT provide: M.D end
1137
1161
data-expr = datatypes. get-value-now( path. first. toname())
1138
- { data-expr. name; data-expr. namet }
1139
- | some( v) =>
1140
- { path. last(). toname() ; A . s-name( l, path. last(). toname()) }
1141
- end
1142
- data-expr = datatypes. get-value-now( path. first. toname())
1143
- cases ( Option ) as-name:
1144
- | none => provided-datatypes. set-now( data-expr. name, { l; none; data-expr. namet} )
1145
- | some( n) => raise( "Cannot rename data using as" )
1162
+ maybe-add( hidden, provided-datatypes, data-expr. name, { l; none; data-expr. namet} )
1163
+ data-checker-name = A . make-checker-name( data-expr. name)
1164
+ data-checker-vb = val-env. get-value( data-checker-name)
1165
+ maybe-add( hidden, provided-values, data-checker-name, { l; none; data-checker-vb. atom} )
1166
+ data-alias-tb = type-env. get-value( data-expr. name)
1167
+ maybe-add( hidden, provided-types, data-expr. name, { l; none; data-alias-tb. atom} )
1168
+ for each( v from data-expr. variants) block:
1169
+ variant-vb = val-env. get-value( v. name)
1170
+ checker-name = A . make-checker-name( v. name)
1171
+ variant-checker-vb = val-env. get-value( checker-name)
1172
+ maybe-add( hidden, provided-values, v. name, { l; none; variant-vb. atom} )
1173
+ maybe-add( hidden, provided-values, checker-name, { l; none; variant-checker-vb. atom} )
1174
+ end
1175
+
1176
+ | some( uri) =>
1177
+ datatype-name = path. last(). toname()
1178
+ providing-module = initial-env. provides-by-uri-value( uri)
1179
+ maybe-datatype = providing-module. data-definitions. get( datatype-name)
1180
+ { datatype-uri; datatype } = cases ( Option ) maybe-datatype:
1181
+ | none =>
1182
+ cases ( Option ) providing-module. aliases. get( datatype-name) :
1183
+ | none => raise( "Name " + datatype-name + " not defined as a type or datatype on " + uri)
1184
+ | some( t) =>
1185
+ cases ( T . Type ) t block:
1186
+ | t-name( module-name, id, _, _) =>
1187
+ when ( not ( T . is-module-uri( module-name))) : raise( "Expected a remote reference: " + to-repr( module-name)) end
1188
+
1189
+ remote-datatype = initial-env. provides-by-uri-value( module-name. uri). data-definitions. get( datatype-name)
1190
+ cases ( Option ) remote-datatype:
1191
+ | some( rd) => { module-name. uri; rd }
1192
+ | none =>
1193
+ raise( "Cannot re-provide datatype " + datatype-name + " because it isn't a datatype in " + uri)
1194
+ end
1195
+ end
1196
+ end
1197
+ | some( datatype) => { uri; datatype }
1198
+ end
1199
+ fun add-value-if-defined( name) :
1200
+ when ( providing-module. values. has-key( name)) :
1201
+ maybe-add( hidden, provided-values, name, { l; some( datatype-uri) ; A . s-name( l, name) } )
1202
+ end
1203
+ end
1204
+ # maybe-add(hidden, provided-datatypes, datatype-name, {l; some(uri); A.s-name(l, datatype-name)})
1205
+ add-value-if-defined( A . make-checker-name( datatype-name))
1206
+ when ( providing-module. aliases. has-key( datatype-name)) :
1207
+ maybe-add( hidden, provided-types, datatype-name, { l; some( datatype-uri) ; A . s-name( l, datatype-name) } )
1208
+ end
1209
+ for each( v from datatype. variants) block:
1210
+ add-value-if-defined( v. name)
1211
+ add-value-if-defined( A . make-checker-name( v. name))
1212
+ end
1146
1213
end
1147
1214
end
1148
1215
end
@@ -1155,7 +1222,7 @@ fun resolve-names(p :: A.Program, initial-env :: C.CompileEnvironment):
1155
1222
| s-provide-module( shadow l, name-spec) =>
1156
1223
expand-name-spec( provided-modules, module-bindings, final-visitor. module-env, name-spec, path)
1157
1224
| s-provide-data( shadow l, name-spec, hidden) =>
1158
- expand-data-spec( name-spec, path)
1225
+ expand-data-spec( final-visitor . env, final-visitor . type-env, name-spec, path, hidden )
1159
1226
| else => nothing
1160
1227
end
1161
1228
end
0 commit comments