@@ -1316,164 +1316,6 @@ end
13161316
13171317# ## Parsing Components:
13181318
1319- function component_args! (a, b, varexpr, kwargs; index_name = nothing )
1320- # Whenever `b` is a function call, skip the first arg aka the function name.
1321- # Whenever it is a kwargs list, include it.
1322- start = b. head == :call ? 2 : 1
1323- for i in start: lastindex (b. args)
1324- arg = b. args[i]
1325- arg isa LineNumberNode && continue
1326- MLStyle. @match arg begin
1327- x:: Symbol ||
1328- Expr (:kw , x) => begin
1329- varname, _varname = _rename (a, x)
1330- b. args[i] = Expr (:kw , x, _varname)
1331- push! (varexpr. args, :((if $ varname != = nothing
1332- $ _varname = $ varname
1333- elseif @isdefined $ x
1334- # Allow users to define a var in `structural_parameters` and set
1335- # that as positional arg of subcomponents; it is useful for cases
1336- # where it needs to be passed to multiple subcomponents.
1337- $ _varname = $ x
1338- end )))
1339- push! (kwargs, Expr (:kw , varname, nothing ))
1340- # dict[:kwargs][varname] = nothing
1341- end
1342- Expr (:parameters , x... ) => begin
1343- component_args! (a, arg, varexpr, kwargs)
1344- end
1345- Expr (:kw ,
1346- x,
1347- y) => begin
1348- varname, _varname = _rename (a, x)
1349- b. args[i] = Expr (:kw , x, _varname)
1350- if isnothing (index_name)
1351- push! (varexpr. args, :($ _varname = $ varname === nothing ? $ y : $ varname))
1352- else
1353- push! (varexpr. args,
1354- :($ _varname = $ varname === nothing ? $ y : $ varname[$ index_name]))
1355- end
1356- push! (kwargs, Expr (:kw , varname, nothing ))
1357- # dict[:kwargs][varname] = nothing
1358- end
1359- _ => error (" Could not parse $arg of component $a " )
1360- end
1361- end
1362- end
1363-
1364- model_name (name, range) = Symbol .(name, :_ , collect (range))
1365-
1366- function _parse_components! (body, kwargs)
1367- local expr
1368- varexpr = Expr (:block )
1369- comps = Vector{Union{Union{Expr, Symbol}, Expr}}[]
1370- comp_names = []
1371-
1372- Base. remove_linenums! (body)
1373- arg = body. args[end ]
1374-
1375- MLStyle. @match arg begin
1376- Expr (:(= ),
1377- a,
1378- Expr (:comprehension , Expr (:generator , b, Expr (:(= ), c, d)))) => begin
1379- array_varexpr = Expr (:block )
1380-
1381- push! (comp_names, :($ a... ))
1382- push! (comps, [a, b. args[1 ], d])
1383- b = deepcopy (b)
1384-
1385- component_args! (a, b, array_varexpr, kwargs; index_name = c)
1386-
1387- expr = _named_idxs (a, d, :($ c -> $ b); extra_args = array_varexpr)
1388- end
1389- Expr (:(= ),
1390- a,
1391- Expr (:comprehension , Expr (:generator , b, Expr (:filter , e, Expr (:(= ), c, d))))) => begin
1392- error (" List comprehensions with conditional statements aren't supported." )
1393- end
1394- Expr (:(= ),
1395- a,
1396- Expr (:comprehension , Expr (:generator , b, Expr (:(= ), c, d), e... ))) => begin
1397- # Note that `e` is of the form `Tuple{Expr(:(=), c, d)}`
1398- error (" More than one index isn't supported while building component array" )
1399- end
1400- Expr (:block ) => begin
1401- # TODO : Do we need this?
1402- error (" Multiple `@components` block detected within a single block" )
1403- end
1404- Expr (:(= ),
1405- a,
1406- Expr (:for , Expr (:(= ), c, d), b)) => begin
1407- Base. remove_linenums! (b)
1408- array_varexpr = Expr (:block )
1409- push! (array_varexpr. args, b. args[1 : (end - 1 )]. .. )
1410- push! (comp_names, :($ a... ))
1411- push! (comps, [a, b. args[end ]. args[1 ], d])
1412- b = deepcopy (b)
1413-
1414- component_args! (a, b. args[end ], array_varexpr, kwargs; index_name = c)
1415-
1416- expr = _named_idxs (a, d, :($ c -> $ (b. args[end ])); extra_args = array_varexpr)
1417- end
1418- Expr (:(= ), a, b) => begin
1419- arg = deepcopy (arg)
1420- b = deepcopy (arg. args[2 ])
1421-
1422- component_args! (a, b, varexpr, kwargs)
1423-
1424- arg. args[2 ] = b
1425- expr = :(@named $ arg)
1426- push! (comp_names, a)
1427- if (isa (b. args[1 ], Symbol) || Meta. isexpr (b. args[1 ], :.))
1428- push! (comps, [a, b. args[1 ]])
1429- end
1430- end
1431- _ => error (" Couldn't parse the component body: $arg " )
1432- end
1433-
1434- return comp_names, comps, expr, varexpr
1435- end
1436-
1437- function push_conditional_component! (ifexpr, expr_vec, comp_names, varexpr)
1438- blk = Expr (:block )
1439- push! (blk. args, varexpr)
1440- push! (blk. args, expr_vec)
1441- push! (blk. args, :($ push! (systems, $ (comp_names... ))))
1442- push! (ifexpr. args, blk)
1443- end
1444-
1445- function handle_if_x! (mod, exprs, ifexpr, x, kwargs, condition = nothing )
1446- push! (ifexpr. args, condition)
1447- comp_names, comps, expr_vec, varexpr = _parse_components! (x, kwargs)
1448- push_conditional_component! (ifexpr, expr_vec, comp_names, varexpr)
1449- comps
1450- end
1451-
1452- function handle_if_y! (exprs, ifexpr, y, kwargs)
1453- Base. remove_linenums! (y)
1454- if Meta. isexpr (y, :elseif )
1455- comps = [:elseif , y. args[1 ]]
1456- elseifexpr = Expr (:elseif )
1457- push! (comps, handle_if_x! (mod, exprs, elseifexpr, y. args[2 ], kwargs, y. args[1 ]))
1458- get (y. args, 3 , nothing ) != = nothing &&
1459- push! (comps, handle_if_y! (exprs, elseifexpr, y. args[3 ], kwargs))
1460- push! (ifexpr. args, elseifexpr)
1461- (comps... ,)
1462- else
1463- comp_names, comps, expr_vec, varexpr = _parse_components! (y, kwargs)
1464- push_conditional_component! (ifexpr, expr_vec, comp_names, varexpr)
1465- comps
1466- end
1467- end
1468-
1469- function handle_conditional_components (condition, dict, exprs, kwargs, x, y = nothing )
1470- ifexpr = Expr (:if )
1471- comps = handle_if_x! (mod, exprs, ifexpr, x, kwargs, condition)
1472- ycomps = y === nothing ? [] : handle_if_y! (exprs, ifexpr, y, kwargs)
1473- push! (exprs, ifexpr)
1474- push! (dict[:components ], (:if , condition, comps, ycomps))
1475- end
1476-
14771319""" `push!`, or `append!`, depending on `x`'s type """
14781320push_append! (vec, x:: AbstractVector ) = append! (vec, x)
14791321push_append! (vec, x) = push! (vec, x)
0 commit comments