Exemple #1
0
        private object GetColorizedDescriptions(IReadOnlyList <INavigationToken> tokens, CancellationToken cancellationToken)
        {
            var builder = new ClassifiedTextBuilder();

            foreach (var tokenGroup in tokens.GroupBy(t => t.Document.Path))
            {
                cancellationToken.ThrowIfCancellationRequested();

                var filePath = tokenGroup.All(t => t.Type == RadAsmTokenType.Instruction)
                    ? Path.GetFileNameWithoutExtension(tokenGroup.Key)
                    : tokenGroup.Key;

                builder.AddClassifiedText(filePath).SetAsElement();
                foreach (var token in tokenGroup)
                {
                    var tokenLine       = token.GetLine();
                    var tokenLineText   = tokenLine.LineText;
                    var lineTokenStart  = token.GetStart() - tokenLine.LineStart;
                    var lineTokenEnd    = token.GetEnd() - tokenLine.LineStart;
                    var typeName        = token.Type.GetName();
                    var textBeforeToken = tokenLineText.Substring(0, lineTokenStart);
                    var textAfterToken  = tokenLineText.Substring(lineTokenEnd);

                    builder.AddClassifiedText($"({typeName}) ")
                    .AddClassifiedText(textBeforeToken)
                    .AddClassifiedText(token)
                    .AddClassifiedText(textAfterToken)
                    .SetAsElement();
                }
            }

            return(builder.Build());
        }
Exemple #2
0
        public async Task <object> GetColorizedDescriptionAsync(INavigationToken token, CancellationToken cancellationToken)
        {
            if (token == null)
            {
                return(null);
            }
            cancellationToken.ThrowIfCancellationRequested();

            var typeName = token.Type.GetName();
            var document = token.Document;
            var snapshot = document.CurrentSnapshot;

            var builder = new ClassifiedTextBuilder();

            if (token.Type == RadAsmTokenType.Instruction)
            {
                builder
                .AddClassifiedText($"({typeName} ")
                .AddClassifiedText(RadAsmTokenType.Instruction, Path.GetFileNameWithoutExtension(document.Path))
                .AddClassifiedText(") ");
            }
            else
            {
                builder.AddClassifiedText($"({typeName}) ");
            }

            builder.AddClassifiedText(token);
            if (token.Type == RadAsmTokenType.FunctionName)
            {
                cancellationToken.ThrowIfCancellationRequested();
                var analysisResult = await document.DocumentAnalysis.GetAnalysisResultAsync(snapshot);

                var block = analysisResult.GetBlock(token.GetEnd());

                cancellationToken.ThrowIfCancellationRequested();

                if (block is FunctionBlock functionBlock)
                {
                    for (var i = 0; i < functionBlock.Parameters.Count; i++)
                    {
                        builder.AddClassifiedText(" ")
                        .AddClassifiedText(_navigationTokenService.CreateToken(functionBlock.Parameters[i], document));
                        if (i != functionBlock.Parameters.Count - 1)
                        {
                            builder.AddClassifiedText(",");
                        }
                    }
                }
            }
            else if (token.Type == RadAsmTokenType.GlobalVariable || token.Type == RadAsmTokenType.LocalVariable)
            {
                var variableToken = (VariableToken)token.Definition;
                if (variableToken.DefaultValue != default)
                {
                    var defaultValueText = variableToken.DefaultValue.GetText(snapshot);
                    builder.AddClassifiedText(" = ")
                    .AddClassifiedText(RadAsmTokenType.Number, defaultValueText);
                }
            }

            cancellationToken.ThrowIfCancellationRequested();

            builder.SetAsElement();
            if (token.Definition is IDefinitionToken definitionToken)
            {
                var description = definitionToken.GetDescription(_documentFactoryLazy.Value);
                if (description != null)
                {
                    builder.AddClassifiedText(description).SetAsElement();
                }
            }
            return(builder.Build());
        }