1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using Mono.Linker.Tests.Cases.Expectations.Assertions;
using Mono.Linker.Tests.Cases.Expectations.Helpers;
namespace Mono.Linker.Tests.Cases.DataFlow
{
// Note: this test's goal is to validate that the product correctly reports unrecognized patterns
// - so the main validation is done by the ExpectedWarning attributes.
[SkipKeptItemsValidation]
[ExpectedNoWarnings]
public class PropertyDataFlow
{
public static void Main ()
{
var instance = new PropertyDataFlow ();
instance.ReadFromInstanceProperty ();
instance.WriteToInstanceProperty ();
instance.ReadFromStaticProperty ();
instance.WriteToStaticProperty ();
instance.WriteToStaticPropertyExpressionValue ();
_ = instance.PropertyPublicParameterlessConstructorWithExplicitAccessors;
_ = instance.PropertyPublicConstructorsWithExplicitAccessors;
_ = instance.PropertyNonPublicConstructorsWithExplicitAccessors;
instance.PropertyPublicParameterlessConstructorWithExplicitAccessors = null;
instance.PropertyPublicConstructorsWithExplicitAccessors = null;
instance.PropertyNonPublicConstructorsWithExplicitAccessors = null;
TestAutomaticPropagation ();
PropertyWithAttributeMarkingItself.Test ();
}
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type PropertyWithPublicConstructor { get; set; }
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
static Type StaticPropertyWithPublicConstructor { get; set; }
[ExpectedWarning ("IL2099", nameof (PropertyWithUnsupportedType))]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicFields)]
static object PropertyWithUnsupportedType { get; set; }
[ExpectedWarning ("IL2072", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresNonPublicConstructors))]
private void ReadFromInstanceProperty ()
{
PropertyWithPublicConstructor.RequiresPublicParameterlessConstructor ();
PropertyWithPublicConstructor.RequiresPublicConstructors ();
PropertyWithPublicConstructor.RequiresNonPublicConstructors ();
PropertyWithPublicConstructor.RequiresNone ();
}
[ExpectedWarning ("IL2072", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresNonPublicConstructors))]
private void ReadFromStaticProperty ()
{
StaticPropertyWithPublicConstructor.RequiresPublicParameterlessConstructor ();
StaticPropertyWithPublicConstructor.RequiresPublicConstructors ();
StaticPropertyWithPublicConstructor.RequiresNonPublicConstructors ();
StaticPropertyWithPublicConstructor.RequiresNone ();
}
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (PropertyWithPublicConstructor) + ".set", nameof (GetTypeWithPublicParameterlessConstructor))]
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (PropertyWithPublicConstructor) + ".set", nameof (GetTypeWithNonPublicConstructors))]
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (PropertyWithPublicConstructor) + ".set", nameof (GetUnkownType))]
private void WriteToInstanceProperty ()
{
PropertyWithPublicConstructor = GetTypeWithPublicParameterlessConstructor ();
PropertyWithPublicConstructor = GetTypeWithPublicConstructors ();
PropertyWithPublicConstructor = GetTypeWithNonPublicConstructors ();
PropertyWithPublicConstructor = GetUnkownType ();
}
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (StaticPropertyWithPublicConstructor) + ".set", nameof (GetTypeWithPublicParameterlessConstructor))]
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (StaticPropertyWithPublicConstructor) + ".set", nameof (GetTypeWithNonPublicConstructors))]
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (StaticPropertyWithPublicConstructor) + ".set", nameof (GetUnkownType))]
private void WriteToStaticProperty ()
{
StaticPropertyWithPublicConstructor = GetTypeWithPublicParameterlessConstructor ();
StaticPropertyWithPublicConstructor = GetTypeWithPublicConstructors ();
StaticPropertyWithPublicConstructor = GetTypeWithNonPublicConstructors ();
StaticPropertyWithPublicConstructor = GetUnkownType ();
}
[ExpectedWarning ("IL2072", nameof (PropertyDataFlow) + "." + nameof (StaticPropertyWithPublicConstructor) + ".set", nameof (GetTypeWithNonPublicConstructors))]
[ExpectedWarning ("IL2072", nameof (GetTypeWithNonPublicConstructors), nameof (DataFlowTypeExtensions.RequiresAll))]
private void WriteToStaticPropertyExpressionValue ()
{
(StaticPropertyWithPublicConstructor = GetTypeWithNonPublicConstructors ()).RequiresAll ();
}
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type _fieldWithPublicConstructors;
Type PropertyPublicConstructorsWithExplicitAccessors {
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
get {
return _fieldWithPublicConstructors;
}
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
set {
_fieldWithPublicConstructors = value;
}
}
Type PropertyPublicParameterlessConstructorWithExplicitAccessors {
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
get {
return _fieldWithPublicConstructors;
}
[ExpectedWarning ("IL2069", nameof (PropertyDataFlow) + "." + nameof (_fieldWithPublicConstructors),
"'value'",
nameof (PropertyPublicParameterlessConstructorWithExplicitAccessors) + ".set")]
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
set {
_fieldWithPublicConstructors = value;
}
}
Type PropertyNonPublicConstructorsWithExplicitAccessors {
[ExpectedWarning ("IL2078", nameof (PropertyDataFlow) + "." + nameof (PropertyNonPublicConstructorsWithExplicitAccessors) + ".get",
nameof (_fieldWithPublicConstructors))]
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
get {
return _fieldWithPublicConstructors;
}
[ExpectedWarning ("IL2069", nameof (PropertyDataFlow) + "." + nameof (_fieldWithPublicConstructors),
"'value'",
nameof (PropertyNonPublicConstructorsWithExplicitAccessors) + ".set")]
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
set {
_fieldWithPublicConstructors = value;
}
}
static void TestAutomaticPropagation ()
{
var instance = new TestAutomaticPropagationType ();
instance.TestImplicitProperty ();
instance.TestPropertyWithSimpleGetter ();
instance.TestPropertyWhichLooksLikeCompilerGenerated ();
instance.TestInstancePropertyWithStaticField ();
instance.TestPropertyWithDifferentBackingFields ();
instance.TestPropertyWithExistingAttributes ();
instance.TestPropertyWithConflictingAttributes ();
instance.TestPropertyWithConflictingNoneAttributes ();
instance.TestPropertyWithIndexerWithMatchingAnnotations (null);
instance.TestPropertyWithIndexerWithoutMatchingAnnotations (null);
}
class TestAutomaticPropagationType
{
// Fully implicit property should work
[ExpectedWarning ("IL2072", nameof (TestAutomaticPropagationType) + "." + nameof (ImplicitProperty) + ".set")]
public void TestImplicitProperty ()
{
ImplicitProperty.RequiresPublicConstructors ();
ImplicitProperty = GetTypeWithPublicParameterlessConstructor (); // This will warn since the setter requires public .ctors
}
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
static Type ImplicitProperty {
get; set;
}
// Simple getter is not enough - we do detect the field, but we require the field to be compiler generated for this to work
[ExpectedWarning ("IL2077", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresPublicConstructors))]
// Make sure we don't warn about the field in context of property annotation propagation.
[LogDoesNotContain ("Could not find a unique backing field for property 'System.Type Mono.Linker.Tests.Cases.DataFlow.PropertyDataFlow/TestAutomaticPropagationType::PropertyWithSimpleGetter()'")]
public void TestPropertyWithSimpleGetter ()
{
_ = PropertyWithSimpleGetter;
PropertyWithSimpleGetter_Field.RequiresPublicConstructors ();
}
static Type PropertyWithSimpleGetter_Field;
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
static Type PropertyWithSimpleGetter {
[ExpectedWarning ("IL2078", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithSimpleGetter) + ".get")]
get {
return PropertyWithSimpleGetter_Field;
}
}
// This test creates a property and field which linker will recognized as a compiler generated backing field for the property
// The purpose of the test is to verify, that linker flows the annotation to the backing field and since there's
// no good way to reference actual compiler generated backing field, we "Fake" it here as compiler generated.
// But this doesn't fool the analyzer - since it's seen as yet another user declared field, so it doesn't propagate the
// annotation.
// This discrepancy is currently by design and not worth the trouble to implement logic for it in the analyzer.
// Producing fields which are annotated with CompilerGeneratedAttribute and making them look like backing fields
// is highly unlikely to be done by anybody. If it happens, the analyzer will produce warnings which the linker will not
// but those warnings are not really wrong, so it's better if the developer fixes them anyway.
[ExpectedWarning ("IL2077", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresPublicConstructors) + "(Type)",
nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWhichLooksLikeCompilerGenerated_Field),
ProducedBy = ProducedBy.Analyzer)]
public void TestPropertyWhichLooksLikeCompilerGenerated ()
{
// If the property was correctly recognized both the property getter and the backing field should get the annotation.
PropertyWhichLooksLikeCompilerGenerated.RequiresPublicConstructors ();
PropertyWhichLooksLikeCompilerGenerated_Field.RequiresPublicConstructors ();
}
[CompilerGenerated]
private static Type PropertyWhichLooksLikeCompilerGenerated_Field;
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
static Type PropertyWhichLooksLikeCompilerGenerated {
// See above comment about fake compiler generated backing fields - this warning is expected from the analyzer
[ExpectedWarning ("IL2078", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWhichLooksLikeCompilerGenerated) + ".get",
nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWhichLooksLikeCompilerGenerated_Field),
ProducedBy = ProducedBy.Analyzer)]
get {
return PropertyWhichLooksLikeCompilerGenerated_Field;
}
}
[ExpectedWarning ("IL2077", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresPublicConstructors))]
// Make sure we don't warn about the field in context of property annotation propagation.
[LogDoesNotContain ("Could not find a unique backing field for property 'System.Type Mono.Linker.Tests.Cases.DataFlow.PropertyDataFlow/TestAutomaticPropagationType::InstancePropertyWithStaticField()'")]
public void TestInstancePropertyWithStaticField ()
{
InstancePropertyWithStaticField = null;
InstancePropertyWithStaticField_Field.RequiresPublicConstructors ();
}
[CompilerGenerated]
private static Type InstancePropertyWithStaticField_Field;
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type InstancePropertyWithStaticField {
// Nothing to warn about - the "value" is annotated with PublicConstructors and we're assigning
// it to unannotated field - that's a perfectly valid operation.
set {
InstancePropertyWithStaticField_Field = value;
}
}
public void TestPropertyWithDifferentBackingFields ()
{
_ = PropertyWithDifferentBackingFields;
}
[CompilerGenerated]
private Type PropertyWithDifferentBackingFields_GetterField;
[CompilerGenerated]
private Type PropertyWithDifferentBackingFields_SetterField;
// Analyzer doesn't try to detect backing fields of properties: https://github.com/dotnet/linker/issues/2273
[ExpectedWarning ("IL2042",
"Mono.Linker.Tests.Cases.DataFlow.PropertyDataFlow.TestAutomaticPropagationType.PropertyWithDifferentBackingFields",
ProducedBy = ProducedBy.Trimmer)]
[ExpectedWarning ("IL2078",
nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithDifferentBackingFields) + ".get",
"Type",
ProducedBy = ProducedBy.Analyzer)]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type PropertyWithDifferentBackingFields {
[ExpectedWarning ("IL2078",
nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithDifferentBackingFields) + ".get",
ProducedBy = ProducedBy.Trimmer)]
get {
return PropertyWithDifferentBackingFields_GetterField;
}
set {
PropertyWithDifferentBackingFields_SetterField = value;
}
}
public void TestPropertyWithExistingAttributes ()
{
_ = PropertyWithExistingAttributes;
PropertyWithExistingAttributes = null;
}
// Analyzer doesn't try to detect backing fields of properties: https://github.com/dotnet/linker/issues/2273
[ExpectedWarning ("IL2056", "PropertyWithExistingAttributes", "PropertyWithExistingAttributes_Field",
ProducedBy = ProducedBy.Trimmer)]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
[CompilerGenerated]
Type PropertyWithExistingAttributes_Field;
[ExpectedWarning ("IL2043", "PropertyWithExistingAttributes", "PropertyWithExistingAttributes.get", ProducedBy = ProducedBy.Analyzer)]
[ExpectedWarning ("IL2043", "PropertyWithExistingAttributes", "PropertyWithExistingAttributes.set", ProducedBy = ProducedBy.Analyzer)]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type PropertyWithExistingAttributes {
// On property/accessor mismatch, linker warns on accessor and analyzer warns on property https://github.com/dotnet/linker/issues/2654
[ExpectedWarning ("IL2043", "PropertyWithExistingAttributes", "PropertyWithExistingAttributes.get",
ProducedBy = ProducedBy.Trimmer)]
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
get { return PropertyWithExistingAttributes_Field; }
// On property/accessor mismatch, linker warns on accessor and analyzer warns on property https://github.com/dotnet/linker/issues/2654
[ExpectedWarning ("IL2043", "PropertyWithExistingAttributes", "PropertyWithExistingAttributes.set",
ProducedBy = ProducedBy.Trimmer)]
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
set { PropertyWithExistingAttributes_Field = value; }
}
// When the property annotation conflicts with the getter/setter annotation,
// we issue a warning (IL2043 below) but respect the getter/setter annotations.
[ExpectedWarning ("IL2072", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingAttributes) + ".get",
nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresPublicConstructors) + "(Type)")]
[ExpectedWarning ("IL2072", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingAttributes) + ".set",
nameof (PropertyDataFlow) + "." + nameof (GetTypeWithPublicConstructors) + "()")]
public void TestPropertyWithConflictingAttributes ()
{
PropertyWithConflictingAttributes.RequiresPublicConstructors ();
PropertyWithConflictingAttributes.RequiresNonPublicConstructors ();
PropertyWithConflictingAttributes = GetTypeWithPublicConstructors ();
PropertyWithConflictingAttributes = GetTypeWithNonPublicConstructors ();
}
// Analyzer doesn't try to detect backing fields of properties: https://github.com/dotnet/linker/issues/2273
[ExpectedWarning ("IL2056", "PropertyWithConflictingAttributes", "PropertyWithConflictingAttributes_Field",
ProducedBy = ProducedBy.Trimmer)]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
[CompilerGenerated]
Type PropertyWithConflictingAttributes_Field;
[ExpectedWarning ("IL2043", "PropertyWithConflictingAttributes", "PropertyWithConflictingAttributes.get", ProducedBy = ProducedBy.Analyzer)]
[ExpectedWarning ("IL2043", "PropertyWithConflictingAttributes", "PropertyWithConflictingAttributes.set", ProducedBy = ProducedBy.Analyzer)]
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type PropertyWithConflictingAttributes {
// On property/accessor mismatch, linker warns on accessor and analyzer warns on property https://github.com/dotnet/linker/issues/2654
[ExpectedWarning ("IL2043", "PropertyWithConflictingAttributes", "PropertyWithConflictingAttributes.get",
ProducedBy = ProducedBy.Trimmer)]
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
get { return PropertyWithConflictingAttributes_Field; }
// On property/accessor mismatch, linker warns on accessor and analyzer warns on property https://github.com/dotnet/linker/issues/2654
[ExpectedWarning ("IL2043", "PropertyWithConflictingAttributes", "PropertyWithConflictingAttributes.set",
ProducedBy = ProducedBy.Trimmer)]
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
set { PropertyWithConflictingAttributes_Field = value; }
}
// When the property annotation is DAMT.None and this conflicts with the getter/setter annotations,
// we don't produce a warning about the conflict, and just respect the property annotations.
[ExpectedWarning ("IL2072", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingNoneAttributes) + ".get",
nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresNonPublicConstructors) + "(Type)")]
[ExpectedWarning ("IL2072", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingNoneAttributes) + ".set",
nameof (PropertyDataFlow) + "." + nameof (GetTypeWithNonPublicConstructors) + "()")]
public void TestPropertyWithConflictingNoneAttributes ()
{
PropertyWithConflictingNoneAttributes.RequiresPublicConstructors ();
PropertyWithConflictingNoneAttributes.RequiresNonPublicConstructors ();
PropertyWithConflictingNoneAttributes = GetTypeWithPublicConstructors ();
PropertyWithConflictingNoneAttributes = GetTypeWithNonPublicConstructors ();
}
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.None)]
[CompilerGenerated]
Type PropertyWithConflictingNoneAttributes_Field;
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
Type PropertyWithConflictingNoneAttributes {
// See above comment about fake compiler generated backing fields - this warning is expected from analyzer
[ExpectedWarning ("IL2078", nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingNoneAttributes) + ".get",
nameof (TestAutomaticPropagationType) + "." + nameof (PropertyWithConflictingNoneAttributes_Field),
ProducedBy = ProducedBy.Analyzer)]
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.None)]
get { return PropertyWithConflictingNoneAttributes_Field; }
[param: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.None)]
set { PropertyWithConflictingNoneAttributes_Field = value; }
}
public void TestPropertyWithIndexerWithMatchingAnnotations ([DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)] Type myType)
{
var propclass = new PropertyWithIndexer ();
propclass[1] = myType;
propclass[1].RequiresPublicConstructors ();
}
// Trimmer and analyzer handle formatting of indexers differently.
[ExpectedWarning ("IL2067", nameof (PropertyWithIndexer) + ".Item.set", ProducedBy = ProducedBy.Trimmer)]
[ExpectedWarning ("IL2067", nameof (PropertyWithIndexer) + ".this[Int32].set", ProducedBy = ProducedBy.Analyzer)]
[ExpectedWarning ("IL2072", nameof (DataFlowTypeExtensions) + "." + nameof (DataFlowTypeExtensions.RequiresNonPublicConstructors) + "(Type)")]
[LogDoesNotContain ("'Value passed to parameter 'index' of method 'Mono.Linker.Tests.Cases.DataFlow.PropertyDataFlow.TestAutomaticPropagationType.PropertyWithIndexer.Item.set'")]
public void TestPropertyWithIndexerWithoutMatchingAnnotations (Type myType)
{
var propclass = new PropertyWithIndexer ();
propclass[1] = myType;
propclass[1].RequiresNonPublicConstructors ();
}
public class PropertyWithIndexer
{
Type[] Property_Field;
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
public Type this[int index] {
// Trimmer and analyzer handle formatting of indexers differently.
[ExpectedWarning ("IL2063", nameof (PropertyWithIndexer) + ".Item.get", ProducedBy = ProducedBy.Trimmer)]
[ExpectedWarning ("IL2063", nameof (PropertyWithIndexer) + ".this[Int32].get", ProducedBy = ProducedBy.Analyzer)]
get => Property_Field[index];
set => Property_Field[index] = value;
}
}
}
class PropertyWithAttributeMarkingItself
{
class AttributeRequiresAllProperties : Attribute
{
public AttributeRequiresAllProperties (
[DynamicallyAccessedMembersAttribute (DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type)
{
}
}
class TestPropertyWithAttributeMarkingSelfType
{
[AttributeRequiresAllProperties (typeof (TestPropertyWithAttributeMarkingSelfType))]
public static bool TestProperty { get; set; }
}
public static void Test ()
{
// https://github.com/dotnet/linker/issues/2196
// TestPropertyWithAttributeMarkingSelfType.TestProperty = true;
}
}
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
private static Type GetTypeWithPublicParameterlessConstructor ()
{
return null;
}
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors)]
private static Type GetTypeWithPublicConstructors ()
{
return null;
}
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicConstructors)]
private static Type GetTypeWithNonPublicConstructors ()
{
return null;
}
private static Type GetUnkownType ()
{
return null;
}
}
}
|