/*
Copyright (C) 2014-2019 de4dot@gmail.com
This file is part of dnSpy
dnSpy is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
dnSpy is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with dnSpy. If not, see .
*/
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis;
using SIGHLP = Microsoft.CodeAnalysis.SignatureHelp;
namespace dnSpy.Roslyn.Internal.SignatureHelp {
sealed class SignatureHelpItem {
public bool IsVariadic => signatureHelpItem.IsVariadic;
public ImmutableArray PrefixDisplayParts {
get {
if (prefixDisplayParts.IsDefault)
Initialize();
return prefixDisplayParts;
}
}
ImmutableArray prefixDisplayParts;
public ImmutableArray SuffixDisplayParts {
get {
if (suffixDisplayParts.IsDefault)
Initialize();
return suffixDisplayParts;
}
}
ImmutableArray suffixDisplayParts;
public ImmutableArray SeparatorDisplayParts {
get {
if (separatorDisplayParts.IsDefault)
Initialize();
return separatorDisplayParts;
}
}
ImmutableArray separatorDisplayParts;
public ImmutableArray Parameters {
get {
if (parameters.IsDefault)
Initialize();
return parameters;
}
}
ImmutableArray parameters;
public ImmutableArray DescriptionParts {
get {
if (descriptionParts.IsDefault)
Initialize();
return descriptionParts;
}
}
ImmutableArray descriptionParts;
public Func> DocumentationFactory {
get {
if (documentationFactory == null)
Initialize();
return documentationFactory;
}
}
Func> documentationFactory;
readonly SIGHLP.SignatureHelpItem signatureHelpItem;
public SignatureHelpItem(SIGHLP.SignatureHelpItem signatureHelpItem) {
if (signatureHelpItem == null)
throw new ArgumentNullException(nameof(signatureHelpItem));
this.signatureHelpItem = signatureHelpItem;
}
void Initialize() {
descriptionParts = signatureHelpItem.DescriptionParts;
documentationFactory = signatureHelpItem.DocumentationFactory;
parameters = ToSignatureHelpParameter(signatureHelpItem.Parameters);
prefixDisplayParts = signatureHelpItem.PrefixDisplayParts;
separatorDisplayParts = signatureHelpItem.SeparatorDisplayParts;
suffixDisplayParts = signatureHelpItem.SuffixDisplayParts;
}
static ImmutableArray ToSignatureHelpParameter(ImmutableArray parameters) {
var builder = ImmutableArray.CreateBuilder(parameters.Length);
for (int i = 0; i < parameters.Length; i++)
builder.Add(new SignatureHelpParameter(parameters[i]));
return builder.MoveToImmutable();
}
public IEnumerable GetAllParts() =>
PrefixDisplayParts.Concat(
SeparatorDisplayParts.Concat(
SuffixDisplayParts.Concat(
Parameters.SelectMany(p => p.GetAllParts())).Concat(
DescriptionParts)));
}
}