Exemplo n.º 1
0
    /// <inheritdoc/>
    public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        var updatedNode = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node) !;

        if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
            SemanticModel.For(node).GetOperation(node) is IMemberReferenceOperation operation)
        {
            // Track and replace constants
            if (operation is IFieldReferenceOperation fieldOperation &&
                fieldOperation.Field.IsConst &&
                fieldOperation.Type !.TypeKind != TypeKind.Enum)
            {
                if (HlslKnownFields.TryGetMappedName(fieldOperation.Member.ToDisplayString(), out string?constantLiteral))
                {
                    return(ParseExpression(constantLiteral !));
                }

                ConstantDefinitions[fieldOperation.Field] = ((IFormattable)fieldOperation.Field.ConstantValue !).ToString(null, CultureInfo.InvariantCulture);

                var ownerTypeName = ((INamedTypeSymbol)fieldOperation.Field.ContainingSymbol).ToDisplayString().ToHlslIdentifierName();
                var constantName  = $"__{ownerTypeName}__{fieldOperation.Field.Name}";

                return(IdentifierName(constantName));
            }

            if (HlslKnownProperties.TryGetMappedName(operation.Member.ToDisplayString(), out string?mapping))
            {
                // Rewrite static and instance mapped members
                return(operation.Member.IsStatic switch
                {
                    true => ParseExpression(mapping !),
                    false => updatedNode.WithName(IdentifierName(mapping !))
                });
Exemplo n.º 2
0
    /// <inheritdoc/>
    public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        var updatedNode = (MemberAccessExpressionSyntax)base.VisitMemberAccessExpression(node) !;

        if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression) &&
            SemanticModel.For(node).GetOperation(node) is IMemberReferenceOperation operation)
        {
            // Track and replace constants
            if (operation is IFieldReferenceOperation fieldOperation &&
                fieldOperation.Field.IsConst &&
                fieldOperation.Type !.TypeKind != TypeKind.Enum)
            {
                if (HlslKnownFields.TryGetMappedName(fieldOperation.Member.ToDisplayString(), out string?constantLiteral))
                {
                    return(ParseExpression(constantLiteral !));
                }

                ConstantDefinitions[fieldOperation.Field] = ((IFormattable)fieldOperation.Field.ConstantValue !).ToString(null, CultureInfo.InvariantCulture);

                var ownerTypeName = ((INamedTypeSymbol)fieldOperation.Field.ContainingSymbol).ToDisplayString().ToHlslIdentifierName();
                var constantName  = $"__{ownerTypeName}__{fieldOperation.Field.Name}";

                return(IdentifierName(constantName));
            }

            if (HlslKnownProperties.TryGetMappedName(operation.Member.ToDisplayString(), out string?mapping))
            {
                if (operation.Member.IsStatic)
                {
                    string typeName = operation.Member.ContainingType.GetFullMetadataName();

                    // Special dispatch types are not supported from static constants
                    DiagnosticDescriptor?descriptor = typeName switch
                    {
                        _ when typeName == typeof(ThreadIds).FullName || typeName == typeof(ThreadIds.Normalized).FullName => InvalidThreadIdsUsage,
                        _ when typeName == typeof(GroupIds).FullName => InvalidGroupIdsUsage,
                        _ when typeName == typeof(GroupSize).FullName => InvalidGroupSizeUsage,
                        _ when typeName == typeof(GridIds).FullName => InvalidGridIdsUsage,
                        _ when typeName == typeof(DispatchSize).FullName => InvalidDispatchSizeUsage,
                        _ => null
                    };

                    if (descriptor is not null)
                    {
                        Diagnostics.Add(descriptor, node);
                    }
                }

                // Rewrite static and instance mapped members
                return(operation.Member.IsStatic switch
                {
                    true => ParseExpression(mapping !),
                    false => updatedNode.WithName(IdentifierName(mapping !))
                });
        /// <inheritdoc/>
        public override SyntaxNode?VisitVariableDeclarator(VariableDeclaratorSyntax node)
        {
            var updatedNode = (VariableDeclaratorSyntax)base.VisitVariableDeclarator(node) !;

            if (node.Initializer is null &&
                node.Parent is VariableDeclarationSyntax declaration &&
                SemanticModel.For(node).GetTypeInfo(declaration.Type).Type is ITypeSymbol {
                IsUnmanagedType : false
            } type)
            {
                Context.ReportDiagnostic(InvalidObjectDeclaration, node, type);
            }

            return(updatedNode);
        }
Exemplo n.º 4
0
    /// <inheritdoc cref="CSharpSyntaxRewriter.Visit(SyntaxNode?)"/>
    public MethodDeclarationSyntax?Visit(MethodDeclarationSyntax?node)
    {
        this.currentMethod = node;

        var updatedNode = (MethodDeclarationSyntax?)base.Visit(node) !;

        updatedNode = updatedNode.ReplaceAndTrackType(updatedNode.ReturnType, node !.ReturnType, SemanticModel.For(node), DiscoveredTypes);

        if (node !.Modifiers.Any(m => m.IsKind(SyntaxKind.AsyncKeyword)))
        {
            Diagnostics.Add(AsyncModifierOnMethodOrFunction, node);
        }

        if (node !.Modifiers.Any(m => m.IsKind(SyntaxKind.UnsafeKeyword)))
        {
            Diagnostics.Add(UnsafeModifierOnMethodOrFunction, node);
        }

        if (updatedNode is not null)
        {
            var implicitBlock = Block(this.implicitVariables.Select(static v => LocalDeclarationStatement(v)).ToArray());