ShaderTools.Hlsl.Binding.Binder.BindFunctionDeclaration C# (CSharp) Method

BindFunctionDeclaration() private method

private BindFunctionDeclaration ( FunctionDeclarationSyntax declaration, Symbol parent ) : BoundFunctionDeclaration
declaration FunctionDeclarationSyntax
parent ShaderTools.Hlsl.Symbols.Symbol
return ShaderTools.Hlsl.Binding.BoundNodes.BoundFunctionDeclaration
        private BoundFunctionDeclaration BindFunctionDeclaration(FunctionDeclarationSyntax declaration, Symbol parent)
        {
            BindAttributes(declaration.Attributes);

            var boundReturnType = Bind(declaration.ReturnType, x => BindType(x, parent));

            var functionSymbol = LocalSymbols.OfType<SourceFunctionSymbol>()
                .FirstOrDefault(x => SyntaxFacts.HaveMatchingSignatures(
                    x.DefinitionSyntax as FunctionSyntax ?? x.DeclarationSyntaxes[0],
                    declaration));

            if (functionSymbol != null)
            {
                functionSymbol.DeclarationSyntaxes.Add(declaration);
            }
            else
            {
                functionSymbol = new SourceFunctionSymbol(declaration, parent, boundReturnType.TypeSymbol);
                AddSymbol(functionSymbol, declaration.Name.GetTextSpanSafe(), true);
            }

            if (declaration.Semantic != null)
                Bind(declaration.Semantic, BindVariableQualifier);

            var functionBinder = new Binder(_sharedBinderState, this);

            var boundParameters = BindParameters(declaration.ParameterList, functionBinder, functionSymbol);

            return new BoundFunctionDeclaration(functionSymbol, boundReturnType, boundParameters.ToImmutableArray());
        }

Usage Example

        private BoundInterfaceType BindInterfaceDeclaration(InterfaceTypeSyntax declaration, Symbol parent)
        {
            var interfaceSymbol = new InterfaceSymbol(declaration, parent);

            AddSymbol(interfaceSymbol, declaration.Name.SourceRange);

            var methods         = new List <BoundFunction>();
            var interfaceBinder = new Binder(_sharedBinderState, this);

            foreach (var memberSyntax in declaration.Methods)
            {
                methods.Add(interfaceBinder.Bind(memberSyntax, x => interfaceBinder.BindFunctionDeclaration(x, interfaceSymbol)));
            }

            foreach (var member in interfaceBinder.LocalSymbols.Values.SelectMany(x => x))
            {
                interfaceSymbol.AddMember(member);
            }

            return(new BoundInterfaceType(interfaceSymbol, methods.ToImmutableArray()));
        }
All Usage Examples Of ShaderTools.Hlsl.Binding.Binder::BindFunctionDeclaration