Skip to content

Commit 9949180

Browse files
Merge pull request #2938 from contradict/disallow_duplicate_names
Disallow duplicate names
2 parents c6ced30 + 99b0138 commit 9949180

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/systems/model_parsing.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,21 @@ function generate_var(a, varclass;
282282
var
283283
end
284284

285+
singular(sym) = last(string(sym)) == 's' ? Symbol(string(sym)[1:(end - 1)]) : sym
286+
287+
function check_name_uniqueness(dict, a, newvarclass)
288+
for varclass in [:variables, :parameters, :structural_parameters, :constants]
289+
dvarclass = get(dict, varclass, nothing)
290+
if dvarclass !== nothing && a in keys(dvarclass)
291+
error("Cannot create a $(singular(newvarclass)) `$(a)` because there is already a $(singular(varclass)) with that name")
292+
end
293+
end
294+
end
295+
285296
function generate_var!(dict, a, varclass;
286297
indices::Union{Vector{UnitRange{Int}}, Nothing} = nothing,
287298
type = Real)
299+
check_name_uniqueness(dict, a, varclass)
288300
vd = get!(dict, varclass) do
289301
Dict{Symbol, Dict{Symbol, Any}}()
290302
end
@@ -302,6 +314,7 @@ function generate_var!(dict, a, b, varclass, mod;
302314
iv
303315
end
304316
@assert isequal(iv, prev_iv) "Multiple independent variables are used in the model"
317+
check_name_uniqueness(dict, a, varclass)
305318
vd = get!(dict, varclass) do
306319
Dict{Symbol, Dict{Symbol, Any}}()
307320
end

test/model_parsing.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,3 +854,25 @@ end
854854
@test getdefault(vec_false.n[i]) == 1
855855
end
856856
end
857+
858+
@testset "Duplicate names" begin
859+
mod = @__MODULE__
860+
@test_throws ErrorException ModelingToolkit._model_macro(mod, :ATest,
861+
:(begin
862+
@variables begin
863+
a(t)
864+
a(t)
865+
end
866+
end),
867+
false)
868+
@test_throws ErrorException ModelingToolkit._model_macro(mod, :ATest,
869+
:(begin
870+
@variables begin
871+
a(t)
872+
end
873+
@parameters begin
874+
a
875+
end
876+
end),
877+
false)
878+
end

0 commit comments

Comments
 (0)