Skip to content

Commit c6b063d

Browse files
committed
Add tests for --rec-module=off
1 parent dc69d82 commit c6b063d

File tree

3 files changed

+60
-51
lines changed

3 files changed

+60
-51
lines changed

build.fsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@ module Test =
135135
// "full" packages involving a lot of dependencies (which includes some "safe" packages)
136136
"safe", !! "node_modules/@types/scheduler/tracing.d.ts", [];
137137
"full", !! "node_modules/csstype/index.d.ts", [];
138-
"safe", !! "node_modules/@types/prop-types/index.d.ts", [];
138+
"safe", !! "node_modules/@types/prop-types/index.d.ts", ["--rec-module=off"];
139139
"full", !! "node_modules/@types/react/index.d.ts" ++ "node_modules/@types/react/global.d.ts", [];
140140
"full", !! "node_modules/@types/react-modal/index.d.ts", [];
141141

142142
// "safe" package which depends on another "safe" package
143143
"safe", !! "node_modules/@types/yargs-parser/index.d.ts", [];
144-
"safe", !! "node_modules/@types/yargs/index.d.ts", [];
144+
"safe", !! "node_modules/@types/yargs/index.d.ts", ["--rec-module=off"];
145145
]
146146

147147
for preset, package, additionalOptions in packages do

src/Targets/JsOfOCaml/Common.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ module Options =
117117
| Some p ->
118118
Log.tracef opts "* using the preset '%s'." !!p
119119

120-
if opts.simplify = [] then
121-
opts.simplify <- [Simplify.All]
122120
let subtypingIsDefault =
123121
opts.subtyping = []
124122

125-
if p = Preset.Minimal || p = Preset.Full then
123+
if p = Preset.Minimal || p = Preset.Safe || p = Preset.Full then
124+
if opts.simplify = [] then
125+
opts.simplify <- [Simplify.All]
126126
if opts.recModule = RecModule.Default then
127127
opts.recModule <- RecModule.Optimized
128128

src/Targets/JsOfOCaml/Writer.fs

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,12 @@ let rec emitTypeImpl (flags: EmitTypeFlags) (overrideFunc: OverrideFunc) (ctx: C
226226
else
227227
let maxArity = List.length typrms
228228
let tyName = Naming.createTypeNameOfArity arity (Some maxArity) "t"
229-
let simple () =
230-
Naming.structured Naming.moduleName i.name + "." + tyName |> str |> withTyargs
231-
if fn.source <> ctx.currentSourceFile then simple ()
229+
let simple name =
230+
Naming.structured Naming.moduleName name + "." + tyName |> str |> withTyargs
231+
if fn.source <> ctx.currentSourceFile then simple fn.name
232232
else
233233
match ctx |> Context.getRelativeNameTo fn.name with
234-
| Ok relativeName ->
235-
assert (relativeName = fn.name)
236-
simple ()
234+
| Ok relativeName -> simple relativeName
237235
| Error [] -> // the type is the current namespace
238236
tyName |> str |> withTyargs
239237
| Error diff ->
@@ -1233,12 +1231,19 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
12331231
| SymbolIndexer _ | UnknownMember None -> () ]
12341232

12351233
let rec folder ctx (current: StructuredText) (s: Statement) : StructuredText =
1236-
let getModule name =
1237-
match current |> Trie.getSubTrie [name] with
1238-
| Some t -> t
1239-
| None -> Trie.empty
1240-
let setModule name trie = current |> Trie.setSubTrie [name] trie
1241-
let setNode node = current |> Trie.setOrUpdate node StructuredTextNode.union
1234+
let getTrie name current =
1235+
current |> Trie.getSubTrie name |> Option.defaultValue Trie.empty
1236+
let setTrie name trie current =
1237+
current |> Trie.setSubTrie name trie
1238+
let inTrie name f current =
1239+
let m =
1240+
current
1241+
|> Trie.getSubTrie name
1242+
|> Option.defaultValue Trie.empty
1243+
|> f
1244+
current |> Trie.setSubTrie name m
1245+
let set node current = current |> Trie.setOrUpdate node StructuredTextNode.union
1246+
let add name node current = current |> Trie.addOrUpdate name node StructuredTextNode.union
12421247

12431248
let comments =
12441249
match (s :> ICommented<_>).getComments() with
@@ -1249,7 +1254,7 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
12491254
let addExport name kind kindString current =
12501255
match getExportFromStatement ctx name kind kindString s with
12511256
| None -> current
1252-
| Some e -> current |> Trie.setOrUpdate {| StructuredTextNode.empty with exports = [e] |} StructuredTextNode.union
1257+
| Some e -> current |> set {| StructuredTextNode.empty with exports = [e] |}
12531258
let addAnonymousInterfaceExcluding ais current =
12541259
knownTypes ()
12551260
|> Seq.choose (function KnownType.AnonymousInterface (a, info) -> Some (a, info) | _ -> None)
@@ -1263,53 +1268,54 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
12631268
if shouldSkip then current
12641269
else
12651270
emitClass emitTypeFlags OverrideFunc.noOverride ctx current (a.MapName Choice2Of2) ((fun _ _ _ -> []), Set.empty, None)
1266-
|> Trie.setOrUpdate {| StructuredTextNode.empty with anonymousInterfaces = Set.singleton a |} StructuredTextNode.union
1271+
|> set {| StructuredTextNode.empty with anonymousInterfaces = Set.singleton a |}
12671272
) current
12681273
let addAnonymousInterface current = addAnonymousInterfaceExcluding [] current
12691274

12701275
match s with
12711276
| Module m ->
12721277
let module' =
12731278
let node = {| StructuredTextNode.empty with docCommentLines = comments; knownTypes = knownTypes () |}
1274-
let module' = getModule m.name |> Trie.setOrUpdate node StructuredTextNode.union
1279+
let module' = current |> getTrie [m.name] |> set node
12751280
let ctx = ctx |> Context.ofChildNamespace m.name
12761281
m.statements |> List.fold (folder ctx) module'
1277-
let result = setModule m.name module'
1282+
let current =
1283+
current |> setTrie [m.name] module'
12781284
match module'.value with
1279-
| None -> result
1285+
| None -> current
12801286
| Some v ->
12811287
let kind =
12821288
if v.scoped <> Scoped.No then Kind.OfModule
12831289
else Kind.OfNamespace
1284-
result |> addExport m.name kind (if m.isNamespace then "namespace" else "module")
1290+
current |> addExport m.name kind (if m.isNamespace then "namespace" else "module")
12851291
| Global m -> m.statements |> List.fold (folder ctx) current
12861292
| Class c ->
12871293
emitClass emitTypeFlags OverrideFunc.noOverride ctx current (c.MapName Choice1Of2) ((fun _ _ _ -> []), Set.empty, None)
12881294
|> addAnonymousInterface
12891295
| Enum e ->
1290-
let module' =
1296+
current
1297+
|> inTrie [e.name] (fun module' ->
12911298
let ctx = ctx |> Context.ofChildNamespace e.name
12921299
let items = emitTypeAliases emitTypeFlags OverrideFunc.noOverride ctx [] (GetSelfTyText.enumCases e e.cases)
1293-
let node = {| StructuredTextNode.empty with items = items; docCommentLines = comments; knownTypes = knownTypes () |}
12941300
let module' =
1295-
getModule e.name |> Trie.setOrUpdate node StructuredTextNode.union
1301+
let node = {| StructuredTextNode.empty with items = items; docCommentLines = comments; knownTypes = knownTypes () |}
1302+
module' |> set node
12961303
e.cases |> List.fold (fun state c ->
12971304
let ctx = ctx |> Context.ofChildNamespace c.name
12981305
let comments = List.map emitCommentBody c.comments
12991306
let items =
13001307
emitTypeAliases emitTypeFlags OverrideFunc.noOverride ctx [] (GetSelfTyText.enumCases e [c])
13011308
let node = {| StructuredTextNode.empty with items = items; docCommentLines = comments; knownTypes = knownTypes () |}
1302-
state |> Trie.addOrUpdate [c.name] node StructuredTextNode.union
1303-
) module'
1304-
setModule e.name module' |> addExport e.name Kind.OfEnum "enum"
1309+
state |> add [c.name] node
1310+
) module')
1311+
|> addExport e.name Kind.OfEnum "enum"
13051312
| TypeAlias ta ->
13061313
let ctx = ctx |> Context.ofChildNamespace ta.name
13071314
let items =
13081315
emitTypeAliases emitTypeFlags OverrideFunc.noOverride ctx ta.typeParams (emitSelfType ctx ta.target)
13091316
let node = {| StructuredTextNode.empty with items = items; docCommentLines = comments; knownTypes = knownTypes () |}
1310-
let module' =
1311-
getModule ta.name |> Trie.setOrUpdate node StructuredTextNode.union
1312-
setModule ta.name module'
1317+
current
1318+
|> inTrie [ta.name] (set node)
13131319
|> addExport ta.name Kind.OfTypeAlias "type"
13141320
|> addAnonymousInterface
13151321
| Pattern p ->
@@ -1326,10 +1332,9 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
13261332
if knownTypesInMembers |> Set.contains (KnownType.Ident (ctx |> Context.getFullName [intfName])) then
13271333
fallback current
13281334
else
1329-
getModule value.name
1330-
|> Trie.setOrUpdate (createModule ()) StructuredTextNode.union
1331-
|> setModule value.name
1332-
|> Trie.setOrUpdate {| StructuredTextNode.empty with scoped = Scoped.Yes |} StructuredTextNode.union
1335+
current
1336+
|> inTrie [value.name] (set (createModule ()))
1337+
|> set {| StructuredTextNode.empty with scoped = Scoped.Yes |}
13331338
|> addExport value.name Kind.OfClass "interface"
13341339
|> addAnonymousInterface
13351340
| ImmediateConstructor (baseIntf, ctorIntf, ctorValue) when Simplify.Has(ctx.options.simplify, Simplify.ImmediateConstructor) ->
@@ -1343,7 +1348,7 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
13431348
knownTypes = knownTypes ()
13441349
scoped = Scoped.Yes |}
13451350
current
1346-
|> Trie.setOrUpdate node StructuredTextNode.union
1351+
|> set node
13471352
|> addExport func.name Kind.OfValue "function"
13481353
|> addAnonymousInterface
13491354
| Variable value ->
@@ -1354,22 +1359,24 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
13541359
knownTypes = knownTypes ()
13551360
scoped = Scoped.Yes |}
13561361
current
1357-
|> Trie.setOrUpdate node StructuredTextNode.union
1362+
|> set node
13581363
|> addExport value.name Kind.OfValue (if value.isConst then "const" else "let")
13591364
|> addAnonymousInterface
13601365
let inline (|Dummy|) _ = []
13611366
match value.typ with
13621367
| AnonymousInterface intf when Simplify.Has(ctx.options.simplify, Simplify.AnonymousInterfaceValue) ->
13631368
let knownTypes = knownTypes ()
13641369
let items = intfToStmts intf (ctx |> Context.ofChildNamespace value.name) emitTypeFlags overrideFunc
1365-
getModule value.name
1366-
|> Trie.setOrUpdate {| StructuredTextNode.empty with items = items; knownTypes = knownTypes; scoped = Scoped.Force value.name |} StructuredTextNode.union
1367-
|> setModule value.name
1368-
|> Trie.setOrUpdate
1370+
current
1371+
|> inTrie [value.name]
1372+
(set
1373+
{| StructuredTextNode.empty with
1374+
items = items; knownTypes = knownTypes; scoped = Scoped.Force value.name |})
1375+
|> set
13691376
{| StructuredTextNode.empty with
13701377
items = emitVariable emitTypeFlags overrideFunc ctx value
13711378
knownTypes = knownTypes
1372-
scoped = Scoped.Yes |} StructuredTextNode.union
1379+
scoped = Scoped.Yes |}
13731380
|> addExport value.name Kind.OfValue (if value.isConst then "const" else "let")
13741381
|> addAnonymousInterface
13751382
| Ident (i & { loc = loc }) & Dummy tyargs
@@ -1386,29 +1393,31 @@ let createStructuredText (rootCtx: Context) (stmts: Statement list) : Structured
13861393
let createModule () =
13871394
let items = intfToStmts intf ctx emitTypeFlags overrideFunc
13881395
{| StructuredTextNode.empty with items = items; knownTypes = knownTypesInMembers; scoped = Scoped.Force value.name |}
1389-
getModule name
1390-
|> Trie.setOrUpdate (createModule ()) StructuredTextNode.union
1391-
|> setModule name
1392-
|> Trie.setOrUpdate {| StructuredTextNode.empty with scoped = Scoped.Yes |} StructuredTextNode.union
1396+
current
1397+
|> inTrie [name] (set (createModule ()))
1398+
|> set {| StructuredTextNode.empty with scoped = Scoped.Yes |}
13931399
|> addExport name Kind.OfValue (if value.isConst then "const" else "let")
13941400
|> fallback
13951401
| _ -> fallback current
13961402
| Import i ->
1397-
setNode {| StructuredTextNode.empty with items = emitImport ctx i |}
1403+
current |> set {| StructuredTextNode.empty with items = emitImport ctx i |}
13981404
| Export e ->
13991405
let getKind = function
14001406
| CommonJsExport i | ES6DefaultExport i -> i |> Ident.getKind ctx
14011407
| ES6Export x -> x.target |> Ident.getKind ctx
14021408
| NamespaceExport _ -> Set.empty
1403-
setNode {| StructuredTextNode.empty with exports = [ExportItem.Statement {| e with clauses = e.clauses |> List.map (fun c -> c, getKind c) |}] |}
1409+
current
1410+
|> set
1411+
{| StructuredTextNode.empty with
1412+
exports = [ExportItem.Statement {| e with clauses = e.clauses |> List.map (fun c -> c, getKind c) |}] |}
14041413
| UnknownStatement u ->
14051414
let cmt =
14061415
match u.origText with
14071416
| Some s -> commentStr s | None -> commentStr "unknown statement"
1408-
setNode {| StructuredTextNode.empty with items = [ScopeIndependent cmt] |}
1417+
current |> set {| StructuredTextNode.empty with items = [ScopeIndependent cmt] |}
14091418
| FloatingComment c ->
14101419
let cmt = ScopeIndependent empty :: (c.comments |> List.map (emitCommentBody >> comment >> ScopeIndependent))
1411-
setNode {| StructuredTextNode.empty with items = ScopeIndependent empty :: cmt |}
1420+
current |> set {| StructuredTextNode.empty with items = ScopeIndependent empty :: cmt |}
14121421
and folder' ctx stmt node = folder ctx node stmt
14131422

14141423
stmts |> List.fold (folder rootCtx) Trie.empty

0 commit comments

Comments
 (0)