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()); }
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()); }