From c988782f7cb34a79641f1df19436b7f12cf632af Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 02:22:12 +0300 Subject: [PATCH 1/8] ATR-940: added unit test for PX1023 for PXDBPackedIntegerArrayAttribute --- .../FieldTypeAttributesOnDacPropertyTests.cs | 7 ++++- .../DacWithPXDBPackedIntegerArrayAttribute.cs | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/Sources/DacWithPXDBPackedIntegerArrayAttribute.cs diff --git a/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs index 38e56156a..827106305 100644 --- a/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs +++ b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs @@ -86,7 +86,12 @@ public virtual Task DacPropertyWithPXDBScalarAttribute(string source) => [Theory] [EmbeddedFileData("DacWithValidAggregatorAttributes.cs")] - public virtual Task DacWithValidAggregatorAttributes(string source) => + public virtual Task Dac_WithValid_AggregatorAttributes(string source) => + VerifyCSharpDiagnosticAsync(source); + + [Theory] + [EmbeddedFileData("DacWithPXDBPackedIntegerArrayAttribute.cs")] + public virtual Task Dac_WithPXDBPackedIntegerArrayAttribute(string source) => VerifyCSharpDiagnosticAsync(source); [Theory] diff --git a/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/Sources/DacWithPXDBPackedIntegerArrayAttribute.cs b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/Sources/DacWithPXDBPackedIntegerArrayAttribute.cs new file mode 100644 index 000000000..18c991e4c --- /dev/null +++ b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/Sources/DacWithPXDBPackedIntegerArrayAttribute.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using PX.Data; + +namespace PX.Objects.HackathonDemo +{ + // Acuminator disable once PX1069 MissingMandatoryDacFields No need in unit test + [PXHidden] + public class SomeDac : PXBqlTable, IBqlTable + { + #region DacID + public abstract class dacID : PX.Data.BQL.BqlInt.Field { } + + [PXDBInt] + public virtual int? DacID + { + get; + set; + } + #endregion + + #region DiscountsAppliedToLine + public abstract class discountsAppliedToLine : IBqlField { } + + [PXDBPackedIntegerArray] + public virtual ushort[]? DiscountsAppliedToLine { get; set; } + #endregion + } +} \ No newline at end of file From f82f0f0c76fa1c248431b55dd323d210eed33155 Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 02:22:49 +0300 Subject: [PATCH 2/8] ATR-940: refactoring - improved unit test names --- .../FieldTypeAttributesOnDacPropertyTests.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs index 827106305..4628ae630 100644 --- a/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs +++ b/src/Acuminator/Acuminator.Tests/Tests/StaticAnalysis/DacPropertyAttributes/FieldTypeAttributesOnDacPropertyTests.cs @@ -26,36 +26,36 @@ protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => [Theory] [EmbeddedFileData("DacWithMultipleFieldTypeAttributes.cs")] - public virtual Task PropertyWithMultipleFieldTypeAttributes(string source) => + public virtual Task Property_WithMultiple_FieldTypeAttributes(string source) => VerifyCSharpDiagnosticAsync(source, Descriptors.PX1023_MultipleTypeAttributesOnProperty.CreateFor(line: 24, column: 4), Descriptors.PX1023_MultipleTypeAttributesOnProperty.CreateFor(line: 25, column: 4)); [Theory] [EmbeddedFileData("DacWithMultipleCalcedOnDbSideAttributes.cs")] - public virtual Task PropertyWithMultipleCalcedOnDbSideAttributes(string source) => + public virtual Task Property_WithMultiple_CalcedOnDbSideAttributes(string source) => VerifyCSharpDiagnosticAsync(source, Descriptors.PX1023_MultipleCalcedOnDbSideAttributesOnProperty.CreateFor(line: 16, column: 4), Descriptors.PX1023_MultipleCalcedOnDbSideAttributesOnProperty.CreateFor(line: 17, column: 4)); [Theory] [EmbeddedFileData("DacWithMultipleFieldTypeAttributes_Expected.cs")] - public virtual Task MultipleFieldTypeAttributes_ShouldNotShowDiagnostic(string source) => + public virtual Task Multiple_FieldTypeAttributes_ShouldNotShowDiagnostic(string source) => VerifyCSharpDiagnosticAsync(source); [Theory] [EmbeddedFileData("DacWithMultipleCalcedOnDbSideAttributes_Expected.cs")] - public virtual Task MultipleCalcedOnDbSideAttributes_ShouldNotShowDiagnostic(string source) => + public virtual Task Multiple_CalcedOnDbSideAttributes_ShouldNotShowDiagnostic(string source) => VerifyCSharpDiagnosticAsync(source); [Theory] [EmbeddedFileData("DacFieldAttributesTypeMismatch_Expected.cs")] - public virtual Task DacPropertyTypeNotMatchingAttributeType_ShouldNotShowDiagnostic(string source) => + public virtual Task DacPropertyType_NotMatching_AttributeType_ShouldNotShowDiagnostic(string source) => VerifyCSharpDiagnosticAsync(source); [Theory] [EmbeddedFileData("DacFieldAttributesTypeMismatch.cs")] - public virtual Task DacPropertyTypeNotMatchingAttributeType(string source) => + public virtual Task DacPropertyType_NotMatching_AttributeType(string source) => VerifyCSharpDiagnosticAsync(source, Descriptors.PX1021_PXDBFieldAttributeNotMatchingDacProperty.CreateFor((Line: 24, Column: 4), extraLocation: (Line: 26, Column: 10)), @@ -74,14 +74,14 @@ public virtual Task DacPropertyTypeNotMatchingAttributeType(string source) => [Theory] [EmbeddedFileData("DacWithInvalidAggregatorAttributes.cs")] - public virtual Task DacPropertyWithInvalidAggregatorAttributes(string source) => + public virtual Task DacProperty_WithInvalid_AggregatorAttributes(string source) => VerifyCSharpDiagnosticAsync(source, Descriptors.PX1023_MultipleCalcedOnDbSideAttributesOnAggregators.CreateFor(line: 41, column: 4), Descriptors.PX1023_MultipleTypeAttributesOnAggregators.CreateFor(line: 55, column: 4)); [Theory] [EmbeddedFileData("DacFieldTypeMismatchPXDBScalarAttr.cs")] - public virtual Task DacPropertyWithPXDBScalarAttribute(string source) => + public virtual Task DacProperty_WithPXDBScalarAttribute(string source) => VerifyCSharpDiagnosticAsync(source); [Theory] @@ -96,7 +96,7 @@ public virtual Task Dac_WithPXDBPackedIntegerArrayAttribute(string source) => [Theory] [EmbeddedFileData("DacFieldWithINUnitAttribute.cs")] - public virtual Task DacFieldWithINUnitAttribute(string source) => + public virtual Task DacField_WithINUnitAttribute(string source) => VerifyCSharpDiagnosticAsync(source); } } From a1a717cc79d8bcdbcc7a47bc4a4b0dcd5a6c7dde Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 02:54:22 +0300 Subject: [PATCH 3/8] ATR-940: added more well known non-data type attributes --- .../PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs index 040cf8ed2..18985183f 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs @@ -298,6 +298,11 @@ private static ImmutableArray GetWellKnownNonDataTypeAttributes(PXC wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXIntListAttribute.Type); wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXSelectorAttribute.Type); wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXForeignReferenceAttribute); + wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXParentAttribute); + wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXDBDefaultAttribute); + + if (pxContext.AttributeTypes.AutoNumberAttribute.IsDefined) + wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.AutoNumberAttribute.Type!); return wellKnownNonDataTypeAttributes.ToImmutable(); } From f351de188ef3e1c16e5465eac3f9c3ff2f7960af Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 03:00:36 +0300 Subject: [PATCH 4/8] ATR-940: added well known special data type attributes --- .../FieldTypeAttributesMetadataProvider.cs | 26 ++++++++++++++++++- .../Attributes/DataTypeAttributeSymbols.cs | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs index 18985183f..2ec40745e 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs @@ -30,6 +30,8 @@ public class FieldTypeAttributesMetadataProvider public ImmutableArray WellKnownNonDataTypeAttributes { get; } + public ImmutableDictionary MetadataForWellKnownSpecialDataTypeAttributes { get; } + private readonly INamedTypeSymbol _pxDBCalcedAttribute; private readonly INamedTypeSymbol _pxDBScalarAttribute; private readonly INamedTypeSymbol _pxDBFieldAttribute; @@ -59,6 +61,7 @@ public FieldTypeAttributesMetadataProvider(PXContext pxContext) .ToImmutableArray(); WellKnownNonDataTypeAttributes = GetWellKnownNonDataTypeAttributes(_pxContext); + MetadataForWellKnownSpecialDataTypeAttributes = GetMetadataForWellKnownSpecialDataTypeAttributes(_pxContext); } public bool IsWellKnownNonDataTypeAttribute(ITypeSymbol attribute) @@ -290,7 +293,7 @@ private static IEnumerable GetDacFieldTypeAttribu private static ImmutableArray GetWellKnownNonDataTypeAttributes(PXContext pxContext) { - var wellKnownNonDataTypeAttributes = ImmutableArray.CreateBuilder(initialCapacity: 6); + var wellKnownNonDataTypeAttributes = ImmutableArray.CreateBuilder(initialCapacity: 9); wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXUIFieldAttribute.Type); wellKnownNonDataTypeAttributes.Add(pxContext.AttributeTypes.PXDefaultAttribute); @@ -306,5 +309,26 @@ private static ImmutableArray GetWellKnownNonDataTypeAttributes(PXC return wellKnownNonDataTypeAttributes.ToImmutable(); } + + private static ImmutableDictionary GetMetadataForWellKnownSpecialDataTypeAttributes(PXContext pxContext) + { + ImmutableDictionary? metadataForWellKnownSpecialDataTypeAttributes = null; + var packagedIntegerAttribute = pxContext.FieldAttributes.PXDBPackedIntegerArrayAttribute; + + if (packagedIntegerAttribute != null) + { + // PXDBPackedIntegerArrayAttribute is a special attribute wrote in a very hacky way. + // It derives from PXDBBinaryAttribute which works with byte[] but in reality PXDBPackedIntegerArrayAttribute works with ushort[]. + // This breaks Acumatica design principle where derived attribute work on properties with the same property type as their base attribute. + // Thus, the attribute needs special handling in Acuminator. + var packedIntegerMetadata = new DataTypeAttributeInfo(FieldTypeAttributeKind.BoundTypeAttribute, packagedIntegerAttribute, + pxContext.SystemTypes.UInt16Array); + metadataForWellKnownSpecialDataTypeAttributes = + ImmutableDictionary.CreateRange(SymbolEqualityComparer.Default, + new[] { KeyValuePair.Create(packagedIntegerAttribute as ITypeSymbol, packedIntegerMetadata) }); + } + + return metadataForWellKnownSpecialDataTypeAttributes ?? ImmutableDictionary.Empty; + } } } \ No newline at end of file diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs index b493a7bc8..f03ed112b 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs @@ -49,7 +49,7 @@ public class DataTypeAttributeSymbols : SymbolsSetBase public INamedTypeSymbol PXDBLongIdentityAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBLongIdentityAttribute)!; public INamedTypeSymbol PXDBBinaryAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBBinaryAttribute)!; - public INamedTypeSymbol PXDBPackedIntegerArrayAttribute => + public INamedTypeSymbol? PXDBPackedIntegerArrayAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBPackedIntegerArrayAttributeFullName_Acumatica2018R2)!; public INamedTypeSymbol PXDBUserPasswordAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBUserPasswordAttribute)!; From e472cc5c002cc9c2ee100c10bd438fe8e32d7013 Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 04:52:00 +0300 Subject: [PATCH 5/8] ATR-940: integrated well known special data type attributes register into the algorithm determining data type attribute's metadata --- .../FieldTypeAttributesMetadataProvider.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs index 2ec40745e..79e1b1c1c 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs @@ -5,7 +5,6 @@ using Acuminator.Utilities.Common; using Acuminator.Utilities.Roslyn.Semantic; -using Acuminator.Utilities.Roslyn.Semantic.Attribute; using Microsoft.CodeAnalysis; @@ -93,6 +92,11 @@ internal IReadOnlyCollection GetDacFieldTypeAttributeInfo if (flattenedAttributes.Count == 0) return []; + var metadataForWellKnownSpecialDataTypeAttribute = TryGetMetadataForWellKnownSpecialDataTypeAttribute(originalAttribute); + + if (metadataForWellKnownSpecialDataTypeAttribute != null) + return [metadataForWellKnownSpecialDataTypeAttribute]; + var mixedDbBoundnessAttributeInfos = GetMixedDbBoundnessAttributeInfosInFlattenedSet(originalAttribute, flattenedAttributes); bool hasMixedBoundnessAttributes = mixedDbBoundnessAttributeInfos?.Count > 0; var typeAttributeInfos = hasMixedBoundnessAttributes @@ -130,6 +134,27 @@ internal IReadOnlyCollection GetDacFieldTypeAttributeInfo return typeAttributeInfos as IReadOnlyCollection ?? []; } + private DataTypeAttributeInfo? TryGetMetadataForWellKnownSpecialDataTypeAttribute(ITypeSymbol attribute) + { + if (MetadataForWellKnownSpecialDataTypeAttributes.Count == 0) + return null; + else if (MetadataForWellKnownSpecialDataTypeAttributes.TryGetValue(attribute, out var metadata)) + return metadata; + + var baseAttributeTypes = attribute.GetBaseTypes(); + + foreach (ITypeSymbol baseAttributeType in baseAttributeTypes) + { + if (baseAttributeType.SpecialType == SpecialType.System_Object) + return null; + + if (MetadataForWellKnownSpecialDataTypeAttributes.TryGetValue(baseAttributeType, out var metadata)) + return metadata; + } + + return null; + } + /// /// Gets mixed database boundness attribute infos in the flattened set with consideration of type hierarchy.
/// If there are multiple mixed boundness attributes in the type hierarchy then only the most derived one should be included into results
From 2a6d2542b3885b6b54d93c2d3e40f26abecada40 Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 02:59:46 +0100 Subject: [PATCH 6/8] ATR-940: implemeted AI suggestion Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs index f03ed112b..a647feffc 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/Semantic/Symbols/Attributes/DataTypeAttributeSymbols.cs @@ -50,7 +50,7 @@ public class DataTypeAttributeSymbols : SymbolsSetBase public INamedTypeSymbol PXDBBinaryAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBBinaryAttribute)!; public INamedTypeSymbol? PXDBPackedIntegerArrayAttribute => - Compilation.GetTypeByMetadataName(TypeFullNames.PXDBPackedIntegerArrayAttributeFullName_Acumatica2018R2)!; + Compilation.GetTypeByMetadataName(TypeFullNames.PXDBPackedIntegerArrayAttributeFullName_Acumatica2018R2); public INamedTypeSymbol PXDBUserPasswordAttribute => Compilation.GetTypeByMetadataName(TypeFullNames.PXDBUserPasswordAttribute)!; From 0d97cc81138b7636919aaa611fdde575c5cedc82 Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 05:04:33 +0300 Subject: [PATCH 7/8] ATR-940: refactoring - fixed local variable name based on AI remark --- .../FieldTypeAttributesMetadataProvider.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs index 79e1b1c1c..a7a12bce2 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs @@ -283,11 +283,11 @@ private bool DacFieldTypeAttributeCapturedByMixedBoundnessAttributesTypeHierarch { pxContext.FieldAttributes.PXDBDataLengthAttribute, pxContext.SystemTypes.Int64 }, }; - var packagedIntegerAttribute = pxContext.FieldAttributes.PXDBPackedIntegerArrayAttribute; + var packedIntegerAttribute = pxContext.FieldAttributes.PXDBPackedIntegerArrayAttribute; - if (packagedIntegerAttribute != null) + if (packedIntegerAttribute != null) { - types.Add(packagedIntegerAttribute, pxContext.SystemTypes.UInt16Array); + types.Add(packedIntegerAttribute, pxContext.SystemTypes.UInt16Array); } return types; @@ -338,19 +338,19 @@ private static ImmutableArray GetWellKnownNonDataTypeAttributes(PXC private static ImmutableDictionary GetMetadataForWellKnownSpecialDataTypeAttributes(PXContext pxContext) { ImmutableDictionary? metadataForWellKnownSpecialDataTypeAttributes = null; - var packagedIntegerAttribute = pxContext.FieldAttributes.PXDBPackedIntegerArrayAttribute; + var packedIntegerAttribute = pxContext.FieldAttributes.PXDBPackedIntegerArrayAttribute; - if (packagedIntegerAttribute != null) + if (packedIntegerAttribute != null) { // PXDBPackedIntegerArrayAttribute is a special attribute wrote in a very hacky way. // It derives from PXDBBinaryAttribute which works with byte[] but in reality PXDBPackedIntegerArrayAttribute works with ushort[]. // This breaks Acumatica design principle where derived attribute work on properties with the same property type as their base attribute. // Thus, the attribute needs special handling in Acuminator. - var packedIntegerMetadata = new DataTypeAttributeInfo(FieldTypeAttributeKind.BoundTypeAttribute, packagedIntegerAttribute, + var packedIntegerMetadata = new DataTypeAttributeInfo(FieldTypeAttributeKind.BoundTypeAttribute, packedIntegerAttribute, pxContext.SystemTypes.UInt16Array); metadataForWellKnownSpecialDataTypeAttributes = ImmutableDictionary.CreateRange(SymbolEqualityComparer.Default, - new[] { KeyValuePair.Create(packagedIntegerAttribute as ITypeSymbol, packedIntegerMetadata) }); + new[] { KeyValuePair.Create(packedIntegerAttribute as ITypeSymbol, packedIntegerMetadata) }); } return metadataForWellKnownSpecialDataTypeAttributes ?? ImmutableDictionary.Empty; From 0d63d170f176948d3ff6189ad6b891ec75bb8363 Mon Sep 17 00:00:00 2001 From: Sergey Nikomarov Date: Fri, 16 Jan 2026 03:06:09 +0100 Subject: [PATCH 8/8] ATR-940: fixed comment based on AI remark Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs index a7a12bce2..a9394f0f4 100644 --- a/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs +++ b/src/Acuminator/Acuminator.Utilities/Roslyn/PXFieldAttributes/FieldTypeAttributesMetadataProvider.cs @@ -342,7 +342,7 @@ private static ImmutableDictionary GetMetada if (packedIntegerAttribute != null) { - // PXDBPackedIntegerArrayAttribute is a special attribute wrote in a very hacky way. + // PXDBPackedIntegerArrayAttribute is a special attribute written in a very hacky way. // It derives from PXDBBinaryAttribute which works with byte[] but in reality PXDBPackedIntegerArrayAttribute works with ushort[]. // This breaks Acumatica design principle where derived attribute work on properties with the same property type as their base attribute. // Thus, the attribute needs special handling in Acuminator.