├── .config └── dotnet-tools.json ├── .devcontainer ├── Dockerfile ├── base.Dockerfile ├── devcontainer.json ├── devinit.json └── library-scripts │ └── common-debian.sh ├── .editorconfig ├── .gitattributes ├── .github └── workflows │ ├── ci.yml │ ├── release-preview.yml │ └── release.yml ├── .gitignore ├── .vscode ├── extensions.json └── tasks.json ├── .vsconfig ├── Build.cmd ├── Directory.Build.props ├── Directory.Build.rsp ├── Directory.Packages.props ├── LICENSE ├── README.md ├── Test.cmd ├── build.sh ├── eng └── Settings.props ├── generator.sln ├── global.json ├── nuget.config ├── src └── Generator │ ├── AutoNotifyGenerator.cs │ ├── Extensions │ ├── INamedTypeSymbolExtensions.cs │ ├── ISymbolExtensions.cs │ └── ITypeSymbolExtensions.cs │ ├── Generator.csproj │ ├── SourceCodeBuilder.cs │ ├── SourceCodeWriter.cs │ ├── SourceCodeWriterExtensions.cs │ └── packages.lock.json ├── test.sh ├── tests ├── Adapter.cs ├── AutoNotifyGeneratorTests.cs ├── Tests.csproj └── packages.lock.json └── version.json /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "nbgv": { 6 | "version": "3.4.255", 7 | "commands": [ 8 | "nbgv" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # [Choice] .NET version: 5.0, 3.1, 2.1 2 | ARG VARIANT=6.0 3 | FROM mcr.microsoft.com/vscode/devcontainers/dotnet:dev-${VARIANT} 4 | -------------------------------------------------------------------------------- /.devcontainer/base.Dockerfile: -------------------------------------------------------------------------------- 1 | # [Choice] .NET version: 5.0, 3.1, 2.1 2 | ARG VARIANT="6.0" 3 | FROM mcr.microsoft.com/dotnet/sdk:${VARIANT}-focal 4 | 5 | # [Option] Install zsh 6 | ARG INSTALL_ZSH="true" 7 | # [Option] Upgrade OS packages to their latest versions 8 | ARG UPGRADE_PACKAGES="true" 9 | 10 | # Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies. 11 | ARG USERNAME=vscode 12 | ARG USER_UID=1000 13 | ARG USER_GID=$USER_UID 14 | COPY library-scripts/common-debian.sh /tmp/library-scripts/ 15 | RUN bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \ 16 | && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts 17 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.140.1/containers/dotnetcore 3 | { 4 | "name": "C# (.NET 6)", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "args": { 8 | "VARIANT": "6.0", 9 | } 10 | }, 11 | "settings": { 12 | "terminal.integrated.shell.linux": "/bin/bash" 13 | }, 14 | "extensions": [ 15 | "ms-dotnettools.csharp", 16 | "formulahendry.dotnet-test-explorer", 17 | "EditorConfig.EditorConfig" 18 | ], 19 | "postCreateCommand": "dotnet restore" 20 | } -------------------------------------------------------------------------------- /.devcontainer/devinit.json: -------------------------------------------------------------------------------- 1 | { 2 | "run": [ 3 | { 4 | "tool": "require-dotnetcoresdk" 5 | } 6 | ] 7 | } -------------------------------------------------------------------------------- /.devcontainer/library-scripts/common-debian.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #------------------------------------------------------------------------------------------------------------- 3 | # Copyright (c) Microsoft Corporation. All rights reserved. 4 | # Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. 5 | #------------------------------------------------------------------------------------------------------------- 6 | # 7 | # Docs: https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/docs/common.md 8 | # 9 | # Syntax: ./common-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] [install Oh My *! flag] 10 | 11 | INSTALL_ZSH=${1:-"true"} 12 | USERNAME=${2:-"automatic"} 13 | USER_UID=${3:-"automatic"} 14 | USER_GID=${4:-"automatic"} 15 | UPGRADE_PACKAGES=${5:-"true"} 16 | INSTALL_OH_MYS=${6:-"true"} 17 | 18 | set -e 19 | 20 | if [ "$(id -u)" -ne 0 ]; then 21 | echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' 22 | exit 1 23 | fi 24 | 25 | # Ensure that login shells get the correct path if the user updated the PATH using ENV. 26 | rm -f /etc/profile.d/00-restore-env.sh 27 | echo "export PATH=${PATH//$(sh -lc 'echo $PATH')/\$PATH}" > /etc/profile.d/00-restore-env.sh 28 | chmod +x /etc/profile.d/00-restore-env.sh 29 | 30 | # If in automatic mode, determine if a user already exists, if not use vscode 31 | if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then 32 | USERNAME="" 33 | POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") 34 | for CURRENT_USER in ${POSSIBLE_USERS[@]}; do 35 | if id -u ${CURRENT_USER} > /dev/null 2>&1; then 36 | USERNAME=${CURRENT_USER} 37 | break 38 | fi 39 | done 40 | if [ "${USERNAME}" = "" ]; then 41 | USERNAME=vscode 42 | fi 43 | elif [ "${USERNAME}" = "none" ]; then 44 | USERNAME=root 45 | USER_UID=0 46 | USER_GID=0 47 | fi 48 | 49 | # Load markers to see which steps have already run 50 | MARKER_FILE="/usr/local/etc/vscode-dev-containers/common" 51 | if [ -f "${MARKER_FILE}" ]; then 52 | echo "Marker file found:" 53 | cat "${MARKER_FILE}" 54 | source "${MARKER_FILE}" 55 | fi 56 | 57 | # Ensure apt is in non-interactive to avoid prompts 58 | export DEBIAN_FRONTEND=noninteractive 59 | 60 | # Function to call apt-get if needed 61 | apt-get-update-if-needed() 62 | { 63 | if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then 64 | echo "Running apt-get update..." 65 | apt-get update 66 | else 67 | echo "Skipping apt-get update." 68 | fi 69 | } 70 | 71 | # Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies 72 | if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then 73 | apt-get-update-if-needed 74 | 75 | PACKAGE_LIST="apt-utils \ 76 | git \ 77 | openssh-client \ 78 | gnupg2 \ 79 | iproute2 \ 80 | procps \ 81 | lsof \ 82 | htop \ 83 | net-tools \ 84 | psmisc \ 85 | curl \ 86 | wget \ 87 | rsync \ 88 | ca-certificates \ 89 | unzip \ 90 | zip \ 91 | nano \ 92 | vim-tiny \ 93 | less \ 94 | jq \ 95 | lsb-release \ 96 | apt-transport-https \ 97 | dialog \ 98 | libc6 \ 99 | libgcc1 \ 100 | libkrb5-3 \ 101 | libgssapi-krb5-2 \ 102 | libicu[0-9][0-9] \ 103 | liblttng-ust0 \ 104 | libstdc++6 \ 105 | zlib1g \ 106 | locales \ 107 | sudo \ 108 | ncdu \ 109 | man-db \ 110 | strace" 111 | 112 | # Install libssl1.1 if available 113 | if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then 114 | PACKAGE_LIST="${PACKAGE_LIST} libssl1.1" 115 | fi 116 | 117 | # Install appropriate version of libssl1.0.x if available 118 | LIBSSL=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') 119 | if [ "$(echo "$LIBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then 120 | if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then 121 | # Debian 9 122 | PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.2" 123 | elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then 124 | # Ubuntu 18.04, 16.04, earlier 125 | PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.0" 126 | fi 127 | fi 128 | 129 | echo "Packages to verify are installed: ${PACKAGE_LIST}" 130 | apt-get -y install --no-install-recommends ${PACKAGE_LIST} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) 131 | 132 | PACKAGES_ALREADY_INSTALLED="true" 133 | fi 134 | 135 | # Get to latest versions of all packages 136 | if [ "${UPGRADE_PACKAGES}" = "true" ]; then 137 | apt-get-update-if-needed 138 | apt-get -y upgrade --no-install-recommends 139 | apt-get autoremove -y 140 | fi 141 | 142 | # Ensure at least the en_US.UTF-8 UTF-8 locale is available. 143 | # Common need for both applications and things like the agnoster ZSH theme. 144 | if [ "${LOCALE_ALREADY_SET}" != "true" ] && ! grep -o -E '^\s*en_US.UTF-8\s+UTF-8' /etc/locale.gen > /dev/null; then 145 | echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen 146 | locale-gen 147 | LOCALE_ALREADY_SET="true" 148 | fi 149 | 150 | # Create or update a non-root user to match UID/GID. 151 | if id -u ${USERNAME} > /dev/null 2>&1; then 152 | # User exists, update if needed 153 | if [ "${USER_GID}" != "automatic" ] && [ "$USER_GID" != "$(id -G $USERNAME)" ]; then 154 | groupmod --gid $USER_GID $USERNAME 155 | usermod --gid $USER_GID $USERNAME 156 | fi 157 | if [ "${USER_UID}" != "automatic" ] && [ "$USER_UID" != "$(id -u $USERNAME)" ]; then 158 | usermod --uid $USER_UID $USERNAME 159 | fi 160 | else 161 | # Create user 162 | if [ "${USER_GID}" = "automatic" ]; then 163 | groupadd $USERNAME 164 | else 165 | groupadd --gid $USER_GID $USERNAME 166 | fi 167 | if [ "${USER_UID}" = "automatic" ]; then 168 | useradd -s /bin/bash --gid $USERNAME -m $USERNAME 169 | else 170 | useradd -s /bin/bash --uid $USER_UID --gid $USERNAME -m $USERNAME 171 | fi 172 | fi 173 | 174 | # Add add sudo support for non-root user 175 | if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then 176 | echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME 177 | chmod 0440 /etc/sudoers.d/$USERNAME 178 | EXISTING_NON_ROOT_USER="${USERNAME}" 179 | fi 180 | 181 | # ** Shell customization section ** 182 | if [ "${USERNAME}" = "root" ]; then 183 | USER_RC_PATH="/root" 184 | else 185 | USER_RC_PATH="/home/${USERNAME}" 186 | fi 187 | 188 | # .bashrc/.zshrc snippet 189 | RC_SNIPPET="$(cat << EOF 190 | export USER=\$(whoami) 191 | if [[ "\${PATH}" != *"\$HOME/.local/bin"* ]]; then export PATH="\${PATH}:\$HOME/.local/bin"; fi 192 | EOF 193 | )" 194 | 195 | # code shim, it fallbacks to code-insiders if code is not available 196 | cat << 'EOF' > /usr/local/bin/code 197 | #!/bin/sh 198 | get_in_path_except_current() { 199 | which -a "$1" | grep -A1 "$0" | grep -v "$0" 200 | } 201 | code="$(get_in_path_except_current code)" 202 | if [ -n "$code" ]; then 203 | exec "$code" "$@" 204 | elif [ "$(command -v code-insiders)" ]; then 205 | exec code-insiders "$@" 206 | else 207 | echo "code or code-insiders is not installed" >&2 208 | exit 127 209 | fi 210 | EOF 211 | chmod +x /usr/local/bin/code 212 | 213 | # Codespaces themes - partly inspired by https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/robbyrussell.zsh-theme 214 | CODESPACES_BASH="$(cat \ 215 | <&1 288 | echo -e "$(cat "${TEMPLATE}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${USER_RC_FILE} 289 | if [ "${OH_MY}" = "bash" ]; then 290 | sed -i -e 's/OSH_THEME=.*/OSH_THEME="codespaces"/g' ${USER_RC_FILE} 291 | mkdir -p ${OH_MY_INSTALL_DIR}/custom/themes/codespaces 292 | echo "${CODESPACES_BASH}" > ${OH_MY_INSTALL_DIR}/custom/themes/codespaces/codespaces.theme.sh 293 | else 294 | sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="codespaces"/g' ${USER_RC_FILE} 295 | mkdir -p ${OH_MY_INSTALL_DIR}/custom/themes 296 | echo "${CODESPACES_ZSH}" > ${OH_MY_INSTALL_DIR}/custom/themes/codespaces.zsh-theme 297 | fi 298 | # Shrink git while still enabling updates 299 | cd ${OH_MY_INSTALL_DIR} 300 | git repack -a -d -f --depth=1 --window=1 301 | 302 | if [ "${USERNAME}" != "root" ]; then 303 | cp -rf ${USER_RC_FILE} ${OH_MY_INSTALL_DIR} /root 304 | chown -R ${USERNAME}:${USERNAME} ${USER_RC_PATH} 305 | fi 306 | } 307 | 308 | if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then 309 | echo "${RC_SNIPPET}" >> /etc/bash.bashrc 310 | RC_SNIPPET_ALREADY_ADDED="true" 311 | fi 312 | install-oh-my bash bashrc.osh-template https://github.com/ohmybash/oh-my-bash 313 | 314 | # Optionally install and configure zsh and Oh My Zsh! 315 | if [ "${INSTALL_ZSH}" = "true" ]; then 316 | if ! type zsh > /dev/null 2>&1; then 317 | apt-get-update-if-needed 318 | apt-get install -y zsh 319 | fi 320 | if [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then 321 | echo "${RC_SNIPPET}" >> /etc/zsh/zshrc 322 | ZSH_ALREADY_INSTALLED="true" 323 | fi 324 | install-oh-my zsh zshrc.zsh-template https://github.com/ohmyzsh/ohmyzsh 325 | fi 326 | 327 | # Write marker file 328 | mkdir -p "$(dirname "${MARKER_FILE}")" 329 | echo -e "\ 330 | PACKAGES_ALREADY_INSTALLED=${PACKAGES_ALREADY_INSTALLED}\n\ 331 | LOCALE_ALREADY_SET=${LOCALE_ALREADY_SET}\n\ 332 | EXISTING_NON_ROOT_USER=${EXISTING_NON_ROOT_USER}\n\ 333 | RC_SNIPPET_ALREADY_ADDED=${RC_SNIPPET_ALREADY_ADDED}\n\ 334 | ZSH_ALREADY_INSTALLED=${ZSH_ALREADY_INSTALLED}" > "${MARKER_FILE}" 335 | 336 | echo "Done!" -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | # All files 4 | [*] 5 | indent_style = space 6 | 7 | # Xml files 8 | [*.xml] 9 | indent_size = 2 10 | 11 | # C# files 12 | [*.cs] 13 | 14 | #### Core EditorConfig Options #### 15 | 16 | # Indentation and spacing 17 | indent_size = 4 18 | tab_width = 4 19 | 20 | # New line preferences 21 | end_of_line = crlf 22 | insert_final_newline = false 23 | 24 | #### .NET Coding Conventions #### 25 | 26 | # Organize usings 27 | dotnet_separate_import_directive_groups = true 28 | dotnet_sort_system_directives_first = true 29 | file_header_template = unset 30 | 31 | # this. and Me. preferences 32 | dotnet_style_qualification_for_event = false:silent 33 | dotnet_style_qualification_for_field = false:silent 34 | dotnet_style_qualification_for_method = false:silent 35 | dotnet_style_qualification_for_property = false:silent 36 | 37 | # Language keywords vs BCL types preferences 38 | dotnet_style_predefined_type_for_locals_parameters_members = true:silent 39 | dotnet_style_predefined_type_for_member_access = true:silent 40 | 41 | # Parentheses preferences 42 | dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent 43 | dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent 44 | dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent 45 | dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent 46 | 47 | # Modifier preferences 48 | dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent 49 | 50 | # Expression-level preferences 51 | dotnet_style_coalesce_expression = true:suggestion 52 | dotnet_style_collection_initializer = true:suggestion 53 | dotnet_style_explicit_tuple_names = true:suggestion 54 | dotnet_style_null_propagation = true:suggestion 55 | dotnet_style_object_initializer = true:suggestion 56 | dotnet_style_operator_placement_when_wrapping = beginning_of_line 57 | dotnet_style_prefer_auto_properties = true:suggestion 58 | dotnet_style_prefer_compound_assignment = true:suggestion 59 | dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion 60 | dotnet_style_prefer_conditional_expression_over_return = true:suggestion 61 | dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion 62 | dotnet_style_prefer_inferred_tuple_names = true:suggestion 63 | dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion 64 | dotnet_style_prefer_simplified_boolean_expressions = true:suggestion 65 | dotnet_style_prefer_simplified_interpolation = true:suggestion 66 | 67 | # Field preferences 68 | dotnet_style_readonly_field = true:warning 69 | 70 | # Parameter preferences 71 | dotnet_code_quality_unused_parameters = all:suggestion 72 | 73 | # Suppression preferences 74 | dotnet_remove_unnecessary_suppression_exclusions = none 75 | 76 | #### C# Coding Conventions #### 77 | 78 | # var preferences 79 | csharp_style_var_elsewhere = false:silent 80 | csharp_style_var_for_built_in_types = false:silent 81 | csharp_style_var_when_type_is_apparent = false:silent 82 | 83 | # Expression-bodied members 84 | csharp_style_expression_bodied_accessors = true:silent 85 | csharp_style_expression_bodied_constructors = false:silent 86 | csharp_style_expression_bodied_indexers = true:silent 87 | csharp_style_expression_bodied_lambdas = true:suggestion 88 | csharp_style_expression_bodied_local_functions = false:silent 89 | csharp_style_expression_bodied_methods = false:silent 90 | csharp_style_expression_bodied_operators = false:silent 91 | csharp_style_expression_bodied_properties = true:silent 92 | 93 | # Pattern matching preferences 94 | csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 95 | csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 96 | csharp_style_prefer_not_pattern = true:suggestion 97 | csharp_style_prefer_pattern_matching = true:silent 98 | csharp_style_prefer_switch_expression = true:suggestion 99 | 100 | # Null-checking preferences 101 | csharp_style_conditional_delegate_call = true:suggestion 102 | 103 | # Modifier preferences 104 | csharp_prefer_static_local_function = true:warning 105 | csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent 106 | 107 | # Code-block preferences 108 | csharp_prefer_braces = true:silent 109 | csharp_prefer_simple_using_statement = true:suggestion 110 | csharp_style_namespace_declarations = file_scoped:suggestion 111 | 112 | # Expression-level preferences 113 | csharp_prefer_simple_default_expression = true:suggestion 114 | csharp_style_deconstructed_variable_declaration = true:suggestion 115 | csharp_style_inlined_variable_declaration = true:suggestion 116 | csharp_style_pattern_local_over_anonymous_function = true:suggestion 117 | csharp_style_prefer_index_operator = true:suggestion 118 | csharp_style_prefer_range_operator = true:suggestion 119 | csharp_style_throw_expression = true:suggestion 120 | csharp_style_unused_value_assignment_preference = discard_variable:suggestion 121 | csharp_style_unused_value_expression_statement_preference = discard_variable:silent 122 | 123 | # 'using' directive preferences 124 | csharp_using_directive_placement = outside_namespace:silent 125 | 126 | #### C# Formatting Rules #### 127 | 128 | # New line preferences 129 | csharp_new_line_before_catch = true 130 | csharp_new_line_before_else = true 131 | csharp_new_line_before_finally = true 132 | csharp_new_line_before_members_in_anonymous_types = true 133 | csharp_new_line_before_members_in_object_initializers = true 134 | csharp_new_line_before_open_brace = all 135 | csharp_new_line_between_query_expression_clauses = true 136 | 137 | # Indentation preferences 138 | csharp_indent_block_contents = true 139 | csharp_indent_braces = false 140 | csharp_indent_case_contents = true 141 | csharp_indent_case_contents_when_block = true 142 | csharp_indent_labels = one_less_than_current 143 | csharp_indent_switch_labels = true 144 | 145 | # Space preferences 146 | csharp_space_after_cast = false 147 | csharp_space_after_colon_in_inheritance_clause = true 148 | csharp_space_after_comma = true 149 | csharp_space_after_dot = false 150 | csharp_space_after_keywords_in_control_flow_statements = true 151 | csharp_space_after_semicolon_in_for_statement = true 152 | csharp_space_around_binary_operators = before_and_after 153 | csharp_space_around_declaration_statements = false 154 | csharp_space_before_colon_in_inheritance_clause = true 155 | csharp_space_before_comma = false 156 | csharp_space_before_dot = false 157 | csharp_space_before_open_square_brackets = false 158 | csharp_space_before_semicolon_in_for_statement = false 159 | csharp_space_between_empty_square_brackets = false 160 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 161 | csharp_space_between_method_call_name_and_opening_parenthesis = false 162 | csharp_space_between_method_call_parameter_list_parentheses = false 163 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 164 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 165 | csharp_space_between_method_declaration_parameter_list_parentheses = false 166 | csharp_space_between_parentheses = false 167 | csharp_space_between_square_brackets = false 168 | 169 | # Wrapping preferences 170 | csharp_preserve_single_line_blocks = true 171 | csharp_preserve_single_line_statements = true 172 | 173 | #### Analyzer perferences #### 174 | dotnet_diagnostic.CA1024.severity = suggestion 175 | dotnet_diagnostic.CA1034.severity = suggestion 176 | dotnet_diagnostic.CA1052.severity = suggestion 177 | dotnet_diagnostic.CA1068.severity = suggestion 178 | 179 | dotnet_diagnostic.CA1031.severity = warning 180 | dotnet_diagnostic.CA1036.severity = warning 181 | dotnet_diagnostic.CA1041.severity = warning 182 | dotnet_diagnostic.CA1043.severity = warning 183 | dotnet_diagnostic.CA1044.severity = warning 184 | dotnet_diagnostic.CA1046.severity = warning 185 | dotnet_diagnostic.CA1054.severity = warning 186 | dotnet_diagnostic.CA1055.severity = warning 187 | dotnet_diagnostic.CA1056.severity = warning 188 | dotnet_diagnostic.CA1058.severity = warning 189 | dotnet_diagnostic.CA1061.severity = warning 190 | dotnet_diagnostic.CA1065.severity = warning 191 | dotnet_diagnostic.CA1066.severity = warning 192 | dotnet_diagnostic.CA1067.severity = warning 193 | dotnet_diagnostic.CA1069.severity = warning 194 | dotnet_diagnostic.CA1507.severity = warning 195 | dotnet_diagnostic.CA1508.severity = warning 196 | dotnet_diagnostic.CA1801.severity = warning 197 | dotnet_diagnostic.CA1802.severity = warning 198 | dotnet_diagnostic.CA1805.severity = warning 199 | dotnet_diagnostic.CA1806.severity = warning 200 | dotnet_diagnostic.CA1815.severity = warning 201 | dotnet_diagnostic.CA1819.severity = warning 202 | dotnet_diagnostic.CA1820.severity = warning 203 | dotnet_diagnostic.CA1820.severity = warning 204 | dotnet_diagnostic.CA1822.severity = warning 205 | dotnet_diagnostic.CA1823.severity = warning 206 | dotnet_diagnostic.CA1823.severity = warning 207 | dotnet_diagnostic.CA1825.severity = warning 208 | dotnet_diagnostic.CA1826.severity = warning 209 | dotnet_diagnostic.CA1827.severity = warning 210 | dotnet_diagnostic.CA1828.severity = warning 211 | dotnet_diagnostic.CA1829.severity = warning 212 | dotnet_diagnostic.CA1830.severity = warning 213 | dotnet_diagnostic.CA1832.severity = warning 214 | dotnet_diagnostic.CA1833.severity = warning 215 | dotnet_diagnostic.CA1834.severity = warning 216 | dotnet_diagnostic.CA1835.severity = warning 217 | dotnet_diagnostic.CA1836.severity = warning 218 | dotnet_diagnostic.CA1837.severity = warning 219 | dotnet_diagnostic.CA2000.severity = warning 220 | dotnet_diagnostic.CA2002.severity = warning 221 | dotnet_diagnostic.CA2009.severity = warning 222 | dotnet_diagnostic.CA2011.severity = warning 223 | dotnet_diagnostic.CA2016.severity = warning 224 | dotnet_diagnostic.CA2201.severity = warning 225 | dotnet_diagnostic.CA2208.severity = warning 226 | dotnet_diagnostic.CA2211.severity = warning 227 | dotnet_diagnostic.CA2214.severity = warning 228 | dotnet_diagnostic.CA2218.severity = warning 229 | dotnet_diagnostic.CA2219.severity = warning 230 | dotnet_diagnostic.CA2224.severity = warning 231 | dotnet_diagnostic.CA2226.severity = warning 232 | dotnet_diagnostic.CA2241.severity = warning 233 | dotnet_diagnostic.CA2242.severity = warning 234 | dotnet_diagnostic.CA2243.severity = warning 235 | dotnet_diagnostic.CA2244.severity = warning 236 | dotnet_diagnostic.CA2245.severity = warning 237 | dotnet_diagnostic.CA2248.severity = warning 238 | dotnet_diagnostic.CA2249.severity = warning 239 | 240 | #### Naming styles #### 241 | 242 | # Naming rules 243 | 244 | dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.severity = suggestion 245 | dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces 246 | dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase 247 | 248 | dotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion 249 | dotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces 250 | dotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase 251 | 252 | dotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion 253 | dotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters 254 | dotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase 255 | 256 | dotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion 257 | dotnet_naming_rule.methods_should_be_pascalcase.symbols = methods 258 | dotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase 259 | 260 | dotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion 261 | dotnet_naming_rule.properties_should_be_pascalcase.symbols = properties 262 | dotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase 263 | 264 | dotnet_naming_rule.events_should_be_pascalcase.severity = suggestion 265 | dotnet_naming_rule.events_should_be_pascalcase.symbols = events 266 | dotnet_naming_rule.events_should_be_pascalcase.style = pascalcase 267 | 268 | dotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion 269 | dotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables 270 | dotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase 271 | 272 | dotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion 273 | dotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants 274 | dotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase 275 | 276 | dotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion 277 | dotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters 278 | dotnet_naming_rule.parameters_should_be_camelcase.style = camelcase 279 | 280 | dotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion 281 | dotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields 282 | dotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase 283 | 284 | dotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion 285 | dotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields 286 | dotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase 287 | 288 | dotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion 289 | dotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields 290 | dotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase 291 | 292 | dotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion 293 | dotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields 294 | dotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase 295 | 296 | dotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion 297 | dotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields 298 | dotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase 299 | 300 | dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion 301 | dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields 302 | dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase 303 | 304 | dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion 305 | dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields 306 | dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase 307 | 308 | dotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion 309 | dotnet_naming_rule.enums_should_be_pascalcase.symbols = enums 310 | dotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase 311 | 312 | dotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion 313 | dotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions 314 | dotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase 315 | 316 | dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion 317 | dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members 318 | dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase 319 | 320 | # Symbol specifications 321 | 322 | dotnet_naming_symbols.interfaces.applicable_kinds = interface 323 | dotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 324 | dotnet_naming_symbols.interfaces.required_modifiers = 325 | 326 | dotnet_naming_symbols.enums.applicable_kinds = enum 327 | dotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 328 | dotnet_naming_symbols.enums.required_modifiers = 329 | 330 | dotnet_naming_symbols.events.applicable_kinds = event 331 | dotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 332 | dotnet_naming_symbols.events.required_modifiers = 333 | 334 | dotnet_naming_symbols.methods.applicable_kinds = method 335 | dotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 336 | dotnet_naming_symbols.methods.required_modifiers = 337 | 338 | dotnet_naming_symbols.properties.applicable_kinds = property 339 | dotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 340 | dotnet_naming_symbols.properties.required_modifiers = 341 | 342 | dotnet_naming_symbols.public_fields.applicable_kinds = field 343 | dotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal 344 | dotnet_naming_symbols.public_fields.required_modifiers = 345 | 346 | dotnet_naming_symbols.private_fields.applicable_kinds = field 347 | dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected 348 | dotnet_naming_symbols.private_fields.required_modifiers = 349 | 350 | dotnet_naming_symbols.private_static_fields.applicable_kinds = field 351 | dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected 352 | dotnet_naming_symbols.private_static_fields.required_modifiers = static 353 | 354 | dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum 355 | dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 356 | dotnet_naming_symbols.types_and_namespaces.required_modifiers = 357 | 358 | dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method 359 | dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected 360 | dotnet_naming_symbols.non_field_members.required_modifiers = 361 | 362 | dotnet_naming_symbols.type_parameters.applicable_kinds = namespace 363 | dotnet_naming_symbols.type_parameters.applicable_accessibilities = * 364 | dotnet_naming_symbols.type_parameters.required_modifiers = 365 | 366 | dotnet_naming_symbols.private_constant_fields.applicable_kinds = field 367 | dotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected 368 | dotnet_naming_symbols.private_constant_fields.required_modifiers = const 369 | 370 | dotnet_naming_symbols.local_variables.applicable_kinds = local 371 | dotnet_naming_symbols.local_variables.applicable_accessibilities = local 372 | dotnet_naming_symbols.local_variables.required_modifiers = 373 | 374 | dotnet_naming_symbols.local_constants.applicable_kinds = local 375 | dotnet_naming_symbols.local_constants.applicable_accessibilities = local 376 | dotnet_naming_symbols.local_constants.required_modifiers = const 377 | 378 | dotnet_naming_symbols.parameters.applicable_kinds = parameter 379 | dotnet_naming_symbols.parameters.applicable_accessibilities = * 380 | dotnet_naming_symbols.parameters.required_modifiers = 381 | 382 | dotnet_naming_symbols.public_constant_fields.applicable_kinds = field 383 | dotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal 384 | dotnet_naming_symbols.public_constant_fields.required_modifiers = const 385 | 386 | dotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field 387 | dotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal 388 | dotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static 389 | 390 | dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field 391 | dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected 392 | dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static 393 | 394 | dotnet_naming_symbols.local_functions.applicable_kinds = local_function 395 | dotnet_naming_symbols.local_functions.applicable_accessibilities = * 396 | dotnet_naming_symbols.local_functions.required_modifiers = 397 | 398 | # Naming styles 399 | 400 | dotnet_naming_style.pascalcase.required_prefix = 401 | dotnet_naming_style.pascalcase.required_suffix = 402 | dotnet_naming_style.pascalcase.word_separator = 403 | dotnet_naming_style.pascalcase.capitalization = pascal_case 404 | 405 | dotnet_naming_style.ipascalcase.required_prefix = I 406 | dotnet_naming_style.ipascalcase.required_suffix = 407 | dotnet_naming_style.ipascalcase.word_separator = 408 | dotnet_naming_style.ipascalcase.capitalization = pascal_case 409 | 410 | dotnet_naming_style.tpascalcase.required_prefix = T 411 | dotnet_naming_style.tpascalcase.required_suffix = 412 | dotnet_naming_style.tpascalcase.word_separator = 413 | dotnet_naming_style.tpascalcase.capitalization = pascal_case 414 | 415 | dotnet_naming_style._camelcase.required_prefix = _ 416 | dotnet_naming_style._camelcase.required_suffix = 417 | dotnet_naming_style._camelcase.word_separator = 418 | dotnet_naming_style._camelcase.capitalization = camel_case 419 | 420 | dotnet_naming_style.camelcase.required_prefix = 421 | dotnet_naming_style.camelcase.required_suffix = 422 | dotnet_naming_style.camelcase.word_separator = 423 | dotnet_naming_style.camelcase.capitalization = camel_case 424 | 425 | dotnet_naming_style.s_camelcase.required_prefix = s_ 426 | dotnet_naming_style.s_camelcase.required_suffix = 427 | dotnet_naming_style.s_camelcase.word_separator = 428 | dotnet_naming_style.s_camelcase.capitalization = camel_case 429 | 430 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | ############################################################################### 3 | # Set default behavior to automatically normalize line endings. 4 | ############################################################################### 5 | * text=auto encoding=UTF-8 6 | *.sh text eol=lf 7 | 8 | ############################################################################### 9 | # Set default behavior for command prompt diff. 10 | # 11 | # This is need for earlier builds of msysgit that does not have it on by 12 | # default for csharp files. 13 | # Note: This is only used by command line 14 | ############################################################################### 15 | *.cs diff=csharp text -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | on: 3 | push: 4 | branches: 5 | - "main" 6 | - "release/*" 7 | paths-ignore: 8 | - 'docs/**' 9 | pull_request: 10 | paths-ignore: 11 | - 'docs/**' 12 | jobs: 13 | build: 14 | name: Build and Test 15 | strategy: 16 | fail-fast: false 17 | matrix: 18 | os: [ubuntu-latest, windows-latest, macos-latest] 19 | configuration: [debug, release] 20 | runs-on: ${{ matrix.os }} 21 | steps: 22 | - uses: actions/checkout@v2.4.0 23 | with: 24 | fetch-depth: 0 25 | - name: Setup .NET 26 | uses: actions/setup-dotnet@v1.9.0 27 | - name: Try get cached dependencies 28 | uses: actions/cache@v2.1.7 29 | with: 30 | path: ${{ github.workspace }}/.nuget/packages 31 | key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} 32 | restore-keys: | 33 | ${{ runner.os }}-nuget- 34 | - name: Validate dependencies 35 | run: dotnet restore --locked-mode --packages ${{ github.workspace }}/.nuget/packages 36 | - name: Build 37 | run: dotnet msbuild -p:Configuration=${{ matrix.configuration }} -graph -isolate -bl:artifacts/log/build.binlog 38 | - name: Test 39 | run: dotnet test --blame-crash --blame-hang --blame-hang-timeout 4m --logger "trx;LogFileName=TestResults.trx" --collect:"XPlat Code Coverage" --results-directory artifacts/test_results artifacts/bin/Tests/${{ matrix.configuration }}/net6.0/Tests.dll 40 | - name: Upload Test Results 41 | uses: dorny/test-reporter@v1.5.0 42 | continue-on-error: true 43 | if: success() || failure() 44 | with: 45 | name: ${{ matrix.os }} ${{ matrix.configuration }} Test Results 46 | path: 'artifacts/test_results/*.trx' 47 | reporter: dotnet-trx 48 | - name: Upload Build Artifacts 49 | uses: actions/upload-artifact@v2.3.1 50 | with: 51 | name: ${{ matrix.os }}_${{ matrix.configuration }} 52 | path: | 53 | ./artifacts/bin/**/* 54 | ./artifacts/log/**/* 55 | ./artifacts/packages/**/* 56 | ./artifacts/test_results/**/* 57 | if-no-files-found: error 58 | -------------------------------------------------------------------------------- /.github/workflows/release-preview.yml: -------------------------------------------------------------------------------- 1 | name: Create Preview Release 2 | on: 3 | push: 4 | branches: 5 | - "main" 6 | - "release/*" 7 | jobs: 8 | main: 9 | name: Build Release 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2.4.0 13 | with: 14 | fetch-depth: 0 15 | - name: Setup .NET 16 | uses: actions/setup-dotnet@v1.9.0 17 | - name: Try get cached dependencies 18 | uses: actions/cache@v2.1.7 19 | with: 20 | path: ${{ github.workspace }}/.nuget/packages 21 | key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} 22 | restore-keys: | 23 | ${{ runner.os }}-nuget- 24 | - name: Validate dependencies 25 | run: dotnet restore --locked-mode --packages ${{ github.workspace }}/.nuget/packages 26 | - name: Build 27 | run: dotnet msbuild -p:Configuration=Release -p:PublicRelease=false -graph -isolate -bl:artifacts/log/build.binlog 28 | - name: Test 29 | run: dotnet test --blame-crash --blame-hang --blame-hang-timeout 4m --logger "trx;LogFileName=TestResults.trx" --collect:"XPlat Code Coverage" --results-directory artifacts/test_results artifacts/bin/Tests/Release/net6.0/Tests.dll 30 | - name: Publish 31 | run: dotnet nuget push artifacts/**/*.nupkg --source 'https://nuget.pkg.github.com/jmarolf/index.json' --api-key ${{secrets.NUGET_API_KEY_GITHUB }} 32 | 33 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Create Release 2 | on: 3 | push: 4 | branches: 5 | - "release/*" 6 | jobs: 7 | main: 8 | name: Build Release 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2.4.0 12 | with: 13 | fetch-depth: 0 14 | - name: Setup .NET 15 | uses: actions/setup-dotnet@v1.9.0 16 | - name: Try get cached dependencies 17 | uses: actions/cache@v2.1.7 18 | with: 19 | path: ${{ github.workspace }}/.nuget/packages 20 | key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} 21 | restore-keys: | 22 | ${{ runner.os }}-nuget- 23 | - name: Validate dependencies 24 | run: dotnet restore --locked-mode --packages ${{ github.workspace }}/.nuget/packages 25 | - name: Build 26 | run: dotnet msbuild -p:Configuration=Release -p:PublicRelease=true -graph -isolate -bl:artifacts/log/build.binlog 27 | - name: Test 28 | run: dotnet test --blame-crash --blame-hang --blame-hang-timeout 4m --logger "trx;LogFileName=TestResults.trx" --collect:"XPlat Code Coverage" --results-directory artifacts/test_results artifacts/bin/Tests/Release/net6.0/Tests.dll 29 | - name: Publish 30 | run: dotnet nuget push artifacts/**/*.nupkg --source 'https://nuget.pkg.github.com/jmarolf/index.json' --api-key ${{secrets.NUGET_API_KEY}} 31 | 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userprefs 8 | *.sln.docstates 9 | *.svclog 10 | .vs/ 11 | 12 | # Build results 13 | [Aa]rtifacts/ 14 | [Dd]ebug/ 15 | [Rr]elease/ 16 | [Bb]inaries/ 17 | x64/ 18 | [Bb]in/ 19 | [Oo]bj/ 20 | .dotnet/ 21 | .tools/ 22 | .packages/ 23 | 24 | # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets 25 | !packages/*/build/ 26 | 27 | # Debug artifacts 28 | launchSettings.json 29 | 30 | # Prevent accidental re-checkin of NuGet.exe 31 | NuGet.exe 32 | 33 | # NuGet restore semaphore 34 | build/ToolsetPackages/toolsetpackages.semaphore 35 | 36 | # NuGet package 37 | src/Tools/UploadNugetZip/*.zip 38 | 39 | # MSTest test Results 40 | [Tt]est[Rr]esult*/ 41 | [Bb]uild[Ll]og.* 42 | UnitTestResults.html 43 | 44 | # NuGet V3 artifacts 45 | *-packages.config 46 | *.nuget.props 47 | *.nuget.targets 48 | project.lock.json 49 | msbuild.binlog 50 | *.project.lock.json 51 | 52 | *_i.c 53 | *_p.c 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.sbr 62 | *.tlb 63 | *.tli 64 | *.tlh 65 | *.tmp 66 | *.tmp_proj 67 | *.log 68 | *.wrn 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.log 74 | *.scc 75 | 76 | # Visual Studio cache files 77 | *.sln.ide/ 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opensdf 84 | *.sdf 85 | *.cachefile 86 | *.VC.opendb 87 | *.VC.db 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | *.DotSettings 101 | 102 | # TeamCity is a build add-in 103 | _TeamCity* 104 | 105 | # DotCover is a Code Coverage Tool 106 | *.dotCover 107 | 108 | # NCrunch 109 | *.ncrunch* 110 | .*crunch*.local.xml 111 | 112 | # Installshield output folder 113 | [Ee]xpress/ 114 | 115 | # DocProject is a documentation generator add-in 116 | DocProject/buildhelp/ 117 | DocProject/Help/*.HxT 118 | DocProject/Help/*.HxC 119 | DocProject/Help/*.hhc 120 | DocProject/Help/*.hhk 121 | DocProject/Help/*.hhp 122 | DocProject/Help/Html2 123 | DocProject/Help/html 124 | 125 | # Click-Once directory 126 | publish/ 127 | 128 | # Publish Web Output 129 | *.Publish.xml 130 | 131 | # NuGet Packages Directory 132 | packages/ 133 | 134 | # Windows Azure Build Output 135 | csx 136 | *.build.csdef 137 | 138 | # Windows Store app package directory 139 | AppPackages/ 140 | 141 | # Others 142 | sql/ 143 | *.Cache 144 | ClientBin/ 145 | [Ss]tyle[Cc]op.* 146 | ~$* 147 | *~ 148 | *.dbmdl 149 | *.[Pp]ublish.xml 150 | *.pfx 151 | *.publishsettings 152 | 153 | # RIA/Silverlight projects 154 | Generated_Code/ 155 | 156 | # Backup & report files from converting an old project file to a newer 157 | # Visual Studio version. Backup files are not needed, because we have git ;-) 158 | _UpgradeReport_Files/ 159 | Backup*/ 160 | UpgradeLog*.XML 161 | UpgradeLog*.htm 162 | 163 | # SQL Server files 164 | App_Data/*.mdf 165 | App_Data/*.ldf 166 | 167 | 168 | #LightSwitch generated files 169 | GeneratedArtifacts/ 170 | _Pvt_Extensions/ 171 | ModelManifest.xml 172 | 173 | # ========================= 174 | # Windows detritus 175 | # ========================= 176 | 177 | # Windows image file caches 178 | Thumbs.db 179 | ehthumbs.db 180 | 181 | # Folder config file 182 | Desktop.ini 183 | 184 | # Recycle Bin used on file shares 185 | $RECYCLE.BIN/ 186 | 187 | # Mac desktop service store files 188 | .DS_Store 189 | 190 | # JetBrains Rider 191 | .idea/ 192 | 193 | # WPF temp projects 194 | *wpftmp.* -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "ms-dotnettools.csharp", 6 | "formulahendry.dotnet-test-explorer", 7 | "EditorConfig.EditorConfig" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "build", 8 | "command": "${workspaceRoot}/build.sh", 9 | "type": "shell", 10 | "windows": { 11 | "command": "${workspaceRoot}/Build.cmd", 12 | }, 13 | "problemMatcher": "$msCompile", 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | }, 18 | }, 19 | { 20 | "label": "test", 21 | "command": "${workspaceRoot}/test.sh", 22 | "type": "shell", 23 | "windows": { 24 | "command": "${workspaceRoot}/Test.cmd", 25 | }, 26 | "problemMatcher": "$msCompile", 27 | "group": { 28 | "kind": "test", 29 | "isDefault": true 30 | }, 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /.vsconfig: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "components": [ 4 | "Microsoft.VisualStudio.Workload.CoreEditor", 5 | "Microsoft.VisualStudio.Workload.ManagedDesktop", 6 | "Microsoft.VisualStudio.Workload.NetCoreTools" 7 | ] 8 | } -------------------------------------------------------------------------------- /Build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | dotnet tool restore 4 | dotnet restore 5 | dotnet msbuild -graph -isolate -binaryLogger:artifacts/log/build.binlog 6 | dotnet pack --no-build --no-restore --nologo --output artifacts/packages -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | true 12 | 13 | 14 | 15 | 16 | 17 | true 18 | 19 | true 20 | 21 | true 22 | 23 | 24 | 25 | 26 | latest 27 | latest 28 | enable 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 6.0.1 37 | true 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Directory.Build.rsp: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------------------------ 2 | # This file contains command-line options that MSBuild will process as part of 3 | # every build, unless the "/noautoresponse" switch is specified. 4 | # 5 | # MSBuild processes the options in this file first, before processing the 6 | # options on the command line. As a result, options on the command line can 7 | # override the options in this file. However, depending on the options being 8 | # set, the overriding can also result in conflicts. 9 | # 10 | # NOTE: The "/noautoresponse" switch cannot be specified in this file, nor in 11 | # any response file that is referenced by this file. 12 | #------------------------------------------------------------------------------ 13 | /noLogo 14 | /verbosity:quiet 15 | /maxCpuCount -------------------------------------------------------------------------------- /Directory.Packages.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jonathon Marolf 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Recommended Roslyn Source Generators Repo Template 2 | 3 | Use this repo as a template for getting started with Roslyn Source Generators 4 | 5 | See examples [here](https://github.com/dotnet/roslyn-sdk/tree/main/samples/CSharp/SourceGenerators) to get started. 6 | 7 | Also, be sure to checkout the [cookbook](https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md). 8 | -------------------------------------------------------------------------------- /Test.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | dotnet test --blame-crash --blame-hang --blame-hang-timeout 4m --logger "trx;LogFileName=TestResults.trx" -p:ParallelizeTestCollections=true --collect:"XPlat Code Coverage" --results-directory artifacts/test_results -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dotnet tool restore 4 | dotnet restore 5 | dotnet msbuild -graph -isolate -binaryLogger:artifacts/log/build.binlog 6 | dotnet pack --no-build --no-restore --nologo --output artifacts/packages -------------------------------------------------------------------------------- /eng/Settings.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | $([MSBuild]::NormalizeDirectory('$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), 'global.json'))')) 7 | $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'eng')) 8 | $([MSBuild]::NormalizeDirectory('$(RepoRoot)', '.tools')) 9 | $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'artifacts')) 10 | $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'obj')) 11 | $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'bin')) 12 | $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'log', '$(Configuration)')) 13 | $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'tmp', '$(Configuration)')) 14 | $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'TestResults', '$(Configuration)')) 15 | 16 | 17 | 18 | 19 | $(MSBuildProjectName) 20 | 21 | $([System.IO.Path]::GetFullPath('$(ArtifactsBinDir)$(OutDirName)\')) 22 | $(BaseOutputPath)$(Configuration)\ 23 | $(BaseOutputPath)$(PlatformName)\$(Configuration)\ 24 | 25 | $([System.IO.Path]::GetFullPath('$(ArtifactsObjDir)$(OutDirName)\')) 26 | $(BaseIntermediateOutputPath)$(Configuration)\ 27 | $(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\ 28 | 29 | 30 | -------------------------------------------------------------------------------- /generator.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31102.280 5 | MinimumVisualStudioVersion = 15.0.26124.0 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8AD80C7C-448A-4A33-97BB-777972B59A58}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Generator", "src\Generator\Generator.csproj", "{540EA240-B200-44A4-9A46-76994BE26CED}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "tests\Tests.csproj", "{42917516-4301-4D45-BAB4-52B94DCD8F15}" 11 | EndProject 12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{ECD898F4-0CDF-4FB4-9DCC-DA305A834AD6}" 13 | ProjectSection(SolutionItems) = preProject 14 | .editorconfig = .editorconfig 15 | .gitattributes = .gitattributes 16 | .gitignore = .gitignore 17 | Directory.Build.props = Directory.Build.props 18 | Directory.Packages.props = Directory.Packages.props 19 | global.json = global.json 20 | nuget.config = nuget.config 21 | README.md = README.md 22 | EndProjectSection 23 | EndProject 24 | Global 25 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 26 | Debug|Any CPU = Debug|Any CPU 27 | Debug|x64 = Debug|x64 28 | Debug|x86 = Debug|x86 29 | Release|Any CPU = Release|Any CPU 30 | Release|x64 = Release|x64 31 | Release|x86 = Release|x86 32 | EndGlobalSection 33 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 34 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|x64.ActiveCfg = Debug|Any CPU 37 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|x64.Build.0 = Debug|Any CPU 38 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|x86.ActiveCfg = Debug|Any CPU 39 | {540EA240-B200-44A4-9A46-76994BE26CED}.Debug|x86.Build.0 = Debug|Any CPU 40 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|Any CPU.Build.0 = Release|Any CPU 42 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|x64.ActiveCfg = Release|Any CPU 43 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|x64.Build.0 = Release|Any CPU 44 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|x86.ActiveCfg = Release|Any CPU 45 | {540EA240-B200-44A4-9A46-76994BE26CED}.Release|x86.Build.0 = Release|Any CPU 46 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 47 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|Any CPU.Build.0 = Debug|Any CPU 48 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|x64.ActiveCfg = Debug|Any CPU 49 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|x64.Build.0 = Debug|Any CPU 50 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|x86.ActiveCfg = Debug|Any CPU 51 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Debug|x86.Build.0 = Debug|Any CPU 52 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|Any CPU.ActiveCfg = Release|Any CPU 53 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|Any CPU.Build.0 = Release|Any CPU 54 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|x64.ActiveCfg = Release|Any CPU 55 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|x64.Build.0 = Release|Any CPU 56 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|x86.ActiveCfg = Release|Any CPU 57 | {42917516-4301-4D45-BAB4-52B94DCD8F15}.Release|x86.Build.0 = Release|Any CPU 58 | EndGlobalSection 59 | GlobalSection(SolutionProperties) = preSolution 60 | HideSolutionNode = FALSE 61 | EndGlobalSection 62 | GlobalSection(NestedProjects) = preSolution 63 | {540EA240-B200-44A4-9A46-76994BE26CED} = {8AD80C7C-448A-4A33-97BB-777972B59A58} 64 | EndGlobalSection 65 | GlobalSection(ExtensibilityGlobals) = postSolution 66 | SolutionGuid = {2C4F626A-5A8F-46A6-8F5C-431E4D470D69} 67 | EndGlobalSection 68 | EndGlobal 69 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "6.0.101", 4 | "allowPrerelease": true, 5 | "rollForward": "patch" 6 | } 7 | } -------------------------------------------------------------------------------- /nuget.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Generator/AutoNotifyGenerator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Collections.Immutable; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading; 6 | 7 | using Microsoft.CodeAnalysis; 8 | using Microsoft.CodeAnalysis.CSharp.Syntax; 9 | using Microsoft.CodeAnalysis.Text; 10 | 11 | namespace Generator; 12 | 13 | [Generator(LanguageNames.CSharp)] 14 | public partial class AutoNotifyGenerator : IIncrementalGenerator 15 | { 16 | private const string NamespaceNameText = "AutoNotify"; 17 | private const string TypeNameText = "AutoNotifyAttribute"; 18 | private const string AttributeFullTypeName = NamespaceNameText + "." + TypeNameText; 19 | private const string AttributeText = $@" 20 | using System; 21 | namespace {NamespaceNameText} 22 | {{ 23 | [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] 24 | [System.Diagnostics.Conditional(""AutoNotifyGenerator_DEBUG"")] 25 | sealed class {TypeNameText} : Attribute 26 | {{ 27 | public {TypeNameText}() 28 | {{ 29 | }} 30 | public string PropertyName {{ get; set; }} 31 | }} 32 | }} 33 | "; 34 | 35 | public void Initialize(IncrementalGeneratorInitializationContext context) 36 | { 37 | context.RegisterPostInitializationOutput(static context => context.AddSource("AutoNotifyAttribute", AttributeText)); 38 | 39 | // Get fields with our attributes grouped by containing type 40 | var fieldSymbols = context.SyntaxProvider.CreateSyntaxProvider( 41 | predicate: IsFieldDeclarationWithAttribute, 42 | transform: GetFieldSymbols) 43 | .SelectMany(static (fields, _) => fields) 44 | .Collect() 45 | .Select(GroupFieldsByContainingType) 46 | .SelectMany(static (groups, _) => groups); 47 | 48 | var data = context.CompilationProvider.Select( 49 | static (compilation, token) => 50 | { 51 | var inotifyPropertyChanged = compilation.GetTypeByMetadataName("System.ComponentModel.INotifyPropertyChanged"); 52 | var autoNotifyAttribute = compilation.GetTypeByMetadataName(AttributeFullTypeName); 53 | var systemObject = compilation.GetSpecialType(SpecialType.System_Object); 54 | return (INotifyPropertyChanged: inotifyPropertyChanged, AutoNotifyAttribute: autoNotifyAttribute, Object: systemObject); 55 | }) 56 | .Combine(fieldSymbols.Collect()); 57 | 58 | context.RegisterSourceOutput(data, GenerateSource); 59 | } 60 | 61 | private static bool IsFieldDeclarationWithAttribute(SyntaxNode node, CancellationToken _) 62 | => node is FieldDeclarationSyntax fieldDeclarationSyntax && fieldDeclarationSyntax.AttributeLists.Count > 0; 63 | 64 | private static IEnumerable GetFieldSymbols(GeneratorSyntaxContext context, CancellationToken token) 65 | { 66 | var fieldDeclarationSyntax = (FieldDeclarationSyntax)context.Node; 67 | foreach (var variable in fieldDeclarationSyntax.Declaration.Variables) 68 | { 69 | // Get the symbol being declared by the field, and keep it if its annotated 70 | if (context.SemanticModel.GetDeclaredSymbol(variable, cancellationToken: token) is IFieldSymbol fieldSymbol && 71 | fieldSymbol.GetAttributes().Any(ad => ad.AttributeClass?.ToDisplayString() == AttributeFullTypeName)) 72 | { 73 | yield return fieldSymbol; 74 | } 75 | } 76 | } 77 | 78 | private static IEnumerable> GroupFieldsByContainingType( 79 | ImmutableArray fieldSymbols, CancellationToken _) 80 | => fieldSymbols.GroupBy(field => field.ContainingType, SymbolEqualityComparer.Default); 81 | 82 | private static void GenerateSource( 83 | SourceProductionContext context, 84 | ( 85 | (INamedTypeSymbol? INotifyPropertyChanged, INamedTypeSymbol? AutoNotifyAttribute, INamedTypeSymbol Object) RequiredSymbols, 86 | ImmutableArray> TypesAndFields 87 | ) data) 88 | { 89 | var attributeSymbol = data.RequiredSymbols.AutoNotifyAttribute; 90 | var notifySymbol = data.RequiredSymbols.INotifyPropertyChanged; 91 | var objectSymbol = data.RequiredSymbols.Object; 92 | if (attributeSymbol is null || notifySymbol is null) 93 | { 94 | return; 95 | } 96 | 97 | var builder = new SourceCodeBuilder(attributeSymbol, notifySymbol, objectSymbol, context.ReportDiagnostic); 98 | foreach (var group in data.TypesAndFields) 99 | { 100 | var containgingType = group.Key; 101 | if (containgingType is not INamedTypeSymbol namedTypeSymbol) 102 | { 103 | continue; 104 | } 105 | 106 | var fields = group.ToImmutableArray(); 107 | if (builder.TryGeneratePartialType(namedTypeSymbol, fields, out var partialType)) 108 | { 109 | context.AddSource($"{containgingType.Name}_autoNotify.cs", SourceText.From(partialType, Encoding.UTF8)); 110 | } 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /src/Generator/Extensions/INamedTypeSymbolExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | 4 | using Microsoft.CodeAnalysis; 5 | 6 | namespace Generator.Extensions; 7 | internal static class INamedTypeSymbolExtensions 8 | { 9 | public static bool AnyBaseTypesHaveFieldsWithAttribute(this INamedTypeSymbol namedType, INamedTypeSymbol attribute) 10 | => namedType.GetBaseTypes().Any(baseType => baseType.GetMembers().OfType().Any(field => field.HasAttribute(attribute))); 11 | 12 | public static IEnumerable GetContainingTypes(this INamedTypeSymbol type) 13 | { 14 | var current = type.ContainingType; 15 | while (current != null) 16 | { 17 | yield return current; 18 | current = current.ContainingType; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Generator/Extensions/ISymbolExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics.CodeAnalysis; 2 | using System.Linq; 3 | 4 | using Microsoft.CodeAnalysis; 5 | 6 | namespace Generator.Extensions; 7 | internal static class ISymbolExtensions 8 | { 9 | /// 10 | /// Returns a value indicating whether the specified symbol has the specified 11 | /// attribute. 12 | /// 13 | /// 14 | /// The symbol being examined. 15 | /// 16 | /// 17 | /// The attribute in question. 18 | /// 19 | /// 20 | /// if has an attribute of type 21 | /// ; otherwise . 22 | /// 23 | /// 24 | /// If is a type, this method does not find attributes 25 | /// on its base types. 26 | /// 27 | public static bool HasAttribute(this ISymbol symbol, [NotNullWhen(returnValue: true)] INamedTypeSymbol? attribute) 28 | { 29 | return attribute != null && symbol.GetAttributes().Any(attr => attr.AttributeClass?.Equals(attribute, SymbolEqualityComparer.Default) == true); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Generator/Extensions/ITypeSymbolExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using Microsoft.CodeAnalysis; 5 | 6 | namespace Generator.Extensions; 7 | internal static class ITypeSymbolExtensions 8 | { 9 | public static IEnumerable GetBaseTypes(this ITypeSymbol type, Func? takeWhilePredicate = null) 10 | { 11 | var current = type.BaseType; 12 | while (current != null && 13 | (takeWhilePredicate == null || takeWhilePredicate(current))) 14 | { 15 | yield return current; 16 | current = current.BaseType; 17 | } 18 | } 19 | 20 | public static IEnumerable GetBaseTypesAndThis(this ITypeSymbol type) 21 | { 22 | var current = type; 23 | while (current != null) 24 | { 25 | yield return current; 26 | current = current.BaseType; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Generator/Generator.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | true 6 | true 7 | true 8 | true 9 | true 10 | false 11 | true 12 | 13 | 14 | 15 | AutoNotifyGenerator 16 | $(NuGetPackageVersion) 17 | Jonathon Marolf 18 | MIT 19 | false 20 | Sample source generator that implements INotifyPropertyChanged for you 21 | AutoNotifyGenerator, generator, template, sample 22 | true 23 | 24 | $(TargetsForTfmSpecificContentInPackage);_AddGeneratorsToOutput 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/Generator/SourceCodeBuilder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Immutable; 3 | using System.Diagnostics.CodeAnalysis; 4 | using System.Linq; 5 | 6 | using Generator.Extensions; 7 | 8 | using Microsoft.CodeAnalysis; 9 | 10 | namespace Generator; 11 | 12 | public class SourceCodeBuilder 13 | { 14 | private DiagnosticDescriptor UnableToGenerateName { get; } = new DiagnosticDescriptor( 15 | id: "NSG001", 16 | title: "Unable to generate property name.", 17 | messageFormat: "Unable to generate property name.", 18 | category: "SourceGenerator", 19 | defaultSeverity: DiagnosticSeverity.Error, 20 | isEnabledByDefault: true); 21 | 22 | private readonly INamedTypeSymbol _attributeSymbol; 23 | private readonly INamedTypeSymbol _notifySymbol; 24 | private readonly INamedTypeSymbol _objectSymbol; 25 | private readonly Action _reportDiagnostic; 26 | 27 | public SourceCodeBuilder( 28 | INamedTypeSymbol attributeSymbol, 29 | INamedTypeSymbol notifySymbol, 30 | INamedTypeSymbol objectSymbol, 31 | Action reportDiagnostic) 32 | { 33 | _attributeSymbol = attributeSymbol ?? throw new ArgumentNullException(nameof(attributeSymbol)); 34 | _notifySymbol = notifySymbol ?? throw new ArgumentNullException(nameof(notifySymbol)); 35 | _objectSymbol = objectSymbol ?? throw new ArgumentNullException(nameof(objectSymbol)); 36 | _reportDiagnostic = reportDiagnostic ?? throw new ArgumentNullException(nameof(reportDiagnostic)); 37 | } 38 | 39 | 40 | public bool TryGeneratePartialType( 41 | INamedTypeSymbol type, 42 | ImmutableArray fields, 43 | [NotNullWhen(true)] out string? partialType) 44 | { 45 | using var codeTextWriter = new SourceCodeWriter(); 46 | partialType = null; 47 | 48 | if (TryGeneratePartialType(codeTextWriter, type, fields)) 49 | { 50 | partialType = codeTextWriter.ToString(); 51 | return true; 52 | } 53 | 54 | return false; 55 | } 56 | 57 | private bool TryGeneratePartialType( 58 | SourceCodeWriter output, 59 | INamedTypeSymbol type, 60 | ImmutableArray fields) 61 | { 62 | using (output.WriteOutNamespace(type)) 63 | { 64 | // Handle nested class 65 | var indentations = ImmutableArray.Empty; 66 | if (!type.ContainingSymbol.Equals(type.ContainingNamespace, SymbolEqualityComparer.Default)) 67 | { 68 | var containingTypes = type.GetContainingTypes().ToImmutableArray(); 69 | var builder = ImmutableArray.CreateBuilder(containingTypes.Length); 70 | foreach (var containingType in containingTypes.Reverse()) 71 | { 72 | builder.Add(WriteOutPartialTypeDeclaration(output, containingType)); 73 | } 74 | 75 | indentations = builder.MoveToImmutable(); 76 | } 77 | 78 | // Write out type declaration 79 | using (WriteOutPartialTypeDeclaration(output, type, _notifySymbol)) 80 | { 81 | // If the type doesn't inherit from a type that implements INotifyPropertyChanged already, 82 | // or inherits from a type that _will_ inherit from it after the source generator runs 83 | // implement the PropertyChanged event. 84 | if (!type.AllInterfaces.Any(t => t.Equals(_notifySymbol, SymbolEqualityComparer.Default)) && 85 | !type.AnyBaseTypesHaveFieldsWithAttribute(_attributeSymbol)) 86 | { 87 | output.WriteOutPropertyChangedImplementation(); 88 | } 89 | 90 | // /create properties for each field 91 | foreach (var fieldSymbol in fields) 92 | { 93 | if (!TryWriteOutProperty(output, fieldSymbol, _attributeSymbol, location => _reportDiagnostic(Diagnostic.Create(UnableToGenerateName, location)))) 94 | { 95 | return false; 96 | } 97 | } 98 | } 99 | 100 | foreach (var block in indentations) 101 | { 102 | block.Dispose(); 103 | } 104 | 105 | return true; 106 | } 107 | } 108 | 109 | private IDisposable WriteOutPartialTypeDeclaration( 110 | SourceCodeWriter output, 111 | INamedTypeSymbol type, 112 | params INamedTypeSymbol[] additionalInterfaces) 113 | { 114 | var accessibility = type.DeclaredAccessibility switch 115 | { 116 | Accessibility.Public => "public", 117 | Accessibility.Internal => "internal", 118 | Accessibility.Protected => "protected", 119 | Accessibility.Private => "private", 120 | Accessibility.ProtectedAndInternal => "private protected", 121 | Accessibility.ProtectedOrInternal => "protected internal", 122 | _ => throw new InvalidOperationException() 123 | }; 124 | var modifiers = GetModifiersString(type); 125 | var typeKind = GetTypeKindString(type); 126 | var typeName = type.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat); 127 | var inheritsList = GetInherits(type, _objectSymbol, additionalInterfaces); 128 | var implementsList = GetImplements(type, additionalInterfaces); 129 | 130 | return output.WriteOutPartialTypeDeclaration(accessibility, modifiers, typeKind, typeName, inheritsList, implementsList); 131 | 132 | static string GetModifiersString(INamedTypeSymbol type) 133 | { 134 | var modifiers = "partial"; 135 | if (type.IsAbstract) 136 | { 137 | modifiers = "abstract " + modifiers; 138 | } 139 | if (type.IsSealed) 140 | { 141 | modifiers = "sealed " + modifiers; 142 | } 143 | if (type.IsStatic) 144 | { 145 | modifiers = "static " + modifiers; 146 | } 147 | return modifiers; 148 | } 149 | 150 | static string GetTypeKindString(INamedTypeSymbol type) 151 | => (type.IsRecord, type.TypeKind) switch 152 | { 153 | (true, TypeKind.Struct) => "record struct", 154 | (true, TypeKind.Class) => "record", 155 | (false, TypeKind.Class) => "class", 156 | (false, TypeKind.Enum) => "enum", 157 | (false, TypeKind.Interface) => "interface", 158 | (false, TypeKind.Struct) => "struct", 159 | _ => throw new NotImplementedException(), 160 | }; 161 | 162 | static ImmutableArray GetInherits( 163 | INamedTypeSymbol type, 164 | INamedTypeSymbol systemObject, 165 | INamedTypeSymbol[] additionalInterfaces) 166 | { 167 | var builder = ImmutableArray.CreateBuilder(); 168 | 169 | var baseType = type.BaseType; 170 | if (baseType is not null && 171 | !baseType.Equals(systemObject, SymbolEqualityComparer.Default)) 172 | { 173 | builder.Add(baseType.ToDisplayString()); 174 | } 175 | 176 | if (type.TypeKind == TypeKind.Interface) 177 | { 178 | builder.AddRange(type.AllInterfaces.Concat(additionalInterfaces).Select(i => i.ToDisplayString())); 179 | } 180 | 181 | return builder.ToImmutable(); ; 182 | } 183 | 184 | static string[] GetImplements( 185 | INamedTypeSymbol type, 186 | INamedTypeSymbol[] additionalInterfaces) 187 | { 188 | return type.TypeKind != TypeKind.Interface 189 | ? type.AllInterfaces.Concat(additionalInterfaces).Select(i => i.ToDisplayString()).ToArray() 190 | : Array.Empty(); 191 | } 192 | } 193 | 194 | private static bool TryWriteOutProperty(SourceCodeWriter output, IFieldSymbol fieldSymbol, INamedTypeSymbol attributeSymbol, Action reportDiagnostic) 195 | { 196 | // get the name and type of the field 197 | var fieldName = fieldSymbol.Name; 198 | var fieldType = fieldSymbol.Type.ToDisplayString(); 199 | 200 | // get the AutoNotify attribute from the field, and any associated data 201 | var attributeData = fieldSymbol.GetAttributes().Single(ad => ad.AttributeClass?.Equals(attributeSymbol, SymbolEqualityComparer.Default) == true); 202 | var overriddenNameOpt = attributeData.NamedArguments.SingleOrDefault(kvp => kvp.Key == "PropertyName").Value; 203 | string propertyName = ChooseName(fieldName, overriddenNameOpt); 204 | if (propertyName.Length == 0 || propertyName == fieldName) 205 | { 206 | reportDiagnostic(fieldSymbol.Locations.FirstOrDefault()); 207 | return false; 208 | } 209 | 210 | output.WriteOutProperty(fieldName, fieldType, propertyName); 211 | return true; 212 | 213 | static string ChooseName(string fieldName, TypedConstant overriddenNameOpt) 214 | { 215 | if (!overriddenNameOpt.IsNull) 216 | { 217 | return overriddenNameOpt.Value!.ToString() ?? string.Empty; 218 | } 219 | 220 | fieldName = fieldName.TrimStart('_'); 221 | return fieldName.Length switch 222 | { 223 | 0 => string.Empty, 224 | 1 => fieldName.ToUpper(), 225 | _ => fieldName[..1].ToUpper() + fieldName[1..] 226 | }; 227 | } 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /src/Generator/SourceCodeWriter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.CodeDom.Compiler; 3 | using System.IO; 4 | 5 | namespace Generator; 6 | 7 | public sealed class SourceCodeWriter : IDisposable 8 | { 9 | private static string StartBlockText => "{"; 10 | private static string EndBlockText => "}"; 11 | 12 | private readonly IndentedTextWriter _indentingStringWriter; 13 | 14 | public SourceCodeWriter() 15 | { 16 | var stringWriter = new StringWriter(); 17 | _indentingStringWriter = new IndentedTextWriter(stringWriter, " "); ; 18 | } 19 | 20 | public void WriteLine(string s) 21 | { 22 | _indentingStringWriter.WriteLine(s); 23 | } 24 | 25 | public IDisposable WriteBlock(string statement) 26 | { 27 | WriteLine(statement); 28 | return BeginWriteBlock(); 29 | } 30 | 31 | public IDisposable BeginWriteBlock(string statement = "") 32 | { 33 | if (StartBlockText is not null) 34 | { 35 | _indentingStringWriter.WriteLine(StartBlockText); 36 | } 37 | 38 | return IndentAndWriteLineAtEndOfIndent(EndBlockText + statement); 39 | } 40 | 41 | public void WriteNewLine() 42 | { 43 | var currentIndentation = _indentingStringWriter.Indent; 44 | _indentingStringWriter.Indent = 0; 45 | _indentingStringWriter.WriteLine(); 46 | _indentingStringWriter.Indent = currentIndentation; 47 | } 48 | 49 | public IDisposable Indent() 50 | { 51 | _indentingStringWriter.Indent++; 52 | return new IndentDisposable(_indentingStringWriter); 53 | } 54 | 55 | public IDisposable IndentAndWriteLineAtEndOfIndent(string s) 56 | { 57 | _indentingStringWriter.Indent++; 58 | return new IndentDisposable(_indentingStringWriter, s); 59 | } 60 | 61 | public void Dispose() 62 | { 63 | _indentingStringWriter.Dispose(); 64 | } 65 | 66 | public override string ToString() 67 | { 68 | return _indentingStringWriter.InnerWriter.ToString() ?? ""; 69 | } 70 | 71 | private class IndentDisposable : IDisposable 72 | { 73 | private readonly IndentedTextWriter _indentingStringWriter; 74 | private readonly string? _line; 75 | 76 | public IndentDisposable(IndentedTextWriter indentingStringWriter, string? line = null) 77 | { 78 | _indentingStringWriter = indentingStringWriter; 79 | _line = line; 80 | } 81 | 82 | public void Dispose() 83 | { 84 | _indentingStringWriter.Indent--; 85 | if (_line is not null) 86 | { 87 | _indentingStringWriter.WriteLine(_line); 88 | } 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /src/Generator/SourceCodeWriterExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Immutable; 3 | using System.Linq; 4 | 5 | using Microsoft.CodeAnalysis; 6 | 7 | namespace Generator.Extensions; 8 | internal static class SourceCodeWriterExtensions 9 | { 10 | public static IDisposable WriteOutNamespace(this SourceCodeWriter output, INamedTypeSymbol type) 11 | { 12 | return output.WriteBlock($"namespace {type.ContainingNamespace.ToDisplayString()}"); 13 | } 14 | 15 | public static IDisposable WriteOutPartialTypeDeclaration(this SourceCodeWriter output, 16 | string accessibility, 17 | string modifiers, 18 | string typeKind, 19 | string typeName, 20 | ImmutableArray inheritsList, 21 | string[] implementsList) 22 | { 23 | var inheritanceString = string.Join(", ", inheritsList.Concat(implementsList)); 24 | 25 | if (!string.IsNullOrWhiteSpace(inheritanceString)) 26 | { 27 | output.WriteLine($"{accessibility} {modifiers} {typeKind} {typeName} : {inheritanceString}"); 28 | } 29 | else 30 | { 31 | output.WriteLine($"{accessibility} {modifiers} {typeKind} {typeName}"); 32 | } 33 | return output.BeginWriteBlock(); 34 | } 35 | 36 | public static void WriteOutPropertyChangedImplementation(this SourceCodeWriter output) 37 | { 38 | output.WriteLine("public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;"); 39 | output.WriteLine("protected void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = \"\")"); 40 | using (output.Indent()) 41 | { 42 | output.WriteLine("=> PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));"); 43 | } 44 | } 45 | 46 | public static void WriteOutProperty(this SourceCodeWriter output, string fieldName, string fieldType, string propertyName) 47 | { 48 | output.WriteNewLine(); 49 | using (output.WriteBlock($"public virtual {fieldType} {propertyName}")) 50 | { 51 | output.WriteLine($"get => this.{fieldName};"); 52 | using (output.WriteBlock("set")) 53 | { 54 | using (output.WriteBlock($"if (!System.Collections.Generic.EqualityComparer<{fieldType}>.Default.Equals(this.{fieldName}, value))")) 55 | { 56 | output.WriteLine($"this.{fieldName} = value;"); 57 | output.WriteLine($"NotifyPropertyChanged(nameof({propertyName}));"); 58 | } 59 | } 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/Generator/packages.lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "dependencies": { 4 | ".NETStandard,Version=v2.0": { 5 | "DotNet.ReproducibleBuilds": { 6 | "type": "Direct", 7 | "requested": "[1.1.1, )", 8 | "resolved": "1.1.1", 9 | "contentHash": "+H2t/t34h6mhEoUvHi8yGXyuZ2GjSovcGYehJrS2MDm2XgmPfZL2Sdxg+uL2lKgZ4M6tTwKHIlxOob2bgh0NRQ==", 10 | "dependencies": { 11 | "Microsoft.SourceLink.AzureRepos.Git": "1.1.1", 12 | "Microsoft.SourceLink.Bitbucket.Git": "1.1.1", 13 | "Microsoft.SourceLink.GitHub": "1.1.1", 14 | "Microsoft.SourceLink.GitLab": "1.1.1" 15 | } 16 | }, 17 | "IndexRange": { 18 | "type": "Direct", 19 | "requested": "[1.0.0, )", 20 | "resolved": "1.0.0", 21 | "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ==" 22 | }, 23 | "Microsoft.CodeAnalysis.Analyzers": { 24 | "type": "Direct", 25 | "requested": "[3.3.3, )", 26 | "resolved": "3.3.3", 27 | "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" 28 | }, 29 | "Microsoft.CodeAnalysis.CSharp": { 30 | "type": "Direct", 31 | "requested": "[4.0.1, )", 32 | "resolved": "4.0.1", 33 | "contentHash": "Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==", 34 | "dependencies": { 35 | "Microsoft.CodeAnalysis.Common": "[4.0.1]" 36 | } 37 | }, 38 | "Microsoft.VisualStudio.Threading.Analyzers": { 39 | "type": "Direct", 40 | "requested": "[17.0.64, )", 41 | "resolved": "17.0.64", 42 | "contentHash": "+xz3lAqA3h2/5q6H7Udmz9TsxDQ99O+PjoQ4k4BTO3SfAfyJX7ejh7I1D1N/M/GzGUci9YOUpr6KBO4vXLg+zQ==" 43 | }, 44 | "Nerdbank.GitVersioning": { 45 | "type": "Direct", 46 | "requested": "[3.5.73-alpha, )", 47 | "resolved": "3.5.73-alpha", 48 | "contentHash": "r+8Cr73hArVXpsg759k2oOqyMld8GCOFKb3fVqzdC4iCOezpp3IJAyl2lDHObfZF0nE7C6ki5pXeaa78fbXQJg==" 49 | }, 50 | "NETStandard.Library": { 51 | "type": "Direct", 52 | "requested": "[2.0.3, )", 53 | "resolved": "2.0.3", 54 | "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", 55 | "dependencies": { 56 | "Microsoft.NETCore.Platforms": "1.1.0" 57 | } 58 | }, 59 | "TunnelVisionLabs.ReferenceAssemblyAnnotator": { 60 | "type": "Direct", 61 | "requested": "[1.0.0-alpha.160, )", 62 | "resolved": "1.0.0-alpha.160", 63 | "contentHash": "ktxB8PGoPpIaYKjLk/+P94Fi2Qw2E1Dw7atBQRrKnHA57sk8WwmkI4RJmg6s5ph4k1RIaaAZMus05ah/AikEkA==" 64 | }, 65 | "Microsoft.Build.Tasks.Git": { 66 | "type": "Transitive", 67 | "resolved": "1.1.1", 68 | "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" 69 | }, 70 | "Microsoft.CodeAnalysis.Common": { 71 | "type": "Transitive", 72 | "resolved": "4.0.1", 73 | "contentHash": "SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==", 74 | "dependencies": { 75 | "Microsoft.CodeAnalysis.Analyzers": "3.3.2", 76 | "System.Collections.Immutable": "5.0.0", 77 | "System.Memory": "4.5.4", 78 | "System.Reflection.Metadata": "5.0.0", 79 | "System.Runtime.CompilerServices.Unsafe": "5.0.0", 80 | "System.Text.Encoding.CodePages": "4.5.1", 81 | "System.Threading.Tasks.Extensions": "4.5.4" 82 | } 83 | }, 84 | "Microsoft.NETCore.Platforms": { 85 | "type": "Transitive", 86 | "resolved": "1.1.0", 87 | "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" 88 | }, 89 | "Microsoft.SourceLink.AzureRepos.Git": { 90 | "type": "Transitive", 91 | "resolved": "1.1.1", 92 | "contentHash": "qB5urvw9LO2bG3eVAkuL+2ughxz2rR7aYgm2iyrB8Rlk9cp2ndvGRCvehk3rNIhRuNtQaeKwctOl1KvWiklv5w==", 93 | "dependencies": { 94 | "Microsoft.Build.Tasks.Git": "1.1.1", 95 | "Microsoft.SourceLink.Common": "1.1.1" 96 | } 97 | }, 98 | "Microsoft.SourceLink.Bitbucket.Git": { 99 | "type": "Transitive", 100 | "resolved": "1.1.1", 101 | "contentHash": "cDzxXwlyWpLWaH0em4Idj0H3AmVo3L/6xRXKssYemx+7W52iNskj/SQ4FOmfCb8YQt39otTDNMveCZzYtMoucQ==", 102 | "dependencies": { 103 | "Microsoft.Build.Tasks.Git": "1.1.1", 104 | "Microsoft.SourceLink.Common": "1.1.1" 105 | } 106 | }, 107 | "Microsoft.SourceLink.Common": { 108 | "type": "Transitive", 109 | "resolved": "1.1.1", 110 | "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" 111 | }, 112 | "Microsoft.SourceLink.GitHub": { 113 | "type": "Transitive", 114 | "resolved": "1.1.1", 115 | "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", 116 | "dependencies": { 117 | "Microsoft.Build.Tasks.Git": "1.1.1", 118 | "Microsoft.SourceLink.Common": "1.1.1" 119 | } 120 | }, 121 | "Microsoft.SourceLink.GitLab": { 122 | "type": "Transitive", 123 | "resolved": "1.1.1", 124 | "contentHash": "tvsg47DDLqqedlPeYVE2lmiTpND8F0hkrealQ5hYltSmvruy/Gr5nHAKSsjyw5L3NeM/HLMI5ORv7on/M4qyZw==", 125 | "dependencies": { 126 | "Microsoft.Build.Tasks.Git": "1.1.1", 127 | "Microsoft.SourceLink.Common": "1.1.1" 128 | } 129 | }, 130 | "System.Buffers": { 131 | "type": "Transitive", 132 | "resolved": "4.5.1", 133 | "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" 134 | }, 135 | "System.Collections.Immutable": { 136 | "type": "Transitive", 137 | "resolved": "5.0.0", 138 | "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", 139 | "dependencies": { 140 | "System.Memory": "4.5.4" 141 | } 142 | }, 143 | "System.Memory": { 144 | "type": "Transitive", 145 | "resolved": "4.5.4", 146 | "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", 147 | "dependencies": { 148 | "System.Buffers": "4.5.1", 149 | "System.Numerics.Vectors": "4.4.0", 150 | "System.Runtime.CompilerServices.Unsafe": "4.5.3" 151 | } 152 | }, 153 | "System.Numerics.Vectors": { 154 | "type": "Transitive", 155 | "resolved": "4.4.0", 156 | "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" 157 | }, 158 | "System.Reflection.Metadata": { 159 | "type": "Transitive", 160 | "resolved": "5.0.0", 161 | "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==", 162 | "dependencies": { 163 | "System.Collections.Immutable": "5.0.0" 164 | } 165 | }, 166 | "System.Runtime.CompilerServices.Unsafe": { 167 | "type": "Transitive", 168 | "resolved": "5.0.0", 169 | "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" 170 | }, 171 | "System.Text.Encoding.CodePages": { 172 | "type": "Transitive", 173 | "resolved": "4.5.1", 174 | "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", 175 | "dependencies": { 176 | "System.Runtime.CompilerServices.Unsafe": "4.5.2" 177 | } 178 | }, 179 | "System.Threading.Tasks.Extensions": { 180 | "type": "Transitive", 181 | "resolved": "4.5.4", 182 | "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", 183 | "dependencies": { 184 | "System.Runtime.CompilerServices.Unsafe": "4.5.3" 185 | } 186 | } 187 | } 188 | } 189 | } -------------------------------------------------------------------------------- /test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | dotnet test --blame-crash --blame-hang --blame-hang-timeout 4m --logger "trx;LogFileName=TestResults.trx" -p:ParallelizeTestCollections=true --collect:"XPlat Code Coverage" --results-directory artifacts/test_results -------------------------------------------------------------------------------- /tests/Adapter.cs: -------------------------------------------------------------------------------- 1 |  2 | using Microsoft.CodeAnalysis; 3 | 4 | namespace Tests; 5 | public class Adapter : ISourceGenerator, IIncrementalGenerator 6 | where TIncrementalGenerator : IIncrementalGenerator, new() 7 | { 8 | private readonly TIncrementalGenerator _internalGenerator; 9 | 10 | public Adapter() 11 | { 12 | _internalGenerator = new TIncrementalGenerator(); 13 | } 14 | 15 | public void Execute(GeneratorExecutionContext context) 16 | { 17 | throw new System.NotImplementedException(); 18 | } 19 | 20 | public void Initialize(GeneratorInitializationContext context) 21 | { 22 | throw new System.NotImplementedException(); 23 | } 24 | 25 | public void Initialize(IncrementalGeneratorInitializationContext context) 26 | { 27 | _internalGenerator.Initialize(context); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/AutoNotifyGeneratorTests.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | using Generator; 4 | 5 | using Microsoft.CodeAnalysis.CSharp.Testing; 6 | using Microsoft.CodeAnalysis.Testing; 7 | using Microsoft.CodeAnalysis.Testing.Verifiers; 8 | 9 | using Tests; 10 | 11 | using Xunit; 12 | 13 | namespace Test; 14 | 15 | using GeneratorTest = CSharpSourceGeneratorTest, XUnitVerifier>; 16 | 17 | public class AutoNotifyGeneratorTests 18 | { 19 | [Fact] 20 | public async Task TestCodeFileIsGenerated() 21 | { 22 | const string codeFile = @" 23 | using System; 24 | using AutoNotify; 25 | 26 | namespace GeneratedDemo 27 | { 28 | // The view model we'd like to augment 29 | public partial class ExampleViewModel 30 | { 31 | [AutoNotify] 32 | private string _text = ""private field text""; 33 | 34 | [AutoNotify(PropertyName=""Count"")] 35 | private int _amount = 5; 36 | } 37 | 38 | public static class UseAutoNotifyGenerator 39 | { 40 | public static void Run() 41 | { 42 | ExampleViewModel vm = new ExampleViewModel(); 43 | 44 | // we didn't explicitly create the 'Text' property, it was generated for us 45 | string text = vm.Text; 46 | Console.WriteLine($""Text = {text}""); 47 | 48 | // Properties can have differnt names generated based on the PropertyName argument of the attribute 49 | int count = vm.Count; 50 | Console.WriteLine($""Count = {count}""); 51 | 52 | // the viewmodel will automatically implement INotifyPropertyChanged 53 | vm.PropertyChanged += (o, e) => Console.WriteLine($""Property {e.PropertyName} was changed""); 54 | vm.Text = ""abc""; 55 | vm.Count = 123; 56 | 57 | // Try adding fields to the ExampleViewModel class above and tagging them with the [AutoNotify] attribute 58 | // You'll see the matching generated properties visibile in IntelliSense in realtime 59 | } 60 | } 61 | } 62 | "; 63 | const string generatedCode = @"namespace GeneratedDemo 64 | { 65 | public partial class ExampleViewModel : System.ComponentModel.INotifyPropertyChanged 66 | { 67 | public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged; 68 | protected void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = """") 69 | => PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 70 | 71 | public virtual string Text 72 | { 73 | get => this._text; 74 | set 75 | { 76 | if (!System.Collections.Generic.EqualityComparer.Default.Equals(this._text, value)) 77 | { 78 | this._text = value; 79 | NotifyPropertyChanged(nameof(Text)); 80 | } 81 | } 82 | } 83 | 84 | public virtual int Count 85 | { 86 | get => this._amount; 87 | set 88 | { 89 | if (!System.Collections.Generic.EqualityComparer.Default.Equals(this._amount, value)) 90 | { 91 | this._amount = value; 92 | NotifyPropertyChanged(nameof(Count)); 93 | } 94 | } 95 | } 96 | } 97 | } 98 | "; 99 | const string attributeText = @" 100 | using System; 101 | namespace AutoNotify 102 | { 103 | [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] 104 | [System.Diagnostics.Conditional(""AutoNotifyGenerator_DEBUG"")] 105 | sealed class AutoNotifyAttribute : Attribute 106 | { 107 | public AutoNotifyAttribute() 108 | { 109 | } 110 | public string PropertyName { get; set; } 111 | } 112 | } 113 | "; 114 | 115 | await new GeneratorTest 116 | { 117 | ReferenceAssemblies = ReferenceAssemblies.Net.Net60, 118 | TestState = 119 | { 120 | Sources = { codeFile }, 121 | GeneratedSources = 122 | { 123 | (typeof(Adapter), "AutoNotifyAttribute.cs", attributeText), 124 | (typeof(Adapter), "ExampleViewModel_autoNotify.cs", generatedCode), 125 | }, 126 | }, 127 | }.RunAsync(); 128 | } 129 | } -------------------------------------------------------------------------------- /tests/Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | true 6 | true 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | runtime; build; native; contentfiles; analyzers; buildtransitive 17 | all 18 | 19 | 20 | runtime; build; native; contentfiles; analyzers; buildtransitive 21 | all 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /tests/packages.lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "dependencies": { 4 | "net6.0": { 5 | "coverlet.collector": { 6 | "type": "Direct", 7 | "requested": "[3.1.0, )", 8 | "resolved": "3.1.0", 9 | "contentHash": "YzYqSRrjoP5lULBhTDcTOjuM4IDPPi6PhFsl4w8EI4WdZhE6llt7E38Tg4CHyrS+QKwyu1+9OwkdDgluOdoBTw==" 10 | }, 11 | "DotNet.ReproducibleBuilds": { 12 | "type": "Direct", 13 | "requested": "[1.1.1, )", 14 | "resolved": "1.1.1", 15 | "contentHash": "+H2t/t34h6mhEoUvHi8yGXyuZ2GjSovcGYehJrS2MDm2XgmPfZL2Sdxg+uL2lKgZ4M6tTwKHIlxOob2bgh0NRQ==", 16 | "dependencies": { 17 | "Microsoft.SourceLink.AzureRepos.Git": "1.1.1", 18 | "Microsoft.SourceLink.Bitbucket.Git": "1.1.1", 19 | "Microsoft.SourceLink.GitHub": "1.1.1", 20 | "Microsoft.SourceLink.GitLab": "1.1.1" 21 | } 22 | }, 23 | "IndexRange": { 24 | "type": "Direct", 25 | "requested": "[1.0.0, )", 26 | "resolved": "1.0.0", 27 | "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ==" 28 | }, 29 | "Microsoft.CodeAnalysis": { 30 | "type": "Direct", 31 | "requested": "[4.0.1, )", 32 | "resolved": "4.0.1", 33 | "contentHash": "PIuWPA8RyLNJhsgPNsOsJPYmfKTrJOqe7+lp7KNvs4m2kFGHVvq2f8yfQ60uCbyRmLxWU4w49gNcKytjcIuBZw==", 34 | "dependencies": { 35 | "Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.0.1]", 36 | "Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.0.1]" 37 | } 38 | }, 39 | "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit": { 40 | "type": "Direct", 41 | "requested": "[1.1.1-beta1.22056.1, )", 42 | "resolved": "1.1.1-beta1.22056.1", 43 | "contentHash": "/j68hml/e4HcnTZTlZ/XrlU6Sid7TigSM6uxSuMN6baOT0Nql6UVf60eUkcAcvV+YWbIxBxkaFQzHW5sPqRqlg==", 44 | "dependencies": { 45 | "Microsoft.CodeAnalysis.Analyzer.Testing": "[1.1.1-beta1.22056.1]", 46 | "Microsoft.CodeAnalysis.Analyzers": "3.3.2", 47 | "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing": "[1.1.1-beta1.22056.1]", 48 | "Microsoft.CodeAnalysis.CSharp.Workspaces": "3.8.0", 49 | "Microsoft.CodeAnalysis.SourceGenerators.Testing": "[1.1.1-beta1.22056.1]", 50 | "Microsoft.CodeAnalysis.Testing.Verifiers.XUnit": "[1.1.1-beta1.22056.1]" 51 | } 52 | }, 53 | "Microsoft.NET.Test.Sdk": { 54 | "type": "Direct", 55 | "requested": "[17.0.0, )", 56 | "resolved": "17.0.0", 57 | "contentHash": "fJcnMY3jX1MzJvhGvUWauRhU5eQsOaHdwlrcnI3NabBhbi8WLAkMFI8d0YnewA/+b9q/U7vbhp8Xmh1vJ05FYQ==", 58 | "dependencies": { 59 | "Microsoft.CodeCoverage": "17.0.0", 60 | "Microsoft.TestPlatform.TestHost": "17.0.0" 61 | } 62 | }, 63 | "Nerdbank.GitVersioning": { 64 | "type": "Direct", 65 | "requested": "[3.5.73-alpha, )", 66 | "resolved": "3.5.73-alpha", 67 | "contentHash": "r+8Cr73hArVXpsg759k2oOqyMld8GCOFKb3fVqzdC4iCOezpp3IJAyl2lDHObfZF0nE7C6ki5pXeaa78fbXQJg==" 68 | }, 69 | "TunnelVisionLabs.ReferenceAssemblyAnnotator": { 70 | "type": "Direct", 71 | "requested": "[1.0.0-alpha.160, )", 72 | "resolved": "1.0.0-alpha.160", 73 | "contentHash": "ktxB8PGoPpIaYKjLk/+P94Fi2Qw2E1Dw7atBQRrKnHA57sk8WwmkI4RJmg6s5ph4k1RIaaAZMus05ah/AikEkA==" 74 | }, 75 | "xunit": { 76 | "type": "Direct", 77 | "requested": "[2.4.1, )", 78 | "resolved": "2.4.1", 79 | "contentHash": "XNR3Yz9QTtec16O0aKcO6+baVNpXmOnPUxDkCY97J+8krUYxPvXT1szYYEUdKk4sB8GOI2YbAjRIOm8ZnXRfzQ==", 80 | "dependencies": { 81 | "xunit.analyzers": "0.10.0", 82 | "xunit.assert": "[2.4.1]", 83 | "xunit.core": "[2.4.1]" 84 | } 85 | }, 86 | "xunit.runner.visualstudio": { 87 | "type": "Direct", 88 | "requested": "[2.4.3, )", 89 | "resolved": "2.4.3", 90 | "contentHash": "kZZSmOmKA8OBlAJaquPXnJJLM9RwQ27H7BMVqfMLUcTi9xHinWGJiWksa3D4NEtz0wZ/nxd2mogObvBgJKCRhQ==" 91 | }, 92 | "DiffPlex": { 93 | "type": "Transitive", 94 | "resolved": "1.5.0", 95 | "contentHash": "scJeM04b6MxaGZPqgRLBYfKc3slw4PzWVmdYxTDoIe/iAspiPAxibKzsceNn7JuGEPlrXSuC9LzqbXUJxRpFoQ==", 96 | "dependencies": { 97 | "NETStandard.Library": "1.6.1" 98 | } 99 | }, 100 | "Humanizer.Core": { 101 | "type": "Transitive", 102 | "resolved": "2.2.0", 103 | "contentHash": "rsYXB7+iUPP8AHgQ8JP2UZI2xK2KhjcdGr9E6zX3CsZaTLCaw8M35vaAJRo1rfxeaZEVMuXeaquLVCkZ7JcZ5Q==", 104 | "dependencies": { 105 | "NETStandard.Library": "1.6.1" 106 | } 107 | }, 108 | "Microsoft.Bcl.AsyncInterfaces": { 109 | "type": "Transitive", 110 | "resolved": "5.0.0", 111 | "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" 112 | }, 113 | "Microsoft.Build.Tasks.Git": { 114 | "type": "Transitive", 115 | "resolved": "1.1.1", 116 | "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" 117 | }, 118 | "Microsoft.CodeAnalysis.Analyzer.Testing": { 119 | "type": "Transitive", 120 | "resolved": "1.1.1-beta1.22056.1", 121 | "contentHash": "KIECub1xdW40DH4qBch+e4nVNY3YoyTg/JvJOyvCXXpt/kP8LvHwSd3RDNi6muQgy8zOwnnKvn7zKme9g6LLkg==", 122 | "dependencies": { 123 | "DiffPlex": "1.5.0", 124 | "Microsoft.CodeAnalysis.Analyzers": "2.6.1", 125 | "Microsoft.CodeAnalysis.Workspaces.Common": "1.0.1", 126 | "Microsoft.VisualBasic": "10.0.1", 127 | "Microsoft.VisualStudio.Composition": "16.1.8", 128 | "NuGet.Common": "5.6.0", 129 | "NuGet.Packaging": "5.6.0", 130 | "NuGet.Protocol": "5.6.0", 131 | "NuGet.Resolver": "5.6.0", 132 | "System.ValueTuple": "4.5.0" 133 | } 134 | }, 135 | "Microsoft.CodeAnalysis.Common": { 136 | "type": "Transitive", 137 | "resolved": "4.0.1", 138 | "contentHash": "SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==", 139 | "dependencies": { 140 | "Microsoft.CodeAnalysis.Analyzers": "3.3.2", 141 | "System.Collections.Immutable": "5.0.0", 142 | "System.Memory": "4.5.4", 143 | "System.Reflection.Metadata": "5.0.0", 144 | "System.Runtime.CompilerServices.Unsafe": "5.0.0", 145 | "System.Text.Encoding.CodePages": "4.5.1", 146 | "System.Threading.Tasks.Extensions": "4.5.4" 147 | } 148 | }, 149 | "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing": { 150 | "type": "Transitive", 151 | "resolved": "1.1.1-beta1.22056.1", 152 | "contentHash": "bd9AuCNqfR1JS9jlhKFRhlM3OJLr6PyY/i3EGDEj2nE9CRMLX+ChIBxzRSO/zyMtctwScPj813eIy8LxJlL7iQ==", 153 | "dependencies": { 154 | "Microsoft.CodeAnalysis.Analyzers": "3.3.2", 155 | "Microsoft.CodeAnalysis.CSharp.Workspaces": "3.8.0", 156 | "Microsoft.CodeAnalysis.SourceGenerators.Testing": "[1.1.1-beta1.22056.1]" 157 | } 158 | }, 159 | "Microsoft.CodeAnalysis.SourceGenerators.Testing": { 160 | "type": "Transitive", 161 | "resolved": "1.1.1-beta1.22056.1", 162 | "contentHash": "xV4B/Sp3VmdF9wFoEf4AzI0V+vqTJZ2tw+BrI0X0lN2xzStigsZdtqfBCortcFiRqJ6ppmDhc+Q+SfsGsI+jfg==", 163 | "dependencies": { 164 | "Microsoft.CodeAnalysis.Analyzer.Testing": "[1.1.1-beta1.22056.1]", 165 | "Microsoft.CodeAnalysis.Analyzers": "3.3.2", 166 | "Microsoft.CodeAnalysis.Workspaces.Common": "3.8.0" 167 | } 168 | }, 169 | "Microsoft.CodeAnalysis.Testing.Verifiers.XUnit": { 170 | "type": "Transitive", 171 | "resolved": "1.1.1-beta1.22056.1", 172 | "contentHash": "dT6Y55WR4OCouCWt+dZgIJ8usLbBviCrBkQHiAShdnKIQU2khp3YBosLs3a8UGGegjRiHgyusw7J4C/e8bO5Bg==", 173 | "dependencies": { 174 | "Microsoft.CodeAnalysis.Analyzer.Testing": "[1.1.1-beta1.22056.1]", 175 | "xunit.assert": "2.3.0" 176 | } 177 | }, 178 | "Microsoft.CodeAnalysis.VisualBasic": { 179 | "type": "Transitive", 180 | "resolved": "4.0.1", 181 | "contentHash": "o67w8S4zO7tQvB0EQeeo7i5uJCT/CrLwnLUWkkbxU2aUsZPGuRd35diuqk7e+vwnfhu27AvNJsr+1Z6EUT+fDA==", 182 | "dependencies": { 183 | "Microsoft.CodeAnalysis.Common": "[4.0.1]" 184 | } 185 | }, 186 | "Microsoft.CodeAnalysis.VisualBasic.Workspaces": { 187 | "type": "Transitive", 188 | "resolved": "4.0.1", 189 | "contentHash": "h8Alrq7yPFHU8DLmCMbAcaKnFVsdu2bDy6IFTiw9UXDdWjGGre1/Uae+VcY/VIi/GkjmrLtRcTTHZZIyagMOWg==", 190 | "dependencies": { 191 | "Microsoft.CodeAnalysis.Common": "[4.0.1]", 192 | "Microsoft.CodeAnalysis.VisualBasic": "[4.0.1]", 193 | "Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.1]" 194 | } 195 | }, 196 | "Microsoft.CodeAnalysis.Workspaces.Common": { 197 | "type": "Transitive", 198 | "resolved": "4.0.1", 199 | "contentHash": "UfH5ZiUeXE3YIJAiJV1KTrs7uyJ4U3kqjLerYxwuugfaxedpI4lTevbXKSvns+FPL+hLTxKvldhANj8/uEYiRA==", 200 | "dependencies": { 201 | "Humanizer.Core": "2.2.0", 202 | "Microsoft.Bcl.AsyncInterfaces": "5.0.0", 203 | "Microsoft.CodeAnalysis.Common": "[4.0.1]", 204 | "System.Composition": "1.0.31", 205 | "System.IO.Pipelines": "5.0.1" 206 | } 207 | }, 208 | "Microsoft.CodeCoverage": { 209 | "type": "Transitive", 210 | "resolved": "17.0.0", 211 | "contentHash": "+B+09FPYBtf+cXfZOPIgpnP5mzLq5QdlBo+JEFy9CdqBaWHWE/YMY0Mos9uDsZhcgFegJm9GigAgMyqBZyfq+Q==" 212 | }, 213 | "Microsoft.CSharp": { 214 | "type": "Transitive", 215 | "resolved": "4.0.1", 216 | "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", 217 | "dependencies": { 218 | "System.Collections": "4.0.11", 219 | "System.Diagnostics.Debug": "4.0.11", 220 | "System.Dynamic.Runtime": "4.0.11", 221 | "System.Globalization": "4.0.11", 222 | "System.Linq": "4.1.0", 223 | "System.Linq.Expressions": "4.1.0", 224 | "System.ObjectModel": "4.0.12", 225 | "System.Reflection": "4.1.0", 226 | "System.Reflection.Extensions": "4.0.1", 227 | "System.Reflection.Primitives": "4.0.1", 228 | "System.Reflection.TypeExtensions": "4.1.0", 229 | "System.Resources.ResourceManager": "4.0.1", 230 | "System.Runtime": "4.1.0", 231 | "System.Runtime.Extensions": "4.1.0", 232 | "System.Runtime.InteropServices": "4.1.0", 233 | "System.Threading": "4.0.11" 234 | } 235 | }, 236 | "Microsoft.NETCore.Platforms": { 237 | "type": "Transitive", 238 | "resolved": "2.1.2", 239 | "contentHash": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==" 240 | }, 241 | "Microsoft.NETCore.Targets": { 242 | "type": "Transitive", 243 | "resolved": "1.1.0", 244 | "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" 245 | }, 246 | "Microsoft.SourceLink.AzureRepos.Git": { 247 | "type": "Transitive", 248 | "resolved": "1.1.1", 249 | "contentHash": "qB5urvw9LO2bG3eVAkuL+2ughxz2rR7aYgm2iyrB8Rlk9cp2ndvGRCvehk3rNIhRuNtQaeKwctOl1KvWiklv5w==", 250 | "dependencies": { 251 | "Microsoft.Build.Tasks.Git": "1.1.1", 252 | "Microsoft.SourceLink.Common": "1.1.1" 253 | } 254 | }, 255 | "Microsoft.SourceLink.Bitbucket.Git": { 256 | "type": "Transitive", 257 | "resolved": "1.1.1", 258 | "contentHash": "cDzxXwlyWpLWaH0em4Idj0H3AmVo3L/6xRXKssYemx+7W52iNskj/SQ4FOmfCb8YQt39otTDNMveCZzYtMoucQ==", 259 | "dependencies": { 260 | "Microsoft.Build.Tasks.Git": "1.1.1", 261 | "Microsoft.SourceLink.Common": "1.1.1" 262 | } 263 | }, 264 | "Microsoft.SourceLink.Common": { 265 | "type": "Transitive", 266 | "resolved": "1.1.1", 267 | "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" 268 | }, 269 | "Microsoft.SourceLink.GitHub": { 270 | "type": "Transitive", 271 | "resolved": "1.1.1", 272 | "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", 273 | "dependencies": { 274 | "Microsoft.Build.Tasks.Git": "1.1.1", 275 | "Microsoft.SourceLink.Common": "1.1.1" 276 | } 277 | }, 278 | "Microsoft.SourceLink.GitLab": { 279 | "type": "Transitive", 280 | "resolved": "1.1.1", 281 | "contentHash": "tvsg47DDLqqedlPeYVE2lmiTpND8F0hkrealQ5hYltSmvruy/Gr5nHAKSsjyw5L3NeM/HLMI5ORv7on/M4qyZw==", 282 | "dependencies": { 283 | "Microsoft.Build.Tasks.Git": "1.1.1", 284 | "Microsoft.SourceLink.Common": "1.1.1" 285 | } 286 | }, 287 | "Microsoft.TestPlatform.ObjectModel": { 288 | "type": "Transitive", 289 | "resolved": "17.0.0", 290 | "contentHash": "WMugCdPkA8U/BsSRc+3RN+DXcaYSDvp/s0MofVld08iF1O5fek4iKecygk6NruNf1rgJsv4LK71mrwbyeqhzHA==", 291 | "dependencies": { 292 | "NuGet.Frameworks": "5.0.0", 293 | "System.Reflection.Metadata": "1.6.0" 294 | } 295 | }, 296 | "Microsoft.TestPlatform.TestHost": { 297 | "type": "Transitive", 298 | "resolved": "17.0.0", 299 | "contentHash": "xkKFzm0hylHF0SlDj78ACYMJC/i8fQ3i16sDDNYoKnjTsstGSQfuSBJ+QT4nqRXk/fOiYTh+iY0KIX5N7HTLuQ==", 300 | "dependencies": { 301 | "Microsoft.TestPlatform.ObjectModel": "17.0.0", 302 | "Newtonsoft.Json": "9.0.1" 303 | } 304 | }, 305 | "Microsoft.VisualBasic": { 306 | "type": "Transitive", 307 | "resolved": "10.0.1", 308 | "contentHash": "HpNyOf/4Tp2lh4FyywB55VITk0SqVxEjDzsVDDyF1yafDN6Bq18xcHowzCPINyYHUTgGcEtmpYiRsFdSo0KKdQ==", 309 | "dependencies": { 310 | "System.Collections": "4.0.11", 311 | "System.Diagnostics.Debug": "4.0.11", 312 | "System.Dynamic.Runtime": "4.0.11", 313 | "System.Globalization": "4.0.11", 314 | "System.Linq": "4.1.0", 315 | "System.Linq.Expressions": "4.1.0", 316 | "System.ObjectModel": "4.0.12", 317 | "System.Reflection": "4.1.0", 318 | "System.Reflection.Extensions": "4.0.1", 319 | "System.Reflection.Primitives": "4.0.1", 320 | "System.Reflection.TypeExtensions": "4.1.0", 321 | "System.Resources.ResourceManager": "4.0.1", 322 | "System.Runtime": "4.1.0", 323 | "System.Runtime.Extensions": "4.1.0", 324 | "System.Runtime.InteropServices": "4.1.0", 325 | "System.Threading": "4.0.11" 326 | } 327 | }, 328 | "Microsoft.VisualStudio.Composition": { 329 | "type": "Transitive", 330 | "resolved": "16.1.8", 331 | "contentHash": "N+thv3dcT7kjn0Xz3U0uBm2CH4uoaMvH8wC6Gy2HWx7HLNdEpqGoMraLyoBdizmypD1owLCJQIa2uKmWe4/o8A==", 332 | "dependencies": { 333 | "Microsoft.VisualStudio.Composition.NetFxAttributes": "16.1.8", 334 | "Microsoft.VisualStudio.Validation": "15.0.82", 335 | "System.Composition": "1.0.31", 336 | "System.Reflection.Emit": "4.3.0", 337 | "System.Reflection.Metadata": "1.3.0", 338 | "System.Reflection.TypeExtensions": "4.3.0", 339 | "System.Threading.Tasks.Dataflow": "4.6.0" 340 | } 341 | }, 342 | "Microsoft.VisualStudio.Composition.NetFxAttributes": { 343 | "type": "Transitive", 344 | "resolved": "16.1.8", 345 | "contentHash": "EbwZWTvdzit68qZSuTI8nd1PZ87pYjhpCwtsis8lrUKJ7XLdbE5rxY6YrY7OFze+YUsguzqZlNjX4Yn5nL9qBw==", 346 | "dependencies": { 347 | "System.ComponentModel.Composition": "4.5.0" 348 | } 349 | }, 350 | "Microsoft.VisualStudio.Validation": { 351 | "type": "Transitive", 352 | "resolved": "15.0.82", 353 | "contentHash": "XwZyVCsHuEtnd6nYScJnA8XkXPzy4Ok0DV5/hqqAe5ccgOhJ6yap7Qh/sU/i6QxEzuYyECPYDQ7IOyEQ3yRQgQ==" 354 | }, 355 | "Microsoft.Win32.Primitives": { 356 | "type": "Transitive", 357 | "resolved": "4.3.0", 358 | "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", 359 | "dependencies": { 360 | "Microsoft.NETCore.Platforms": "1.1.0", 361 | "Microsoft.NETCore.Targets": "1.1.0", 362 | "System.Runtime": "4.3.0" 363 | } 364 | }, 365 | "Microsoft.Win32.Registry": { 366 | "type": "Transitive", 367 | "resolved": "4.3.0", 368 | "contentHash": "Lw1/VwLH1yxz6SfFEjVRCN0pnflLEsWgnV4qsdJ512/HhTwnKXUG+zDQ4yTO3K/EJQemGoNaBHX5InISNKTzUQ==", 369 | "dependencies": { 370 | "Microsoft.NETCore.Platforms": "1.1.0", 371 | "System.Collections": "4.3.0", 372 | "System.Globalization": "4.3.0", 373 | "System.Resources.ResourceManager": "4.3.0", 374 | "System.Runtime": "4.3.0", 375 | "System.Runtime.Extensions": "4.3.0", 376 | "System.Runtime.Handles": "4.3.0", 377 | "System.Runtime.InteropServices": "4.3.0" 378 | } 379 | }, 380 | "NETStandard.Library": { 381 | "type": "Transitive", 382 | "resolved": "1.6.1", 383 | "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", 384 | "dependencies": { 385 | "Microsoft.NETCore.Platforms": "1.1.0", 386 | "Microsoft.Win32.Primitives": "4.3.0", 387 | "System.AppContext": "4.3.0", 388 | "System.Collections": "4.3.0", 389 | "System.Collections.Concurrent": "4.3.0", 390 | "System.Console": "4.3.0", 391 | "System.Diagnostics.Debug": "4.3.0", 392 | "System.Diagnostics.Tools": "4.3.0", 393 | "System.Diagnostics.Tracing": "4.3.0", 394 | "System.Globalization": "4.3.0", 395 | "System.Globalization.Calendars": "4.3.0", 396 | "System.IO": "4.3.0", 397 | "System.IO.Compression": "4.3.0", 398 | "System.IO.Compression.ZipFile": "4.3.0", 399 | "System.IO.FileSystem": "4.3.0", 400 | "System.IO.FileSystem.Primitives": "4.3.0", 401 | "System.Linq": "4.3.0", 402 | "System.Linq.Expressions": "4.3.0", 403 | "System.Net.Http": "4.3.0", 404 | "System.Net.Primitives": "4.3.0", 405 | "System.Net.Sockets": "4.3.0", 406 | "System.ObjectModel": "4.3.0", 407 | "System.Reflection": "4.3.0", 408 | "System.Reflection.Extensions": "4.3.0", 409 | "System.Reflection.Primitives": "4.3.0", 410 | "System.Resources.ResourceManager": "4.3.0", 411 | "System.Runtime": "4.3.0", 412 | "System.Runtime.Extensions": "4.3.0", 413 | "System.Runtime.Handles": "4.3.0", 414 | "System.Runtime.InteropServices": "4.3.0", 415 | "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", 416 | "System.Runtime.Numerics": "4.3.0", 417 | "System.Security.Cryptography.Algorithms": "4.3.0", 418 | "System.Security.Cryptography.Encoding": "4.3.0", 419 | "System.Security.Cryptography.Primitives": "4.3.0", 420 | "System.Security.Cryptography.X509Certificates": "4.3.0", 421 | "System.Text.Encoding": "4.3.0", 422 | "System.Text.Encoding.Extensions": "4.3.0", 423 | "System.Text.RegularExpressions": "4.3.0", 424 | "System.Threading": "4.3.0", 425 | "System.Threading.Tasks": "4.3.0", 426 | "System.Threading.Timer": "4.3.0", 427 | "System.Xml.ReaderWriter": "4.3.0", 428 | "System.Xml.XDocument": "4.3.0" 429 | } 430 | }, 431 | "Newtonsoft.Json": { 432 | "type": "Transitive", 433 | "resolved": "9.0.1", 434 | "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", 435 | "dependencies": { 436 | "Microsoft.CSharp": "4.0.1", 437 | "System.Collections": "4.0.11", 438 | "System.Diagnostics.Debug": "4.0.11", 439 | "System.Dynamic.Runtime": "4.0.11", 440 | "System.Globalization": "4.0.11", 441 | "System.IO": "4.1.0", 442 | "System.Linq": "4.1.0", 443 | "System.Linq.Expressions": "4.1.0", 444 | "System.ObjectModel": "4.0.12", 445 | "System.Reflection": "4.1.0", 446 | "System.Reflection.Extensions": "4.0.1", 447 | "System.Resources.ResourceManager": "4.0.1", 448 | "System.Runtime": "4.1.0", 449 | "System.Runtime.Extensions": "4.1.0", 450 | "System.Runtime.Serialization.Primitives": "4.1.1", 451 | "System.Text.Encoding": "4.0.11", 452 | "System.Text.Encoding.Extensions": "4.0.11", 453 | "System.Text.RegularExpressions": "4.1.0", 454 | "System.Threading": "4.0.11", 455 | "System.Threading.Tasks": "4.0.11", 456 | "System.Xml.ReaderWriter": "4.0.11", 457 | "System.Xml.XDocument": "4.0.11" 458 | } 459 | }, 460 | "NuGet.Common": { 461 | "type": "Transitive", 462 | "resolved": "5.6.0", 463 | "contentHash": "N6EvbGxGOvDgf92osTE7o9GKeLuzRodLo6iiG/TGcUvW9sBt9oKWzB5C16MaubIKBZ8Z4J4ri8gTGUM3mEwPkg==", 464 | "dependencies": { 465 | "NuGet.Frameworks": "5.6.0", 466 | "System.Diagnostics.Process": "4.3.0", 467 | "System.Threading.Thread": "4.3.0" 468 | } 469 | }, 470 | "NuGet.Configuration": { 471 | "type": "Transitive", 472 | "resolved": "5.6.0", 473 | "contentHash": "l4ePqw6Tml1SEhxYv8EWg/h0AiNnNi7dOnUU/8ovZ9e0e7z25AJRGt8aBwzIzntgEkRzL0KnwMuXy5oTM+wszg==", 474 | "dependencies": { 475 | "NuGet.Common": "5.6.0", 476 | "System.Security.Cryptography.ProtectedData": "4.3.0" 477 | } 478 | }, 479 | "NuGet.Frameworks": { 480 | "type": "Transitive", 481 | "resolved": "5.6.0", 482 | "contentHash": "QKl4ieKQnDnNybLxk5y7TbIHAiYLVXxapCV7AmIr8gVk2wzPwETerlNwks1jCiknfjRPxtAf6XKNln+Q6G4RPA==" 483 | }, 484 | "NuGet.Packaging": { 485 | "type": "Transitive", 486 | "resolved": "5.6.0", 487 | "contentHash": "av0vDlf071JdpP5bdX2wN+sEYFp/TkLGGArpl3mn5w7pHp7eeLYGWYpYRmRIABSkA15gxMB+P1QH1LNch5Kqhg==", 488 | "dependencies": { 489 | "Newtonsoft.Json": "9.0.1", 490 | "NuGet.Configuration": "5.6.0", 491 | "NuGet.Versioning": "5.6.0", 492 | "System.Dynamic.Runtime": "4.3.0" 493 | } 494 | }, 495 | "NuGet.Protocol": { 496 | "type": "Transitive", 497 | "resolved": "5.6.0", 498 | "contentHash": "95ekDA23ypvzf138qhFkSQAkjykTikB1dKpRLBBD8Ugm9Cfib2VEWZQ3QCMwg/xdEDpoVN9/GtF+J3JYV0eBaA==", 499 | "dependencies": { 500 | "NuGet.Packaging": "5.6.0", 501 | "System.Dynamic.Runtime": "4.3.0" 502 | } 503 | }, 504 | "NuGet.Resolver": { 505 | "type": "Transitive", 506 | "resolved": "5.6.0", 507 | "contentHash": "SH7vnLbYr4KlzOSitAqv5AVP0o0mnGBR2fcoKXENhrUvIEQ3awo+IokL3IChsWNTULLFDxdyQmr6Zd4VgnotSA==", 508 | "dependencies": { 509 | "NuGet.Protocol": "5.6.0" 510 | } 511 | }, 512 | "NuGet.Versioning": { 513 | "type": "Transitive", 514 | "resolved": "5.6.0", 515 | "contentHash": "UIUh1X1XXSOJwc18a7ssTmCAyN7sDXOTfNJN9HfJnWX8NStzQeZq/6RHfSHYMxUjECk6n5alCQjUA51C36R46A==" 516 | }, 517 | "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 518 | "type": "Transitive", 519 | "resolved": "4.3.0", 520 | "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" 521 | }, 522 | "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 523 | "type": "Transitive", 524 | "resolved": "4.3.0", 525 | "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" 526 | }, 527 | "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 528 | "type": "Transitive", 529 | "resolved": "4.3.0", 530 | "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" 531 | }, 532 | "runtime.native.System": { 533 | "type": "Transitive", 534 | "resolved": "4.3.0", 535 | "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", 536 | "dependencies": { 537 | "Microsoft.NETCore.Platforms": "1.1.0", 538 | "Microsoft.NETCore.Targets": "1.1.0" 539 | } 540 | }, 541 | "runtime.native.System.IO.Compression": { 542 | "type": "Transitive", 543 | "resolved": "4.3.0", 544 | "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", 545 | "dependencies": { 546 | "Microsoft.NETCore.Platforms": "1.1.0", 547 | "Microsoft.NETCore.Targets": "1.1.0" 548 | } 549 | }, 550 | "runtime.native.System.Net.Http": { 551 | "type": "Transitive", 552 | "resolved": "4.3.0", 553 | "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", 554 | "dependencies": { 555 | "Microsoft.NETCore.Platforms": "1.1.0", 556 | "Microsoft.NETCore.Targets": "1.1.0" 557 | } 558 | }, 559 | "runtime.native.System.Security.Cryptography.Apple": { 560 | "type": "Transitive", 561 | "resolved": "4.3.0", 562 | "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", 563 | "dependencies": { 564 | "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" 565 | } 566 | }, 567 | "runtime.native.System.Security.Cryptography.OpenSsl": { 568 | "type": "Transitive", 569 | "resolved": "4.3.0", 570 | "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", 571 | "dependencies": { 572 | "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 573 | "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 574 | "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 575 | "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 576 | "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 577 | "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 578 | "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 579 | "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 580 | "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", 581 | "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 582 | } 583 | }, 584 | "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 585 | "type": "Transitive", 586 | "resolved": "4.3.0", 587 | "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" 588 | }, 589 | "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 590 | "type": "Transitive", 591 | "resolved": "4.3.0", 592 | "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" 593 | }, 594 | "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { 595 | "type": "Transitive", 596 | "resolved": "4.3.0", 597 | "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" 598 | }, 599 | "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 600 | "type": "Transitive", 601 | "resolved": "4.3.0", 602 | "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" 603 | }, 604 | "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 605 | "type": "Transitive", 606 | "resolved": "4.3.0", 607 | "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" 608 | }, 609 | "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 610 | "type": "Transitive", 611 | "resolved": "4.3.0", 612 | "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" 613 | }, 614 | "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 615 | "type": "Transitive", 616 | "resolved": "4.3.0", 617 | "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" 618 | }, 619 | "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { 620 | "type": "Transitive", 621 | "resolved": "4.3.0", 622 | "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" 623 | }, 624 | "System.AppContext": { 625 | "type": "Transitive", 626 | "resolved": "4.3.0", 627 | "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", 628 | "dependencies": { 629 | "System.Runtime": "4.3.0" 630 | } 631 | }, 632 | "System.Buffers": { 633 | "type": "Transitive", 634 | "resolved": "4.3.0", 635 | "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", 636 | "dependencies": { 637 | "System.Diagnostics.Debug": "4.3.0", 638 | "System.Diagnostics.Tracing": "4.3.0", 639 | "System.Resources.ResourceManager": "4.3.0", 640 | "System.Runtime": "4.3.0", 641 | "System.Threading": "4.3.0" 642 | } 643 | }, 644 | "System.Collections": { 645 | "type": "Transitive", 646 | "resolved": "4.3.0", 647 | "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", 648 | "dependencies": { 649 | "Microsoft.NETCore.Platforms": "1.1.0", 650 | "Microsoft.NETCore.Targets": "1.1.0", 651 | "System.Runtime": "4.3.0" 652 | } 653 | }, 654 | "System.Collections.Concurrent": { 655 | "type": "Transitive", 656 | "resolved": "4.3.0", 657 | "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", 658 | "dependencies": { 659 | "System.Collections": "4.3.0", 660 | "System.Diagnostics.Debug": "4.3.0", 661 | "System.Diagnostics.Tracing": "4.3.0", 662 | "System.Globalization": "4.3.0", 663 | "System.Reflection": "4.3.0", 664 | "System.Resources.ResourceManager": "4.3.0", 665 | "System.Runtime": "4.3.0", 666 | "System.Runtime.Extensions": "4.3.0", 667 | "System.Threading": "4.3.0", 668 | "System.Threading.Tasks": "4.3.0" 669 | } 670 | }, 671 | "System.Collections.Immutable": { 672 | "type": "Transitive", 673 | "resolved": "5.0.0", 674 | "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" 675 | }, 676 | "System.ComponentModel.Composition": { 677 | "type": "Transitive", 678 | "resolved": "4.5.0", 679 | "contentHash": "+iB9FoZnfdqMEGq6np28X6YNSUrse16CakmIhV3h6PxEWt7jYxUN3Txs1D8MZhhf4QmyvK0F/EcIN0f4gGN0dA==", 680 | "dependencies": { 681 | "System.Security.Permissions": "4.5.0" 682 | } 683 | }, 684 | "System.Composition": { 685 | "type": "Transitive", 686 | "resolved": "1.0.31", 687 | "contentHash": "I+D26qpYdoklyAVUdqwUBrEIckMNjAYnuPJy/h9dsQItpQwVREkDFs4b4tkBza0kT2Yk48Lcfsv2QQ9hWsh9Iw==", 688 | "dependencies": { 689 | "System.Composition.AttributedModel": "1.0.31", 690 | "System.Composition.Convention": "1.0.31", 691 | "System.Composition.Hosting": "1.0.31", 692 | "System.Composition.Runtime": "1.0.31", 693 | "System.Composition.TypedParts": "1.0.31" 694 | } 695 | }, 696 | "System.Composition.AttributedModel": { 697 | "type": "Transitive", 698 | "resolved": "1.0.31", 699 | "contentHash": "NHWhkM3ZkspmA0XJEsKdtTt1ViDYuojgSND3yHhTzwxepiwqZf+BCWuvCbjUt4fe0NxxQhUDGJ5km6sLjo9qnQ==", 700 | "dependencies": { 701 | "System.Reflection": "4.3.0", 702 | "System.Runtime": "4.3.0" 703 | } 704 | }, 705 | "System.Composition.Convention": { 706 | "type": "Transitive", 707 | "resolved": "1.0.31", 708 | "contentHash": "GLjh2Ju71k6C0qxMMtl4efHa68NmWeIUYh4fkUI8xbjQrEBvFmRwMDFcylT8/PR9SQbeeL48IkFxU/+gd0nYEQ==", 709 | "dependencies": { 710 | "System.Collections": "4.3.0", 711 | "System.Composition.AttributedModel": "1.0.31", 712 | "System.Diagnostics.Debug": "4.3.0", 713 | "System.Diagnostics.Tools": "4.3.0", 714 | "System.Globalization": "4.3.0", 715 | "System.Linq": "4.3.0", 716 | "System.Linq.Expressions": "4.3.0", 717 | "System.Reflection": "4.3.0", 718 | "System.Reflection.Extensions": "4.3.0", 719 | "System.Resources.ResourceManager": "4.3.0", 720 | "System.Runtime": "4.3.0", 721 | "System.Threading": "4.3.0" 722 | } 723 | }, 724 | "System.Composition.Hosting": { 725 | "type": "Transitive", 726 | "resolved": "1.0.31", 727 | "contentHash": "fN1bT4RX4vUqjbgoyuJFVUizAl2mYF5VAb+bVIxIYZSSc0BdnX+yGAxcavxJuDDCQ1K+/mdpgyEFc8e9ikjvrg==", 728 | "dependencies": { 729 | "System.Collections": "4.3.0", 730 | "System.Composition.Runtime": "1.0.31", 731 | "System.Diagnostics.Debug": "4.3.0", 732 | "System.Diagnostics.Tools": "4.3.0", 733 | "System.Globalization": "4.3.0", 734 | "System.Linq": "4.3.0", 735 | "System.Linq.Expressions": "4.3.0", 736 | "System.ObjectModel": "4.3.0", 737 | "System.Reflection": "4.3.0", 738 | "System.Reflection.Extensions": "4.3.0", 739 | "System.Resources.ResourceManager": "4.3.0", 740 | "System.Runtime": "4.3.0", 741 | "System.Threading": "4.3.0" 742 | } 743 | }, 744 | "System.Composition.Runtime": { 745 | "type": "Transitive", 746 | "resolved": "1.0.31", 747 | "contentHash": "0LEJN+2NVM89CE4SekDrrk5tHV5LeATltkp+9WNYrR+Huiyt0vaCqHbbHtVAjPyeLWIc8dOz/3kthRBj32wGQg==", 748 | "dependencies": { 749 | "System.Collections": "4.3.0", 750 | "System.Diagnostics.Debug": "4.3.0", 751 | "System.Diagnostics.Tools": "4.3.0", 752 | "System.Globalization": "4.3.0", 753 | "System.Linq": "4.3.0", 754 | "System.Reflection": "4.3.0", 755 | "System.Resources.ResourceManager": "4.3.0", 756 | "System.Runtime": "4.3.0" 757 | } 758 | }, 759 | "System.Composition.TypedParts": { 760 | "type": "Transitive", 761 | "resolved": "1.0.31", 762 | "contentHash": "0Zae/FtzeFgDBBuILeIbC/T9HMYbW4olAmi8XqqAGosSOWvXfiQLfARZEhiGd0LVXaYgXr0NhxiU1LldRP1fpQ==", 763 | "dependencies": { 764 | "System.Collections": "4.3.0", 765 | "System.Composition.AttributedModel": "1.0.31", 766 | "System.Composition.Hosting": "1.0.31", 767 | "System.Composition.Runtime": "1.0.31", 768 | "System.Diagnostics.Debug": "4.3.0", 769 | "System.Diagnostics.Tools": "4.3.0", 770 | "System.Globalization": "4.3.0", 771 | "System.Linq": "4.3.0", 772 | "System.Linq.Expressions": "4.3.0", 773 | "System.Reflection": "4.3.0", 774 | "System.Reflection.Extensions": "4.3.0", 775 | "System.Resources.ResourceManager": "4.3.0", 776 | "System.Runtime": "4.3.0", 777 | "System.Runtime.Extensions": "4.3.0" 778 | } 779 | }, 780 | "System.Console": { 781 | "type": "Transitive", 782 | "resolved": "4.3.0", 783 | "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", 784 | "dependencies": { 785 | "Microsoft.NETCore.Platforms": "1.1.0", 786 | "Microsoft.NETCore.Targets": "1.1.0", 787 | "System.IO": "4.3.0", 788 | "System.Runtime": "4.3.0", 789 | "System.Text.Encoding": "4.3.0" 790 | } 791 | }, 792 | "System.Diagnostics.Debug": { 793 | "type": "Transitive", 794 | "resolved": "4.3.0", 795 | "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", 796 | "dependencies": { 797 | "Microsoft.NETCore.Platforms": "1.1.0", 798 | "Microsoft.NETCore.Targets": "1.1.0", 799 | "System.Runtime": "4.3.0" 800 | } 801 | }, 802 | "System.Diagnostics.DiagnosticSource": { 803 | "type": "Transitive", 804 | "resolved": "4.3.0", 805 | "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", 806 | "dependencies": { 807 | "System.Collections": "4.3.0", 808 | "System.Diagnostics.Tracing": "4.3.0", 809 | "System.Reflection": "4.3.0", 810 | "System.Runtime": "4.3.0", 811 | "System.Threading": "4.3.0" 812 | } 813 | }, 814 | "System.Diagnostics.Process": { 815 | "type": "Transitive", 816 | "resolved": "4.3.0", 817 | "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", 818 | "dependencies": { 819 | "Microsoft.NETCore.Platforms": "1.1.0", 820 | "Microsoft.Win32.Primitives": "4.3.0", 821 | "Microsoft.Win32.Registry": "4.3.0", 822 | "System.Collections": "4.3.0", 823 | "System.Diagnostics.Debug": "4.3.0", 824 | "System.Globalization": "4.3.0", 825 | "System.IO": "4.3.0", 826 | "System.IO.FileSystem": "4.3.0", 827 | "System.IO.FileSystem.Primitives": "4.3.0", 828 | "System.Resources.ResourceManager": "4.3.0", 829 | "System.Runtime": "4.3.0", 830 | "System.Runtime.Extensions": "4.3.0", 831 | "System.Runtime.Handles": "4.3.0", 832 | "System.Runtime.InteropServices": "4.3.0", 833 | "System.Text.Encoding": "4.3.0", 834 | "System.Text.Encoding.Extensions": "4.3.0", 835 | "System.Threading": "4.3.0", 836 | "System.Threading.Tasks": "4.3.0", 837 | "System.Threading.Thread": "4.3.0", 838 | "System.Threading.ThreadPool": "4.3.0", 839 | "runtime.native.System": "4.3.0" 840 | } 841 | }, 842 | "System.Diagnostics.Tools": { 843 | "type": "Transitive", 844 | "resolved": "4.3.0", 845 | "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", 846 | "dependencies": { 847 | "Microsoft.NETCore.Platforms": "1.1.0", 848 | "Microsoft.NETCore.Targets": "1.1.0", 849 | "System.Runtime": "4.3.0" 850 | } 851 | }, 852 | "System.Diagnostics.Tracing": { 853 | "type": "Transitive", 854 | "resolved": "4.3.0", 855 | "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", 856 | "dependencies": { 857 | "Microsoft.NETCore.Platforms": "1.1.0", 858 | "Microsoft.NETCore.Targets": "1.1.0", 859 | "System.Runtime": "4.3.0" 860 | } 861 | }, 862 | "System.Dynamic.Runtime": { 863 | "type": "Transitive", 864 | "resolved": "4.3.0", 865 | "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", 866 | "dependencies": { 867 | "System.Collections": "4.3.0", 868 | "System.Diagnostics.Debug": "4.3.0", 869 | "System.Linq": "4.3.0", 870 | "System.Linq.Expressions": "4.3.0", 871 | "System.ObjectModel": "4.3.0", 872 | "System.Reflection": "4.3.0", 873 | "System.Reflection.Emit": "4.3.0", 874 | "System.Reflection.Emit.ILGeneration": "4.3.0", 875 | "System.Reflection.Primitives": "4.3.0", 876 | "System.Reflection.TypeExtensions": "4.3.0", 877 | "System.Resources.ResourceManager": "4.3.0", 878 | "System.Runtime": "4.3.0", 879 | "System.Runtime.Extensions": "4.3.0", 880 | "System.Threading": "4.3.0" 881 | } 882 | }, 883 | "System.Globalization": { 884 | "type": "Transitive", 885 | "resolved": "4.3.0", 886 | "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", 887 | "dependencies": { 888 | "Microsoft.NETCore.Platforms": "1.1.0", 889 | "Microsoft.NETCore.Targets": "1.1.0", 890 | "System.Runtime": "4.3.0" 891 | } 892 | }, 893 | "System.Globalization.Calendars": { 894 | "type": "Transitive", 895 | "resolved": "4.3.0", 896 | "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", 897 | "dependencies": { 898 | "Microsoft.NETCore.Platforms": "1.1.0", 899 | "Microsoft.NETCore.Targets": "1.1.0", 900 | "System.Globalization": "4.3.0", 901 | "System.Runtime": "4.3.0" 902 | } 903 | }, 904 | "System.Globalization.Extensions": { 905 | "type": "Transitive", 906 | "resolved": "4.3.0", 907 | "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", 908 | "dependencies": { 909 | "Microsoft.NETCore.Platforms": "1.1.0", 910 | "System.Globalization": "4.3.0", 911 | "System.Resources.ResourceManager": "4.3.0", 912 | "System.Runtime": "4.3.0", 913 | "System.Runtime.Extensions": "4.3.0", 914 | "System.Runtime.InteropServices": "4.3.0" 915 | } 916 | }, 917 | "System.IO": { 918 | "type": "Transitive", 919 | "resolved": "4.3.0", 920 | "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", 921 | "dependencies": { 922 | "Microsoft.NETCore.Platforms": "1.1.0", 923 | "Microsoft.NETCore.Targets": "1.1.0", 924 | "System.Runtime": "4.3.0", 925 | "System.Text.Encoding": "4.3.0", 926 | "System.Threading.Tasks": "4.3.0" 927 | } 928 | }, 929 | "System.IO.Compression": { 930 | "type": "Transitive", 931 | "resolved": "4.3.0", 932 | "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", 933 | "dependencies": { 934 | "Microsoft.NETCore.Platforms": "1.1.0", 935 | "System.Buffers": "4.3.0", 936 | "System.Collections": "4.3.0", 937 | "System.Diagnostics.Debug": "4.3.0", 938 | "System.IO": "4.3.0", 939 | "System.Resources.ResourceManager": "4.3.0", 940 | "System.Runtime": "4.3.0", 941 | "System.Runtime.Extensions": "4.3.0", 942 | "System.Runtime.Handles": "4.3.0", 943 | "System.Runtime.InteropServices": "4.3.0", 944 | "System.Text.Encoding": "4.3.0", 945 | "System.Threading": "4.3.0", 946 | "System.Threading.Tasks": "4.3.0", 947 | "runtime.native.System": "4.3.0", 948 | "runtime.native.System.IO.Compression": "4.3.0" 949 | } 950 | }, 951 | "System.IO.Compression.ZipFile": { 952 | "type": "Transitive", 953 | "resolved": "4.3.0", 954 | "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", 955 | "dependencies": { 956 | "System.Buffers": "4.3.0", 957 | "System.IO": "4.3.0", 958 | "System.IO.Compression": "4.3.0", 959 | "System.IO.FileSystem": "4.3.0", 960 | "System.IO.FileSystem.Primitives": "4.3.0", 961 | "System.Resources.ResourceManager": "4.3.0", 962 | "System.Runtime": "4.3.0", 963 | "System.Runtime.Extensions": "4.3.0", 964 | "System.Text.Encoding": "4.3.0" 965 | } 966 | }, 967 | "System.IO.FileSystem": { 968 | "type": "Transitive", 969 | "resolved": "4.3.0", 970 | "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", 971 | "dependencies": { 972 | "Microsoft.NETCore.Platforms": "1.1.0", 973 | "Microsoft.NETCore.Targets": "1.1.0", 974 | "System.IO": "4.3.0", 975 | "System.IO.FileSystem.Primitives": "4.3.0", 976 | "System.Runtime": "4.3.0", 977 | "System.Runtime.Handles": "4.3.0", 978 | "System.Text.Encoding": "4.3.0", 979 | "System.Threading.Tasks": "4.3.0" 980 | } 981 | }, 982 | "System.IO.FileSystem.Primitives": { 983 | "type": "Transitive", 984 | "resolved": "4.3.0", 985 | "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", 986 | "dependencies": { 987 | "System.Runtime": "4.3.0" 988 | } 989 | }, 990 | "System.IO.Pipelines": { 991 | "type": "Transitive", 992 | "resolved": "5.0.1", 993 | "contentHash": "qEePWsaq9LoEEIqhbGe6D5J8c9IqQOUuTzzV6wn1POlfdLkJliZY3OlB0j0f17uMWlqZYjH7txj+2YbyrIA8Yg==" 994 | }, 995 | "System.Linq": { 996 | "type": "Transitive", 997 | "resolved": "4.3.0", 998 | "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", 999 | "dependencies": { 1000 | "System.Collections": "4.3.0", 1001 | "System.Diagnostics.Debug": "4.3.0", 1002 | "System.Resources.ResourceManager": "4.3.0", 1003 | "System.Runtime": "4.3.0", 1004 | "System.Runtime.Extensions": "4.3.0" 1005 | } 1006 | }, 1007 | "System.Linq.Expressions": { 1008 | "type": "Transitive", 1009 | "resolved": "4.3.0", 1010 | "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", 1011 | "dependencies": { 1012 | "System.Collections": "4.3.0", 1013 | "System.Diagnostics.Debug": "4.3.0", 1014 | "System.Globalization": "4.3.0", 1015 | "System.IO": "4.3.0", 1016 | "System.Linq": "4.3.0", 1017 | "System.ObjectModel": "4.3.0", 1018 | "System.Reflection": "4.3.0", 1019 | "System.Reflection.Emit": "4.3.0", 1020 | "System.Reflection.Emit.ILGeneration": "4.3.0", 1021 | "System.Reflection.Emit.Lightweight": "4.3.0", 1022 | "System.Reflection.Extensions": "4.3.0", 1023 | "System.Reflection.Primitives": "4.3.0", 1024 | "System.Reflection.TypeExtensions": "4.3.0", 1025 | "System.Resources.ResourceManager": "4.3.0", 1026 | "System.Runtime": "4.3.0", 1027 | "System.Runtime.Extensions": "4.3.0", 1028 | "System.Threading": "4.3.0" 1029 | } 1030 | }, 1031 | "System.Memory": { 1032 | "type": "Transitive", 1033 | "resolved": "4.5.4", 1034 | "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" 1035 | }, 1036 | "System.Net.Http": { 1037 | "type": "Transitive", 1038 | "resolved": "4.3.0", 1039 | "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", 1040 | "dependencies": { 1041 | "Microsoft.NETCore.Platforms": "1.1.0", 1042 | "System.Collections": "4.3.0", 1043 | "System.Diagnostics.Debug": "4.3.0", 1044 | "System.Diagnostics.DiagnosticSource": "4.3.0", 1045 | "System.Diagnostics.Tracing": "4.3.0", 1046 | "System.Globalization": "4.3.0", 1047 | "System.Globalization.Extensions": "4.3.0", 1048 | "System.IO": "4.3.0", 1049 | "System.IO.FileSystem": "4.3.0", 1050 | "System.Net.Primitives": "4.3.0", 1051 | "System.Resources.ResourceManager": "4.3.0", 1052 | "System.Runtime": "4.3.0", 1053 | "System.Runtime.Extensions": "4.3.0", 1054 | "System.Runtime.Handles": "4.3.0", 1055 | "System.Runtime.InteropServices": "4.3.0", 1056 | "System.Security.Cryptography.Algorithms": "4.3.0", 1057 | "System.Security.Cryptography.Encoding": "4.3.0", 1058 | "System.Security.Cryptography.OpenSsl": "4.3.0", 1059 | "System.Security.Cryptography.Primitives": "4.3.0", 1060 | "System.Security.Cryptography.X509Certificates": "4.3.0", 1061 | "System.Text.Encoding": "4.3.0", 1062 | "System.Threading": "4.3.0", 1063 | "System.Threading.Tasks": "4.3.0", 1064 | "runtime.native.System": "4.3.0", 1065 | "runtime.native.System.Net.Http": "4.3.0", 1066 | "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 1067 | } 1068 | }, 1069 | "System.Net.Primitives": { 1070 | "type": "Transitive", 1071 | "resolved": "4.3.0", 1072 | "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", 1073 | "dependencies": { 1074 | "Microsoft.NETCore.Platforms": "1.1.0", 1075 | "Microsoft.NETCore.Targets": "1.1.0", 1076 | "System.Runtime": "4.3.0", 1077 | "System.Runtime.Handles": "4.3.0" 1078 | } 1079 | }, 1080 | "System.Net.Sockets": { 1081 | "type": "Transitive", 1082 | "resolved": "4.3.0", 1083 | "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", 1084 | "dependencies": { 1085 | "Microsoft.NETCore.Platforms": "1.1.0", 1086 | "Microsoft.NETCore.Targets": "1.1.0", 1087 | "System.IO": "4.3.0", 1088 | "System.Net.Primitives": "4.3.0", 1089 | "System.Runtime": "4.3.0", 1090 | "System.Threading.Tasks": "4.3.0" 1091 | } 1092 | }, 1093 | "System.ObjectModel": { 1094 | "type": "Transitive", 1095 | "resolved": "4.3.0", 1096 | "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", 1097 | "dependencies": { 1098 | "System.Collections": "4.3.0", 1099 | "System.Diagnostics.Debug": "4.3.0", 1100 | "System.Resources.ResourceManager": "4.3.0", 1101 | "System.Runtime": "4.3.0", 1102 | "System.Threading": "4.3.0" 1103 | } 1104 | }, 1105 | "System.Reflection": { 1106 | "type": "Transitive", 1107 | "resolved": "4.3.0", 1108 | "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", 1109 | "dependencies": { 1110 | "Microsoft.NETCore.Platforms": "1.1.0", 1111 | "Microsoft.NETCore.Targets": "1.1.0", 1112 | "System.IO": "4.3.0", 1113 | "System.Reflection.Primitives": "4.3.0", 1114 | "System.Runtime": "4.3.0" 1115 | } 1116 | }, 1117 | "System.Reflection.Emit": { 1118 | "type": "Transitive", 1119 | "resolved": "4.3.0", 1120 | "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", 1121 | "dependencies": { 1122 | "System.IO": "4.3.0", 1123 | "System.Reflection": "4.3.0", 1124 | "System.Reflection.Emit.ILGeneration": "4.3.0", 1125 | "System.Reflection.Primitives": "4.3.0", 1126 | "System.Runtime": "4.3.0" 1127 | } 1128 | }, 1129 | "System.Reflection.Emit.ILGeneration": { 1130 | "type": "Transitive", 1131 | "resolved": "4.3.0", 1132 | "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", 1133 | "dependencies": { 1134 | "System.Reflection": "4.3.0", 1135 | "System.Reflection.Primitives": "4.3.0", 1136 | "System.Runtime": "4.3.0" 1137 | } 1138 | }, 1139 | "System.Reflection.Emit.Lightweight": { 1140 | "type": "Transitive", 1141 | "resolved": "4.3.0", 1142 | "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", 1143 | "dependencies": { 1144 | "System.Reflection": "4.3.0", 1145 | "System.Reflection.Emit.ILGeneration": "4.3.0", 1146 | "System.Reflection.Primitives": "4.3.0", 1147 | "System.Runtime": "4.3.0" 1148 | } 1149 | }, 1150 | "System.Reflection.Extensions": { 1151 | "type": "Transitive", 1152 | "resolved": "4.3.0", 1153 | "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", 1154 | "dependencies": { 1155 | "Microsoft.NETCore.Platforms": "1.1.0", 1156 | "Microsoft.NETCore.Targets": "1.1.0", 1157 | "System.Reflection": "4.3.0", 1158 | "System.Runtime": "4.3.0" 1159 | } 1160 | }, 1161 | "System.Reflection.Metadata": { 1162 | "type": "Transitive", 1163 | "resolved": "5.0.0", 1164 | "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" 1165 | }, 1166 | "System.Reflection.Primitives": { 1167 | "type": "Transitive", 1168 | "resolved": "4.3.0", 1169 | "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", 1170 | "dependencies": { 1171 | "Microsoft.NETCore.Platforms": "1.1.0", 1172 | "Microsoft.NETCore.Targets": "1.1.0", 1173 | "System.Runtime": "4.3.0" 1174 | } 1175 | }, 1176 | "System.Reflection.TypeExtensions": { 1177 | "type": "Transitive", 1178 | "resolved": "4.3.0", 1179 | "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", 1180 | "dependencies": { 1181 | "System.Reflection": "4.3.0", 1182 | "System.Runtime": "4.3.0" 1183 | } 1184 | }, 1185 | "System.Resources.ResourceManager": { 1186 | "type": "Transitive", 1187 | "resolved": "4.3.0", 1188 | "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", 1189 | "dependencies": { 1190 | "Microsoft.NETCore.Platforms": "1.1.0", 1191 | "Microsoft.NETCore.Targets": "1.1.0", 1192 | "System.Globalization": "4.3.0", 1193 | "System.Reflection": "4.3.0", 1194 | "System.Runtime": "4.3.0" 1195 | } 1196 | }, 1197 | "System.Runtime": { 1198 | "type": "Transitive", 1199 | "resolved": "4.3.0", 1200 | "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", 1201 | "dependencies": { 1202 | "Microsoft.NETCore.Platforms": "1.1.0", 1203 | "Microsoft.NETCore.Targets": "1.1.0" 1204 | } 1205 | }, 1206 | "System.Runtime.CompilerServices.Unsafe": { 1207 | "type": "Transitive", 1208 | "resolved": "5.0.0", 1209 | "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" 1210 | }, 1211 | "System.Runtime.Extensions": { 1212 | "type": "Transitive", 1213 | "resolved": "4.3.0", 1214 | "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", 1215 | "dependencies": { 1216 | "Microsoft.NETCore.Platforms": "1.1.0", 1217 | "Microsoft.NETCore.Targets": "1.1.0", 1218 | "System.Runtime": "4.3.0" 1219 | } 1220 | }, 1221 | "System.Runtime.Handles": { 1222 | "type": "Transitive", 1223 | "resolved": "4.3.0", 1224 | "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", 1225 | "dependencies": { 1226 | "Microsoft.NETCore.Platforms": "1.1.0", 1227 | "Microsoft.NETCore.Targets": "1.1.0", 1228 | "System.Runtime": "4.3.0" 1229 | } 1230 | }, 1231 | "System.Runtime.InteropServices": { 1232 | "type": "Transitive", 1233 | "resolved": "4.3.0", 1234 | "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", 1235 | "dependencies": { 1236 | "Microsoft.NETCore.Platforms": "1.1.0", 1237 | "Microsoft.NETCore.Targets": "1.1.0", 1238 | "System.Reflection": "4.3.0", 1239 | "System.Reflection.Primitives": "4.3.0", 1240 | "System.Runtime": "4.3.0", 1241 | "System.Runtime.Handles": "4.3.0" 1242 | } 1243 | }, 1244 | "System.Runtime.InteropServices.RuntimeInformation": { 1245 | "type": "Transitive", 1246 | "resolved": "4.3.0", 1247 | "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", 1248 | "dependencies": { 1249 | "System.Reflection": "4.3.0", 1250 | "System.Reflection.Extensions": "4.3.0", 1251 | "System.Resources.ResourceManager": "4.3.0", 1252 | "System.Runtime": "4.3.0", 1253 | "System.Runtime.InteropServices": "4.3.0", 1254 | "System.Threading": "4.3.0", 1255 | "runtime.native.System": "4.3.0" 1256 | } 1257 | }, 1258 | "System.Runtime.Numerics": { 1259 | "type": "Transitive", 1260 | "resolved": "4.3.0", 1261 | "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", 1262 | "dependencies": { 1263 | "System.Globalization": "4.3.0", 1264 | "System.Resources.ResourceManager": "4.3.0", 1265 | "System.Runtime": "4.3.0", 1266 | "System.Runtime.Extensions": "4.3.0" 1267 | } 1268 | }, 1269 | "System.Runtime.Serialization.Primitives": { 1270 | "type": "Transitive", 1271 | "resolved": "4.1.1", 1272 | "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", 1273 | "dependencies": { 1274 | "System.Resources.ResourceManager": "4.0.1", 1275 | "System.Runtime": "4.1.0" 1276 | } 1277 | }, 1278 | "System.Security.AccessControl": { 1279 | "type": "Transitive", 1280 | "resolved": "4.5.0", 1281 | "contentHash": "vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==", 1282 | "dependencies": { 1283 | "Microsoft.NETCore.Platforms": "2.0.0", 1284 | "System.Security.Principal.Windows": "4.5.0" 1285 | } 1286 | }, 1287 | "System.Security.Cryptography.Algorithms": { 1288 | "type": "Transitive", 1289 | "resolved": "4.3.0", 1290 | "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", 1291 | "dependencies": { 1292 | "Microsoft.NETCore.Platforms": "1.1.0", 1293 | "System.Collections": "4.3.0", 1294 | "System.IO": "4.3.0", 1295 | "System.Resources.ResourceManager": "4.3.0", 1296 | "System.Runtime": "4.3.0", 1297 | "System.Runtime.Extensions": "4.3.0", 1298 | "System.Runtime.Handles": "4.3.0", 1299 | "System.Runtime.InteropServices": "4.3.0", 1300 | "System.Runtime.Numerics": "4.3.0", 1301 | "System.Security.Cryptography.Encoding": "4.3.0", 1302 | "System.Security.Cryptography.Primitives": "4.3.0", 1303 | "System.Text.Encoding": "4.3.0", 1304 | "runtime.native.System.Security.Cryptography.Apple": "4.3.0", 1305 | "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 1306 | } 1307 | }, 1308 | "System.Security.Cryptography.Cng": { 1309 | "type": "Transitive", 1310 | "resolved": "4.3.0", 1311 | "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", 1312 | "dependencies": { 1313 | "Microsoft.NETCore.Platforms": "1.1.0", 1314 | "System.IO": "4.3.0", 1315 | "System.Resources.ResourceManager": "4.3.0", 1316 | "System.Runtime": "4.3.0", 1317 | "System.Runtime.Extensions": "4.3.0", 1318 | "System.Runtime.Handles": "4.3.0", 1319 | "System.Runtime.InteropServices": "4.3.0", 1320 | "System.Security.Cryptography.Algorithms": "4.3.0", 1321 | "System.Security.Cryptography.Encoding": "4.3.0", 1322 | "System.Security.Cryptography.Primitives": "4.3.0", 1323 | "System.Text.Encoding": "4.3.0" 1324 | } 1325 | }, 1326 | "System.Security.Cryptography.Csp": { 1327 | "type": "Transitive", 1328 | "resolved": "4.3.0", 1329 | "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", 1330 | "dependencies": { 1331 | "Microsoft.NETCore.Platforms": "1.1.0", 1332 | "System.IO": "4.3.0", 1333 | "System.Reflection": "4.3.0", 1334 | "System.Resources.ResourceManager": "4.3.0", 1335 | "System.Runtime": "4.3.0", 1336 | "System.Runtime.Extensions": "4.3.0", 1337 | "System.Runtime.Handles": "4.3.0", 1338 | "System.Runtime.InteropServices": "4.3.0", 1339 | "System.Security.Cryptography.Algorithms": "4.3.0", 1340 | "System.Security.Cryptography.Encoding": "4.3.0", 1341 | "System.Security.Cryptography.Primitives": "4.3.0", 1342 | "System.Text.Encoding": "4.3.0", 1343 | "System.Threading": "4.3.0" 1344 | } 1345 | }, 1346 | "System.Security.Cryptography.Encoding": { 1347 | "type": "Transitive", 1348 | "resolved": "4.3.0", 1349 | "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", 1350 | "dependencies": { 1351 | "Microsoft.NETCore.Platforms": "1.1.0", 1352 | "System.Collections": "4.3.0", 1353 | "System.Collections.Concurrent": "4.3.0", 1354 | "System.Linq": "4.3.0", 1355 | "System.Resources.ResourceManager": "4.3.0", 1356 | "System.Runtime": "4.3.0", 1357 | "System.Runtime.Extensions": "4.3.0", 1358 | "System.Runtime.Handles": "4.3.0", 1359 | "System.Runtime.InteropServices": "4.3.0", 1360 | "System.Security.Cryptography.Primitives": "4.3.0", 1361 | "System.Text.Encoding": "4.3.0", 1362 | "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 1363 | } 1364 | }, 1365 | "System.Security.Cryptography.OpenSsl": { 1366 | "type": "Transitive", 1367 | "resolved": "4.3.0", 1368 | "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", 1369 | "dependencies": { 1370 | "System.Collections": "4.3.0", 1371 | "System.IO": "4.3.0", 1372 | "System.Resources.ResourceManager": "4.3.0", 1373 | "System.Runtime": "4.3.0", 1374 | "System.Runtime.Extensions": "4.3.0", 1375 | "System.Runtime.Handles": "4.3.0", 1376 | "System.Runtime.InteropServices": "4.3.0", 1377 | "System.Runtime.Numerics": "4.3.0", 1378 | "System.Security.Cryptography.Algorithms": "4.3.0", 1379 | "System.Security.Cryptography.Encoding": "4.3.0", 1380 | "System.Security.Cryptography.Primitives": "4.3.0", 1381 | "System.Text.Encoding": "4.3.0", 1382 | "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 1383 | } 1384 | }, 1385 | "System.Security.Cryptography.Primitives": { 1386 | "type": "Transitive", 1387 | "resolved": "4.3.0", 1388 | "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", 1389 | "dependencies": { 1390 | "System.Diagnostics.Debug": "4.3.0", 1391 | "System.Globalization": "4.3.0", 1392 | "System.IO": "4.3.0", 1393 | "System.Resources.ResourceManager": "4.3.0", 1394 | "System.Runtime": "4.3.0", 1395 | "System.Threading": "4.3.0", 1396 | "System.Threading.Tasks": "4.3.0" 1397 | } 1398 | }, 1399 | "System.Security.Cryptography.ProtectedData": { 1400 | "type": "Transitive", 1401 | "resolved": "4.3.0", 1402 | "contentHash": "qBUHUk7IqrPHY96THHTa1akCxw0GsNFpsk3XFHbi0A0tMUDBpQprtY1Tbl6yaS1x4c96ilcXU8PocYtmSmkaQQ==", 1403 | "dependencies": { 1404 | "Microsoft.NETCore.Platforms": "1.1.0", 1405 | "System.Resources.ResourceManager": "4.3.0", 1406 | "System.Runtime": "4.3.0", 1407 | "System.Runtime.InteropServices": "4.3.0", 1408 | "System.Security.Cryptography.Primitives": "4.3.0" 1409 | } 1410 | }, 1411 | "System.Security.Cryptography.X509Certificates": { 1412 | "type": "Transitive", 1413 | "resolved": "4.3.0", 1414 | "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", 1415 | "dependencies": { 1416 | "Microsoft.NETCore.Platforms": "1.1.0", 1417 | "System.Collections": "4.3.0", 1418 | "System.Diagnostics.Debug": "4.3.0", 1419 | "System.Globalization": "4.3.0", 1420 | "System.Globalization.Calendars": "4.3.0", 1421 | "System.IO": "4.3.0", 1422 | "System.IO.FileSystem": "4.3.0", 1423 | "System.IO.FileSystem.Primitives": "4.3.0", 1424 | "System.Resources.ResourceManager": "4.3.0", 1425 | "System.Runtime": "4.3.0", 1426 | "System.Runtime.Extensions": "4.3.0", 1427 | "System.Runtime.Handles": "4.3.0", 1428 | "System.Runtime.InteropServices": "4.3.0", 1429 | "System.Runtime.Numerics": "4.3.0", 1430 | "System.Security.Cryptography.Algorithms": "4.3.0", 1431 | "System.Security.Cryptography.Cng": "4.3.0", 1432 | "System.Security.Cryptography.Csp": "4.3.0", 1433 | "System.Security.Cryptography.Encoding": "4.3.0", 1434 | "System.Security.Cryptography.OpenSsl": "4.3.0", 1435 | "System.Security.Cryptography.Primitives": "4.3.0", 1436 | "System.Text.Encoding": "4.3.0", 1437 | "System.Threading": "4.3.0", 1438 | "runtime.native.System": "4.3.0", 1439 | "runtime.native.System.Net.Http": "4.3.0", 1440 | "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" 1441 | } 1442 | }, 1443 | "System.Security.Permissions": { 1444 | "type": "Transitive", 1445 | "resolved": "4.5.0", 1446 | "contentHash": "9gdyuARhUR7H+p5CjyUB/zPk7/Xut3wUSP8NJQB6iZr8L3XUXTMdoLeVAg9N4rqF8oIpE7MpdqHdDHQ7XgJe0g==", 1447 | "dependencies": { 1448 | "System.Security.AccessControl": "4.5.0" 1449 | } 1450 | }, 1451 | "System.Security.Principal.Windows": { 1452 | "type": "Transitive", 1453 | "resolved": "4.5.0", 1454 | "contentHash": "U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==", 1455 | "dependencies": { 1456 | "Microsoft.NETCore.Platforms": "2.0.0" 1457 | } 1458 | }, 1459 | "System.Text.Encoding": { 1460 | "type": "Transitive", 1461 | "resolved": "4.3.0", 1462 | "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", 1463 | "dependencies": { 1464 | "Microsoft.NETCore.Platforms": "1.1.0", 1465 | "Microsoft.NETCore.Targets": "1.1.0", 1466 | "System.Runtime": "4.3.0" 1467 | } 1468 | }, 1469 | "System.Text.Encoding.CodePages": { 1470 | "type": "Transitive", 1471 | "resolved": "4.5.1", 1472 | "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", 1473 | "dependencies": { 1474 | "Microsoft.NETCore.Platforms": "2.1.2", 1475 | "System.Runtime.CompilerServices.Unsafe": "4.5.2" 1476 | } 1477 | }, 1478 | "System.Text.Encoding.Extensions": { 1479 | "type": "Transitive", 1480 | "resolved": "4.3.0", 1481 | "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", 1482 | "dependencies": { 1483 | "Microsoft.NETCore.Platforms": "1.1.0", 1484 | "Microsoft.NETCore.Targets": "1.1.0", 1485 | "System.Runtime": "4.3.0", 1486 | "System.Text.Encoding": "4.3.0" 1487 | } 1488 | }, 1489 | "System.Text.RegularExpressions": { 1490 | "type": "Transitive", 1491 | "resolved": "4.3.0", 1492 | "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", 1493 | "dependencies": { 1494 | "System.Runtime": "4.3.0" 1495 | } 1496 | }, 1497 | "System.Threading": { 1498 | "type": "Transitive", 1499 | "resolved": "4.3.0", 1500 | "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", 1501 | "dependencies": { 1502 | "System.Runtime": "4.3.0", 1503 | "System.Threading.Tasks": "4.3.0" 1504 | } 1505 | }, 1506 | "System.Threading.Tasks": { 1507 | "type": "Transitive", 1508 | "resolved": "4.3.0", 1509 | "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", 1510 | "dependencies": { 1511 | "Microsoft.NETCore.Platforms": "1.1.0", 1512 | "Microsoft.NETCore.Targets": "1.1.0", 1513 | "System.Runtime": "4.3.0" 1514 | } 1515 | }, 1516 | "System.Threading.Tasks.Dataflow": { 1517 | "type": "Transitive", 1518 | "resolved": "4.6.0", 1519 | "contentHash": "2hRjGu2r2jxRZ55wmcHO/WbdX+YAOz9x6FE8xqkHZgPaoFMKQZRe9dk8xTZIas8fRjxRmzawnTEWIrhlM+Un7w==", 1520 | "dependencies": { 1521 | "System.Collections": "4.0.11", 1522 | "System.Collections.Concurrent": "4.0.12", 1523 | "System.Diagnostics.Debug": "4.0.11", 1524 | "System.Diagnostics.Tracing": "4.1.0", 1525 | "System.Dynamic.Runtime": "4.0.11", 1526 | "System.Linq": "4.1.0", 1527 | "System.Resources.ResourceManager": "4.0.1", 1528 | "System.Runtime": "4.1.0", 1529 | "System.Runtime.Extensions": "4.1.0", 1530 | "System.Threading": "4.0.11", 1531 | "System.Threading.Tasks": "4.0.11" 1532 | } 1533 | }, 1534 | "System.Threading.Tasks.Extensions": { 1535 | "type": "Transitive", 1536 | "resolved": "4.5.4", 1537 | "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" 1538 | }, 1539 | "System.Threading.Thread": { 1540 | "type": "Transitive", 1541 | "resolved": "4.3.0", 1542 | "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", 1543 | "dependencies": { 1544 | "System.Runtime": "4.3.0" 1545 | } 1546 | }, 1547 | "System.Threading.ThreadPool": { 1548 | "type": "Transitive", 1549 | "resolved": "4.3.0", 1550 | "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", 1551 | "dependencies": { 1552 | "System.Runtime": "4.3.0", 1553 | "System.Runtime.Handles": "4.3.0" 1554 | } 1555 | }, 1556 | "System.Threading.Timer": { 1557 | "type": "Transitive", 1558 | "resolved": "4.3.0", 1559 | "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", 1560 | "dependencies": { 1561 | "Microsoft.NETCore.Platforms": "1.1.0", 1562 | "Microsoft.NETCore.Targets": "1.1.0", 1563 | "System.Runtime": "4.3.0" 1564 | } 1565 | }, 1566 | "System.ValueTuple": { 1567 | "type": "Transitive", 1568 | "resolved": "4.5.0", 1569 | "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" 1570 | }, 1571 | "System.Xml.ReaderWriter": { 1572 | "type": "Transitive", 1573 | "resolved": "4.3.0", 1574 | "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", 1575 | "dependencies": { 1576 | "System.Collections": "4.3.0", 1577 | "System.Diagnostics.Debug": "4.3.0", 1578 | "System.Globalization": "4.3.0", 1579 | "System.IO": "4.3.0", 1580 | "System.IO.FileSystem": "4.3.0", 1581 | "System.IO.FileSystem.Primitives": "4.3.0", 1582 | "System.Resources.ResourceManager": "4.3.0", 1583 | "System.Runtime": "4.3.0", 1584 | "System.Runtime.Extensions": "4.3.0", 1585 | "System.Runtime.InteropServices": "4.3.0", 1586 | "System.Text.Encoding": "4.3.0", 1587 | "System.Text.Encoding.Extensions": "4.3.0", 1588 | "System.Text.RegularExpressions": "4.3.0", 1589 | "System.Threading.Tasks": "4.3.0", 1590 | "System.Threading.Tasks.Extensions": "4.3.0" 1591 | } 1592 | }, 1593 | "System.Xml.XDocument": { 1594 | "type": "Transitive", 1595 | "resolved": "4.3.0", 1596 | "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", 1597 | "dependencies": { 1598 | "System.Collections": "4.3.0", 1599 | "System.Diagnostics.Debug": "4.3.0", 1600 | "System.Diagnostics.Tools": "4.3.0", 1601 | "System.Globalization": "4.3.0", 1602 | "System.IO": "4.3.0", 1603 | "System.Reflection": "4.3.0", 1604 | "System.Resources.ResourceManager": "4.3.0", 1605 | "System.Runtime": "4.3.0", 1606 | "System.Runtime.Extensions": "4.3.0", 1607 | "System.Text.Encoding": "4.3.0", 1608 | "System.Threading": "4.3.0", 1609 | "System.Xml.ReaderWriter": "4.3.0" 1610 | } 1611 | }, 1612 | "xunit.abstractions": { 1613 | "type": "Transitive", 1614 | "resolved": "2.0.3", 1615 | "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" 1616 | }, 1617 | "xunit.analyzers": { 1618 | "type": "Transitive", 1619 | "resolved": "0.10.0", 1620 | "contentHash": "4/IDFCJfIeg6bix9apmUtIMwvOsiwqdEexeO/R2D4GReIGPLIRODTpId/l4LRSrAJk9lEO3Zx1H0Zx6uohJDNg==" 1621 | }, 1622 | "xunit.assert": { 1623 | "type": "Transitive", 1624 | "resolved": "2.4.1", 1625 | "contentHash": "O/Oe0BS5RmSsM+LQOb041TzuPo5MdH2Rov+qXGS37X+KFG1Hxz7kopYklM5+1Y+tRGeXrOx5+Xne1RuqLFQoyQ==", 1626 | "dependencies": { 1627 | "NETStandard.Library": "1.6.1" 1628 | } 1629 | }, 1630 | "xunit.core": { 1631 | "type": "Transitive", 1632 | "resolved": "2.4.1", 1633 | "contentHash": "Zsj5OMU6JasNGERXZy8s72+pcheG6Q15atS5XpZXqAtULuyQiQ6XNnUsp1gyfC6WgqScqMvySiEHmHcOG6Eg0Q==", 1634 | "dependencies": { 1635 | "xunit.extensibility.core": "[2.4.1]", 1636 | "xunit.extensibility.execution": "[2.4.1]" 1637 | } 1638 | }, 1639 | "xunit.extensibility.core": { 1640 | "type": "Transitive", 1641 | "resolved": "2.4.1", 1642 | "contentHash": "yKZKm/8QNZnBnGZFD9SewkllHBiK0DThybQD/G4PiAmQjKtEZyHi6ET70QPU9KtSMJGRYS6Syk7EyR2EVDU4Kg==", 1643 | "dependencies": { 1644 | "NETStandard.Library": "1.6.1", 1645 | "xunit.abstractions": "2.0.3" 1646 | } 1647 | }, 1648 | "xunit.extensibility.execution": { 1649 | "type": "Transitive", 1650 | "resolved": "2.4.1", 1651 | "contentHash": "7e/1jqBpcb7frLkB6XDrHCGXAbKN4Rtdb88epYxCSRQuZDRW8UtTfdTEVpdTl8s4T56e07hOBVd4G0OdCxIY2A==", 1652 | "dependencies": { 1653 | "NETStandard.Library": "1.6.1", 1654 | "xunit.extensibility.core": "[2.4.1]" 1655 | } 1656 | }, 1657 | "AutoNotifyGenerator": { 1658 | "type": "Project", 1659 | "dependencies": { 1660 | "IndexRange": "1.0.0", 1661 | "Microsoft.CodeAnalysis.CSharp": "4.0.1" 1662 | } 1663 | }, 1664 | "Microsoft.CodeAnalysis.Analyzers": { 1665 | "type": "CentralTransitive", 1666 | "requested": "[3.3.3, )", 1667 | "resolved": "3.3.2", 1668 | "contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA==" 1669 | }, 1670 | "Microsoft.CodeAnalysis.CSharp": { 1671 | "type": "CentralTransitive", 1672 | "requested": "[4.0.1, )", 1673 | "resolved": "4.0.1", 1674 | "contentHash": "Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==", 1675 | "dependencies": { 1676 | "Microsoft.CodeAnalysis.Common": "[4.0.1]" 1677 | } 1678 | }, 1679 | "Microsoft.CodeAnalysis.CSharp.Workspaces": { 1680 | "type": "CentralTransitive", 1681 | "requested": "[4.0.1, )", 1682 | "resolved": "4.0.1", 1683 | "contentHash": "gcixGtpEjtoZV9SQcmSzf3OjHBACWUBKEEEjdIyn9E2gpd7dm+TiFFMrvJK6mW0VJp63z2MW6wBDiuaXDcFZdQ==", 1684 | "dependencies": { 1685 | "Humanizer.Core": "2.2.0", 1686 | "Microsoft.CodeAnalysis.CSharp": "[4.0.1]", 1687 | "Microsoft.CodeAnalysis.Common": "[4.0.1]", 1688 | "Microsoft.CodeAnalysis.Workspaces.Common": "[4.0.1]" 1689 | } 1690 | } 1691 | } 1692 | } 1693 | } -------------------------------------------------------------------------------- /version.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", 3 | "version": "1.0-alpha", 4 | "pathFilters": [ 5 | "src" 6 | ], 7 | "publicReleaseRefSpec": [ 8 | "^refs/heads/main$", 9 | "^refs/heads/release/v\\d+(?:\\.\\d+)?$" 10 | ], 11 | "cloudBuild": { 12 | "setVersionVariables": true, 13 | "buildNumber": { 14 | "enabled": false, 15 | "includeCommitId": { 16 | "when": "nonPublicReleaseOnly", 17 | "where": "buildMetadata" 18 | } 19 | } 20 | }, 21 | "release": { 22 | "branchName": "release/v{version}", 23 | "versionIncrement": "minor", 24 | "firstUnstableTag": "alpha" 25 | } 26 | } --------------------------------------------------------------------------------