2021-09-20 18:20:01 +02:00

322 lines
9.9 KiB
C#

/*
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 <http://www.gnu.org/licenses/>.
*/
using System.Collections.Immutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Tags;
namespace dnSpy.Roslyn.Intellisense.Completions {
enum CompletionKind {
Unknown,
ClassProtected,
ClassInternal,
ClassPrivate,
Class,
ConstantProtected,
ConstantInternal,
ConstantPrivate,
Constant,
DelegateProtected,
DelegateInternal,
DelegatePrivate,
Delegate,
EnumProtected,
EnumInternal,
EnumPrivate,
Enum,
EventProtected,
EventInternal,
EventPrivate,
Event,
ExtensionMethodProtected,
ExtensionMethodInternal,
ExtensionMethodPrivate,
ExtensionMethod,
FieldProtected,
FieldInternal,
FieldPrivate,
Field,
InterfaceProtected,
InterfaceInternal,
InterfacePrivate,
Interface,
MethodProtected,
MethodInternal,
MethodPrivate,
Method,
ModuleProtected,
ModuleInternal,
ModulePrivate,
Module,
OperatorProtected,
OperatorInternal,
OperatorPrivate,
Operator,
PropertyProtected,
PropertyInternal,
PropertyPrivate,
Property,
StructureProtected,
StructureInternal,
StructurePrivate,
Structure,
FileCSharp,
FileVisualBasic,
ProjectCSharp,
ProjectVisualBasic,
EnumMember,
Assembly,
RangeVariable,
Local,
Parameter,
Intrinsic,
Keyword,
Label,
Namespace,
Folder,
Reference,
TypeParameter,
Snippet,
StatusError,
StatusWarning,
StatusInformation,
}
static class CompletionKindUtilities {
public static CompletionKind ToCompletionKind(this ImmutableArray<string> tags) {
foreach (var tag in tags) {
switch (tag) {
case WellKnownTags.Class:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.ClassProtected;
case Accessibility.Internal: return CompletionKind.ClassInternal;
case Accessibility.Private: return CompletionKind.ClassPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Class;
}
case WellKnownTags.Constant:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.ConstantProtected;
case Accessibility.Internal: return CompletionKind.ConstantInternal;
case Accessibility.Private: return CompletionKind.ConstantPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Constant;
}
case WellKnownTags.Delegate:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.DelegateProtected;
case Accessibility.Internal: return CompletionKind.DelegateInternal;
case Accessibility.Private: return CompletionKind.DelegatePrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Delegate;
}
case WellKnownTags.Enum:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.EnumProtected;
case Accessibility.Internal: return CompletionKind.EnumInternal;
case Accessibility.Private: return CompletionKind.EnumPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Enum;
}
case WellKnownTags.Event:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.EventProtected;
case Accessibility.Internal: return CompletionKind.EventInternal;
case Accessibility.Private: return CompletionKind.EventPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Event;
}
case WellKnownTags.ExtensionMethod:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.ExtensionMethodProtected;
case Accessibility.Internal: return CompletionKind.ExtensionMethodInternal;
case Accessibility.Private: return CompletionKind.ExtensionMethodPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.ExtensionMethod;
}
case WellKnownTags.Field:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.FieldProtected;
case Accessibility.Internal: return CompletionKind.FieldInternal;
case Accessibility.Private: return CompletionKind.FieldPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Field;
}
case WellKnownTags.Interface:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.InterfaceProtected;
case Accessibility.Internal: return CompletionKind.InterfaceInternal;
case Accessibility.Private: return CompletionKind.InterfacePrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Interface;
}
case WellKnownTags.Method:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.MethodProtected;
case Accessibility.Internal: return CompletionKind.MethodInternal;
case Accessibility.Private: return CompletionKind.MethodPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Method;
}
case WellKnownTags.Module:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.ModuleProtected;
case Accessibility.Internal: return CompletionKind.ModuleInternal;
case Accessibility.Private: return CompletionKind.ModulePrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Module;
}
case WellKnownTags.Operator:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.OperatorProtected;
case Accessibility.Internal: return CompletionKind.OperatorInternal;
case Accessibility.Private: return CompletionKind.OperatorPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Operator;
}
case WellKnownTags.Property:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.PropertyProtected;
case Accessibility.Internal: return CompletionKind.PropertyInternal;
case Accessibility.Private: return CompletionKind.PropertyPrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Property;
}
case WellKnownTags.Structure:
switch (GetAccessibility(tags)) {
case Accessibility.Protected: return CompletionKind.StructureProtected;
case Accessibility.Internal: return CompletionKind.StructureInternal;
case Accessibility.Private: return CompletionKind.StructurePrivate;
case Accessibility.Public:
case Accessibility.None:
default:
return CompletionKind.Structure;
}
case WellKnownTags.File:
switch (GetLanguage(tags)) {
case Language.CSharp: return CompletionKind.FileCSharp;
case Language.VisualBasic: return CompletionKind.FileVisualBasic;
case Language.None:
default:
return CompletionKind.Unknown;
}
case WellKnownTags.Project:
switch (GetLanguage(tags)) {
case Language.CSharp: return CompletionKind.ProjectCSharp;
case Language.VisualBasic: return CompletionKind.ProjectVisualBasic;
case Language.None:
default:
return CompletionKind.Unknown;
}
case WellKnownTags.EnumMember: return CompletionKind.EnumMember;
case WellKnownTags.Assembly: return CompletionKind.Assembly;
case WellKnownTags.Parameter: return CompletionKind.Parameter;
case WellKnownTags.RangeVariable: return CompletionKind.RangeVariable;
case WellKnownTags.Intrinsic: return CompletionKind.Intrinsic;
case WellKnownTags.Keyword: return CompletionKind.Keyword;
case WellKnownTags.Label: return CompletionKind.Label;
case WellKnownTags.Local: return CompletionKind.Local;
case WellKnownTags.Namespace: return CompletionKind.Namespace;
case WellKnownTags.Folder: return CompletionKind.Folder;
case WellKnownTags.Reference: return CompletionKind.Reference;
case WellKnownTags.TypeParameter: return CompletionKind.TypeParameter;
case WellKnownTags.Snippet: return CompletionKind.Snippet;
case WellKnownTags.Error: return CompletionKind.StatusError;
case WellKnownTags.Warning: return CompletionKind.StatusWarning;
case "StatusInformation": return CompletionKind.StatusInformation;
}
}
return CompletionKind.Unknown;
}
static Accessibility GetAccessibility(ImmutableArray<string> tags) {
if (tags.Contains(WellKnownTags.Public))
return Accessibility.Public;
if (tags.Contains(WellKnownTags.Protected))
return Accessibility.Protected;
if (tags.Contains(WellKnownTags.Internal))
return Accessibility.Internal;
if (tags.Contains(WellKnownTags.Private))
return Accessibility.Private;
return Accessibility.None;
}
static Language GetLanguage(ImmutableArray<string> tags) {
if (tags.Contains(LanguageNames.CSharp))
return Language.CSharp;
if (tags.Contains(LanguageNames.VisualBasic))
return Language.VisualBasic;
return Language.None;
}
enum Accessibility {
None,
Public,
Protected,
Internal,
Private,
}
enum Language {
None,
CSharp,
VisualBasic,
}
}
}