public string GetTypeReferenceString (ITypeSymbol type, bool highlight = true)
{
if (type == null)
throw new ArgumentNullException (nameof (type));
if (type.TypeKind == TypeKind.Error) {
SemanticModel model = SemanticModel;
if (model == null) {
var parsedDocument = ctx.ParsedDocument;
if (parsedDocument != null) {
model = parsedDocument.GetAst<SemanticModel> () ?? ctx.AnalysisDocument?.GetSemanticModelAsync ().Result;
}
}
var typeSyntax = type.GenerateTypeSyntax ();
string generatedTypeSyntaxString;
try {
var oldDoc = ctx.AnalysisDocument;
var newDoc = oldDoc.WithSyntaxRoot (SyntaxFactory.ParseCompilationUnit (typeSyntax.ToString ()).WithAdditionalAnnotations (Simplifier.Annotation));
var reducedDoc = Simplifier.ReduceAsync (newDoc, options);
generatedTypeSyntaxString = Ambience.EscapeText (reducedDoc.Result.GetSyntaxRootAsync ().Result.ToString ());
} catch (Exception e) {
generatedTypeSyntaxString = typeSyntax != null ? Ambience.EscapeText (typeSyntax.ToString ()) : "?";
}
return highlight ? HighlightSemantically (generatedTypeSyntaxString, colorStyle.UserTypes) : generatedTypeSyntaxString;
}
if (type.TypeKind == TypeKind.Array) {
var arrayType = (IArrayTypeSymbol)type;
return GetTypeReferenceString (arrayType.ElementType, highlight) + "[" + new string (',', arrayType.Rank - 1) + "]";
}
if (type.TypeKind == TypeKind.Pointer)
return GetTypeReferenceString (((IPointerTypeSymbol)type).PointedAtType, highlight) + "*";
string displayString;
if (ctx != null) {
SemanticModel model = SemanticModel;
if (model == null) {
var parsedDocument = ctx.ParsedDocument;
if (parsedDocument != null) {
model = parsedDocument.GetAst<SemanticModel> () ?? ctx.AnalysisDocument?.GetSemanticModelAsync ().Result;
}
}
//Math.Min (model.SyntaxTree.Length, offset)) is needed in case parsedDocument.GetAst<SemanticModel> () is outdated
//this is tradeoff between performance and consistency between editor text(offset) and model, since
//ToMinimalDisplayString can use little outdated model this is fine
//but in case of Sketches where user usually is at end of document when typing text this can throw exception
//because offset can be >= Length
displayString = model != null ? RoslynCompletionData.SafeMinimalDisplayString (type, model, Math.Min (model.SyntaxTree.Length - 1, offset), MonoDevelop.Ide.TypeSystem.Ambience.LabelFormat) : type.Name;
} else {
displayString = type.ToDisplayString (MonoDevelop.Ide.TypeSystem.Ambience.LabelFormat);
}
var text = MonoDevelop.Ide.TypeSystem.Ambience.EscapeText (displayString);
return highlight ? HighlightSemantically (text, colorStyle.UserTypes) : text;
}