Exemplo n.º 1
0
        public static void AnalyzeNamedType(SymbolAnalysisContext context, INamedTypeSymbol flagsAttribute)
        {
            var enumSymbol = (INamedTypeSymbol)context.Symbol;

            if (enumSymbol.IsEnum() &&
                enumSymbol.HasAttribute(flagsAttribute))
            {
                var infos = default(ImmutableArray <EnumFieldInfo>);

                foreach (ISymbol member in enumSymbol.GetMembers())
                {
                    if (member.IsField())
                    {
                        var fieldSymbol = (IFieldSymbol)member;

                        if (!fieldSymbol.HasConstantValue)
                        {
                            break;
                        }

                        var info = new EnumFieldInfo(fieldSymbol);

                        if (info.IsComposite())
                        {
                            var declaration = (EnumMemberDeclarationSyntax)info.Symbol.GetSyntax(context.CancellationToken);

                            ExpressionSyntax valueExpression = declaration.EqualsValue?.Value;

                            if (valueExpression != null &&
                                (valueExpression.IsKind(SyntaxKind.NumericLiteralExpression) ||
                                 valueExpression
                                 .DescendantNodes()
                                 .Any(f => f.IsKind(SyntaxKind.NumericLiteralExpression))))
                            {
                                if (infos.IsDefault)
                                {
                                    infos = EnumFieldInfo.CreateRange(enumSymbol);

                                    if (infos.IsDefault)
                                    {
                                        break;
                                    }
                                }

                                List <EnumFieldInfo> values = info.Decompose(infos);

                                if (values?.Count > 1)
                                {
                                    context.ReportDiagnostic(
                                        DiagnosticDescriptors.DeclareEnumValueAsCombinationOfNames,
                                        valueExpression);
                                }
                            }
                        }
                    }
                }
            }
        }
        public static async Task <Document> RefactorAsync(
            Document document,
            EnumMemberDeclarationSyntax enumMemberDeclaration,
            CancellationToken cancellationToken)
        {
            SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            IFieldSymbol enumMemberSymbol = semanticModel.GetDeclaredSymbol(enumMemberDeclaration, cancellationToken);

            ImmutableArray <EnumFieldInfo> infos = EnumFieldInfo.CreateRange(enumMemberSymbol.ContainingType);

            ExpressionSyntax value = enumMemberDeclaration.EqualsValue?.Value;

            var info = new EnumFieldInfo(enumMemberSymbol);

            List <EnumFieldInfo> values = info.Decompose(infos);

            values.Sort((f, g) =>
            {
                if (f.IsComposite())
                {
                    if (g.IsComposite())
                    {
                        return(((IComparable)f.Value).CompareTo((IComparable)g.Value));
                    }
                    else
                    {
                        return(-1);
                    }
                }
                else if (g.IsComposite())
                {
                    return(1);
                }

                return(((IComparable)f.Value).CompareTo((IComparable)g.Value));
            });

            BinaryExpressionSyntax newValue = BitwiseOrExpression(values[0].ToIdentifierName(), values[1].ToIdentifierName());

            for (int i = 2; i < values.Count; i++)
            {
                newValue = BitwiseOrExpression(newValue, values[i].ToIdentifierName());
            }

            newValue = newValue.WithFormatterAnnotation();

            return(await document.ReplaceNodeAsync(value, newValue, cancellationToken).ConfigureAwait(false));
        }
Exemplo n.º 3
0
 internal static bool TryReadProperty(ref Utf8JsonReader reader, EnumFieldInfo obj, JsonSerializerOptions options)
 {
     if (reader.ValueTextEquals(nameof(obj.Value)))
     {
         obj.Value = reader.ReadInt64();
         return(true);
     }
     if (reader.ValueTextEquals(nameof(obj.Name)))
     {
         obj.Name = reader.ReadString();
         return(true);
     }
     if (reader.ValueTextEquals(nameof(obj.DisplayName)))
     {
         obj.DisplayName = reader.ReadString();
         return(true);
     }
     return(false);
 }
Exemplo n.º 4
0
        public SDKEnumFieldInfo(IntPtr address, RemoteProcess remoteProcess)
        {
            EnumFieldInfo     typeInfo     = remoteProcess.Read <EnumFieldInfo>(address);
            EnumFieldInfoData typeInfoData = remoteProcess.Read <EnumFieldInfoData>(typeInfo.m_InfoData);

            Name         = $"{remoteProcess.ReadString(typeInfoData.m_Name, 255)}";
            ThisTypeInfo = address;
            Type         = typeInfoData.GetNewEntryType();
            Flags        = typeInfoData.m_Flags;
            Alignment    = typeInfoData.m_Alignment;
            TotalSize    = typeInfoData.m_TotalSize;
            FieldCount   = typeInfoData.m_FieldCount;
            RuntimeId    = typeInfo.m_RuntimeId;
            Next         = typeInfo.m_Next;

            if (FieldCount > 0)
            {
                for (int i = 0; i < FieldCount; i++)
                {
                    var fieldInfoData = remoteProcess.Read <FieldInfoData>((IntPtr)((Int64)typeInfoData.m_Fields + (i * 0x18)));

                    SDKFieldEntry fieldEntry;

                    fieldEntry.fieldName         = remoteProcess.ReadString(fieldInfoData.m_Name, 255);
                    fieldEntry.fieldType         = "";
                    fieldEntry.fieldInternalType = "";
                    fieldEntry.fieldBasicType    = BasicTypesEnum.kTypeCode_Void;
                    fieldEntry.fieldOffset       = 0;
                    fieldEntry.fieldSize         = 0;
                    fieldEntry.lastFieldOffset   = 0;
                    fieldEntry.lastFieldSize     = 0;

                    Fields.Add(fieldEntry);
                }
            }
        }
Exemplo n.º 5
0
 public EditEnumFieldCommand(Lazy <HexBufferFileServiceFactory> hexBufferFileServiceFactory, EnumFieldInfo enumFieldInfo)
     : base(hexBufferFileServiceFactory)
 {
     this.enumFieldInfo = enumFieldInfo;
 }
Exemplo n.º 6
0
 internal static void WriteProperties(Utf8JsonWriter writer, EnumFieldInfo value, JsonSerializerOptions options)
 {
     writer.WriteNumber(nameof(value.Value), value.Value);
     writer.WriteString(nameof(value.Name), value.Name);
     writer.WriteString(nameof(value.DisplayName), value.DisplayName);
 }
Exemplo n.º 7
0
    public override QueryPropertyInfo ReadJson(JsonReader reader, Type objectType, QueryPropertyInfo existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return(null);
        }
        else if (reader.TokenType != JsonToken.StartObject)
        {
            throw new InvalidOperationException();
        }

        var r = new QueryPropertyInfo();

        BooleanQueryPropertyInfo getOrCreateBoolean()
        => (r as BooleanQueryPropertyInfo) ?? (BooleanQueryPropertyInfo)(r = new BooleanQueryPropertyInfo
        {
            Name = r.Name,
            DisplayName = r.DisplayName,
            TypeName = r.TypeName,
            DefaultOperator = r.DefaultOperator,
        });

        DateTimeQueryPropertyInfo getOrCreateDateTime()
        => (r as DateTimeQueryPropertyInfo) ?? (DateTimeQueryPropertyInfo)(r = new DateTimeQueryPropertyInfo
        {
            Name = r.Name,
            DisplayName = r.DisplayName,
            TypeName = r.TypeName,
            DefaultOperator = r.DefaultOperator,
        });

        EnumQueryPropertyInfo getOrCreateEnum()
        => (r as EnumQueryPropertyInfo) ?? (EnumQueryPropertyInfo)(r = new EnumQueryPropertyInfo
        {
            Name = r.Name,
            DisplayName = r.DisplayName,
            TypeName = r.TypeName,
            DefaultOperator = r.DefaultOperator,
        });

        while (reader.Read())
        {
            switch (reader.TokenType)
            {
            case JsonToken.EndObject:
                return(r);

            case JsonToken.PropertyName:
                var propertyName = reader.Value?.ToString();

                if (!reader.Read())
                {
                    throw new InvalidOperationException();
                }

                switch (propertyName)
                {
                case nameof(r.TypeName):
                    var tn = reader.Value?.ToString();

                    switch (tn)
                    {
                    case nameof(DateTime):
                    case nameof(DateTimeOffset):
                        getOrCreateDateTime();
                        break;

                    case nameof(Boolean):
                        getOrCreateBoolean();
                        break;

                    case nameof(Enum):
                        getOrCreateEnum();
                        break;
                    }

                    r.TypeName = tn;
                    break;

                case nameof(r.Name):
                    r.Name = reader.Value?.ToString();
                    break;

                case nameof(r.DisplayName):
                    r.DisplayName = reader.Value?.ToString();
                    break;

                case nameof(r.DefaultOperator):
                    r.DefaultOperator = reader.Value?.ToString();
                    break;

                case nameof(BooleanQueryPropertyInfo.TrueString):
                    getOrCreateBoolean().TrueString = reader.Value?.ToString();
                    break;

                case nameof(BooleanQueryPropertyInfo.FalseString):
                    getOrCreateBoolean().FalseString = reader.Value?.ToString();
                    break;

                case nameof(DateTimeQueryPropertyInfo.IsDate):
                    getOrCreateDateTime().IsDate = reader.Value is bool bds ||
                                                   reader.Value is string ds && bool.TryParse(ds, out bds)
                                ? bds : false;
                    break;

                case nameof(EnumQueryPropertyInfo.Fields):
                    var er = getOrCreateEnum();
                    if (reader.TokenType == JsonToken.Null)
                    {
                        er.Fields = null;
                    }
                    else if (reader.TokenType != JsonToken.StartArray)
                    {
                        throw new InvalidOperationException();
                    }
                    else
                    {
                        EnumFieldInfo f = null;
                        while (reader.Read() && reader.TokenType != JsonToken.EndArray)
                        {
                            switch (reader.TokenType)
                            {
                            case JsonToken.EndObject:
                                if (f != null)
                                {
                                    er.Fields.Add(f);
                                    f = null;
                                }
                                break;

                            case JsonToken.StartObject:
                                f = new EnumFieldInfo();
                                break;

                            case JsonToken.PropertyName:

                                switch (reader.Value?.ToString())
                                {
                                case nameof(f.Name):
                                    f.Name = reader.ReadAsString();
                                    break;

                                case nameof(f.DisplayName):
                                    f.DisplayName = reader.ReadAsString();
                                    break;

                                case nameof(f.Value):
                                    f.Value = (long)reader.ReadAsDouble();
                                    break;

                                default:
                                    if (!reader.Read())
                                    {
                                        throw new InvalidOperationException();
                                    }
                                    break;
                                }

                                break;
                            }
                        }
                    }

                    break;
                }

                break;
            }
        }

        throw new InvalidOperationException();
    }