Skip to content

Commit c8e288d

Browse files
fix: Escape names of nested modules in C# and Java (#5049)
Fixes #5048. --------- Co-authored-by: Rustan Leino <[email protected]>
1 parent 693baaf commit c8e288d

File tree

6 files changed

+36
-8
lines changed

6 files changed

+36
-8
lines changed

Source/DafnyCore/Compilers/CSharp/Compiler-Csharp.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,14 @@ protected override ConcreteSyntaxTree CreateStaticMain(IClassWriter cw, string a
266266
return wr.NewBlock($"public static void _StaticMain(Dafny.ISequence<Dafny.ISequence<{CharTypeName}>> {argsParameterName})");
267267
}
268268

269+
string IdProtectModule(string moduleName) {
270+
return string.Join(".", moduleName.Split(".").Select(IdProtect));
271+
}
272+
269273
protected override ConcreteSyntaxTree CreateModule(string moduleName, bool isDefault, ModuleDefinition externModule,
270274
string libraryName /*?*/, ConcreteSyntaxTree wr) {
271-
return wr.NewBlock($"namespace {IdProtect(moduleName)}", " // end of " + $"namespace {IdProtect(moduleName)}");
275+
moduleName = IdProtectModule(moduleName);
276+
return wr.NewBlock($"namespace {moduleName}", " // end of " + $"namespace {moduleName}");
272277
}
273278

274279
protected override string GetHelperModuleName() => DafnyHelpersClass;
@@ -1213,7 +1218,11 @@ string DtCtorName(DatatypeCtor ctor) {
12131218
Contract.Ensures(Contract.Result<string>() != null);
12141219

12151220
var dt = ctor.EnclosingDatatype;
1216-
var dtName = dt.EnclosingModuleDefinition.TryToAvoidName ? IdName(dt) : dt.GetFullCompileName(Options);
1221+
var dtName = IdName(dt);
1222+
if (!dt.EnclosingModuleDefinition.TryToAvoidName) {
1223+
dtName = IdProtectModule(dt.EnclosingModuleDefinition.GetCompileName(Options)) + "." + dtName;
1224+
}
1225+
12171226
return dt.IsRecordType ? dtName : dtName + "_" + ctor.GetCompileName(Options);
12181227
}
12191228

@@ -2472,7 +2481,7 @@ private string FullTypeName(UserDefinedType udt, MemberDecl/*?*/ member = null,
24722481
if ((cl is DatatypeDecl)
24732482
&& !ignoreInterface
24742483
&& (member is null || !NeedsCustomReceiver(member))) {
2475-
return (cl.EnclosingModuleDefinition.TryToAvoidName ? "" : IdProtect(cl.EnclosingModuleDefinition.GetCompileName(Options)) + ".") + DtTypeName(cl, false);
2484+
return (cl.EnclosingModuleDefinition.TryToAvoidName ? "" : IdProtectModule(cl.EnclosingModuleDefinition.GetCompileName(Options)) + ".") + DtTypeName(cl, false);
24762485
}
24772486

24782487
if (cl.EnclosingModuleDefinition.TryToAvoidName) {
@@ -2482,7 +2491,7 @@ private string FullTypeName(UserDefinedType udt, MemberDecl/*?*/ member = null,
24822491
if (cl.IsExtern(Options, out _, out _)) {
24832492
return cl.EnclosingModuleDefinition.GetCompileName(Options) + "." + cl.GetCompileName(Options);
24842493
}
2485-
return IdProtect(cl.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdProtect(cl.GetCompileName(Options));
2494+
return IdProtectModule(cl.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdProtect(cl.GetCompileName(Options));
24862495
}
24872496

24882497
protected override void EmitThis(ConcreteSyntaxTree wr, bool callToInheritedMember) {
@@ -2496,7 +2505,7 @@ protected override void EmitThis(ConcreteSyntaxTree wr, bool callToInheritedMemb
24962505

24972506
protected override void EmitDatatypeValue(DatatypeValue dtv, string typeDescriptorArguments, string arguments, ConcreteSyntaxTree wr) {
24982507
var dt = dtv.Ctor.EnclosingDatatype;
2499-
var dtName = dt.GetFullCompileName(Options);
2508+
var dtName = IdProtectModule(dt.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdName(dt);
25002509

25012510
var nonGhostInferredTypeArgs = SelectNonGhost(dt, dtv.InferredTypeArgs);
25022511
var typeParams = nonGhostInferredTypeArgs.Count == 0 ? "" : $"<{TypeNames(nonGhostInferredTypeArgs, wr, dtv.tok)}>";

Source/DafnyCore/Compilers/Java/Compiler-java.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,13 @@ private void EmitImport(Import import, ConcreteSyntaxTree importWriter) {
374374
importWriter.WriteLine($"import {import.Path.Replace('/', '.')}.*;");
375375
}
376376

377+
string IdProtectModule(string moduleName) {
378+
return string.Join(".", moduleName.Split(".").Select(IdProtect));
379+
}
380+
377381
protected override ConcreteSyntaxTree CreateModule(string moduleName, bool isDefault, ModuleDefinition externModule,
378382
string libraryName /*?*/, ConcreteSyntaxTree wr) {
383+
moduleName = IdProtectModule(moduleName);
379384
if (isDefault) {
380385
// Fold the default module into the main module
381386
moduleName = "_System";
@@ -824,7 +829,7 @@ protected string FullTypeName(UserDefinedType udt, MemberDecl member, bool useCo
824829
} else if (cl.EnclosingModuleDefinition.GetCompileName(Options) == ModuleName || cl.EnclosingModuleDefinition.TryToAvoidName) {
825830
return IdProtect(cl.GetCompileName(Options));
826831
} else {
827-
return IdProtect(cl.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdProtect(cl.GetCompileName(Options));
832+
return IdProtectModule(cl.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdProtect(cl.GetCompileName(Options));
828833
}
829834
}
830835

@@ -2248,7 +2253,7 @@ string DtCtorName(DatatypeCtor ctor) {
22482253
if (dt is TupleTypeDecl tupleDecl) {
22492254
return DafnyTupleClass(tupleDecl.NonGhostDims);
22502255
}
2251-
var dtName = IdProtect(dt.GetFullCompileName(Options));
2256+
var dtName = IdProtectModule(dt.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdName(dt);
22522257
return dt.IsRecordType ? dtName : dtName + "_" + ctor.GetCompileName(Options);
22532258
}
22542259
string DtCreateName(DatatypeCtor ctor) {
@@ -2657,7 +2662,9 @@ protected override void EmitDatatypeValue(DatatypeValue dtv, string typeDescript
26572662

26582663
void EmitDatatypeValue(DatatypeDecl dt, DatatypeCtor ctor, List<Type> typeArgs, bool isCoCall,
26592664
string typeDescriptorArguments, string arguments, ConcreteSyntaxTree wr) {
2660-
var dtName = dt is TupleTypeDecl tupleDecl ? DafnyTupleClass(tupleDecl.NonGhostDims) : dt.GetFullCompileName(Options);
2665+
var dtName = dt is TupleTypeDecl tupleDecl
2666+
? DafnyTupleClass(tupleDecl.NonGhostDims)
2667+
: IdProtectModule(dt.EnclosingModuleDefinition.GetCompileName(Options)) + "." + IdName(dt);
26612668
var typeParams = typeArgs.Count == 0 ? "" : $"<{BoxedTypeNames(typeArgs, wr, dt.tok)}>";
26622669
var sep = typeDescriptorArguments.Length != 0 && arguments.Length != 0 ? ", " : "";
26632670
if (!isCoCall) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %testDafnyForEachCompiler --refresh-exit-code=0 "%s"
2+
3+
module A.try {
4+
datatype Dt = Dt
5+
}
6+
7+
method Main() {
8+
print A.try.Dt, "\n";
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
try.Dt.Dt
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
A.try.Dt.Dt

docs/dev/news/5049.fix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Escape names of nested modules in C# and Java

0 commit comments

Comments
 (0)