Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] impossibility to define an array from any index other than zero #184

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pack-only.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# run build

dotnet run --project cake/Build.csproj --do-test false --do-pack true --do-publish false --test-level 1
dotnet run --project cake/Build.csproj --do-pack --test-level 1
exit $LASTEXITCODE;
2 changes: 1 addition & 1 deletion publish-no-tests.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# run build

dotnet run --project cake/Build.csproj --do-test false --do-pack true --do-publish true --test-level 1
dotnet run --project cake/Build.csproj --do-pack --do-publish --test-level 1
exit $LASTEXITCODE;
2 changes: 1 addition & 1 deletion publish.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# run build

dotnet run --project cake/Build.csproj --do-test true --do-pack true --do-publish true --test-level 100
dotnet run --project cake/Build.csproj --do-test --do-pack --do-publish --test-level 100
exit $LASTEXITCODE;
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,21 @@ private static bool IsToBeOmitted(this IStorageDeclaration fieldDeclaration, ISo
/// <returns></returns>
public static bool IsTypeEligibleForTranspile(this ITypeDeclaration typeDeclaration, ISourceBuilder sourceBuilder)
{
return !(typeDeclaration is IReferenceTypeDeclaration)
&&
(typeDeclaration is IScalarTypeDeclaration ||
typeDeclaration is IStringTypeDeclaration ||
typeDeclaration is IStructuredTypeDeclaration ||
typeDeclaration is INamedValueTypeDeclaration ||
sourceBuilder.Compilation.GetSemanticTree().Types.Any(p => p.FullyQualifiedName == typeDeclaration.FullyQualifiedName))
;
var asArray = typeDeclaration as IArrayTypeDeclaration;
var singleDimensionalArray = asArray is null || asArray.Dimensions.Count == 1;


var isEligibleType = !(typeDeclaration is IReferenceTypeDeclaration)
&&
(typeDeclaration is IScalarTypeDeclaration ||
typeDeclaration is IStringTypeDeclaration ||
typeDeclaration is IStructuredTypeDeclaration ||
typeDeclaration is INamedValueTypeDeclaration ||
sourceBuilder.Compilation.GetSemanticTree().Types.Any(p =>
p.FullyQualifiedName == typeDeclaration.FullyQualifiedName));

return isEligibleType && singleDimensionalArray;

}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ private void AddArrayMemberInitialization(IArrayTypeDeclaration type, IFieldDecl
type.Accept(visitor, this);
AddToSource(";");


AddToSource($"{typeof(Arrays).n()}.InstantiateArray({field.Name}, " +
"this, " +
$"\"{field.GetAttributeNameValue(field.Name)}\", " +
Expand All @@ -250,7 +250,18 @@ private void AddArrayMemberInitialization(IArrayTypeDeclaration type, IFieldDecl
break;
}

AddToSource("(p, rt, st));");
var dimensions = "new[] {";
foreach (var dimension in type.Dimensions)
{
dimensions = $"{dimensions}({dimension.LowerBoundValue}, {dimension.UpperBoundValue})";
}

dimensions = $"{dimensions}}}";

AddToSource($"(p, rt, st), {dimensions});");



}

private void AddMemberInitialization(IClassDeclaration type, IFieldDeclaration field, IxNodeVisitor visitor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ public array_declaration_class(AXSharp.Connector.ITwinObject parent, string read
HumanReadable = AXSharp.Connector.Connector.CreateHumanReadable(parent.HumanReadable, readableTail);
PreConstruct(parent, readableTail, symbolTail);
primitive = new OnlinerInt[100];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(primitive, this, "primitive", "primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateINT(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(primitive, this, "primitive", "primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateINT(p, rt, st), new[]{(1, 100)});
complex = new ArrayDeclarationSimpleNamespace.some_complex_type[100];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(complex, this, "complex", "complex", (p, rt, st) => new ArrayDeclarationSimpleNamespace.some_complex_type(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(complex, this, "complex", "complex", (p, rt, st) => new ArrayDeclarationSimpleNamespace.some_complex_type(p, rt, st), new[]{(1, 100)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public ClassWithArrays(AXSharp.Connector.ITwinObject parent, string readableTail
PreConstruct(parent, readableTail, symbolTail);
_must_be_omitted_in_poco = new CompilerOmmits.Complex(this, "_must_be_omitted_in_poco", "_must_be_omitted_in_poco");
_primitive = new OnlinerByte[11];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st), new[]{(0, 10)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down Expand Up @@ -1154,9 +1154,9 @@ public ClassWithArrays(AXSharp.Connector.ITwinObject parent, string readableTail
HumanReadable = AXSharp.Connector.Connector.CreateHumanReadable(parent.HumanReadable, readableTail);
PreConstruct(parent, readableTail, symbolTail);
_complexKnown = new UnknownArraysShouldNotBeTraspiled.Complex[11];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_complexKnown, this, "_complexKnown", "_complexKnown", (p, rt, st) => new UnknownArraysShouldNotBeTraspiled.Complex(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_complexKnown, this, "_complexKnown", "_complexKnown", (p, rt, st) => new UnknownArraysShouldNotBeTraspiled.Complex(p, rt, st), new[]{(0, 10)});
_primitive = new OnlinerByte[11];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st), new[]{(0, 10)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -829,9 +829,9 @@ public ClassWithArrays(AXSharp.Connector.ITwinObject parent, string readableTail
HumanReadable = AXSharp.Connector.Connector.CreateHumanReadable(parent.HumanReadable, readableTail);
PreConstruct(parent, readableTail, symbolTail);
_complexKnown = new UnknownArraysShouldNotBeTraspiled.Complex[11];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_complexKnown, this, "_complexKnown", "_complexKnown", (p, rt, st) => new UnknownArraysShouldNotBeTraspiled.Complex(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_complexKnown, this, "_complexKnown", "_complexKnown", (p, rt, st) => new UnknownArraysShouldNotBeTraspiled.Complex(p, rt, st), new[]{(0, 10)});
_primitive = new OnlinerByte[11];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(_primitive, this, "_primitive", "_primitive", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st), new[]{(0, 10)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ NAMESPACE ArrayDeclarationSimpleNamespace
VAR PUBLIC
primitive : ARRAY[1..100] OF INT;
complex : ARRAY[1..100] OF some_complex_type;
// multidimensional arrays should not be transpiled
complex_multidim : ARRAY[1..100, 0..30] OF some_complex_type;
primitive_multidim : ARRAY[1..100, 0..100, 0..300] OF INT;
END_VAR
END_CLASS

Expand Down
121 changes: 17 additions & 104 deletions src/AXSharp.connectors/src/AXSharp.Connector/BuilderHelpers/Arrays.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,6 @@ namespace AXSharp.Connector.BuilderHelpers;
/// </summary>
public static class Arrays
{
private static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
var array = Array.CreateInstance(type, lengths[index]);
var elementType = type.GetElementType();

if (elementType != null)
for (var i = 0; i < lengths[index]; i++)
array.SetValue(
InitializeJaggedArray(elementType, index + 1, lengths), i);

return array;
}

/// <summary>
/// Instantiates an array.
/// </summary>
Expand All @@ -42,112 +29,38 @@ private static object InitializeJaggedArray(Type type, int index, int[] lengths)
/// <param name="readableTail">Human readable tail.</param>
/// <param name="symbolTail">Symbol tail.</param>
/// <param name="initializer">Intializes</param>
// [Obsolete("Internal use only")]
[Obsolete("Internal use only")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static void InstantiateArray(Array array,
ITwinObject parent,
string readableTail,
string symbolTail,
Func<ITwinObject, string, string, object> initializer)
{
foreach (var element in GetIndices(array))
{
var indiceAsString = GetIndicesAsString(element);
var a = initializer(parent,
$"{readableTail}{indiceAsString}",
$"{symbolTail}{indiceAsString}");
array.SetValue(a, element);
}
}

/// <summary>
/// Gets index of an array as string.[Internal use only]
/// </summary>
/// <param name="index">Array index.</param>
/// <returns>String representation of index</returns>
//[Obsolete("Internal use only")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static string GetIndicesAsString(int[] index)
{
var ind = string.Empty;

foreach (var a in index)
{
var b = a == -1 ? 0 : a;
ind = string.IsNullOrEmpty(ind) ? $"[{b}" : $"{ind},{b}";
}

ind = $"{ind}]";

return ind;
}


/// <summary>
/// Creates list of indicies of give array.
/// </summary>
/// <param name="array">Array from which indiecies are being created.</param>
/// <returns></returns>
//[Obsolete("Internal use only")]
[EditorBrowsable(EditorBrowsableState.Never)]
public static int[][] GetIndices(Array array)
Func<ITwinObject, string, string, object> initializer,
IEnumerable<(int LowerBound, int UpperBound)> arrayBounds)
{
var arrays = EmptyDimensions(array);

// Add first dimension
var arrayIndex = 0;
var rank = 0;
for (var dimension = 0; dimension <= array.GetUpperBound(rank); dimension++)
{
arrays[dimension][0] = dimension;
arrayIndex = dimension;
}
var indice = string.Empty;
var arrayFieldIndex = 0;

// Add from second dimension on
for (rank = 1; rank < array.Rank; rank++)
// Rank
foreach (var rank in arrayBounds)
{
var filled = arrays.TakeWhile(p => p[0] != -1).ToArray();
indice = string.IsNullOrEmpty(indice) ? string.Empty : $"{indice},";

for (var dimension = 0; dimension <= array.GetUpperBound(rank); dimension++)
// Index
for (int index = rank.LowerBound; index <= rank.UpperBound; index++)
{
// do not add 0 dimension that has been already added in the previous iteration.
if (dimension == 0)
continue;
var currentIndice = $"{indice}{index}";
var a = initializer(parent,
$"{readableTail}[{currentIndice}]",
$"{symbolTail}[{currentIndice}]");

// Copy previous array items
foreach (var item in filled)
{
arrayIndex++;
item.CopyTo(arrays[arrayIndex], 0);
arrays[arrayIndex][rank] = dimension;
}
array.SetValue(a, arrayFieldIndex++);
}
}

for (var ari = 0; ari < arrays.Length; ari++)
for (var rnk = 0; rnk < arrays[ari].Length; rnk++)
arrays[ari][rnk] = arrays[ari][rnk] == -1 ? 0 : arrays[ari][rnk];

return arrays;
}

private static int[][] EmptyDimensions(Array array)
private static int GetNumberOfElements((int LowerBound, int UpperBound) bounds)
{
var emptyDimensions = new List<List<int>>();

var numberOfElements = 1;
for (var rank = 0; rank < array.Rank; rank++)
numberOfElements = numberOfElements * (array.GetUpperBound(rank) + 1);

for (var i = 0; i < numberOfElements; i++)
{
var n = new List<int>();
for (var rank = 0; rank < array.Rank; rank++) n.Add(-1);

emptyDimensions.Add(n);
}

var arrays = emptyDimensions.Select(a => a.ToArray()).ToArray();
return arrays;
return bounds.LowerBound == 0 ? bounds.UpperBound + 1 : bounds.UpperBound - bounds.LowerBound;
}
}
2 changes: 2 additions & 0 deletions src/tests.integrations/integrated/src/ax/src/configuration.st
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ CONFIGURATION MyConfiguration
p_plain_shadow: all_primitives;

StartPolling_should_update_cyclic_property : RealMonsterData.RealMonster;

GH_ISSUE_183 : GH_ISSUE_183.GH_ISSUE_183_1;
END_VAR
END_CONFIGURATION

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
NAMESPACE GH_ISSUE_183
CLASS GH_ISSUE_183_1
VAR PUBLIC
NonZeroBasedArray : ARRAY[10..30] OF BYTE;
END_VAR
END_CLASS
END_NAMESPACE
3 changes: 2 additions & 1 deletion src/tests.integrations/integrated/src/ax/src/program.st
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
PROGRAM MyProgram
VAR_EXTERNAL
StartPolling_should_update_cyclic_property : RealMonsterData.RealMonster;
StartPolling_should_update_cyclic_property : RealMonsterData.RealMonster;
GH_ISSUE_183 : GH_ISSUE_183.GH_ISSUE_183_1;
END_VAR
StartPolling_should_update_cyclic_property.Id := StartPolling_should_update_cyclic_property.Id + ULINT#1;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public partial class integratedTwinController : ITwinController

public RealMonsterData.RealMonster StartPolling_should_update_cyclic_property { get; }

public GH_ISSUE_183.GH_ISSUE_183_1 GH_ISSUE_183 { get; }

public integratedTwinController(AXSharp.Connector.ConnectorAdapter adapter, object[] parameters)
{
this.Connector = adapter.GetConnector(parameters);
Expand Down Expand Up @@ -102,6 +104,7 @@ public integratedTwinController(AXSharp.Connector.ConnectorAdapter adapter, obje
p_shadow_plain = new all_primitives(this.Connector, "", "p_shadow_plain");
p_plain_shadow = new all_primitives(this.Connector, "", "p_plain_shadow");
StartPolling_should_update_cyclic_property = new RealMonsterData.RealMonster(this.Connector, "", "StartPolling_should_update_cyclic_property");
GH_ISSUE_183 = new GH_ISSUE_183.GH_ISSUE_183_1(this.Connector, "", "GH_ISSUE_183");
}

public integratedTwinController(AXSharp.Connector.ConnectorAdapter adapter)
Expand Down Expand Up @@ -137,6 +140,7 @@ public integratedTwinController(AXSharp.Connector.ConnectorAdapter adapter)
p_shadow_plain = new all_primitives(this.Connector, "", "p_shadow_plain");
p_plain_shadow = new all_primitives(this.Connector, "", "p_plain_shadow");
StartPolling_should_update_cyclic_property = new RealMonsterData.RealMonster(this.Connector, "", "StartPolling_should_update_cyclic_property");
GH_ISSUE_183 = new GH_ISSUE_183.GH_ISSUE_183_1(this.Connector, "", "GH_ISSUE_183");
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public MonsterBase(AXSharp.Connector.ITwinObject parent, string readableTail, st
Description = @Connector.ConnectorAdapter.AdapterFactory.CreateSTRING(this, "Description", "Description");
Id = @Connector.ConnectorAdapter.AdapterFactory.CreateULINT(this, "Id", "Id");
ArrayOfBytes = new OnlinerByte[4];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfBytes, this, "ArrayOfBytes", "ArrayOfBytes", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfBytes, this, "ArrayOfBytes", "ArrayOfBytes", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st), new[]{(0, 3)});
ArrayOfDrives = new MonsterData.DriveBase[4];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfDrives, this, "ArrayOfDrives", "ArrayOfDrives", (p, rt, st) => new MonsterData.DriveBase(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfDrives, this, "ArrayOfDrives", "ArrayOfDrives", (p, rt, st) => new MonsterData.DriveBase(p, rt, st), new[]{(0, 3)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ public RealMonsterBase(AXSharp.Connector.ITwinObject parent, string readableTail
TestDateTime = @Connector.ConnectorAdapter.AdapterFactory.CreateDATE_AND_TIME(this, "TestDateTime", "TestDateTime");
TestTimeSpan = @Connector.ConnectorAdapter.AdapterFactory.CreateTIME_OF_DAY(this, "TestTimeSpan", "TestTimeSpan");
ArrayOfBytes = new OnlinerByte[4];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfBytes, this, "ArrayOfBytes", "ArrayOfBytes", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfBytes, this, "ArrayOfBytes", "ArrayOfBytes", (p, rt, st) => @Connector.ConnectorAdapter.AdapterFactory.CreateBYTE(p, rt, st), new[]{(0, 3)});
ArrayOfDrives = new RealMonsterData.DriveBaseNested[4];
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfDrives, this, "ArrayOfDrives", "ArrayOfDrives", (p, rt, st) => new RealMonsterData.DriveBaseNested(p, rt, st));
AXSharp.Connector.BuilderHelpers.Arrays.InstantiateArray(ArrayOfDrives, this, "ArrayOfDrives", "ArrayOfDrives", (p, rt, st) => new RealMonsterData.DriveBaseNested(p, rt, st), new[]{(0, 3)});
parent.AddChild(this);
parent.AddKid(this);
PostConstruct(parent, readableTail, symbolTail);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public partial class integratedTwinController
public all_primitives p_shadow_plain { get; set; } = new all_primitives();
public all_primitives p_plain_shadow { get; set; } = new all_primitives();
public RealMonsterData.RealMonster StartPolling_should_update_cyclic_property { get; set; } = new RealMonsterData.RealMonster();
public GH_ISSUE_183.GH_ISSUE_183_1 GH_ISSUE_183 { get; set; } = new GH_ISSUE_183.GH_ISSUE_183_1();
}

public partial class Pokus : AXSharp.Connector.IPlain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,7 @@
<ProjectReference Include="..\..\..\..\AXSharp.connectors\src\AXSharp.Connector.S71500.WebAPI\AXSharp.Connector.S71500.WebAPI.csproj" />
<ProjectReference Include="..\..\..\..\AXSharp.connectors\src\AXSharp.Connector\AXSharp.Connector.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include=".g\Onliners\issues\" />
</ItemGroup>
</Project>
Loading