|
|
@ -35,9 +35,10 @@ public class ParameterInfo : BaseInfo |
|
|
|
public IReadOnlyList<object> TermTypes { get; } // Either ITypeSymbol or Pair for relationships. |
|
|
|
public IReadOnlyList<object> TermTypes { get; } // Either ITypeSymbol or Pair for relationships. |
|
|
|
public ITypeSymbol? FieldType { get; } |
|
|
|
public ITypeSymbol? FieldType { get; } |
|
|
|
public ParameterKind Kind { get; } |
|
|
|
public ParameterKind Kind { get; } |
|
|
|
|
|
|
|
public bool IsOr { get; } |
|
|
|
|
|
|
|
|
|
|
|
public bool HasTerm => (Kind != ParameterKind.Unique); |
|
|
|
public bool HasTerm => (Kind != ParameterKind.Unique); |
|
|
|
public bool HasField => HasTerm && !(Kind is ParameterKind.Has or ParameterKind.Not or ParameterKind.HasOr); |
|
|
|
public bool HasField => HasTerm && !(Kind is ParameterKind.Has or ParameterKind.Not); |
|
|
|
|
|
|
|
|
|
|
|
public ParameterInfo(ISymbol symbol) |
|
|
|
public ParameterInfo(ISymbol symbol) |
|
|
|
: base(symbol) |
|
|
|
: base(symbol) |
|
|
@ -49,15 +50,16 @@ public class ParameterInfo : BaseInfo |
|
|
|
var typeFullName = Symbol.Type.GetFullName(FullNameStyle.Metadata); |
|
|
|
var typeFullName = Symbol.Type.GetFullName(FullNameStyle.Metadata); |
|
|
|
if (UniqueParameters.TryGetValue(typeFullName, out var replacement)) |
|
|
|
if (UniqueParameters.TryGetValue(typeFullName, out var replacement)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
IsOr = false; |
|
|
|
Kind = ParameterKind.Unique; |
|
|
|
Kind = ParameterKind.Unique; |
|
|
|
TermTypes = Array.Empty<ITypeSymbol>(); |
|
|
|
TermTypes = Array.Empty<ITypeSymbol>(); |
|
|
|
UniqueReplacement = replacement; |
|
|
|
UniqueReplacement = replacement; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
IsOr = typeFullName.StartsWith("gaemstone.ECS.Or"); |
|
|
|
var isHas = typeFullName.StartsWith("gaemstone.ECS.Has"); |
|
|
|
var isHas = typeFullName.StartsWith("gaemstone.ECS.Has"); |
|
|
|
var isNot = typeFullName.StartsWith("gaemstone.ECS.Not"); |
|
|
|
var isNot = typeFullName.StartsWith("gaemstone.ECS.Not"); |
|
|
|
var isOr = typeFullName.StartsWith("gaemstone.ECS.Or"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (IsGeneric) |
|
|
|
if (IsGeneric) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -71,7 +73,7 @@ public class ParameterInfo : BaseInfo |
|
|
|
{ |
|
|
|
{ |
|
|
|
TermTypes = argType.TypeArguments.ToImmutableList(); |
|
|
|
TermTypes = argType.TypeArguments.ToImmutableList(); |
|
|
|
FieldType = null; |
|
|
|
FieldType = null; |
|
|
|
isOr = true; |
|
|
|
IsOr = true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if ((isHas || isNot) && (args is [ INamedTypeSymbol relation, INamedTypeSymbol target ])) |
|
|
|
else if ((isHas || isNot) && (args is [ INamedTypeSymbol relation, INamedTypeSymbol target ])) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -90,11 +92,9 @@ public class ParameterInfo : BaseInfo |
|
|
|
FieldType = Symbol.Type; |
|
|
|
FieldType = Symbol.Type; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Kind = (isHas && isOr) ? ParameterKind.HasOr |
|
|
|
Kind = isHas ? ParameterKind.Has |
|
|
|
: isHas ? ParameterKind.Has |
|
|
|
: isNot ? ParameterKind.Not |
|
|
|
: isOr ? ParameterKind.Or |
|
|
|
: IsNullable ? ParameterKind.Nullable |
|
|
|
: isNot ? ParameterKind.Not |
|
|
|
|
|
|
|
: IsNullable ? ParameterKind.Nullable |
|
|
|
|
|
|
|
: Symbol.RefKind switch { |
|
|
|
: Symbol.RefKind switch { |
|
|
|
RefKind.In => ParameterKind.In, |
|
|
|
RefKind.In => ParameterKind.In, |
|
|
|
RefKind.Out => ParameterKind.Out, |
|
|
|
RefKind.Out => ParameterKind.Out, |
|
|
@ -141,8 +141,7 @@ public class ParameterInfo : BaseInfo |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
var isSpecial = Kind is ParameterKind.Has or ParameterKind.HasOr |
|
|
|
var isSpecial = IsOr || (Kind is ParameterKind.Has or ParameterKind.Not); |
|
|
|
or ParameterKind.Or or ParameterKind.Not; |
|
|
|
|
|
|
|
if (isSpecial && IsByRef) yield return Diagnostic.Create( |
|
|
|
if (isSpecial && IsByRef) yield return Diagnostic.Create( |
|
|
|
Descriptors.SpecialMustNotBeByRef, Location); |
|
|
|
Descriptors.SpecialMustNotBeByRef, Location); |
|
|
|
if (isSpecial && IsNullable) yield return Diagnostic.Create( |
|
|
|
if (isSpecial && IsNullable) yield return Diagnostic.Create( |
|
|
@ -202,8 +201,6 @@ public enum ParameterKind |
|
|
|
Ref, // Pass by reference (read/write) |
|
|
|
Ref, // Pass by reference (read/write) |
|
|
|
Has, // Required present (no read/write) |
|
|
|
Has, // Required present (no read/write) |
|
|
|
Not, // Required missing (no read/write) |
|
|
|
Not, // Required missing (no read/write) |
|
|
|
Or, // Only one of multiple terms is required |
|
|
|
|
|
|
|
HasOr, // Both Has and Or at the same time |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// public enum TermKind |
|
|
|
// public enum TermKind |
|
|
|