-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathPropertyExtension.cs
More file actions
140 lines (118 loc) · 5.41 KB
/
PropertyExtension.cs
File metadata and controls
140 lines (118 loc) · 5.41 KB
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
// -------------------------------------------------------------------------------------------------
// <copyright file="PropertyExtension.cs" company="Starion Group S.A.">
//
// Copyright 2022-2025 Starion Group S.A.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// </copyright>
// ------------------------------------------------------------------------------------------------
namespace SysML2.NET.CodeGenerator.Extensions
{
using System;
using System.Linq;
using uml4net.Classification;
using uml4net.Extensions;
using uml4net.SimpleClassifiers;
/// <summary>
/// Extension class for the <see cref="IProperty"/>
/// </summary>
public static class PropertyExtension
{
/// <summary>
/// Asserts that the <see cref="IProperty"/> is an enum type with a default value provided
/// </summary>
/// <param name="property">The <see cref="IProperty"/> to assert</param>
/// <returns>True if the <see cref="IProperty"/> have a default value for an enum</returns>
public static bool QueryIsEnumPropertyWithDefaultValue(this IProperty property)
{
ArgumentNullException.ThrowIfNull(property);
if (!property.QueryIsEnum())
{
return false;
}
var defaultValue = property.QueryDefaultValueAsString();
if (defaultValue == "null")
{
return false;
}
var valueSpecification = property.DefaultValue.FirstOrDefault();
if (valueSpecification is IInstanceValue instanceValue)
{
return instanceValue.Instance is IEnumerationLiteral;
}
return false;
}
/// <summary>
/// Gets the name of the property.
/// </summary>
/// <param name="property">The <see cref="IProperty"/></param>
/// <returns>The <see cref="IProperty.Name"/> with the first letter lowered case in case of derived property, in upper case otherwise</returns>
public static string QueryPropertyNameBasedOnUmlProperties(this IProperty property)
{
ArgumentNullException.ThrowIfNull(property);
return property.IsDerived || property.IsDerivedUnion ? StringExtensions.LowerCaseFirstLetter(property.Name) : StringExtensions.CapitalizeFirstLetter(property.Name);
}
/// <summary>
/// Asserts that the property is one of the part of a Composite Aggregation that is not derived
/// </summary>
/// <param name="property">The property to check</param>
/// <exception cref="ArgumentNullException">If the provided <see cref="IProperty"/> is null</exception>
/// <returns>True if the property is composite and not derived or if the opposite property is Composite and not derived</returns>
public static bool QueryPropertyIsPartOfNonDerivedCompositeAggregation(this IProperty property)
{
ArgumentNullException.ThrowIfNull(property);
if (property.IsComposite && !property.IsDerived)
{
return true;
}
return property.Opposite is { IsComposite: true, IsDerived: false };
}
/// <summary>
/// Queries the content of a IF statement for non-empty values
/// </summary>
/// <param name="property">The property that have to be used to produce the content</param>
/// <param name="variableName">The name of the name</param>
/// <returns>The If Statement content</returns>
public static string QueryIfStatementContentForNonEmpty(this IProperty property, string variableName)
{
var propertyName = property.QueryPropertyNameBasedOnUmlProperties();
if (property.QueryIsEnumerable())
{
return $"{variableName}.MoveNext()";
}
if (property.QueryIsReferenceProperty())
{
return $"{variableName}.{propertyName} != null";
}
if (property.QueryIsNullableAndNotString())
{
return $"{variableName}.{propertyName}.HasValue";
}
if (property.QueryIsString())
{
return $"!string.IsNullOrWhiteSpace({variableName}.{propertyName})";
}
if (property.QueryIsBool())
{
return $"{variableName}.{propertyName}";
}
if (property.QueryIsEnum())
{
var defaultValue = property.QueryIsEnumPropertyWithDefaultValue() ? $"{property.Type.QueryFullyQualifiedTypeName()}.{property.QueryDefaultValueAsString().CapitalizeFirstLetter()}" : ((IEnumeration)property.Type).OwnedLiteral[0].Name;
return $"{variableName}.{propertyName} != {defaultValue}";
}
return "THIS WILL PRODUCE COMPILE ERROR";
}
}
}