private static void AppendConstantBuffer(this ICollection<SymbolMarkupToken> markup, ConstantBufferSymbol symbol)
        {
            markup.AppendPlainText("(constant buffer)");
            markup.AppendSpace();

            markup.AppendName(SymbolMarkupKind.ConstantBufferVariableName, symbol.Name);
        }
        private static void AppendSemantic(this ICollection<SymbolMarkupToken> markup, SemanticSymbol symbol)
        {
            markup.AppendPlainText("(semantic)");
            markup.AppendSpace();

            markup.AppendName(SymbolMarkupKind.SemanticName, symbol.Name);
        }
 private static void AppendFieldSymbolInfo(this ICollection<SymbolMarkupToken> markup, FieldSymbol symbol)
 {
     markup.AppendPlainText("(field)");
     markup.AppendSpace();
     markup.AppendType(symbol.ValueType, true);
     markup.AppendSpace();
     markup.AppendType((TypeSymbol) symbol.Parent, false);
     markup.AppendPunctuation(".");
     markup.AppendName(SymbolMarkupKind.FieldName, symbol.Name);
 }
        private static void AppendVariableSymbolInfo(this ICollection<SymbolMarkupToken> markup, VariableSymbol symbol)
        {
            VariableType variableType;
            if (symbol.Parent == null)
                variableType = VariableType.Global;
            else if (symbol.Parent.Kind == SymbolKind.ConstantBuffer)
                variableType = VariableType.ConstantBuffer;
            else
                variableType = VariableType.Local;

            switch (variableType)
            {
                case VariableType.Local:
                    markup.AppendPlainText("(local variable)");
                    break;
                case VariableType.ConstantBuffer:
                    markup.AppendPlainText("(constant buffer variable)");
                    break;
                case VariableType.Global:
                    markup.AppendPlainText("(global variable)");
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            markup.AppendSpace();
            markup.AppendType(symbol.ValueType, true);
            markup.AppendSpace();

            switch (variableType)
            {
                case VariableType.Local:
                    markup.AppendName(SymbolMarkupKind.LocalVariableName, symbol.Name);
                    break;
                case VariableType.ConstantBuffer:
                    markup.AppendName(SymbolMarkupKind.ConstantBufferVariableName, symbol.Name);
                    break;
                case VariableType.Global:
                    markup.AppendName(SymbolMarkupKind.GlobalVariableName, symbol.Name);
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
        private static void AppendParameterSymbolInfo(this ICollection<SymbolMarkupToken> markup, ParameterSymbol symbol, bool includeInfo)
        {
            if (includeInfo)
            {
                markup.AppendPlainText("(parameter)");
                markup.AppendSpace();
            }

            if (symbol.Direction == ParameterDirection.Inout)
            {
                markup.AppendKeyword("inout");
                markup.AppendSpace();
            }
            else if (symbol.Direction == ParameterDirection.Out)
            {
                markup.AppendKeyword("out");
                markup.AppendSpace();
            }

            markup.AppendType(symbol.ValueType, false);
            markup.AppendSpace();
            markup.AppendParameterName(symbol.Name);
        }