Skip to content

Commit e6d156f

Browse files
committed
Merge branch 'dev-mirage' of https://github.com/Inxton/axsharp into dev-mirage
2 parents 5109039 + b0c7481 commit e6d156f

File tree

4 files changed

+43
-29
lines changed

4 files changed

+43
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ This project is under development; however, we are [releasing versions](https://
2020

2121
All versions released with a major version number `0` (e.g. 0.10.0) can have breaking changes to the previous version at any moment. Stable versions will be released with a major version number greater than `0` (e.g. 1.2.1).
2222

23-
We plan to have production-ready libraries and tools in early spring 2024, that will cover:
23+
We plan to have production-ready libraries and tools in early spring 2026, that will cover:
2424

2525
- compiler for building .NET twin object (ix compiler)
2626
- communication layer between .NET twin objects and S71500 series PLCs

src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Helpers/SemanticsHelpers.cs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,30 @@ public static class SemanticsHelpers
2828
/// <param name="field">Field declaration</param>
2929
/// <param name="sourceBuilder">Source builder</param>
3030
/// <param name="coBuilder">Lateral builder signature</param>
31+
/// <param name="warnMissingOrInconsistent">Issues warning when the type is eligible but not available.</param>
3132
/// <returns>True when the member is eligible for generation.</returns>
32-
public static (bool isEligible, ITypeDeclaration eligibleType) IsMemberEligibleForTranspile(this IFieldDeclaration field, ISourceBuilder sourceBuilder, string coBuilder = "")
33+
public static (bool isEligible, ITypeDeclaration eligibleType) IsMemberEligibleForTranspile(this IFieldDeclaration field, ISourceBuilder sourceBuilder,
34+
string coBuilder = "", bool warnMissingOrInconsistent = false)
3335
{
34-
var eligibility = field.IsEligibleForTranspile(sourceBuilder);
36+
var eligibility = field.IsEligibleForTranspile(sourceBuilder, warnMissingOrInconsistent);
3537
var isEligible = (field.AccessModifier == AccessModifier.Public
3638
&& eligibility.isEligibe
3739
&& !IsToBeOmitted(field, sourceBuilder, coBuilder));
3840

3941
return (isEligible, eligibility.eligibleType);
4042
}
41-
43+
4244

4345
/// <summary>
4446
/// Finds type declaration.
4547
/// </summary>
4648
/// <param name="compilation">Compilation object</param>
4749
/// <param name="typeAccess">Required type</param>
50+
/// <param name="warnMissingOrInconsistent">Will report missing type.</param>
4851
/// <returns>Required type if found.</returns>
49-
public static ITypeDeclaration FindTypeDeclaration(this Compilation compilation, AX.ST.Semantic.Model.ISemanticTypeAccess? typeAccess)
52+
public static ITypeDeclaration FindTypeDeclaration
53+
(this Compilation compilation, AX.ST.Semantic.Model.ISemanticTypeAccess? typeAccess,
54+
bool warnMissingOrInconsistent = false)
5055
{
5156
if (typeAccess == null)
5257
return null;
@@ -82,14 +87,14 @@ public static ITypeDeclaration FindTypeDeclaration(this Compilation compilation,
8287
var span = typeAccess?.Location?.GetLineSpan();
8388
var line = span.Value.StartLinePosition.Line;
8489
var character = span.Value.StartLinePosition.Character;
85-
if (candidates.Count() == 0)
90+
if (candidates.Count() == 0 && warnMissingOrInconsistent)
8691
{
87-
Log.Logger.Warning($"{span?.Filename}({line}:{character}) : Type '{typeAccess.TypeSymbol.Name}' not found the type may not be eligible for transpile or meta information is not available because this type is not defined in AX# compliant project. ");
92+
Log.Logger.Warning($"{span?.Filename}({line}:{character}) : Type '{typeAccess.TypeSymbol.Name}' not found. The type may not be eligible for transpile or meta information is not available because this type is not defined in AX# compliant project.");
8893
}
8994

90-
if (candidates.Count() > 1)
95+
if (candidates.Count() > 1 && warnMissingOrInconsistent)
9196
{
92-
Log.Logger.Warning($"{span?.Filename}({line}:{character}) : Multiple types found for '{typeAccess.TypeSymbol.Name}' the declaration appears ambiguous. You may need to fully qualify the declaration.");
97+
Log.Logger.Warning($"{span?.Filename}({line}:{character}) : Multiple types found for '{typeAccess.TypeSymbol.Name}'. The declaration appears ambiguous. You may need to fully qualify the declaration.");
9398
}
9499
}
95100
catch
@@ -101,7 +106,8 @@ public static ITypeDeclaration FindTypeDeclaration(this Compilation compilation,
101106
return null;
102107
}
103108

104-
public static ITypeDeclaration FindTypeDeclaration(this Compilation compilation, IDeclaration? typeAccess)
109+
private static ITypeDeclaration FindTypeDeclaration(this Compilation compilation, IDeclaration? typeAccess,
110+
bool warnMissingOrInconsistent = false)
105111
{
106112
// This is to resolve fully qualified type name when the type cannot be determined propeprly form the semantic tree.
107113
// TODO: This workaround should be removed once we can properly use project dependencies in the stc.
@@ -123,20 +129,20 @@ public static ITypeDeclaration FindTypeDeclaration(this Compilation compilation,
123129
return candidates.First();
124130
}
125131

126-
if (candidates.Count() == 0)
132+
if (candidates.Count() == 0 && warnMissingOrInconsistent)
127133
{
128134
Log.Logger.Warning($"Type '{typeAccess?.ToString()}' not found in the semantic tree. {typeAccess?.Location}");
129135
}
130136

131-
if (candidates.Count() > 1)
137+
if (candidates.Count() > 1 && warnMissingOrInconsistent)
132138
{
133139
Log.Logger.Warning($"Multiple types found for '{typeAccess?.ToString()}' in the semantic tree. You may need to fully qualify the declaration.");
134140
}
135141

136142
return null;
137143
}
138144

139-
public static string? DetermineFullyQualifiedName(this AX.ST.Semantic.Model.ISemanticTypeAccess declaration, Compilation compilation)
145+
private static string? DetermineFullyQualifiedName(this AX.ST.Semantic.Model.ISemanticTypeAccess declaration, Compilation compilation)
140146
{
141147
return compilation.FindTypeDeclaration(declaration)?.FullyQualifiedName;
142148
}
@@ -184,7 +190,7 @@ public static void AddFullyQualifiedName(this IDeclaration declaration, Compilat
184190
/// <param name="declaration">Field declaration</param>
185191
/// <param name="compilation">Compilation object.</param>
186192
/// <returns>Fully qualified name of the declaration.</returns>
187-
public static string? DetermineFullyQualifiedName(this IFieldDeclaration declaration, Compilation compilation)
193+
private static string? DetermineFullyQualifiedName(this IFieldDeclaration declaration, Compilation compilation)
188194
{
189195
return compilation.FindTypeDeclaration(declaration.TypeAccess)?.FullyQualifiedName;
190196
}
@@ -195,7 +201,7 @@ public static void AddFullyQualifiedName(this IDeclaration declaration, Compilat
195201
/// <param name="declaration">Variable declaration</param>
196202
/// <param name="compilation">Compilation object.</param>
197203
/// <returns>Fully qualified name of the declaration.</returns>
198-
public static string? DetermineFullyQualifiedName(this IVariableDeclaration declaration, Compilation compilation)
204+
private static string? DetermineFullyQualifiedName(this IVariableDeclaration declaration, Compilation compilation)
199205
{
200206
return compilation.FindTypeDeclaration(declaration.TypeAccess)?.FullyQualifiedName;
201207
}
@@ -243,11 +249,12 @@ private static bool IsToBeOmitted(this IStorageDeclaration fieldDeclaration, ISo
243249
/// </summary>
244250
/// <param name="fieldDeclaration"></param>
245251
/// <param name="sourceBuilder"></param>
252+
/// <param name="warnMissingOrInconsistent">Issues warning when the type is eligible but not available.</param>
246253
/// <returns>True when the type is eligible</returns>
247-
public static (bool isEligibe, ITypeDeclaration eligibleType) IsEligibleForTranspile(this IFieldDeclaration fieldDeclaration, ISourceBuilder sourceBuilder)
254+
private static (bool isEligibe, ITypeDeclaration eligibleType) IsEligibleForTranspile(this IFieldDeclaration fieldDeclaration, ISourceBuilder sourceBuilder, bool warnMissingOrInconsistent = false)
248255
{
249256
var type = fieldDeclaration.Type;
250-
var fullyQualified = sourceBuilder.Compilation.FindTypeDeclaration(fieldDeclaration.TypeAccess);
257+
var fullyQualified = sourceBuilder.Compilation.FindTypeDeclaration(fieldDeclaration.TypeAccess, warnMissingOrInconsistent);
251258
var isEligible = !(type is IReferenceTypeDeclaration)
252259
&&
253260
fieldDeclaration.IsAvailableForComm(sourceBuilder)
@@ -271,11 +278,13 @@ type is INamedValueTypeDeclaration ||
271278
/// </summary>
272279
/// <param name="variableDeclaration"></param>
273280
/// <param name="sourceBuilder"></param>
281+
/// <param name="warnMissingOrInconsistent">Will issue warning when the type is eligible but not available.</param>
274282
/// <returns>True when the type is eligible</returns>
275-
public static (bool isEligibe, ITypeDeclaration? eligibleType) IsEligibleForTranspile(this IVariableDeclaration variableDeclaration, ISourceBuilder sourceBuilder)
283+
private static (bool isEligibe, ITypeDeclaration? eligibleType) IsEligibleForTranspile(this IVariableDeclaration variableDeclaration,
284+
ISourceBuilder sourceBuilder, bool warnMissingOrInconsistent = false)
276285
{
277286
var type = variableDeclaration.Type;
278-
var declaration = sourceBuilder.Compilation.FindTypeDeclaration(variableDeclaration.TypeAccess);
287+
var declaration = sourceBuilder.Compilation.FindTypeDeclaration(variableDeclaration.TypeAccess, warnMissingOrInconsistent);
279288
var isEligible = !(type is IReferenceTypeDeclaration)
280289
&&
281290
variableDeclaration.IsAvailableForComm(sourceBuilder)
@@ -300,11 +309,14 @@ type is INamedValueTypeDeclaration ||
300309
/// </summary>
301310
/// <param name="arrayTypeDeclaration"></param>
302311
/// <param name="sourceBuilder">Source builder</param>
312+
/// <param name="warnMissingOrInconsistent">Should issue warning if the type was not found though eligible.</param>
303313
/// <returns></returns>
304-
public static (bool isEligibe, ITypeDeclaration? eligibleType) IsEligibleForTranspile(this IArrayTypeDeclaration arrayTypeDeclaration, ISourceBuilder sourceBuilder)
314+
public static (bool isEligibe, ITypeDeclaration? eligibleType) IsEligibleForTranspile(this IArrayTypeDeclaration arrayTypeDeclaration,
315+
ISourceBuilder sourceBuilder,
316+
bool warnMissingOrInconsistent = false )
305317
{
306318
var singleDimensionalArray = arrayTypeDeclaration.Dimensions.Count == 1;
307-
var declaration = sourceBuilder.Compilation.FindTypeDeclaration(arrayTypeDeclaration.ElementTypeAccess);
319+
var declaration = sourceBuilder.Compilation.FindTypeDeclaration(arrayTypeDeclaration.ElementTypeAccess, warnMissingOrInconsistent);
308320
var isEligibleType = !(arrayTypeDeclaration.ElementTypeAccess.Type is IReferenceTypeDeclaration)
309321
&&
310322
arrayTypeDeclaration.IsAvailableForComm(sourceBuilder)
@@ -326,10 +338,12 @@ arrayTypeDeclaration.ElementTypeAccess.Type is INamedValueTypeDeclaration ||
326338
/// <param name="variable">Variable declaration</param>
327339
/// <param name="sourceBuilder">Source builder</param>
328340
/// <param name="coBuilder">Co-builder signature (e.g. POCO, Onliner, etc.)</param>
341+
/// <param name="warnMissingOrInconsistent">Will issue warning when the type is eligible but not found</param>
329342
/// <returns>True when the member is eligible for generation.</returns>
330-
public static (bool isEligibe, ITypeDeclaration? eligibleType) IsMemberEligibleForTranspile(this IVariableDeclaration variable, ISourceBuilder sourceBuilder, string coBuilder = "")
343+
public static (bool isEligibe, ITypeDeclaration? eligibleType) IsMemberEligibleForTranspile(this IVariableDeclaration variable,
344+
ISourceBuilder sourceBuilder, string coBuilder = "", bool warnMissingOrInconsistent = false)
331345
{
332-
var eligibility = variable.IsEligibleForTranspile(sourceBuilder);
346+
var eligibility = variable.IsEligibleForTranspile(sourceBuilder, warnMissingOrInconsistent);
333347
var eligible = variable.IsInGlobalMemory
334348
&& eligibility.isEligibe
335349
&& !IsToBeOmitted(variable, sourceBuilder, coBuilder);

src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerMemberBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected CsOnlinerMemberBuilder(ISourceBuilder ISourceBuilder)
3232

3333
public void CreateArrayTypeDeclaration(IArrayTypeDeclaration arrayTypeDeclaration, IxNodeVisitor visitor)
3434
{
35-
var type = this.SourceBuilder.Compilation.FindTypeDeclaration(arrayTypeDeclaration.ElementTypeAccess);
35+
var type = this.SourceBuilder.Compilation.FindTypeDeclaration(arrayTypeDeclaration.ElementTypeAccess, warnMissingOrInconsistent: true);
3636
//arrayTypeDeclaration.ElementTypeAccess.Type.Accept(visitor, this);
3737
type.Accept(visitor, this);
3838
AddToSource("[]");
@@ -51,7 +51,7 @@ public void CreateEnumTypeDeclaration(IEnumTypeDeclaration enumTypeDeclaration,
5151

5252
public void CreateFieldDeclaration(IFieldDeclaration fieldDeclaration, IxNodeVisitor visitor)
5353
{
54-
var eligibility = fieldDeclaration.IsMemberEligibleForTranspile(SourceBuilder);
54+
var eligibility = fieldDeclaration.IsMemberEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
5555
if (eligibility.isEligible)
5656
{
5757
AddToSource(fieldDeclaration.Pragmas.AddAttributes());
@@ -76,7 +76,7 @@ public void CreateFieldDeclaration(IFieldDeclaration fieldDeclaration, IxNodeVis
7676
AddToSource("{get;}");
7777
break;
7878
case IArrayTypeDeclaration array:
79-
var arrayEligibility = array.IsEligibleForTranspile(SourceBuilder);
79+
var arrayEligibility = array.IsEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
8080
if (arrayEligibility.isEligibe)
8181
{
8282
AddToSource($"{fieldDeclaration.AccessModifier.Transform()} ");
@@ -145,7 +145,7 @@ public void CreateStructuredType(IStructuredTypeDeclaration structuredTypeDeclar
145145

146146
public void CreateVariableDeclaration(IVariableDeclaration semantics, IxNodeVisitor visitor)
147147
{
148-
var eligibility = semantics.IsMemberEligibleForTranspile(SourceBuilder);
148+
var eligibility = semantics.IsMemberEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
149149
if (eligibility.isEligibe)
150150
{
151151
AddToSource(semantics.Pragmas.AddAttributes());
@@ -170,7 +170,7 @@ public void CreateVariableDeclaration(IVariableDeclaration semantics, IxNodeVisi
170170
AddToSource("{get;}");
171171
break;
172172
case IArrayTypeDeclaration array:
173-
var arrayEligible = array.IsEligibleForTranspile(SourceBuilder);
173+
var arrayEligible = array.IsEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
174174
if (arrayEligible.isEligibe)
175175
{
176176
AddToSource($"public");

src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerSourceBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public void CreateClassDeclaration(IClassDeclarationSyntax classDeclarationSynta
160160
AX.ST.Semantic.Model.ISemanticTypeAccess? extendedType = classDeclaration.ExtendedTypeAccesses.FirstOrDefault();
161161

162162
//TODO: Workaround for not fully qualified declarations. To be addressed with proper dependency handling in stc.
163-
var extend = Compilation.FindTypeDeclaration(extendedType);
163+
var extend = Compilation.FindTypeDeclaration(extendedType, warnMissingOrInconsistent: true);
164164
if (extend != null)
165165
{
166166
AddToSource($"{extend.FullyQualifiedName}{ReplaceGenericSignature(classDeclaration)}");

0 commit comments

Comments
 (0)