public static async Task<ISymbol> FindApplicableAlias(this ITypeSymbol type, int position, SemanticModel semanticModel, CancellationToken cancellationToken) { try { if (semanticModel.IsSpeculativeSemanticModel) { position = semanticModel.OriginalPositionForSpeculation; semanticModel = semanticModel.ParentModel; } var root = await semanticModel.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); IEnumerable<UsingDirectiveSyntax> applicableUsings = GetApplicableUsings(position, root as CompilationUnitSyntax); foreach (var applicableUsing in applicableUsings) { var alias = semanticModel.GetOriginalSemanticModel().GetDeclaredSymbol(applicableUsing, cancellationToken); if (alias != null && alias.Target == type) { return alias; } } return null; } catch (Exception e) when (FatalError.ReportUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
public static async Task<ISymbol> FindApplicableAlias(this ITypeSymbol type, int position, SemanticModel semanticModel, CancellationToken cancellationToken) { var token = semanticModel.SyntaxTree.FindTokenOnLeftOfPosition(position, cancellationToken); var declaration = token.GetAncestor<MemberDeclarationSyntax>(); if (declaration != null) { position = declaration.SpanStart; } var root = await semanticModel.GetOriginalSemanticModel().SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false); IEnumerable<UsingDirectiveSyntax> applicableUsings = GetApplicableUsings(position, root as CompilationUnitSyntax); foreach (var applicableUsing in applicableUsings) { var alias = semanticModel.GetOriginalSemanticModel().GetDeclaredSymbol(applicableUsing, cancellationToken); if (alias != null && alias.Target == type) { return alias; } } return null; }