summaryrefslogtreecommitdiffstats
path: root/generator/plugins/dotnet/dotnet_enums.py
diff options
context:
space:
mode:
Diffstat (limited to 'generator/plugins/dotnet/dotnet_enums.py')
-rw-r--r--generator/plugins/dotnet/dotnet_enums.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/generator/plugins/dotnet/dotnet_enums.py b/generator/plugins/dotnet/dotnet_enums.py
new file mode 100644
index 0000000..c5e7a6c
--- /dev/null
+++ b/generator/plugins/dotnet/dotnet_enums.py
@@ -0,0 +1,51 @@
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License.
+
+from typing import Dict, List, Union
+
+from generator import model
+
+from .dotnet_commons import TypeData
+from .dotnet_constants import NAMESPACE
+from .dotnet_helpers import (
+ indent_lines,
+ lines_to_doc_comments,
+ namespace_wrapper,
+ to_upper_camel_case,
+)
+
+
+def generate_enums(spec: model.LSPModel, types: TypeData) -> None:
+ """Generate the code for the given spec."""
+ for enum_def in spec.enumerations:
+ types.add_type_info(enum_def, enum_def.name, generate_enum(enum_def))
+
+
+def _get_enum_doc(enum: Union[model.Enum, model.EnumItem]) -> List[str]:
+ doc = enum.documentation.splitlines(keepends=False) if enum.documentation else []
+ return lines_to_doc_comments(doc)
+
+
+def generate_enum(enum: model.Enum) -> List[str]:
+ use_enum_member = all(isinstance(item.value, str) for item in enum.values)
+ imports = ["using System.Runtime.Serialization;"]
+ if use_enum_member:
+ imports += ["using Newtonsoft.Json;", "using Newtonsoft.Json.Converters;"]
+
+ lines = _get_enum_doc(enum)
+ if use_enum_member:
+ lines += ["[JsonConverter(typeof(StringEnumConverter))]"]
+ lines += [f"public enum {enum.name}", "{"]
+
+ for item in enum.values:
+ name = to_upper_camel_case(item.name)
+ inner = _get_enum_doc(item)
+ if use_enum_member:
+ inner += [f'[EnumMember(Value = "{item.value}")]{name},']
+ else:
+ inner += [f"{name} = {item.value},"]
+ lines += indent_lines(inner) + [""]
+
+ lines += ["}"]
+
+ return namespace_wrapper(NAMESPACE, (imports if use_enum_member else []), lines)