diff options
Diffstat (limited to 'generator/plugins/dotnet/dotnet_enums.py')
-rw-r--r-- | generator/plugins/dotnet/dotnet_enums.py | 51 |
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) |