Skip to content

Commit fdd9746

Browse files
committed
Ensure generated getters are readonly where possible
1 parent 3710e44 commit fdd9746

File tree

16 files changed

+256
-255
lines changed

16 files changed

+256
-255
lines changed

sources/ClangSharp.PInvokeGenerator/Abstractions/IOutputBuilder.VisitDecl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ internal partial interface IOutputBuilder
6161
CSharpOutputBuilder BeginCSharpCode();
6262
void EndCSharpCode(CSharpOutputBuilder output);
6363

64-
void BeginGetter(bool aggressivelyInlined);
64+
void BeginGetter(bool aggressivelyInlined, bool isReadOnly);
6565
void EndGetter();
6666
void BeginSetter(bool aggressivelyInlined);
6767
void EndSetter();

sources/ClangSharp.PInvokeGenerator/CSharp/CSharpOutputBuilder.VisitDecl.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public void BeginValue(in ValueDesc desc)
177177
{
178178
WriteNewline();
179179
WriteBlockStart();
180-
BeginGetter(desc.IsConstant && _config.GenerateAggressiveInlining);
180+
BeginGetter(desc.IsConstant && _config.GenerateAggressiveInlining, isReadOnly: false);
181181
}
182182
else
183183
{
@@ -883,15 +883,15 @@ public void EndCSharpCode(CSharpOutputBuilder output)
883883
// nop, used only by XML
884884
}
885885

886-
public void BeginGetter(bool aggressivelyInlined)
886+
public void BeginGetter(bool aggressivelyInlined, bool isReadOnly)
887887
{
888888
if (aggressivelyInlined)
889889
{
890890
AddUsingDirective("System.Runtime.CompilerServices");
891891
WriteIndentedLine("[MethodImpl(MethodImplOptions.AggressiveInlining)]");
892892
}
893893

894-
WriteIndentedLine("get");
894+
WriteIndentedLine(isReadOnly ? "readonly get" : "get");
895895
WriteBlockStart();
896896
}
897897

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ private void VisitIndirectFieldDecl(IndirectFieldDecl indirectFieldDecl)
995995
var isIndirectPointerField = IsTypePointerOrReference(indirectFieldDecl, type) && (typeName != "IntPtr") && (typeName != "UIntPtr");
996996

997997
_outputBuilder.BeginBody();
998-
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining);
998+
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining, isReadOnly: fieldDecl.IsBitField && !Config.GenerateCompatibleCode);
999999
var code = _outputBuilder.BeginCSharpCode();
10001000

10011001
if (fieldDecl.IsBitField)
@@ -2639,7 +2639,7 @@ void VisitBitfieldDecl(FieldDecl fieldDecl, BitfieldDesc[] bitfieldDescs, Record
26392639
_outputBuilder.BeginField(in desc);
26402640
_outputBuilder.WriteRegularField(typeName, escapedName);
26412641
_outputBuilder.BeginBody();
2642-
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining);
2642+
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining, isReadOnly: !Config.GenerateCompatibleCode);
26432643
var code = _outputBuilder.BeginCSharpCode();
26442644

26452645
code.WriteIndented("return ");
@@ -2973,7 +2973,7 @@ void VisitConstantOrIncompleteArrayFieldDecl(RecordDecl recordDecl, FieldDecl co
29732973
_outputBuilder.EndIndexerParameters();
29742974
_outputBuilder.BeginBody();
29752975

2976-
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining);
2976+
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining, isReadOnly: false);
29772977
var code = _outputBuilder.BeginCSharpCode();
29782978

29792979
code.WriteIndented("fixed (");
@@ -3006,7 +3006,7 @@ void VisitConstantOrIncompleteArrayFieldDecl(RecordDecl recordDecl, FieldDecl co
30063006
_outputBuilder.EndIndexerParameters();
30073007
_outputBuilder.BeginBody();
30083008

3009-
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining);
3009+
_outputBuilder.BeginGetter(_config.GenerateAggressiveInlining, isReadOnly: false);
30103010
var code = _outputBuilder.BeginCSharpCode();
30113011
code.AddUsingDirective("System");
30123012
code.AddUsingDirective("System.Runtime.InteropServices");

sources/ClangSharp.PInvokeGenerator/XML/XmlOutputBuilder.VisitDecl.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,9 +332,10 @@ public void EndCSharpCode(CSharpOutputBuilder output)
332332
_ = _sb.Append("</code>");
333333
}
334334

335-
public void BeginGetter(bool aggressivelyInlined)
335+
public void BeginGetter(bool aggressivelyInlined, bool isReadOnly)
336336
{
337337
_ = _sb.Append("<get");
338+
338339
if (aggressivelyInlined)
339340
{
340341
_ = _sb.Append(" inlining=\"aggressive\"");

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpDefaultUnix/StructDeclarationTest.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public partial struct MyStruct1
147147
[NativeTypeName(""unsigned int : 24"")]
148148
public uint o0_b0_24
149149
{
150-
get
150+
readonly get
151151
{
152152
return _bitfield1 & 0xFFFFFFu;
153153
}
@@ -163,7 +163,7 @@ public uint o0_b0_24
163163
[NativeTypeName(""unsigned int : 16"")]
164164
public uint o4_b0_16
165165
{
166-
get
166+
readonly get
167167
{
168168
return _bitfield2 & 0xFFFFu;
169169
}
@@ -177,7 +177,7 @@ public uint o4_b0_16
177177
[NativeTypeName(""unsigned int : 3"")]
178178
public uint o4_b16_3
179179
{
180-
get
180+
readonly get
181181
{
182182
return (_bitfield2 >> 16) & 0x7u;
183183
}
@@ -191,7 +191,7 @@ public uint o4_b16_3
191191
[NativeTypeName(""int : 3"")]
192192
public int o4_b19_3
193193
{
194-
get
194+
readonly get
195195
{
196196
return (int)((_bitfield2 >> 19) & 0x7u);
197197
}
@@ -205,7 +205,7 @@ public int o4_b19_3
205205
[NativeTypeName(""unsigned char : 1"")]
206206
public byte o4_b22_1
207207
{
208-
get
208+
readonly get
209209
{
210210
return (byte)((_bitfield2 >> 22) & 0x1u);
211211
}
@@ -219,7 +219,7 @@ public byte o4_b22_1
219219
[NativeTypeName(""int : 1"")]
220220
public int o4_b23_1
221221
{
222-
get
222+
readonly get
223223
{
224224
return (int)((_bitfield2 >> 23) & 0x1u);
225225
}
@@ -233,7 +233,7 @@ public int o4_b23_1
233233
[NativeTypeName(""int : 1"")]
234234
public int o4_b24_1
235235
{
236-
get
236+
readonly get
237237
{
238238
return (int)((_bitfield2 >> 24) & 0x1u);
239239
}
@@ -252,7 +252,7 @@ public partial struct MyStruct2
252252
[NativeTypeName(""unsigned int : 1"")]
253253
public uint o0_b0_1
254254
{
255-
get
255+
readonly get
256256
{
257257
return _bitfield1 & 0x1u;
258258
}
@@ -270,7 +270,7 @@ public uint o0_b0_1
270270
[NativeTypeName(""unsigned int : 1"")]
271271
public uint o8_b0_1
272272
{
273-
get
273+
readonly get
274274
{
275275
return _bitfield2 & 0x1u;
276276
}
@@ -289,7 +289,7 @@ public partial struct MyStruct3
289289
[NativeTypeName(""unsigned int : 1"")]
290290
public uint o0_b0_1
291291
{
292-
get
292+
readonly get
293293
{
294294
return _bitfield & 0x1u;
295295
}
@@ -303,7 +303,7 @@ public uint o0_b0_1
303303
[NativeTypeName(""unsigned int : 1"")]
304304
public uint o0_b1_1
305305
{
306-
get
306+
readonly get
307307
{
308308
return (_bitfield >> 1) & 0x1u;
309309
}
@@ -357,7 +357,7 @@ public partial struct MyStruct1
357357
[NativeTypeName(""unsigned int : 24"")]
358358
public uint o0_b0_24
359359
{
360-
get
360+
readonly get
361361
{
362362
return _bitfield1 & 0xFFFFFFu;
363363
}
@@ -379,7 +379,7 @@ public uint o0_b0_24
379379
[NativeTypeName(""unsigned int : 16"")]
380380
public uint o4_b0_16
381381
{
382-
get
382+
readonly get
383383
{
384384
return _bitfield2 & 0xFFFFu;
385385
}
@@ -393,7 +393,7 @@ public uint o4_b0_16
393393
[NativeTypeName(""unsigned int : 3"")]
394394
public uint o4_b16_3
395395
{
396-
get
396+
readonly get
397397
{
398398
return (_bitfield2 >> 16) & 0x7u;
399399
}
@@ -407,7 +407,7 @@ public uint o4_b16_3
407407
[NativeTypeName(""int : 3"")]
408408
public int o4_b19_3
409409
{
410-
get
410+
readonly get
411411
{
412412
return (int)((_bitfield2 >> 19) & 0x7u);
413413
}
@@ -421,7 +421,7 @@ public int o4_b19_3
421421
[NativeTypeName(""unsigned char : 1"")]
422422
public byte o4_b22_1
423423
{
424-
get
424+
readonly get
425425
{
426426
return (byte)((_bitfield2 >> 22) & 0x1u);
427427
}
@@ -435,7 +435,7 @@ public byte o4_b22_1
435435
[NativeTypeName(""int : 1"")]
436436
public int o4_b23_1
437437
{
438-
get
438+
readonly get
439439
{
440440
return (int)((_bitfield2 >> 23) & 0x1u);
441441
}
@@ -449,7 +449,7 @@ public int o4_b23_1
449449
[NativeTypeName(""int : 1"")]
450450
public int o4_b24_1
451451
{
452-
get
452+
readonly get
453453
{
454454
return (int)((_bitfield2 >> 24) & 0x1u);
455455
}
@@ -469,7 +469,7 @@ public partial struct MyStruct2
469469
[NativeTypeName(""unsigned int : 1"")]
470470
public uint o0_b0_1
471471
{
472-
get
472+
readonly get
473473
{
474474
return _bitfield1 & 0x1u;
475475
}
@@ -488,7 +488,7 @@ public uint o0_b0_1
488488
[NativeTypeName(""unsigned int : 1"")]
489489
public uint o8_b0_1
490490
{
491-
get
491+
readonly get
492492
{
493493
return _bitfield2 & 0x1u;
494494
}
@@ -509,7 +509,7 @@ public partial struct MyStruct3
509509
[NativeTypeName(""unsigned int : 1"")]
510510
public uint o0_b0_1
511511
{
512-
get
512+
readonly get
513513
{
514514
return _bitfield & 0x1u;
515515
}
@@ -523,7 +523,7 @@ public uint o0_b0_1
523523
[NativeTypeName(""unsigned int : 1"")]
524524
public uint o0_b1_1
525525
{
526-
get
526+
readonly get
527527
{
528528
return (_bitfield >> 1) & 0x1u;
529529
}
@@ -1329,7 +1329,7 @@ public ref int w
13291329
13301330
public int o0_b0_16
13311331
{
1332-
get
1332+
readonly get
13331333
{
13341334
return Anonymous.Anonymous.o0_b0_16;
13351335
}
@@ -1342,7 +1342,7 @@ public int o0_b0_16
13421342
13431343
public int o0_b16_4
13441344
{
1345-
get
1345+
readonly get
13461346
{
13471347
return Anonymous.Anonymous.o0_b16_4;
13481348
}
@@ -1369,7 +1369,7 @@ public partial struct _Anonymous_e__Struct
13691369
[NativeTypeName(""int : 16"")]
13701370
public int o0_b0_16
13711371
{
1372-
get
1372+
readonly get
13731373
{
13741374
return _bitfield & 0xFFFF;
13751375
}
@@ -1383,7 +1383,7 @@ public int o0_b0_16
13831383
[NativeTypeName(""int : 4"")]
13841384
public int o0_b16_4
13851385
{
1386-
get
1386+
readonly get
13871387
{
13881388
return (_bitfield >> 16) & 0xF;
13891389
}

0 commit comments

Comments
 (0)