[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/workflows/Build-ClangPowerTools.yml",
    "content": "# This is a basic workflow to help you get started with Actions\n\nname: Build Clang Power Tools and generate vsix with Advenced Installer\n\n# Controls when the workflow will run\non:\n  # Triggers the workflow on push or pull request events but only for the master branch\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  # This workflow contains a single job called \"build\"\n  build:\n    # The type of runner that the job will run on\n    runs-on: windows-latest\n\n    # Steps represent a sequence of tasks that will be executed as part of the job\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n      - uses: actions/checkout@v2\n        \n      - name: Add msbuild to PATH\n        uses: microsoft/setup-msbuild@v1.1\n        \n      - name: Restore dependencies\n        run: dotnet restore ClangPowerTools\\ClangPowerTools.sln\n\n      - name: Build app for release\n        run: msbuild ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.sln -t:rebuild -property:Configuration=Release\n\n  generate-aip:\n    runs-on: windows-latest\n    needs: build\n    if: github.ref == 'refs/heads/master'\n    steps:\n      - uses: actions/checkout@v2\n      - name: Add msbuild to PATH\n        uses: microsoft/setup-msbuild@v1.1\n        \n      - name: Restore dependencies\n        run: dotnet restore ClangPowerTools\\ClangPowerTools.sln\n\n      - name: Build app for release\n        run: msbuild ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.sln -t:rebuild -property:Configuration=Release\n      - name: Create ClangPowerTools.vsix- build AIP\n        uses: caphyon/advinst-github-action@v1.0\n        with:\n          advinst-license: ${{ secrets.ADVINST_LICENSE_KEY }}\n          advinst-enable-automation: 'true'\n          aip-path: ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.aip\n      - run: |\n          AdvancedInstaller.com /edit ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.aip /SetProperty Identifier=\"Caphyon.9ce239f2-d27a-432c-906c-1d55a123dbfd\"\n          AdvancedInstaller.com /edit ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.aip /SetProperty Name=\"Clang Power Tools 2022\"\n          AdvancedInstaller.com /edit ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.aip /SetPackageName ClangPowerTools2022\n\n      - name: Create ClangPowerTools2022.vsix - build AIP\n        uses: caphyon/advinst-github-action@v1.0\n        with:\n          advinst-license: ${{ secrets.ADVINST_LICENSE_KEY }}\n          advinst-enable-automation: 'true'\n          aip-path: ${{ github.workspace }}\\ClangPowerTools\\ClangPowerTools.aip\n\n     \n      - name: Archive production ClangPowerTools artifacts (cpt generated with advanced installer)\n        uses: actions/upload-artifact@v4\n        with:\n          name: VsixAI\n          path: ${{ github.workspace }}\\ClangPowerTools\\VsixAI\\ClangPowerTools.vsix\n\n      - name: Archive production ClangPowerTools 2022 artifacts (cpt 2022 generated with advanced installer)\n        uses: actions/upload-artifact@v4\n        with:\n          name: VsixAI2022\n          path: ${{ github.workspace }}\\ClangPowerTools\\VsixAI\\ClangPowerTools2022.vsix\n      \n\n\n"
  },
  {
    "path": ".github/workflows/Run-ClangPowerTools-tests.yml",
    "content": "name: Run script tests\n\n# Controls when the workflow will run\non:\n  # Triggers the workflow on push or pull request events but only for the master branch\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  # This workflow contains a single job called \"run-script-tests\"\n  run-script-tests:\n    # The type of runner that the job will run on\n    runs-on: windows-latest\n\n    # Steps represent a sequence of tasks that will be executed as part of the job\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n      - name: Check out repository code\n        uses: actions/checkout@v2\n\n      - name: Perform Pester tests from the command-line\n        shell: pwsh\n        run: Invoke-Pester"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\r\n## files generated by popular Visual Studio add-ons.\r\n\r\n# User-specific files\r\n*.suo\r\n*.user\r\n*.userosscache\r\n*.sln.docstates\r\n\r\n# Build results\r\n[Dd]ebug/\r\n[Dd]ebugPublic/\r\n[Rr]elease/\r\n[Rr]eleases/\r\nx64/\r\nx86/\r\nbuild/\r\nbld/\r\n[Bb]in/\r\n[Oo]bj/\r\n\r\n#Nuget\r\n[Pp]ackages\r\n\r\n# Visual Studio cache/options directory\r\n\r\n.vs/\r\n.DS_Store\r\nClangPowerTools/ClangPowerTools/ClangPowerToolsLib16.dll\r\nClangPowerTools/ClangPowerTools/ClangPowerToolsLib17.dll\r\nClangPowerTools/CPTReleases/ClangPowerTools2022.vsix\r\nClangPowerTools/CPTReleases/ClangPowerTools.vsix\r\nClangPowerTools/ClangPowerToolsShared/Tooling/.vscode/launch.json\r\n"
  },
  {
    "path": "ClangPowerTools/Automation/full-llvm-update-instructions.md",
    "content": "\n# Copilot recipe – Update clang-format & LLVM metadata\n\nWhen the user says something like:\n\n> Update clang-format and LLVM version to `<NEW_LLVM_VERSION>` with CPT previous release tag `<CPT_PREVIOUS_RELEASE_TAG>`\n\nyou must do **all** of the following steps from the **repo root** (`clang-power-tools`).\n\n> ⚠️ **Important:**  \n> The value of `kCptGithubLlvm` is **the Clang Power Tools GitHub release that contains the previous assets**  \n> (`#Url to assets (clang++ and clang-tidy) from previous release made by Clang Power Tools on github`).  \n> If the user did **not** provide `<CPT_PREVIOUS_RELEASE_TAG>`, you **must ask the user** for it before editing\n> `get-llvm-helper.ps1`. Do **not** guess it.\n\n---\n\n## 1. Run the PowerShell updater\n\nFrom the **repo root**, run:\n\n```powershell\n& \".\\ClangPowerTools\\Tidy_Checks_Automation\\update-clang-format.ps1\" -LlvmVersion <NEW_LLVM_VERSION>\n```\n\nExample for LLVM 21.1.6:\n\n```powershell\n& \".\\ClangPowerTools\\Tidy_Checks_Automation\\update-clang-format.ps1\" -LlvmVersion 21.1.6\n```\n\nThis downloads:\n\n```\nhttps://github.com/llvm/llvm-project/releases/download/llvmorg-<NEW_LLVM_VERSION>/LLVM-<NEW_LLVM_VERSION>-win64.exe\n```\n\nruns the installer into a temporary folder, then copies the new `clang-format.exe` to:\n\n```\nClangPowerTools/ClangPowerToolsShared/Executables/clang-format.exe\n```\n\nYou do **not** need to manually edit the EXE; just ensure this path is updated.\n\n---\n\n## 2. Update C# version lists\n\n### 2.1 File: `ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LLVMVersionsAlternate.cs`\n\nIn the `VersionAlternateUri` list, insert the new version **at the top** (as the first element), keeping the rest unchanged.\n\nPattern:\n\n```diff\npublic static List<string> VersionAlternateUri { get; } = new List<string>\n{\n+  \"<NEW_LLVM_VERSION>\",\n   \"18.1.2\",\n   \"17.0.1\",\n   \"16.0.6\",\n   // ...\n};\n```\n\n---\n\n### 2.2 File: `ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LlvmVersions.cs`\n\nIn the `Versions` list, insert the new version **at the top** (first element), keeping the rest unchanged.\n\nPattern:\n\n```diff\npublic static List<string> Versions { get; } = new List<string>\n{\n+  \"<NEW_LLVM_VERSION>\",\n   \"18.1.2\",\n   \"17.0.1\",\n   \"16.0.6\",\n   // ...\n};\n```\n\n---\n\n## 3. Update the PowerShell helper script\n\n### File: `ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/get-llvm-helper.ps1`\n\nAt the top of this file there is a comment:\n\n```powershell\n#Url to assets (clang++ and clang-tidy) from previous release made by Clang Power Tools on github\n```\n\nThis means:\n\n- `kCptGithubLlvm` must point to the **previous Clang Power Tools GitHub release** that contains the clang++/clang-tidy assets.\n- `kCptGithubLlvmVersion` is a human-readable description for the LLVM version.\n\n> 🔴 **Rule for Copilot:**  \n> If the user did **not** provide `<CPT_PREVIOUS_RELEASE_TAG>`, you must ask:  \n> *“What is the Clang Power Tools GitHub release tag that contains the previous clang++/clang-tidy assets (for kCptGithubLlvm)?”*  \n> Only after the user answers, update `kCptGithubLlvm`.\n\nOnce the user has provided `<CPT_PREVIOUS_RELEASE_TAG>`, update both variables like this:\n\n```diff\n-Set-Variable -name kCptGithubLlvm -value \"https://github.com/Caphyon/clang-power-tools/releases/download/v2023.9.0\" `\n+Set-Variable -name kCptGithubLlvm -value \"https://github.com/Caphyon/clang-power-tools/releases/download/<CPT_PREVIOUS_RELEASE_TAG>\" `\n                                   -option Constant\n-Set-Variable -name kCptGithubLlvmVersion -value \"18.1.2 (LLVM 18.1.2)\" -Option Constant\n+Set-Variable -name kCptGithubLlvmVersion -value \"<NEW_LLVM_VERSION> (LLVM <NEW_LLVM_VERSION>)\" -Option Constant\n```\n\n---\n\n## 4. Summary for Copilot\n\nWhen asked to update LLVM to `<NEW_LLVM_VERSION>`:\n\n1. **Run the update script** from the repo root:\n\n```powershell\n& \".\\ClangPowerTools\\Tidy_Checks_Automation\\update-clang-format.ps1\" -LlvmVersion <NEW_LLVM_VERSION>\n```\n\n2. **Edit** `ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LLVMVersionsAlternate.cs`:\n   - Insert `<NEW_LLVM_VERSION>` as the first element in `VersionAlternateUri`.\n\n3. **Edit** `ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LlvmVersions.cs`:\n   - Insert `<NEW_LLVM_VERSION>` as the first element in `Versions`.\n\n4. **Edit** `get-llvm-helper.ps1`:\n   - If `<CPT_PREVIOUS_RELEASE_TAG>` is **not provided**, ask the user for it.\n   - After receiving it, update:\n     - `kCptGithubLlvm` → `\"https://github.com/Caphyon/clang-power-tools/releases/download/<CPT_PREVIOUS_RELEASE_TAG>\"`\n     - `kCptGithubLlvmVersion` → `\"<NEW_LLVM_VERSION> (LLVM <NEW_LLVM_VERSION>)\"`\n\n5. After all changes, show diffs for:\n   - `LLVMVersionsAlternate.cs`\n   - `LlvmVersions.cs`\n   - `get-llvm-helper.ps1`\n   - Confirm the script replaced `clang-format.exe`.\n"
  },
  {
    "path": "ClangPowerTools/Automation/get-tidy-checks-and-format.ps1",
    "content": "param(\n    [string]$OutFile = \"input_checks.txt\",\n    [string]$Url     = \"https://clang.llvm.org/extra/clang-tidy/checks/list.html\"\n)\n\n# Make sure TLS is OK on older PowerShells\n[Net.ServicePointManager]::SecurityProtocol =\n    [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13\n\n# Download HTML\n$response = Invoke-WebRequest -Uri $Url\n$html = $response.Content\n\n# Regex:\n# <a class=\"reference internal\" ...>\n#   <span class=\"doc\">CHECK-NAME</span>\n# </a>\n$pattern = '<a[^>]*class=[\"'']reference internal[\"''][^>]*>\\s*<span[^>]*class=[\"'']doc[\"''][^>]*>([^<]+)</span>\\s*</a>'\n\n$matches = [regex]::Matches(\n    $html,\n    $pattern,\n    [System.Text.RegularExpressions.RegexOptions]::IgnoreCase\n)\n\n$checks = @()\n\nforeach ($m in $matches) {\n    $name = $m.Groups[1].Value.Trim()\n    if ([string]::IsNullOrWhiteSpace($name)) { continue }\n\n    # Names can contain letters, digits, -, _, .\n    if ($name -match '^[A-Za-z0-9_.-]+$') {\n        $checks += $name\n    }\n}\n\n# Sort & dedupe\n$checks = $checks | Sort-Object -Unique\n\n# Write to file\n$checks | Set-Content -Path $OutFile -Encoding UTF8\n\nWrite-Host \"$($checks.Count) checks written to '$OutFile'\"\n\n\n#-------------------------------------------------------------- Format here --------------------------------------------------------------------------------------------------------\n\n# Will convert bugprone-empty-catch list in new TidyCheckModel { Name = \"bugprone-empty-catch\", IsChecked = false }, and remove dublicates\n\n# Input and output file paths\n$inputFilePath = \"input_checks.txt\"\n$outputFilePath = \"output_checks.txt\"\n\n# Read checks from input file\n$checks = Get-Content $inputFilePath\n\n# Sort the checks alphabetically\n$sortedChecks = $checks | Sort-Object\n\n# Create a hashtable to store unique checks\n$uniqueChecks = @{}\n\n# Format and add each unique check to the hashtable\nforeach ($check in $sortedChecks) {\n    if (-not $uniqueChecks.ContainsKey($check)) {\n        $uniqueChecks[$check] = \"new TidyCheckModel { Name = `\"$check`\", IsChecked = false },\"\n    }\n}\n\n# Sort the unique checks alphabetically again\n$sortedUniqueChecks = $uniqueChecks.Values | Sort-Object\n\n# Write sorted unique checks to output file\n$sortedUniqueChecks | Out-File $outputFilePath\n\nWrite-Host \"Formatted unique checks written to $outputFilePath\"\n"
  },
  {
    "path": "ClangPowerTools/Automation/input_checks.txt",
    "content": "﻿abseil-cleanup-ctad\nabseil-duration-addition\nabseil-duration-comparison\nabseil-duration-conversion-cast\nabseil-duration-division\nabseil-duration-factory-float\nabseil-duration-factory-scale\nabseil-duration-subtraction\nabseil-duration-unnecessary-conversion\nabseil-faster-strsplit-delimiter\nabseil-no-internal-dependencies\nabseil-no-namespace\nabseil-redundant-strcat-calls\nabseil-str-cat-append\nabseil-string-find-startswith\nabseil-string-find-str-contains\nabseil-time-comparison\nabseil-time-subtraction\nabseil-upgrade-duration-conversions\naltera-id-dependent-backward-branch\naltera-kernel-name-restriction\naltera-single-work-item-barrier\naltera-struct-pack-align\naltera-unroll-loops\nandroid-cloexec-accept\nandroid-cloexec-accept4\nandroid-cloexec-creat\nandroid-cloexec-dup\nandroid-cloexec-epoll-create\nandroid-cloexec-epoll-create1\nandroid-cloexec-fopen\nandroid-cloexec-inotify-init\nandroid-cloexec-inotify-init1\nandroid-cloexec-memfd-create\nandroid-cloexec-open\nandroid-cloexec-pipe\nandroid-cloexec-pipe2\nandroid-cloexec-socket\nandroid-comparison-in-temp-failure-retry\nboost-use-ranges\nboost-use-to-string\nbugprone-argument-comment\nbugprone-assert-side-effect\nbugprone-assignment-in-if-condition\nbugprone-bad-signal-to-kill-thread\nbugprone-bitwise-pointer-cast\nbugprone-bool-pointer-implicit-conversion\nbugprone-branch-clone\nbugprone-capturing-this-in-member-variable\nbugprone-casting-through-void\nbugprone-chained-comparison\nbugprone-command-processor\nbugprone-compare-pointer-to-member-virtual-function\nbugprone-copy-constructor-init\nbugprone-copy-constructor-mutates-argument\nbugprone-crtp-constructor-accessibility\nbugprone-dangling-handle\nbugprone-default-operator-new-on-overaligned-type\nbugprone-derived-method-shadowing-base-method\nbugprone-dynamic-static-initializers\nbugprone-easily-swappable-parameters\nbugprone-empty-catch\nbugprone-exception-copy-constructor-throws\nbugprone-exception-escape\nbugprone-float-loop-counter\nbugprone-fold-init-type\nbugprone-forward-declaration-namespace\nbugprone-forwarding-reference-overload\nbugprone-implicit-widening-of-multiplication-result\nbugprone-inaccurate-erase\nbugprone-inc-dec-in-conditions\nbugprone-incorrect-enable-if\nbugprone-incorrect-enable-shared-from-this\nbugprone-incorrect-roundings\nbugprone-infinite-loop\nbugprone-integer-division\nbugprone-invalid-enum-default-initialization\nbugprone-lambda-function-name\nbugprone-macro-parentheses\nbugprone-macro-repeated-side-effects\nbugprone-misleading-setter-of-reference\nbugprone-misplaced-operator-in-strlen-in-alloc\nbugprone-misplaced-pointer-arithmetic-in-alloc\nbugprone-misplaced-widening-cast\nbugprone-move-forwarding-reference\nbugprone-multi-level-implicit-pointer-conversion\nbugprone-multiple-new-in-one-expression\nbugprone-multiple-statement-macro\nbugprone-narrowing-conversions\nbugprone-no-escape\nbugprone-nondeterministic-pointer-iteration-order\nbugprone-non-zero-enum-to-bool-conversion\nbugprone-not-null-terminated-result\nbugprone-optional-value-conversion\nbugprone-parent-virtual-call\nbugprone-pointer-arithmetic-on-polymorphic-object\nbugprone-posix-return\nbugprone-random-generator-seed\nbugprone-raw-memory-call-on-non-trivial-type\nbugprone-redundant-branch-condition\nbugprone-reserved-identifier\nbugprone-return-const-ref-from-parameter\nbugprone-shared-ptr-array-mismatch\nbugprone-signal-handler\nbugprone-signed-char-misuse\nbugprone-sizeof-container\nbugprone-sizeof-expression\nbugprone-spuriously-wake-up-functions\nbugprone-standalone-empty\nbugprone-std-namespace-modification\nbugprone-string-constructor\nbugprone-string-integer-assignment\nbugprone-string-literal-with-embedded-nul\nbugprone-stringview-nullptr\nbugprone-suspicious-enum-usage\nbugprone-suspicious-include\nbugprone-suspicious-memory-comparison\nbugprone-suspicious-memset-usage\nbugprone-suspicious-missing-comma\nbugprone-suspicious-realloc-usage\nbugprone-suspicious-semicolon\nbugprone-suspicious-string-compare\nbugprone-suspicious-stringview-data-usage\nbugprone-swapped-arguments\nbugprone-switch-missing-default-case\nbugprone-tagged-union-member-count\nbugprone-terminating-continue\nbugprone-throwing-static-initialization\nbugprone-throw-keyword-missing\nbugprone-too-small-loop-variable\nbugprone-unchecked-optional-access\nbugprone-unchecked-string-to-number-conversion\nbugprone-undefined-memory-manipulation\nbugprone-undelegated-constructor\nbugprone-unhandled-exception-at-new\nbugprone-unhandled-self-assignment\nbugprone-unintended-char-ostream-output\nbugprone-unique-ptr-array-mismatch\nbugprone-unsafe-functions\nbugprone-unused-local-non-trivial-variable\nbugprone-unused-raii\nbugprone-unused-return-value\nbugprone-use-after-move\nbugprone-virtual-near-miss\ncert-arr39-c\ncert-con36-c\ncert-con54-cpp\ncert-ctr56-cpp\ncert-dcl03-c\ncert-dcl16-c\ncert-dcl37-c\ncert-dcl50-cpp\ncert-dcl51-cpp\ncert-dcl54-cpp\ncert-dcl58-cpp\ncert-dcl59-cpp\ncert-env33-c\ncert-err09-cpp\ncert-err33-c\ncert-err34-c\ncert-err52-cpp\ncert-err58-cpp\ncert-err60-cpp\ncert-err61-cpp\ncert-exp42-c\ncert-fio38-c\ncert-flp30-c\ncert-flp37-c\ncert-int09-c\ncert-mem57-cpp\ncert-msc24-c\ncert-msc30-c\ncert-msc32-c\ncert-msc33-c\ncert-msc50-cpp\ncert-msc51-cpp\ncert-msc54-cpp\ncert-oop11-cpp\ncert-oop54-cpp\ncert-oop57-cpp\ncert-oop58-cpp\ncert-pos44-c\ncert-pos47-c\ncert-sig30-c\ncert-str34-c\nclang-analyzer-core.BitwiseShift\nclang-analyzer-core.CallAndMessage\nclang-analyzer-core.DivideZero\nclang-analyzer-core.NonNullParamChecker\nclang-analyzer-core.NullDereference\nclang-analyzer-core.StackAddressEscape\nclang-analyzer-core.UndefinedBinaryOperatorResult\nclang-analyzer-core.uninitialized.ArraySubscript\nclang-analyzer-core.uninitialized.Assign\nclang-analyzer-core.uninitialized.Branch\nclang-analyzer-core.uninitialized.CapturedBlockVariable\nclang-analyzer-core.uninitialized.NewArraySize\nclang-analyzer-core.uninitialized.UndefReturn\nclang-analyzer-core.VLASize\nclang-analyzer-cplusplus.ArrayDelete\nclang-analyzer-cplusplus.InnerPointer\nclang-analyzer-cplusplus.Move\nclang-analyzer-cplusplus.NewDelete\nclang-analyzer-cplusplus.NewDeleteLeaks\nclang-analyzer-cplusplus.PlacementNew\nclang-analyzer-cplusplus.SelfAssignment\nclang-analyzer-cplusplus.StringChecker\nclang-analyzer-deadcode.DeadStores\nclang-analyzer-fuchsia.HandleChecker\nclang-analyzer-nullability.NullableDereferenced\nclang-analyzer-nullability.NullablePassedToNonnull\nclang-analyzer-nullability.NullableReturnedFromNonnull\nclang-analyzer-nullability.NullPassedToNonnull\nclang-analyzer-nullability.NullReturnedFromNonnull\nclang-analyzer-optin.core.EnumCastOutOfRange\nclang-analyzer-optin.cplusplus.UninitializedObject\nclang-analyzer-optin.cplusplus.VirtualCall\nclang-analyzer-optin.mpi.MPI-Checker\nclang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker\nclang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker\nclang-analyzer-optin.performance.GCDAntipattern\nclang-analyzer-optin.performance.Padding\nclang-analyzer-optin.portability.UnixAPI\nclang-analyzer-optin.taint.TaintedAlloc\nclang-analyzer-osx.API\nclang-analyzer-osx.cocoa.AtSync\nclang-analyzer-osx.cocoa.AutoreleaseWrite\nclang-analyzer-osx.cocoa.ClassRelease\nclang-analyzer-osx.cocoa.Dealloc\nclang-analyzer-osx.cocoa.IncompatibleMethodTypes\nclang-analyzer-osx.cocoa.Loops\nclang-analyzer-osx.cocoa.MissingSuperCall\nclang-analyzer-osx.cocoa.NilArg\nclang-analyzer-osx.cocoa.NonNilReturnValue\nclang-analyzer-osx.cocoa.NSAutoreleasePool\nclang-analyzer-osx.cocoa.NSError\nclang-analyzer-osx.cocoa.ObjCGenerics\nclang-analyzer-osx.cocoa.RetainCount\nclang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak\nclang-analyzer-osx.cocoa.SelfInit\nclang-analyzer-osx.cocoa.SuperDealloc\nclang-analyzer-osx.cocoa.UnusedIvars\nclang-analyzer-osx.cocoa.VariadicMethodTypes\nclang-analyzer-osx.coreFoundation.CFError\nclang-analyzer-osx.coreFoundation.CFNumber\nclang-analyzer-osx.coreFoundation.CFRetainRelease\nclang-analyzer-osx.coreFoundation.containers.OutOfBounds\nclang-analyzer-osx.coreFoundation.containers.PointerSizedValues\nclang-analyzer-osx.NumberObjectConversion\nclang-analyzer-osx.ObjCProperty\nclang-analyzer-osx.SecKeychainAPI\nclang-analyzer-security.cert.env.InvalidPtr\nclang-analyzer-security.FloatLoopCounter\nclang-analyzer-security.insecureAPI.bcmp\nclang-analyzer-security.insecureAPI.bcopy\nclang-analyzer-security.insecureAPI.bzero\nclang-analyzer-security.insecureAPI.decodeValueOfObjCType\nclang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling\nclang-analyzer-security.insecureAPI.getpw\nclang-analyzer-security.insecureAPI.gets\nclang-analyzer-security.insecureAPI.mkstemp\nclang-analyzer-security.insecureAPI.mktemp\nclang-analyzer-security.insecureAPI.rand\nclang-analyzer-security.insecureAPI.strcpy\nclang-analyzer-security.insecureAPI.UncheckedReturn\nclang-analyzer-security.insecureAPI.vfork\nclang-analyzer-security.PutenvStackArray\nclang-analyzer-security.SetgidSetuidOrder\nclang-analyzer-unix.API\nclang-analyzer-unix.BlockInCriticalSection\nclang-analyzer-unix.cstring.BadSizeArg\nclang-analyzer-unix.cstring.NullArg\nclang-analyzer-unix.Errno\nclang-analyzer-unix.Malloc\nclang-analyzer-unix.MallocSizeof\nclang-analyzer-unix.MismatchedDeallocator\nclang-analyzer-unix.StdCLibraryFunctions\nclang-analyzer-unix.Stream\nclang-analyzer-unix.Vfork\nclang-analyzer-webkit.NoUncountedMemberChecker\nclang-analyzer-webkit.RefCntblBaseVirtualDtor\nclang-analyzer-webkit.UncountedLambdaCapturesChecker\nconcurrency-mt-unsafe\nconcurrency-thread-canceltype-asynchronous\ncppcoreguidelines-avoid-capturing-lambda-coroutines\ncppcoreguidelines-avoid-c-arrays\ncppcoreguidelines-avoid-const-or-ref-data-members\ncppcoreguidelines-avoid-do-while\ncppcoreguidelines-avoid-goto\ncppcoreguidelines-avoid-magic-numbers\ncppcoreguidelines-avoid-non-const-global-variables\ncppcoreguidelines-avoid-reference-coroutine-parameters\ncppcoreguidelines-c-copy-assignment-signature\ncppcoreguidelines-explicit-virtual-functions\ncppcoreguidelines-init-variables\ncppcoreguidelines-interfaces-global-init\ncppcoreguidelines-macro-to-enum\ncppcoreguidelines-macro-usage\ncppcoreguidelines-misleading-capture-default-by-value\ncppcoreguidelines-missing-std-forward\ncppcoreguidelines-narrowing-conversions\ncppcoreguidelines-noexcept-destructor\ncppcoreguidelines-noexcept-move-operations\ncppcoreguidelines-noexcept-swap\ncppcoreguidelines-no-malloc\ncppcoreguidelines-non-private-member-variables-in-classes\ncppcoreguidelines-no-suspend-with-lock\ncppcoreguidelines-owning-memory\ncppcoreguidelines-prefer-member-initializer\ncppcoreguidelines-pro-bounds-array-to-pointer-decay\ncppcoreguidelines-pro-bounds-avoid-unchecked-container-access\ncppcoreguidelines-pro-bounds-constant-array-index\ncppcoreguidelines-pro-bounds-pointer-arithmetic\ncppcoreguidelines-pro-type-const-cast\ncppcoreguidelines-pro-type-cstyle-cast\ncppcoreguidelines-pro-type-member-init\ncppcoreguidelines-pro-type-reinterpret-cast\ncppcoreguidelines-pro-type-static-cast-downcast\ncppcoreguidelines-pro-type-union-access\ncppcoreguidelines-pro-type-vararg\ncppcoreguidelines-rvalue-reference-param-not-moved\ncppcoreguidelines-slicing\ncppcoreguidelines-special-member-functions\ncppcoreguidelines-use-default-member-init\ncppcoreguidelines-use-enum-class\ncppcoreguidelines-virtual-class-destructor\ndarwin-avoid-spinlock\ndarwin-dispatch-once-nonstatic\nfuchsia-default-arguments-calls\nfuchsia-default-arguments-declarations\nfuchsia-header-anon-namespaces\nfuchsia-multiple-inheritance\nfuchsia-overloaded-operator\nfuchsia-statically-constructed-objects\nfuchsia-temporary-objects\nfuchsia-trailing-return\nfuchsia-virtual-inheritance\ngoogle-build-explicit-make-pair\ngoogle-build-namespaces\ngoogle-build-using-namespace\ngoogle-default-arguments\ngoogle-explicit-constructor\ngoogle-global-names-in-headers\ngoogle-objc-avoid-nsobject-new\ngoogle-objc-avoid-throwing-exception\ngoogle-objc-function-naming\ngoogle-objc-global-variable-declaration\ngoogle-readability-avoid-underscore-in-googletest-name\ngoogle-readability-braces-around-statements\ngoogle-readability-casting\ngoogle-readability-function-size\ngoogle-readability-namespace-comments\ngoogle-readability-todo\ngoogle-runtime-float\ngoogle-runtime-int\ngoogle-runtime-operator\ngoogle-upgrade-googletest-case\nhicpp-avoid-c-arrays\nhicpp-avoid-goto\nhicpp-braces-around-statements\nhicpp-deprecated-headers\nhicpp-exception-baseclass\nhicpp-explicit-conversions\nhicpp-function-size\nhicpp-ignored-remove-result\nhicpp-invalid-access-moved\nhicpp-member-init\nhicpp-move-const-arg\nhicpp-multiway-paths-covered\nhicpp-named-parameter\nhicpp-new-delete-operators\nhicpp-no-array-decay\nhicpp-no-assembler\nhicpp-noexcept-move\nhicpp-no-malloc\nhicpp-signed-bitwise\nhicpp-special-member-functions\nhicpp-static-assert\nhicpp-undelegated-constructor\nhicpp-uppercase-literal-suffix\nhicpp-use-auto\nhicpp-use-emplace\nhicpp-use-equals-default\nhicpp-use-equals-delete\nhicpp-use-noexcept\nhicpp-use-nullptr\nhicpp-use-override\nhicpp-vararg\nlinuxkernel-must-check-errs\nllvm-else-after-return\nllvm-header-guard\nllvm-include-order\nllvmlibc-callee-namespace\nllvmlibc-implementation-in-namespace\nllvmlibc-inline-function-decl\nllvmlibc-restrict-system-libc-headers\nllvm-namespace-comment\nllvm-prefer-isa-or-dyn-cast-in-conditionals\nllvm-prefer-register-over-unsigned\nllvm-prefer-static-over-anonymous-namespace\nllvm-qualified-auto\nllvm-twine-local\nllvm-use-new-mlir-op-builder\nllvm-use-ranges\nmisc-confusable-identifiers\nmisc-const-correctness\nmisc-coroutine-hostile-raii\nmisc-definitions-in-headers\nmisc-header-include-cycle\nmisc-include-cleaner\nmisc-misleading-bidirectional\nmisc-misleading-identifier\nmisc-misplaced-const\nmisc-new-delete-overloads\nmisc-non-copyable-objects\nmisc-non-private-member-variables-in-classes\nmisc-no-recursion\nmisc-override-with-different-visibility\nmisc-predictable-rand\nmisc-redundant-expression\nmisc-static-assert\nmisc-throw-by-value-catch-by-reference\nmisc-unconventional-assign-operator\nmisc-uniqueptr-reset-release\nmisc-unused-alias-decls\nmisc-unused-parameters\nmisc-unused-using-decls\nmisc-use-anonymous-namespace\nmisc-use-internal-linkage\nmodernize-avoid-bind\nmodernize-avoid-c-arrays\nmodernize-avoid-setjmp-longjmp\nmodernize-avoid-variadic-functions\nmodernize-concat-nested-namespaces\nmodernize-deprecated-headers\nmodernize-deprecated-ios-base-aliases\nmodernize-loop-convert\nmodernize-macro-to-enum\nmodernize-make-shared\nmodernize-make-unique\nmodernize-min-max-use-initializer-list\nmodernize-pass-by-value\nmodernize-raw-string-literal\nmodernize-redundant-void-arg\nmodernize-replace-auto-ptr\nmodernize-replace-disallow-copy-and-assign-macro\nmodernize-replace-random-shuffle\nmodernize-return-braced-init-list\nmodernize-shrink-to-fit\nmodernize-type-traits\nmodernize-unary-static-assert\nmodernize-use-auto\nmodernize-use-bool-literals\nmodernize-use-constraints\nmodernize-use-default-member-init\nmodernize-use-designated-initializers\nmodernize-use-emplace\nmodernize-use-equals-default\nmodernize-use-equals-delete\nmodernize-use-integer-sign-comparison\nmodernize-use-nodiscard\nmodernize-use-noexcept\nmodernize-use-nullptr\nmodernize-use-override\nmodernize-use-ranges\nmodernize-use-scoped-lock\nmodernize-use-starts-ends-with\nmodernize-use-std-format\nmodernize-use-std-numbers\nmodernize-use-std-print\nmodernize-use-trailing-return-type\nmodernize-use-transparent-functors\nmodernize-use-uncaught-exceptions\nmodernize-use-using\nmpi-buffer-deref\nmpi-type-mismatch\nobjc-assert-equals\nobjc-avoid-nserror-init\nobjc-dealloc-in-category\nobjc-forbidden-subclassing\nobjc-missing-hash\nobjc-nsdate-formatter\nobjc-nsinvocation-argument-lifetime\nobjc-property-declaration\nobjc-super-self\nopenmp-exception-escape\nopenmp-use-default-none\nperformance-avoid-endl\nperformance-enum-size\nperformance-faster-string-find\nperformance-for-range-copy\nperformance-implicit-conversion-in-loop\nperformance-inefficient-algorithm\nperformance-inefficient-string-concatenation\nperformance-inefficient-vector-operation\nperformance-move-const-arg\nperformance-move-constructor-init\nperformance-no-automatic-move\nperformance-noexcept-destructor\nperformance-noexcept-move-constructor\nperformance-noexcept-swap\nperformance-no-int-to-ptr\nperformance-trivially-destructible\nperformance-type-promotion-in-math-fn\nperformance-unnecessary-copy-initialization\nperformance-unnecessary-value-param\nportability-avoid-pragma-once\nportability-restrict-system-includes\nportability-simd-intrinsics\nportability-std-allocator-const\nportability-template-virtual-member-function\nreadability-ambiguous-smartptr-reset-call\nreadability-avoid-const-params-in-decls\nreadability-avoid-nested-conditional-operator\nreadability-avoid-return-with-void-value\nreadability-avoid-unconditional-preprocessor-if\nreadability-braces-around-statements\nreadability-const-return-type\nreadability-container-contains\nreadability-container-data-pointer\nreadability-container-size-empty\nreadability-convert-member-functions-to-static\nreadability-delete-null-pointer\nreadability-duplicate-include\nreadability-else-after-return\nreadability-enum-initial-value\nreadability-function-cognitive-complexity\nreadability-function-size\nreadability-identifier-length\nreadability-identifier-naming\nreadability-implicit-bool-conversion\nreadability-inconsistent-declaration-parameter-name\nreadability-isolate-declaration\nreadability-magic-numbers\nreadability-make-member-function-const\nreadability-math-missing-parentheses\nreadability-misleading-indentation\nreadability-misplaced-array-index\nreadability-named-parameter\nreadability-non-const-parameter\nreadability-operators-representation\nreadability-qualified-auto\nreadability-redundant-access-specifiers\nreadability-redundant-casting\nreadability-redundant-control-flow\nreadability-redundant-declaration\nreadability-redundant-function-ptr-dereference\nreadability-redundant-inline-specifier\nreadability-redundant-member-init\nreadability-redundant-parentheses\nreadability-redundant-preprocessor\nreadability-redundant-smartptr-get\nreadability-redundant-string-cstr\nreadability-redundant-string-init\nreadability-redundant-typename\nreadability-reference-to-constructed-temporary\nreadability-simplify-boolean-expr\nreadability-simplify-subscript-expr\nreadability-static-accessed-through-instance\nreadability-static-definition-in-anonymous-namespace\nreadability-string-compare\nreadability-suspicious-call-argument\nreadability-uniqueptr-delete-release\nreadability-uppercase-literal-suffix\nreadability-use-anyofallof\nreadability-use-concise-preprocessor-directives\nreadability-use-std-min-max\nzircon-temporary-objects\n"
  },
  {
    "path": "ClangPowerTools/Automation/update_clang-format.ps1",
    "content": "<#\n.SYNOPSIS\n  Download and update clang-format.exe for a given LLVM version.\n\n.DESCRIPTION\n  - Downloads the official LLVM Windows installer from GitHub releases:\n      https://github.com/llvm/llvm-project/releases/download/llvmorg-<VERSION>/LLVM-<VERSION>-win64.exe\n  - Runs the installer silently into a temporary folder.\n  - Locates clang-format.exe in the installed tree.\n  - Replaces:\n      ClangPowerTools/ClangPowerToolsShared/Executables/clang-format.exe\n\n.PARAMETER LlvmVersion\n  LLVM version, e.g. \"20.1.0\" or \"21.1.6\".\n\n.PARAMETER RepoRoot\n  (Optional) Path to the repository root.\n  Defaults to one level above the script location.\n\n.EXAMPLE\n  .\\update-clang-format.ps1 -LlvmVersion 21.1.6\n#>\n\n[CmdletBinding()]\nparam (\n    [Parameter(Mandatory = $true)]\n    [string] $LlvmVersion,\n\n    [Parameter(Mandatory = $false)]\n    [string] $RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot \"..\")).Path\n)\n\n# -------- Config --------\n\n# GitHub tag prefix\n$GithubTagPrefix = \"llvmorg\"\n\n# Asset file name pattern\n# Example: LLVM-21.1.6-win64.exe\n$AssetFileName = \"LLVM-$LlvmVersion-win64.exe\"\n\n# Target clang-format path (relative to repo root)\n$TargetRelativePath = \"ClangPowerTools\\ClangPowerToolsShared\\Executables\\clang-format.exe\"\n\n# -------- Derived paths & URLs --------\n\n$tag = \"$GithubTagPrefix-$LlvmVersion\"\n$baseDownloadUrl = \"https://github.com/llvm/llvm-project/releases/download/$tag\"\n$downloadUrl = \"$baseDownloadUrl/$AssetFileName\"\n\n$targetPath = Join-Path $RepoRoot $TargetRelativePath\n\n# Temp folder for download & installation\n$tempRoot = Join-Path ([System.IO.Path]::GetTempPath()) \"cpt-update-clang-format-$($LlvmVersion.Replace('.','-'))\"\n$null = New-Item -ItemType Directory -Path $tempRoot -Force\n\n$downloadPath = Join-Path $tempRoot $AssetFileName\n$installDir   = Join-Path $tempRoot \"install\"\n\nWrite-Host \"LLVM version      : $LlvmVersion\"\nWrite-Host \"GitHub tag        : $tag\"\nWrite-Host \"Download URL      : $downloadUrl\"\nWrite-Host \"Repository root   : $RepoRoot\"\nWrite-Host \"Target exe path   : $targetPath\"\nWrite-Host \"\"\n\ntry {\n    # -------- Download installer --------\n    Write-Host \"Downloading LLVM installer...\"\n    Invoke-WebRequest -Uri $downloadUrl -OutFile $downloadPath -UseBasicParsing\n\n    if (-not (Test-Path $downloadPath)) {\n        throw \"Download failed: file not found at $downloadPath\"\n    }\n\n    # -------- Run installer silently into temp folder --------\n    Write-Host \"Running installer silently into: $installDir\"\n    $null = New-Item -ItemType Directory -Path $installDir -Force\n\n    # LLVM Windows installers are NSIS-based, which typically support:\n    #   /S              = silent\n    #   /D=<path>       = install directory (no quotes, path must be last arg)\n    #\n    # We pass arguments as a single string where /D= is last.\n    $installArgs = \"/S /D=$installDir\"\n\n    $process = Start-Process -FilePath $downloadPath `\n                             -ArgumentList $installArgs `\n                             -Wait `\n                             -PassThru\n\n    if ($process.ExitCode -ne 0) {\n        throw \"Installer exited with code $($process.ExitCode)\"\n    }\n\n    # -------- Locate clang-format.exe --------\n    Write-Host \"Searching for clang-format.exe in installed files...\"\n    $clangFormat = Get-ChildItem -Path $installDir -Recurse -Filter \"clang-format.exe\" |\n                   Select-Object -First 1\n\n    if (-not $clangFormat) {\n        throw \"clang-format.exe not found under $installDir\"\n    }\n\n    Write-Host \"Found clang-format.exe at: $($clangFormat.FullName)\"\n\n    # -------- Replace target file --------\n    $targetDir = Split-Path $targetPath -Parent\n    if (-not (Test-Path $targetDir)) {\n        Write-Host \"Creating target directory: $targetDir\"\n        $null = New-Item -ItemType Directory -Path $targetDir -Force\n    }\n\n    Write-Host \"Copying new clang-format.exe to target...\"\n    Copy-Item -Path $clangFormat.FullName -Destination $targetPath -Force\n\n    Write-Host \"\"\n    Write-Host \" clang-format.exe updated successfully.\"\n    Write-Host \"   Version: $LlvmVersion\"\n    Write-Host \"   Location: $targetPath\"\n}\ncatch {\n    Write-Error \" Failed to update clang-format.exe: $_\"\n}\nfinally {\n    if (Test-Path $tempRoot) {\n        Write-Host \"Cleaning up temp folder: $tempRoot\"\n        Remove-Item -Path $tempRoot -Recurse -Force -ErrorAction SilentlyContinue\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/CPTReleases/IncrementRevisionNumber.ps1",
    "content": "param([Parameter(Mandatory=$true, HelpMessage=\"Increments revision number in manifest file\")][string] $loc)\n\n#Get version from xml and increment revision value\n$filepath = \"$loc\\..\\ClangPowerTools\\source.extension.vsixmanifest\"\n$filepathToAip = \"$loc\\..\\ClangPowerTools.aip\"\nif((Test-Path $filepath) -and (Test-Path $filepathToAip))\n{\n    #Get xml data from manifest file\n    [xml] $data = Get-Content $filepath\n    $currentVersion = [Version]::new($data.PackageManifest.Metadata.Identity.Version.ToString())\n    \n    #Get xml data from aip file\n    [xml] $aipData = Get-Content $filepathToAip\n\t\t\n    #Replace old version with new one in manifest\n    $data.PackageManifest.Metadata.Identity.Version = $currentVersion.ToString()\n    $data.Save(\"$filepath\")\n\n    #Replace old version with new one in aip file\n    $aipData.DOCUMENT.COMPONENT[0].ROW[7].Value = $currentVersion.ToString()\n    $aipData.Save(\"$filepathToAip\")\n    $resultData = Get-Content $filepathToAip -Encoding utf8\n    $result = $resultData -replace \" />\", \"/>\"\n    # $result > $filepathToAip\n    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)\n    [System.IO.File]::WriteAllLines($filepathToAip, $result, $Utf8NoBomEncoding)\n}\nelse \n{\n    Write-Error \"Invalid manifest file path\"    \n}\n\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/ClangPowerTools.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"17.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <RuntimeIdentifiers>win</RuntimeIdentifiers>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SignAssembly>true</SignAssembly>\n  </PropertyGroup>\n  <PropertyGroup>\n    <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <ProjectGuid>{51237463-9F4D-44DE-8BC0-587384B9E8B8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClangPowerTools</RootNamespace>\n    <AssemblyName>ClangPowerTools</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <GeneratePkgDefFile>true</GeneratePkgDefFile>\n    <UseCodebase>true</UseCodebase>\n    <IncludeAssemblyInVSIXContainer>true</IncludeAssemblyInVSIXContainer>\n    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>\n    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>\n    <CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>\n    <CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>\n    <StartAction>Program</StartAction>\n    <StartProgram Condition=\"'$(DevEnvDir)' != ''\">$(DevEnvDir)devenv.exe</StartProgram>\n    <StartArguments>/rootsuffix Exp</StartArguments>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\ToolWindows\\TidyToolWindow.cs\">\n      <Link>MVVM\\Views\\TidyToolWindow.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\ToolWindows\\FindToolWindow.cs\">\n      <Link>MVVM\\Views\\FindToolWindow.cs</Link>\n    </Compile>\n    <Compile Include=\"ClangPowerToolsPackage.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Properties\\Resource.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resource.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\[CPT]OptimizeIncludes.png\">\n      <Link>Resources\\[CPT]OptimizeIncludes.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Pinned.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Pinned.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]UnPinned.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]UnPinned.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CTP]Pinned_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CTP]Pinned_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CTP]UnPinned_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CTP]UnPinned_dark.png</Link>\n    </Resource>\n    <Content Include=\"Resources\\[CPT]Find.png\" />\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff2.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff2.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh-Tidy.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh-Tidy.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove_disabled.png</Link>\n    </Resource>\n    <Content Include=\"ClangPowerToolsLib16.dll\">\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"ClangPowerToolsLib17.dll\">\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsBackground.png\">\n      <Link>Resources\\SettingsBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AccountAvatarIcon.png\">\n      <Link>Resources\\AccountAvatarIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AccountIcon.png\">\n      <Link>Resources\\AccountIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AddInput.png\">\n      <Link>Resources\\AddInput.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\BannerInfo.png\">\n      <Link>Resources\\BannerInfo.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\BannersError.png\">\n      <Link>Resources\\BannersError.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\bannerWarning.png\">\n      <Link>Resources\\bannerWarning.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\Browse.png\">\n      <Link>Resources\\Browse.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangFormatIcon.png\">\n      <Link>Resources\\ClangFormatIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangPowerToolsIco.ico\">\n      <Link>Resources\\ClangPowerToolsIco.ico</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangSplitBackground.png\">\n      <Link>Resources\\ClangSplitBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CleanSearchIcon.PNG\">\n      <Link>Resources\\CleanSearchIcon.PNG</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CloudIcon.png\">\n      <Link>Resources\\CloudIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CodeInputIcon.png\">\n      <Link>Resources\\CodeInputIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CompileIcon.png\">\n      <Link>Resources\\CompileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CPTLogo.png\">\n      <Link>Resources\\CPTLogo.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Executables\\clang-format.exe\">\n      <Link>Executables\\clang-format.exe</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <VSIXSubPath>.</VSIXSubPath>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Executables\\Clang Format Editor.msi\">\n      <Link>Executables\\Clang Format Editor.msi</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <VSIXSubPath>.</VSIXSubPath>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\CPTLogoManageExtensionVS.png\">\n      <Link>Resources\\CPTLogoManageExtensionVS.png</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\DetectOnFileIcon.png\">\n      <Link>Resources\\DetectOnFileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\EmptyIcon.png\">\n      <Link>Resources\\EmptyIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ErrorIcon.png\">\n      <Link>Resources\\ErrorIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\FeedbackIcon.png\">\n      <Link>Resources\\FeedbackIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\FileIcon.png\">\n      <Link>Resources\\FileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\GenerateClangFormatFile.png\">\n      <Link>Resources\\GenerateClangFormatFile.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\GitHubMark.png\">\n      <Link>Resources\\GitHubMark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconCommercial.png\">\n      <Link>Resources\\iconCommercial.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconFreeTrial.png\">\n      <Link>Resources\\iconFreeTrial.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconPersonal.png\">\n      <Link>Resources\\iconPersonal.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\IgnoreIcon.png\">\n      <Link>Resources\\IgnoreIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\InfoIcon.png\">\n      <Link>Resources\\InfoIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\JsonCompilationDatabase.png\">\n      <Link>Resources\\JsonCompilationDatabase.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\LICENSE.txt\">\n      <Link>Resources\\LICENSE.txt</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\LoginBackground.png\">\n      <Link>Resources\\LoginBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\LogoutIcon.png\">\n      <Link>Resources\\LogoutIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\PreviewWhiteIcon.png\">\n      <Link>Resources\\PreviewWhiteIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ProjectFilesIcon.png\">\n      <Link>Resources\\ProjectFilesIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ReleaseNotesBackground.png\">\n      <Link>Resources\\ReleaseNotesBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\RemoveInputHover.png\">\n      <Link>Resources\\RemoveInputHover.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\RemoveInputIdle.png\">\n      <Link>Resources\\RemoveInputIdle.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ResetIcon.png\">\n      <Link>Resources\\ResetIcon.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\RunPowerShellCommandPackage.ico\">\n      <Link>Resources\\RunPowerShellCommandPackage.ico</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SearchIcon.PNG\">\n      <Link>Resources\\SearchIcon.PNG</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsIcon.png\">\n      <Link>Resources\\SettingsIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsLLVM.png\">\n      <Link>Resources\\SettingsLLVM.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\StopCommandIcon.png\">\n      <Link>Resources\\StopCommandIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\StorageIcon.png\">\n      <Link>Resources\\StorageIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyIcon.png\">\n      <Link>Resources\\TidyIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\WarningIcon.png\">\n      <Link>Resources\\WarningIcon.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\clang-build.ps1\">\n      <Link>Tooling\\v1\\clang-build.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm-helper.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-llvm-helper.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-llvm.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-header-references.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-header-references.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\io.ps1\">\n      <Link>Tooling\\v1\\psClang\\io.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\itemdefinition-context.ps1\">\n      <Link>Tooling\\v1\\psClang\\itemdefinition-context.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\jsondb-export.ps1\">\n      <Link>Tooling\\v1\\psClang\\jsondb-export.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-expression-eval.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-expression-eval.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-data.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-data.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-load.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-load.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\visualstudio-detection.ps1\">\n      <Link>Tooling\\v1\\psClang\\visualstudio-detection.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psclang\\msbuild-project-cache-repository.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-cache-repository.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <None Include=\"Key.snk\" />\n    <None Include=\"source.extension.vsixmanifest\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Windows\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"WindowsBase\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" Version=\"15.0.1\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Shell.Framework\" Version=\"15.9.28307\" />\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.3.2094\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"System.ComponentModel.Annotations\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Management\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <VSCTCompile Include=\"ClangPowerTools.vsct\">\n      <ResourceName>Menus.ctmenu</ResourceName>\n      <SubType>Designer</SubType>\n    </VSCTCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Properties\\Resource.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"VSPackage.resx\">\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\AppResources.xaml\">\n      <Link>MVVM\\Views\\Styles\\AppResources.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\HyperlinkStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\HyperlinkStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\ImageResources.xaml\">\n      <Link>MVVM\\Views\\Styles\\ImageResources.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\SettingsButtonStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\SettingsButtonStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\ToggleStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\ToggleStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\YellowButtonStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\YellowButtonStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PreBuildEvent>powershell.exe -executionPolicy Bypass -WindowStyle Hidden -file \"$(SolutionDir)CPTReleases\\IncrementRevisionNumber.ps1\" -loc \"$(SolutionDir)CPTReleases\"</PreBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/ClangPowerTools.csproj.bak",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"17.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <RuntimeIdentifiers>win</RuntimeIdentifiers>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SignAssembly>true</SignAssembly>\n  </PropertyGroup>\n  <PropertyGroup>\n    <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <ProjectGuid>{51237463-9F4D-44DE-8BC0-587384B9E8B8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClangPowerTools</RootNamespace>\n    <AssemblyName>ClangPowerTools</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <GeneratePkgDefFile>true</GeneratePkgDefFile>\n    <UseCodebase>true</UseCodebase>\n    <IncludeAssemblyInVSIXContainer>true</IncludeAssemblyInVSIXContainer>\n    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>\n    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>\n    <CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>\n    <CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>\n    <StartAction>Program</StartAction>\n    <StartProgram Condition=\"'$(DevEnvDir)' != ''\">$(DevEnvDir)devenv.exe</StartProgram>\n    <StartArguments>/rootsuffix Exp</StartArguments>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\ToolWindows\\TidyToolWindow.cs\">\n      <Link>MVVM\\Views\\TidyToolWindow.cs</Link>\n    </Compile>\n    <Compile Include=\"ClangPowerToolsPackage.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Properties\\Resource.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resource.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Resources\\[CPT]GenerateDocumentation.png\" />\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff2.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff2.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Diff_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Diff_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Fix_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Fix_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh-Tidy.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh-Tidy.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Refresh_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Refresh_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]RemoveFix_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]RemoveFix_disabled.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove_dark.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove_dark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyToolWindow\\[CPT]Remove_disabled.png\">\n      <Link>Resources\\TidyToolWindow\\[CPT]Remove_disabled.png</Link>\n    </Resource>\n    <Content Include=\"ClangPowerToolsLib16.dll\">\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"ClangPowerToolsLib17.dll\">\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsBackground.png\">\n      <Link>Resources\\SettingsBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AccountAvatarIcon.png\">\n      <Link>Resources\\AccountAvatarIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AccountIcon.png\">\n      <Link>Resources\\AccountIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\AddInput.png\">\n      <Link>Resources\\AddInput.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\BannerInfo.png\">\n      <Link>Resources\\BannerInfo.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\BannersError.png\">\n      <Link>Resources\\BannersError.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\bannerWarning.png\">\n      <Link>Resources\\bannerWarning.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\Browse.png\">\n      <Link>Resources\\Browse.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangFormatIcon.png\">\n      <Link>Resources\\ClangFormatIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangPowerToolsIco.ico\">\n      <Link>Resources\\ClangPowerToolsIco.ico</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ClangSplitBackground.png\">\n      <Link>Resources\\ClangSplitBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CleanSearchIcon.PNG\">\n      <Link>Resources\\CleanSearchIcon.PNG</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CloudIcon.png\">\n      <Link>Resources\\CloudIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CodeInputIcon.png\">\n      <Link>Resources\\CodeInputIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CompileIcon.png\">\n      <Link>Resources\\CompileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\CPTLogo.png\">\n      <Link>Resources\\CPTLogo.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Executables\\clang-format.exe\">\n      <Link>Executables\\clang-format.exe</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <VSIXSubPath>.</VSIXSubPath>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Executables\\ClangFormatEditor.exe\">\n      <Link>Executables\\ClangFormatEditor.exe</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <VSIXSubPath>.</VSIXSubPath>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\CPTLogoManageExtensionVS.png\">\n      <Link>Resources\\CPTLogoManageExtensionVS.png</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\DetectOnFileIcon.png\">\n      <Link>Resources\\DetectOnFileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\EmptyIcon.png\">\n      <Link>Resources\\EmptyIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ErrorIcon.png\">\n      <Link>Resources\\ErrorIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\FeedbackIcon.png\">\n      <Link>Resources\\FeedbackIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\FileIcon.png\">\n      <Link>Resources\\FileIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\GenerateClangFormatFile.png\">\n      <Link>Resources\\GenerateClangFormatFile.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\GitHubMark.png\">\n      <Link>Resources\\GitHubMark.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconCommercial.png\">\n      <Link>Resources\\iconCommercial.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconFreeTrial.png\">\n      <Link>Resources\\iconFreeTrial.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\iconPersonal.png\">\n      <Link>Resources\\iconPersonal.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\IgnoreIcon.png\">\n      <Link>Resources\\IgnoreIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\InfoIcon.png\">\n      <Link>Resources\\InfoIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\JsonCompilationDatabase.png\">\n      <Link>Resources\\JsonCompilationDatabase.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\LICENSE.txt\">\n      <Link>Resources\\LICENSE.txt</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\LoginBackground.png\">\n      <Link>Resources\\LoginBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\LogoutIcon.png\">\n      <Link>Resources\\LogoutIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\PreviewWhiteIcon.png\">\n      <Link>Resources\\PreviewWhiteIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ProjectFilesIcon.png\">\n      <Link>Resources\\ProjectFilesIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ReleaseNotesBackground.png\">\n      <Link>Resources\\ReleaseNotesBackground.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\RemoveInputHover.png\">\n      <Link>Resources\\RemoveInputHover.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\RemoveInputIdle.png\">\n      <Link>Resources\\RemoveInputIdle.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\ResetIcon.png\">\n      <Link>Resources\\ResetIcon.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Resources\\RunPowerShellCommandPackage.ico\">\n      <Link>Resources\\RunPowerShellCommandPackage.ico</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SearchIcon.PNG\">\n      <Link>Resources\\SearchIcon.PNG</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsIcon.png\">\n      <Link>Resources\\SettingsIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\SettingsLLVM.png\">\n      <Link>Resources\\SettingsLLVM.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\StopCommandIcon.png\">\n      <Link>Resources\\StopCommandIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\StorageIcon.png\">\n      <Link>Resources\\StorageIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TeamIcon.png\">\n      <Link>Resources\\TeamIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\TidyIcon.png\">\n      <Link>Resources\\TidyIcon.png</Link>\n    </Resource>\n    <Resource Include=\"..\\ClangPowerToolsShared\\Resources\\WarningIcon.png\">\n      <Link>Resources\\WarningIcon.png</Link>\n    </Resource>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\clang-build.ps1\">\n      <Link>Tooling\\v1\\clang-build.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm-helper.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-llvm-helper.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-llvm.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-header-references.ps1\">\n      <Link>Tooling\\v1\\psClang\\get-header-references.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\io.ps1\">\n      <Link>Tooling\\v1\\psClang\\io.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\itemdefinition-context.ps1\">\n      <Link>Tooling\\v1\\psClang\\itemdefinition-context.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\jsondb-export.ps1\">\n      <Link>Tooling\\v1\\psClang\\jsondb-export.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-expression-eval.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-expression-eval.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-data.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-data.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-load.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-load.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psClang\\visualstudio-detection.ps1\">\n      <Link>Tooling\\v1\\psClang\\visualstudio-detection.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"..\\ClangPowerToolsShared\\Tooling\\v1\\psclang\\msbuild-project-cache-repository.ps1\">\n      <Link>Tooling\\v1\\psClang\\msbuild-project-cache-repository.ps1</Link>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <None Include=\"Key.snk\" />\n    <None Include=\"source.extension.vsixmanifest\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Windows\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"WindowsBase\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" Version=\"15.0.1\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Shell.Framework\" Version=\"15.9.28307\" />\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.0.3155-preview3\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"System.ComponentModel.Annotations\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Management\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <VSCTCompile Include=\"ClangPowerTools.vsct\">\n      <ResourceName>Menus.ctmenu</ResourceName>\n      <SubType>Designer</SubType>\n    </VSCTCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Properties\\Resource.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"VSPackage.resx\">\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\AppResources.xaml\">\n      <Link>MVVM\\Views\\Styles\\AppResources.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\HyperlinkStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\HyperlinkStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\ImageResources.xaml\">\n      <Link>MVVM\\Views\\Styles\\ImageResources.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\SettingsButtonStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\SettingsButtonStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\ToggleStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\ToggleStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"..\\ClangPowerToolsShared\\MVVM\\Views\\Styles\\YellowButtonStyle.xaml\">\n      <Link>MVVM\\Views\\Styles\\YellowButtonStyle.xaml</Link>\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PreBuildEvent>powershell.exe -executionPolicy Bypass -WindowStyle Hidden -file \"$(SolutionDir)CPTReleases\\IncrementRevisionNumber.ps1\" -loc \"$(SolutionDir)CPTReleases\"</PreBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/ClangPowerTools.vsct",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CommandTable xmlns=\"http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n\n\t<Extern href=\"stdidcmd.h\" />\n\t<Extern href=\"vsshlids.h\" />\n\t<Commands package=\"guidClangPowerToolsPackage\">\n\n\t\t<Menus>\n\t\t\t<!--Context menu-->\n\t\t\t<Menu guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Submenu\" priority=\"0x0000\" type=\"Menu\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" />\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Clang Power Tools</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Menu>\n\n\t\t\t<!--Toolbar menu-->\n\t\t\t<Menu guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Toolbar\" type=\"Toolbar\">\n\t\t\t\t<CommandFlag>DefaultDocked</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Clang Power Tools</ButtonText>\n\t\t\t\t\t<CommandName>Clang Power Tools</CommandName>\n\t\t\t\t</Strings>\n\t\t\t</Menu>\n\n\t\t\t<!--Tidy Drop-Down Menu-->\n\t\t\t<Menu guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownMenu\" type=\"MenuController\" priority=\"0x0001\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<CommandFlag>TextChanges</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Clang Tidy</ButtonText>\n\t\t\t\t\t<CommandName>Clang Power Tools</CommandName>\n\t\t\t\t</Strings>\n\t\t\t</Menu>\n\n      <!--Documentation Drop-Down Menu-->\n      <Menu guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenu\" type=\"MenuController\" priority=\"0x0102\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForJsonDatabase\" />\n        <CommandFlag>DefaultDocked</CommandFlag>\n        <Strings>\n          <ButtonText>Generate Documentation</ButtonText>\n          <CommandName>Generate Documentation</CommandName>\n        </Strings>\n      </Menu>\n\t\t</Menus>\n\n\n\t\t<!-- Goups declarations -->\n\t\t<!-- All the command buttons must be placed inside of a group -->\n\t\t<Groups>\n\n\t\t\t<!-- Submenus groups -->\n\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0x0000\" />\n\n      <Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"FindToolWindowGroup\" priority=\"0x0600\">\n        <Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_MENU_VIEW\" />\n      </Group>\n\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" priority=\"0x0000\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Toolbar\" />\n\t\t\t</Group>\n      \n      <Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenuGroup\" priority=\"0x0000\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenu\" />\n      </Group>\n\n\t\t\t<!-- Context Menu groups-->\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" priority=\"0x0000\" />\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForIgnore\" priority=\"0x0002\" />\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForJsonDatabase\" priority=\"0x0003\" />\n\t\t\t<Group guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSettings\" priority=\"0x0004\" />\n\n\t\t</Groups>\n\n\n\t\t<!-- Commands declaration -->\n\t\t<!-- Each button coresponds to a specific custom command from VS Extension -->\n\t\t<Buttons>\n\n\t\t\t<!-- Context Menu buttons -->\n\n\n\t\t\t<!-- Clang Compile Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"CompileId\" priority=\"0x0000\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n\t\t\t\t<Icon guid=\"guidImageCompile\" id=\"Compile\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Compile</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!--Clang Tidy button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyId\" priority=\"0x0001\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n\t\t\t\t<Icon guid=\"guidImageTidy\" id=\"Tidy\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<CommandFlag>TextChanges</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Tidy</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!-- Clang Tidy-Fix context menu button  -->\n\t\t\t<!--\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyFixId\" priority=\"0x0003\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n        <Icon guid=\"guidImageEmpty\" id=\"Empty\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Tidy-Fix</ButtonText>\n        </Strings>\n      </Button>-->\n\n\t\t\t<!-- Clang Format Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ClangFormatId\" priority=\"0x0004\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n\t\t\t\t<Icon guid=\"guidImageFormat\" id=\"Format\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Format</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n      <!-- Clang Find Context Menu button -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"FindId\" priority=\"0x0004\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n        <Icon guid=\"guidImageFind\" id=\"Find\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Find</ButtonText>\n        </Strings>\n      </Button>\n\n      <!-- Clang Optimize Includes Context Menu button -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"OptimizeIncludesId\" priority=\"0x0005\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n        <Icon guid=\"guidImageOptimizeIncludes\" id=\"OptimizeIncludes\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Optimize Includes (BETA)</ButtonText>\n        </Strings>\n      </Button>\n\n\t\t\t<!-- Stop Clang execution Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"StopClangId\" priority=\"0x0006\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" />\n\t\t\t\t<Icon guid=\"guidImageStopClang\" id=\"StopClang\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Stop</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!-- Ignore file for clang compile Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"IgnoreCompileId\" priority=\"0x0007\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForIgnore\" />\n\t\t\t\t<Icon guid=\"guidImageIgnoreFormat\" id=\"IgnoreFormat\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Ignore at Compile</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!-- Ignore file for clang format Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"IgnoreFormatId\" priority=\"0x0008\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForIgnore\" />\n\t\t\t\t<Icon guid=\"guidImageEmpty\" id=\"Empty\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Ignore at Format</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n      \n      <!-- Find Command from view menu -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"FindToolWindowId\" priority=\"0x0100\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"FindToolWindowGroup\" />\n        <Icon guid=\"guidImageFind\" id=\"Find\" />\n        <CommandFlag>DynamicVisibility</CommandFlag>\n        <Strings>\n          <ButtonText>Find Tool Window - Clang Power Tools</ButtonText>\n        </Strings>\n      </Button>\n\n\t\t\t<!-- Export JSON Compilation Database Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"JsonCompilationDatabaseId\" priority=\"0x0008\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForJsonDatabase\" />\n\t\t\t\t<Icon guid=\"guidImageJsonCompilationDb\" id=\"JsonCompilationDb\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Export Compilation Database</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n      <!-- Generate documentation yaml Context Menu button -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DocumentationYamlId\" priority=\"0x0000\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenuGroup\" />\n        <Icon guid=\"guidImageDocumentation\" id=\"Documentation\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Yaml</ButtonText>\n        </Strings>\n      </Button>\n\n      <!-- Generate documentation html Context Menu button -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DocumentationHtmlId\" priority=\"0x0001\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenuGroup\" />\n        <Icon guid=\"guidImageDocumentation\" id=\"Documentation\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Html</ButtonText>\n        </Strings>\n      </Button>\n\n\n      <!-- Generate documentation md Context Menu button -->\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DocumentationMdId\" priority=\"0x0002\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DromDownDocumentationMenuGroup\" />\n        <Icon guid=\"guidImageDocumentation\" id=\"Documentation\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Markdown</ButtonText>\n        </Strings>\n      </Button>\n      \n\n\t\t\t<!-- Clang Settings Context Menu button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"SettingsId\" priority=\"0x000A\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSettings\" />\n\t\t\t\t<Icon guid=\"guidImageSettings\" id=\"Settings\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Settings</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\n\t\t\t<!-- Toolbar Buttons -->\n\n\t\t\t<!-- Clang Compile toolbar button -->\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"CompileToolbarId\" priority=\"0x0000\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<Icon guid=\"guidImageCompile\" id=\"Compile\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Compile</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!-- Clang Tidy & Clang Tidy Fix Drop Down submenu in toolbar-->\n\n\t\t\t<!-- Clang Tidy-Fix toolbar button  -->\n\t\t\t<!--\n      <Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyFixToolbarId\" priority=\"0x0003\" type=\"Button\">\n        <Icon guid=\"guidImageTidy\" id=\"Tidy\" />\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <ButtonText>Tidy-Fix</ButtonText>\n        </Strings>\n      </Button>-->\n\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyToolbarId\" priority=\"0x0001\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<Icon guid=\"guidImageTidy\" id=\"Tidy\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<CommandFlag>TextChanges</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Tidy</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<!--<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyFixToolbarId\" priority=\"0x0003\" type=\"Button\">\n        <Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"DropDownToolbarMenuGroup\" />\n        <Strings>\n          <ButtonText>Tidy-Fix</ButtonText>\n        </Strings>\n      </Button>-->\n\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ClangFormatToolbarId\" priority=\"0x0003\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<Icon guid=\"guidImageFormat\" id=\"Format\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Format</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"StopClangId\" priority=\"0x0004\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Stop</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t\t<Button guid=\"guidClangPowerToolsPackageCmdSet\" id=\"SettingsId\" priority=\"0x0006\" type=\"Button\">\n\t\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ToolbarGroup\" />\n\t\t\t\t<CommandFlag>DefaultDisabled</CommandFlag>\n\t\t\t\t<Strings>\n\t\t\t\t\t<ButtonText>Settings</ButtonText>\n\t\t\t\t</Strings>\n\t\t\t</Button>\n\n\t\t</Buttons>\n\n\t\t<!--Declare all the image resources -->\n\t\t<Bitmaps>\n\t\t\t<Bitmap guid=\"guidImages\" href=\"..\\ClangPowerToolsShared\\Resources\\CPTLogo.png\" usedList=\"bmpPic1\" />\n\t\t\t<Bitmap guid=\"guidImageTidy\" href=\"..\\ClangPowerToolsShared\\Resources\\TidyIcon.png\" usedList=\"Tidy\" />\n\t\t\t<Bitmap guid=\"guidImageCompile\" href=\"..\\ClangPowerToolsShared\\Resources\\CompileIcon.png\" usedList=\"Compile\" />\n\t\t\t<Bitmap guid=\"guidImageFormat\" href=\"..\\ClangPowerToolsShared\\Resources\\ClangFormatIcon.png\" usedList=\"Format\" />\n\t\t\t<Bitmap guid=\"guidImageFind\" href=\"..\\ClangPowerToolsShared\\Resources\\[CPT]Find.png\" usedList=\"Find\" />\n\t\t\t<Bitmap guid=\"guidImageOptimizeIncludes\" href=\"..\\ClangPowerToolsShared\\Resources\\[CPT]OptimizeIncludes.png\" usedList=\"OptimizeIncludes\" />\n\t\t\t<Bitmap guid=\"guidImageStopClang\" href=\"..\\ClangPowerToolsShared\\Resources\\StopCommandIcon.png\" usedList=\"StopClang\" />\n\t\t\t<Bitmap guid=\"guidImageSettings\" href=\"..\\ClangPowerToolsShared\\Resources\\SettingsIcon.png\" usedList=\"Settings\" />\n\t\t\t<Bitmap guid=\"guidImageIgnoreFormat\" href=\"..\\ClangPowerToolsShared\\Resources\\IgnoreIcon.png\" usedList=\"IgnoreFormat\" />\n\t\t\t<Bitmap guid=\"guidImageEmpty\" href=\"..\\ClangPowerToolsShared\\Resources\\EmptyIcon.png\" usedList=\"Empty\" />\n\t\t\t<Bitmap guid=\"guidImageJsonCompilationDb\" href=\"..\\ClangPowerToolsShared\\Resources\\JsonCompilationDatabase.png\" usedList=\"JsonCompilationDb\" />\n\t\t\t<Bitmap guid=\"guidImageDocumentation\" href=\"..\\ClangPowerToolsShared\\Resources\\[CPT]GenerateDocumentation.png\" usedList=\"Documentation\" />\n\t\t</Bitmaps>\n\n\t</Commands>\n\n\t<!-- Shortcuts for commands-->\n\t<KeyBindings>\n\t\t<KeyBinding guid=\"guidClangPowerToolsPackageCmdSet\" id=\"CompileToolbarId\" editor=\"guidVSStd97\"\n                key1=\"U\" mod1=\"ALT\" />\n\n\t\t<KeyBinding guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyToolbarId\" editor=\"guidVSStd97\"\n                    key1=\"Y\" mod1=\"ALT\" />\n\n\t\t<!--<KeyBinding guid=\"guidClangPowerToolsPackageCmdSet\" id=\"TidyFixToolbarId\" editor=\"guidVSStd97\"\n                key1=\"X\" mod1=\"ALT\" />-->\n\n\t\t<KeyBinding guid=\"guidClangPowerToolsPackageCmdSet\" id=\"ClangFormatToolbarId\" editor=\"guidVSStd97\"\n                key1=\"M\" mod1=\"ALT\" />\n\n\t\t<KeyBinding guid=\"guidClangPowerToolsPackageCmdSet\" id=\"StopClangId\" editor=\"guidVSStd97\"\n                key1=\"O\" mod1=\"ALT\" />\n\t</KeyBindings>\n\n\t<!-- Placement for commands. The parent of a command is always a group, never a menu, context menu or toolbar.-->\n\n\t<CommandPlacements>\n\n\t\t<!-- Add the Clang Power Tools submenu(the subpenu contains all the commands) \n      in context menu of solution, project, folder, file and tab editor -->\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0x08FF\">\n\t\t\t<!-- The parent of the group will be the solution context menu -->\n\t\t\t<Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_SOLNNODE\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0x07FF\">\n\t\t\t<!-- The parent of the group will be the project context menu -->\n\t\t\t<Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_PROJNODE\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0x0500\">\n\t\t\t<!-- The parent of the group will be the folder context menu -->\n\t\t\t<Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_FOLDERNODE\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0x0600\">\n\t\t\t<!-- The parent of the group will be the file context menu -->\n\t\t\t<Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_ITEMNODE\" />\n\t\t</CommandPlacement>\n\n\t\t<!--The parent of the group will be the tab file context menu -->\n\t\t<!--<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSubmenu\" priority=\"0xFFFF\">\n     <Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_EZDOCWINTAB\" /> \n    </CommandPlacement> -->\n\n\t\t<!-- Define which groups will be placed in the Clang Power Tools submenu  -->\n\t\t<!-- By placing a group automatically each section it will be delimited by a separator -->\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForCommands\" priority=\"0x0001\">\n\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Submenu\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForIgnore\" priority=\"0x0002\">\n\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Submenu\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForJsonDatabase\" priority=\"0x0003\">\n\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Submenu\" />\n\t\t</CommandPlacement>\n\n\t\t<CommandPlacement guid=\"guidClangPowerToolsPackageCmdSet\" id=\"GroupForSettings\" priority=\"0x0004\">\n\t\t\t<Parent guid=\"guidClangPowerToolsPackageCmdSet\" id=\"Submenu\" />\n\t\t</CommandPlacement>\n\n\t</CommandPlacements>\n\n\n\t<!--Contains all the unique identifires and symbols declaration-->\n\t<Symbols>\n\t\t<GuidSymbol name=\"guidClangPowerToolsPackage\" value=\"{f564f9d3-01ae-493e-883b-18deebdb975e}\" />\n\n\n\t\t<!-- Define the unique identifires for commands, groups, menu and toolbar -->\n\t\t<GuidSymbol name=\"guidClangPowerToolsPackageCmdSet\" value=\"{498fdff5-5217-4da9-88d2-edad44ba3874}\">\n\n\t\t\t<!-- Define the unique identifires for groups -->\n\t\t\t<IDSymbol name=\"GroupForSubmenu\" value=\"0x1020\" />\n\t\t\t<IDSymbol name=\"GroupForCommands\" value=\"0x1021\" />\n\t\t\t<IDSymbol name=\"GroupForSettings\" value=\"0x1022\" />\n\t\t\t<IDSymbol name=\"GroupForIgnore\" value=\"0x1023\" />\n\t\t\t<IDSymbol name=\"GroupForJsonDatabase\" value=\"0x1024\" />\n\t\t\t<IDSymbol name=\"ToolbarGroup\" value=\"0x1050\" />\n\t\t\t<IDSymbol name=\"GroupForToolbarMenu\" value=\"0x1030\" />\n\t\t\t<!--<IDSymbol name =\"DropDownToolbarMenuGroup\" value=\"0x0110\"/>-->\n      \n      <!-- Find Command from view menu -->\n      <IDSymbol name=\"FindToolWindowGroup\" value=\"0x000D\" />\n      <IDSymbol name=\"FindToolWindowId\" value=\"0x1A20\" />\n\n\n\t\t\t<!-- Define the unique identifires for menus -->\n\t\t\t<IDSymbol name=\"Submenu\" value=\"0x0100\" />\n\t\t\t<IDSymbol name=\"DromDownMenu\" value=\"0x0200\" />\n\t\t\t<IDSymbol name=\"DromDownDocumentationMenu\" value=\"0x020A\" />\n\t\t\t<IDSymbol name=\"DromDownDocumentationMenuGroup\" value=\"0x010A\" />\n\n\t\t\t<!-- Define the unique identifires for commands -->\n\t\t\t<IDSymbol name=\"CompileId\" value=\"0x0102\" />\n\t\t\t<IDSymbol name=\"CompileToolbarId\" value=\"0x1100\" />\n\n\t\t\t<IDSymbol name=\"TidyId\" value=\"0x0101\" />\n\t\t\t<!--<IDSymbol name=\"TidyFixId\" value=\"0x0109\" />-->\n\n\t\t\t<IDSymbol name=\"TidyToolbarId\" value=\"0x1101\" />\n\t\t\t<!--<IDSymbol name=\"TidyFixToolbarId\" value=\"0x1102\" />-->\n\n\t\t\t<IDSymbol name=\"ClangFormatId\" value=\"0x0105\" />\n\t\t\t<IDSymbol name=\"ClangFormatToolbarId\" value=\"0x1103\" />\n\t\t\t<IDSymbol name=\"FindId\" value=\"0x0115\" />\n      <IDSymbol name=\"OptimizeIncludesId\" value=\"0x01A7\" />\n\n\t\t\t<IDSymbol name=\"StopClangId\" value=\"0x0104\" />\n\t\t\t<IDSymbol name=\"IgnoreFormatId\" value=\"0x0107\" />\n\t\t\t<IDSymbol name=\"IgnoreCompileId\" value=\"0x0108\" />\n\n\t\t\t<IDSymbol name=\"JsonCompilationDatabaseId\" value=\"0x0106\" />\n\t\t\t<IDSymbol name=\"DocumentationYamlId\" value=\"0x0216\" />\n\t\t\t<IDSymbol name=\"DocumentationHtmlId\" value=\"0x0116\" />\n\t\t\t<IDSymbol name=\"DocumentationMdId\" value=\"0x0126\" />\n\n\t\t\t<IDSymbol name=\"SettingsId\" value=\"0x0103\" />\n\t\t\t<IDSymbol name=\"TidyExportConfigId\" value=\"0x1032\" />\n\t\t\t<IDSymbol name=\"LogoutId\" value=\"0x1033\" />\n\n\t\t\t<!-- Define the unique identifires for toolbar -->\n\t\t\t<IDSymbol name=\"Toolbar\" value=\"0x1000\" />\n\t\t</GuidSymbol>\n\n\t\t<!--Icon for preview image and main icon-->\n\t\t<GuidSymbol name=\"guidImages\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c70a}\">\n\t\t\t<IDSymbol name=\"bmpPic1\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define the image for each command -->\n\n\t\t<!-- Define clang tidy image -->\n\t\t<GuidSymbol name=\"guidImageTidy\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c70d}\">\n\t\t\t<IDSymbol name=\"Tidy\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define clang compile image -->\n\t\t<GuidSymbol name=\"guidImageCompile\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c70e}\">\n\t\t\t<IDSymbol name=\"Compile\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define clang stop image -->\n\t\t<GuidSymbol name=\"guidImageStopClang\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c700}\">\n\t\t\t<IDSymbol name=\"StopClang\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define clang  ignore format image -->\n\t\t<GuidSymbol name=\"guidImageIgnoreFormat\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c708}\">\n\t\t\t<IDSymbol name=\"IgnoreFormat\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define empty image -->\n\t\t<GuidSymbol name=\"guidImageEmpty\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c705}\">\n\t\t\t<IDSymbol name=\"Empty\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define clang settigns image -->\n\t\t<GuidSymbol name=\"guidImageSettings\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c70f}\">\n\t\t\t<IDSymbol name=\"Settings\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<!-- Define clang format image -->\n\t\t<GuidSymbol name=\"guidImageFormat\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c71a}\">\n\t\t\t<IDSymbol name=\"Format\" value=\"1\" />\n\t\t</GuidSymbol>\n\n    <!-- Define clang find image -->\n    <GuidSymbol name=\"guidImageFind\" value=\"{d46b5b3e-8c5a-4a6d-972f-37146878a106}\">\n      <IDSymbol name=\"Find\" value=\"1\" />\n    </GuidSymbol>\n\n    <!-- Define clang optimize includes image -->\n    <GuidSymbol name=\"guidImageOptimizeIncludes\" value=\"{6a7c3b9d-5f2e-4a8c-9d1b-e79f2d4c1a35}\">\n      <IDSymbol name=\"OptimizeIncludes\" value=\"1\" />\n    </GuidSymbol>\n\n\t\t<!-- Define Logout image -->\n\t\t<GuidSymbol name=\"guidImageLogout\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c72a}\">\n\t\t\t<IDSymbol name=\"Logout\" value=\"1\" />\n\t\t</GuidSymbol>\n\n\t\t<GuidSymbol name=\"guidImageJsonCompilationDb\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c73a}\">\n\t\t\t<IDSymbol name=\"JsonCompilationDb\" value=\"1\" />\n\t\t</GuidSymbol>\n    \n    <!-- Define Documentation image -->\n    <GuidSymbol name=\"guidImageDocumentation\" value=\"{6ef146ba-e044-43ab-989d-c4a1d6d5c74a}\">\n      <IDSymbol name=\"Documentation\" value=\"1\" />\n    </GuidSymbol>\n\n\t</Symbols>\n\n</CommandTable>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/ClangPowerToolsPackage.cs",
    "content": "using ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Threading;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  /// <summary>\n  /// This is the class that implements the package exposed by this assembly.\n  /// </summary>\n  /// <remarks>\n  /// <para>\n  /// The minimum requirement for a class to be considered a valid package for Visual Studio\n  /// is to implement the IVsPackage interface and register itself with the shell.\n  /// This package uses the helper classes defined inside the Managed Package Framework (MPF)\n  /// to do it: it derives from the Package class that provides the implementation of the\n  /// IVsPackage interface and uses the registration attributes defined in the framework to\n  /// register itself and its components with the shell. These attributes tell the pkgdef creation\n  /// utility what data to put into .pkgdef file.\n  /// </para>\n  /// <para>\n  /// To get loaded into VS, the package must be referred by &lt;Asset Type=\"Microsoft.VisualStudio.VsPackage\" ...&gt; in .vsixmanifest file.\n  /// </para>\n  /// </remarks>\n  [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]\n  [InstalledProductRegistration(\"#110\", \"#112\", \"1.0\", IconResourceID = 400)] // Info on this package for Help/About\n  [ProvideMenuResource(\"Menus.ctmenu\", 1)]\n  [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string, PackageAutoLoadFlags.BackgroundLoad)]\n  [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string, PackageAutoLoadFlags.BackgroundLoad)]\n  [ProvideMenuResource(\"Menus.ctmenu\", 1)]\n  [ProvideToolWindow(typeof(TidyToolWindow), Style = VsDockStyle.Tabbed, DockedWidth = 300, Window = \"DocumentWell\", Orientation = ToolWindowOrientation.Left, Transient = true)]\n  [ProvideToolWindow(typeof(FindToolWindow), Style = VsDockStyle.Tabbed, DockedWidth = 300, Window = \"DocumentWell\", Orientation = ToolWindowOrientation.Left, Transient = true)]\n  [Guid(PackageGuidString)]\n  public sealed class RunClangPowerToolsPackage2 : AsyncPackage\n  {\n    #region Members\n\n    Object mClangPackageImpl;\n\n    /// <summary>\n    /// RunPowerShellCommandPackage GUID string.\n    /// </summary>\n    public const string PackageGuidString = \"f564f9d3-01ae-493e-883b-18deebdb975e\";\n    private const string cptLib16 = \"ClangPowerToolsLib16.dll\";\n    private const string cptLib17 = \"ClangPowerToolsLib17.dll\";\n    private const string WPFTextBoxAutoComplete = \"WPFTextBoxAutoComplete.dll\";\n    private const string cptNamespace = \"ClangPowerTools.ClangPowerToolsPackageImpl\";\n    private const string initializeAsync = \"InitializeAsync\";\n\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TidyCommand\"/> class.\n    /// </summary>\n    public RunClangPowerToolsPackage2()\n    {\n\n    }\n\n    #endregion\n\n\n    #region Initialize Package\n\n\n    /// <summary>\n    /// Initialization of the package; this method is called right after the package is sited, so this is the place\n    /// where you can put all the initialization code that rely on services provided by VisualStudio.\n    /// </summary>\n    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)\n    {\n      // Switches to the UI thread in order to consume some services used in command initialization\n      await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);\n\n      var shellService = (IVsShell)await GetServiceAsync(typeof(SVsShell));\n      object releaseVersionObj = \"\";\n      shellService.GetProperty(-9068, out releaseVersionObj);\n      string releaseVersion = (string)releaseVersionObj;\n      releaseVersion = releaseVersion.Substring(0, releaseVersion.IndexOf('.')) + \".0\";\n      string assemblyName = new Version(releaseVersion) < new Version(\"17.0\")\n          ? cptLib16\n          : cptLib17;\n\n      string currentDir = Path.GetDirectoryName(GetType().Assembly.Location);\n      Assembly assembly = Assembly.LoadFile(Path.Combine(currentDir, assemblyName));\n\n      Type type = assembly.GetType(cptNamespace);\n      mClangPackageImpl = Activator.CreateInstance(type, this);\n      MethodInfo method = type.GetMethod(initializeAsync);\n\n      await (Task)method.Invoke(mClangPackageImpl, null);\n\n\n\n      await base.InitializeAsync(cancellationToken, progress);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClangPowerTools\")]\n[assembly: AssemblyDescription(\"A tool bringing clang-tidy magic to Visual Studio C++ developers.\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Caphyon\")]\n[assembly: AssemblyProduct(\"ClangPowerTools\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Properties/Resource.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ClangPowerTools.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resource {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resource() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ClangPowerTools.Properties.Resource\", typeof(Resource).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Deselect all.\n        /// </summary>\n        internal static string DeselectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"DeselectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Encoding Converter.\n        /// </summary>\n        internal static string EncodingConverterWindowTitle {\n            get {\n                return ResourceManager.GetString(\"EncodingConverterWindowTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to encoding is not supported.\n        /// </summary>\n        internal static string EncodingError {\n            get {\n                return ResourceManager.GetString(\"EncodingError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The following files are not encoded in UTF-8. Do you want to change their encoding?.\n        /// </summary>\n        internal static string EncodingErrorText {\n            get {\n                return ResourceManager.GetString(\"EncodingErrorText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Select all.\n        /// </summary>\n        internal static string SelectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"SelectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unicode (UTF-8).\n        /// </summary>\n        internal static string UTF8Encoding {\n            get {\n                return ResourceManager.GetString(\"UTF8Encoding\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Properties/Resource.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"DeselectAllTooltipText\" xml:space=\"preserve\">\n    <value>Deselect all</value>\n  </data>\n  <data name=\"EncodingConverterWindowTitle\" xml:space=\"preserve\">\n    <value>Encoding Converter</value>\n  </data>\n  <data name=\"EncodingError\" xml:space=\"preserve\">\n    <value>encoding is not supported</value>\n  </data>\n  <data name=\"EncodingErrorText\" xml:space=\"preserve\">\n    <value>The following files are not encoded in UTF-8. Do you want to change their encoding?</value>\n  </data>\n  <data name=\"SelectAllTooltipText\" xml:space=\"preserve\">\n    <value>Select all</value>\n  </data>\n  <data name=\"UTF8Encoding\" xml:space=\"preserve\">\n    <value>Unicode (UTF-8)</value>\n  </data>\n</root>"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/clang-build.ps1",
    "content": "﻿<#\n.SYNOPSIS\n    Compiles or tidies up code from Visual Studio .vcxproj project files.\n\n.DESCRIPTION\n    This PowerShell script scans for all .vcxproj Visual Studio projects inside a source directory.\n    One or more of these projects will be compiled or tidied up (modernized), using Clang.\n\n.PARAMETER aSolutionsPath\n    Alias 'dir'. Source directory to find sln files.\n                 Projects will be extracted from each sln.\n\n    Important: You can pass an absolute path to a sln. This way, no file searching will be done, and\n               only the projects from this solution file will be taken into account.\n\n.PARAMETER aVcxprojToCompile\n    Alias 'proj'. Array of project(s) to compile. If empty, all projects found in solutions are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*components').\n\n    Absolute disk paths to vcxproj files are accepted.\n\n    Can be passed as comma separated values.\n\n.PARAMETER aVcxprojToIgnore\n    Alias 'proj-ignore'. Array of project(s) to ignore, from the matched ones.\n    If empty, all already matched projects are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*components').\n\n    Can be passed as comma separated values.\n\n.PARAMETER aVcxprojConfigPlatform\n    Alias 'active-config'. Array of configuration-platform pairs, each pair being separated by |,\n    to be used when processing project files.\n\n    E.g. \"Debug|Win32\", \"Debug|x64\".\n    If not specified, the first configuration-platform found in the current project is used.\n    Projects will be processed for each configuration-platform specified, the ones that are missing will be skipped.\n\n.PARAMETER aCppToCompile\n    Alias 'file'. What cpp(s) to compile from the found project(s). If empty, all CPPs are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*table').\n\n    Note: If any headers are given then all translation units that include them will be processed.\n\n.PARAMETER aCppToIgnore\n    Alias 'file-ignore'. Array of file(s) to ignore, from the matched ones.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*table').\n\n    Can be passed as comma separated values.\n\n.PARAMETER aUseParallelCompile\n    Alias 'parallel'. Switch to run in parallel mode, on all logical CPU cores.\n\n.PARAMETER aContinueOnError\n     Alias 'continue'. Switch to continue project compilation even when errors occur.\n\n.PARAMETER aTreatAdditionalIncludesAsSystemIncludes\n     Alias 'treat-sai'. Switch to treat project additional include directories as system includes.\n\n.PARAMETER aClangCompileFlags\n     Alias 'clang-flags'. Flags given to clang++ when compiling project,\n     alongside project-specific defines.\n\n.PARAMETER aTidyFlags\n      Alias 'tidy'. If not empty clang-tidy will be called with given flags, instead of clang++.\n      The tidy operation is applied to whole translation units, meaning all directory headers\n      included in the CPP will be tidied up too. Changes will not be applied, only simulated.\n\n      If aTidyFixFlags is present, it takes precedence over this parameter.\n\n      If '.clang-tidy' value is given, configuration will be read from .clang-tidy file\n      in the closest parent directory.\n\n.PARAMETER aTidyFixFlags\n      Alias 'tidy-fix'. If not empty clang-tidy will be called with given flags, instead of clang++.\n      The tidy operation is applied to whole translation units, meaning all directory headers\n      included in the CPP will be tidied up too. Changes will be applied to the file(s).\n\n      If present, this parameter takes precedence over aTidyFlags.\n\n      If '.clang-tidy' value is given, configuration will be read from .clang-tidy file\n      in the closest parent directory.\n\n.PARAMETER aAfterTidyFixFormatStyle\n      Alias 'format-style'. Used in combination with 'tidy-fix'. If present, clang-tidy will\n      also format the fixed file(s), using the specified style.\n      Possible values: - not present, no formatting will be done\n                       - 'file'\n                           Literally 'file', not a placeholder.\n                           Uses .clang-format file in the closest parent directory.\n                       - 'llvm'\n                       - 'google'\n                       - 'webkit'\n                       - 'mozilla'\n\n.PARAMETER aVisualStudioVersion\n      Alias 'vs-ver'. Version of Visual Studio (VC++) installed and that'll be used for\n      standard library include directories. E.g. 2017.\n\n      Optional. If not given, it will be inferred based on the project toolset version.\n\n.PARAMETER aVisualStudioSku\n      Alias 'vs-sku'. Sku of Visual Studio (VC++) installed and that'll be used for\n      standard library include directories. E.g. Professional.\n\n      If not given, the first detected Visual Studio SKU will be used.\n\n.NOTES\n    Author: Gabriel Diaconita\n#>\n#Requires -Version 5\nparam( [alias(\"proj\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Filter project(s) to compile/tidy\")]\n       [System.Object[]] $aVcxprojToCompile = @()\n\n     , [alias(\"dir\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Source directory for finding solutions; projects will be found from each sln\")]\n       [string] $aSolutionsPath\n\n     , [alias(\"proj-ignore\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify projects to ignore\")]\n       [System.Object[]] $aVcxprojToIgnore = @()\n\n     , [alias(\"active-config\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Config/platform to be used, e.g. Debug|Win32\")]\n       [string[]] $aVcxprojConfigPlatform = @()\n\n     , [alias(\"file\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Filter file(s) to compile/tidy\")]\n       [System.Object[]] $aCppToCompile = @()\n\n     , [alias(\"file-ignore\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify file(s) to ignore\")]\n       [System.Object[]] $aCppToIgnore = @()\n\n     , [alias(\"parallel\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Compile/tidy/tidy-fix projects in parallel\")]\n       [switch]   $aUseParallelCompile\n\n     , [alias(\"continue\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Allow CPT to continue immediately after encountering an error\")]\n       [switch]   $aContinueOnError\n\n     , [alias(\"resume\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Allow CPT to resume the last session (start from last active project / file number).\")]\n       [switch]   $aResumeAfterError\n\n     , [alias(\"treat-sai\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Treat project additional include directories as system includes\")]\n       [switch]   $aTreatAdditionalIncludesAsSystemIncludes\n\n     , [alias(\"clang-flags\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify compilation flags to CLANG\")]\n       [string[]] $aClangCompileFlags = @()\n\n     , [alias(\"tidy\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify flags to CLANG TIDY\")]\n       [string]   $aTidyFlags\n\n     , [alias(\"tidy-fix\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify flags to CLANG TIDY & FIX\")]\n       [string]   $aTidyFixFlags\n\n     , [alias(\"header-filter\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Enable Clang-Tidy to run on header files\")]\n       [string]   $aTidyHeaderFilter\n\n     , [alias(\"format-style\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Used with 'tidy-fix'; tells CLANG TIDY-FIX to also format the fixed file(s)\")]\n       [string]   $aAfterTidyFixFormatStyle\n\n     , [alias(\"vs-ver\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Version of Visual Studio toolset to use for loading project\")]\n       [string]   $aVisualStudioVersion\n\n     , [alias(\"vs-sku\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Edition of Visual Studio toolset to use for loading project\")]\n       [string]   $aVisualStudioSku\n       \n     , [alias(\"export-jsondb\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Switch to generate a JSON compilation database file, in the current working directory\")]\n       [switch]   $aExportJsonDB\n      \n     , [alias(\"export-doc\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"If present, specifies the type of documentation to generate, in the current working direcotory\")]\n       [ValidateSet(\"yaml\", \"md\", \"html\")]\n       [string]   $aDocumentationExportFormat\n     )\n\nSet-StrictMode -version latest\n$ErrorActionPreference = 'Continue'\n\n# System Architecture Constants\n# ------------------------------------------------------------------------------------------------\n\nSet-Variable -name kCptGithubRepoBase -value `\n\"https://raw.githubusercontent.com/Caphyon/clang-power-tools/master/ClangPowerTools/ClangPowerToolsShared/Tooling/v1/\" `\n                                      -option Constant\nSet-Variable -name kPsMajorVersion    -value (Get-Host).Version.Major   -Option Constant \n# ------------------------------------------------------------------------------------------------\n# Return Value Constants\n\nSet-Variable -name kScriptFailsExitCode      -value  47                 -option Constant\n\n# ------------------------------------------------------------------------------------------------\n# File System Constants\n\nSet-Variable -name kExtensionVcxproj         -value \".vcxproj\"          -option Constant\nSet-Variable -name kExtensionSolution        -value \".sln\"              -option Constant\nSet-Variable -name kExtensionYaml            -value \".yaml\"             -option Constant\nSet-Variable -name kExtensionClangPch        -value \".clang.pch\"        -option Constant\nSet-Variable -name kExtensionC               -value \".c\"                -option Constant\n\n\n# ------------------------------------------------------------------------------------------------\n# Envinroment Variables for controlling logic\n\nSet-Variable -name kVarEnvClangTidyPath     -value \"CLANG_TIDY_PATH\"-option Constant\n\n# ------------------------------------------------------------------------------------------------\n# Clang-Related Constants\n\nSet-Variable -name kClangFlagSupressLINK    -value @(\"-fsyntax-only\")   -option Constant\nSet-Variable -name kClangFlagIncludePch     -value \"-include-pch\"       -option Constant\nSet-Variable -name kClangFlagFasterPch      -value \"-fpch-instantiate-templates\" -option Constant\nSet-Variable -name kClangFlagMinusO         -value \"-o\"                 -option Constant\n\nSet-Variable -name kClangDefinePrefix       -value \"-D\"                 -option Constant\nSet-Variable -name kClangFlagNoUnusedArg    -value \"-Wno-unused-command-line-argument\" `\n                                                                        -option Constant\nSet-Variable -name kClangFlagNoMsInclude    -value \"-Wno-microsoft-include\" `\n                                                                        -Option Constant\nSet-Variable -name kClangFlagFileIsCPP      -value \"-x c++\"             -option Constant\nSet-Variable -name kClangFlagFileIsC        -value \"-x c\"               -option Constant\nSet-Variable -name kClangFlagForceInclude   -value \"-include\"           -option Constant\nSet-Variable -name kClangTidyFixExportFixes -value \"--export-fixes=\"    -option Constant\n\n\nSet-Variable -name kClangCompiler           -value \"clang++.exe\"        -option Constant\n\nSet-Variable -name kClangTidyFlags            -value @(\"-quiet\"\n                                                      ,\"--\")            -option Constant\nSet-Variable -name kClangTidyFlagHeaderFilter -value \"-header-filter=\"  -option Constant\nSet-Variable -name kClangTidyFlagChecks       -value \"-checks=\"         -option Constant\nSet-Variable -name kClangTidyUseFile          -value \".clang-tidy\"      -option Constant\nSet-Variable -name kClangTidyFormatStyle      -value \"-format-style=\"   -option Constant\n\nSet-Variable -name kClangTidyFlagTempFile     -value \"\"\n\nSet-Variable -name kCptRegHiveSettings         -value \"HKCU:SOFTWARE\\Caphyon\\Clang Power Tools\"             -option Constant\nSet-Variable -name kCptVsixSettings            -value \"${env:APPDATA}\\ClangPowerTools\\settings.json\"        -option Constant\nSet-Variable -name kCptTidyFixReplacementsDir  -value \"${env:APPDATA}\\ClangPowerTools\\TidyFixReplacements\" -option Constant\n\n# ------------------------------------------------------------------------------------------------\n\nFunction cpt:getSetting([string] $name)\n{\n  if ((Test-Path $kCptVsixSettings))\n  {\n    $settingsJson = ( (Get-Content -Raw -Path $kCptVsixSettings) | ConvertFrom-Json)\n    $settingField = $settingsJson.Where{ $_ | Get-Member $name }\n    if (!$settingField)\n    {\n      return $null\n    }\n    \n    return $settingField.$name\n  }\n  return $null\n}\n\n# We define this separately from the implementation in io.ps1 because that may not yet be present and \n# in order to download it we need the connection-status greenlight.\nFunction cpt:testInternetConnectivity\n{  \n  $resp = Get-WmiObject -Class Win32_PingStatus -Filter 'Address=\"github.com\" and Timeout=100' | Select-Object ResponseTime\n  [bool] $hasInternetConnectivity = ($resp.ResponseTime -and $resp.ResponseTime -gt 0)\n  return $hasInternetConnectivity\n}\n\n# Include required scripts, or download them from Github, if necessary\n\nFunction cpt:ensureScriptExists( [Parameter(Mandatory=$true)] [string] $scriptName\n                               , [Parameter(Mandatory=$false)][bool]   $forceRedownload\n                               )\n{\n  [string] $scriptFilePath = \"$PSScriptRoot/psClang/$scriptName\"\n  if ( $forceRedownload -or (! (Test-Path $scriptFilePath)) )\n  {\n    Write-Verbose \"Download required script $scriptName ...\"\n    [string] $request = \"$kCptGithubRepoBase/psClang/$scriptName\"\n\n    if ( ! (Test-Path \"$PSScriptRoot/psClang\"))\n    {\n      New-Item \"$PSScriptRoot/psClang\" -ItemType Directory > $null\n    }\n\n    # Invoke-WebRequest has an issue when displaying progress on PowerShell 7, it won't go away\n    # and will keep nagging the user, and on PS5 it causes slow transfers  => we supress it.\n    \n    $prevPreference = $progressPreference\n    $ProgressPreference = \"SilentlyContinue\"\n    \n    Invoke-WebRequest -Uri $request -OutFile $scriptFilePath\n    (Get-Content $scriptFilePath -Raw).Replace(\"`n\",\"`r`n\") | Set-Content $scriptFilePath -Force -NoNewline\n\n    $ProgressPreference = $prevPreference\n    \n    if (! (Test-Path $scriptFilePath))\n    {\n      Write-Error \"Could not download required script file ($scriptName). Aborting...\"\n      exit 1\n    }\n  }\n\n  return $scriptFilePath\n}\n\n[bool] $shouldRedownloadForcefully = $false\n[Version] $cptVsixVersion = cpt:getSetting \"Version\"\nWrite-Verbose \"Current Clang Power Tools VSIX version: $cptVsixVersion\"\n\n$kLogicalCoreCount = 4;\nif($Env:NUMBER_OF_PROCESSORS -match \"^\\d+$\")\n{\n  $kLogicalCoreCount = $Env:NUMBER_OF_PROCESSORS\n  if($Env:CPT_CPULIMIT -match \"^\\d+$\")\n  {\n    $kLogicalCoreCount = $Env:CPT_CPULIMIT\n  }\n  #Set-Variable -name kLogicalCoreCount -value $Env:CPT_CPULIMIT   -option Constant\n}\n\n# If the main script has been updated meanwhile, we invalidate all other scripts, and force\n# them to update from github. We need to watch for this because older CPT VS Extensions (before v7.9)\n# did not updated all helper scripts, but a list of predefined ones; we need to update the new ones as well.\nif ( ( ![string]::IsNullOrWhiteSpace($cptVsixVersion) -and \n        [Version]::new($cptVsixVersion) -lt [Version]::new(7, 9, 0) ) -and\n     (Test-Path $kCptRegHiveSettings) )\n{\n  Write-Verbose \"Checking to see if we should redownload script helpers...\"\n  $regHive = Get-Item -LiteralPath $kCptRegHiveSettings\n  $currentHash = (Get-FileHash $PSCommandPath -Algorithm \"SHA1\").Hash\n  $savedHash = $regHive.GetValue('ScriptContentHash');\n\n  # we used to rely on timestamps but it's unreliable so make sure to clean up the reg value\n  if ($regHive.GetValue('ScriptTimestamp'))\n  {\n    Remove-ItemProperty -path $kCptRegHiveSettings -name 'ScriptTimestamp'\n  }\n\n  if (! (cpt:testInternetConnectivity) )\n  {\n    Write-Verbose \"No internet connectivity. Postponing helper scripts update from github...\"\n  }\n  \n  [string] $featureDisableValue = '42'\n  if ( (cpt:testInternetConnectivity) -and \n      ($savedHash -ne $currentHash) -and\n      ($savedHash -ne $featureDisableValue) )\n  {\n    Write-Verbose \"Detected changes in main script. Will redownload helper scripts from Github...\"\n    Write-Verbose \"Current main script SHA1: $currentHash. Saved SHA1: $savedHash\"\n    Set-ItemProperty -path $kCptRegHiveSettings -name 'ScriptContentHash' -value $currentHash\n    $shouldRedownloadForcefully = $true\n  }\n}\n\n@( \"io.ps1\"\n , \"visualstudio-detection.ps1\"\n , \"msbuild-expression-eval.ps1\"\n , \"msbuild-project-data.ps1\"\n , \"msbuild-project-load.ps1\"\n , \"msbuild-project-cache-repository.ps1\"\n , \"get-header-references.ps1\"\n , \"itemdefinition-context.ps1\"\n , \"jsondb-export.ps1\"\n , \"get-llvm-helper.ps1\"\n)                                                                        |\nForEach-Object { cpt:ensureScriptExists $_ $shouldRedownloadForcefully } |\nForEach-Object { . $_ }\n\nWrite-InformationTimed \"Imported scripts\"\n\n#-------------------------------------------------------------------------------------------------\n# do not include in list above because it is an invokable script, dot-sourcing does not work.\n\ncpt:ensureScriptExists \"get-llvm.ps1\" $shouldRedownloadForcefully | Out-Null\n\n#-------------------------------------------------------------------------------------------------\n# we may have a custom path for Clang-Tidy. Use it if that's the case.\n\n[string] $customTidyPath = (Get-QuotedPath -path ([Environment]::GetEnvironmentVariable($kVarEnvClangTidyPath)))\nif (![string]::IsNullOrWhiteSpace($customTidyPath))\n{\n  Set-Variable -name kClangTidy                         -value $customTidyPath                    -option Constant\n}\nelse\n{\n  Set-Variable -name kClangTidy                         -value \"clang-tidy.exe\"                   -option Constant\n  Set-Variable -name kClangApplyReplacements            -value \"clang-apply-replacements.exe\"     -option Constant\n}\n\nSet-Variable -name kCacheRepositorySaveIsNeeded -value $false \n\n#-------------------------------------------------------------------------------------------------\n# Custom Types\n\n\nWrite-InformationTimed \"Before .NET enum types\"\n\nif ($kPsMajorVersion -lt 5)\n{\nAdd-Type -TypeDefinition @\"\n  public enum WorkloadType\n  {\n    Compile,\n    Tidy,\n    TidyFix\n  }\n\"@\n\nAdd-Type -TypeDefinition @\"\n  public enum StopReason\n  {\n    Unknown,\n    ConfigurationNotFound\n  }\n\"@\n}\nelse \n{\n  # this is much faster if PowerShell supports enums, we will save some time\n  Invoke-Expression @\"\n  enum WorkloadType \n  {\n    Compile\n    Tidy\n    TidyFix\n  }\n\n  enum StopReason \n  {\n    Unknown\n    ConfigurationNotFound\n  }\n\"@\n}\n\nWrite-InformationTimed \"Created .NET enum types\"\n#-------------------------------------------------------------------------------------------------\n# Global variables\n\n# temporary files created during project processing (e.g. PCH files)\n[System.Collections.ArrayList] $global:FilesToDeleteWhenScriptQuits = @()\n\n# filePath-fileData for SLN files located in source directory\n[System.Collections.Generic.Dictionary[String,String]] $global:slnFiles = @{}\n\n# flag to signal when errors are encounteres during project processing\n[Boolean]                      $global:FoundErrors                  = $false\n\n# directory path where tidy fix replacement files will be stored\n[string] $global:tidyFixReplacementDirPath = \"\"\n\n# default ClangPowerTools version of visual studio to use\n[string] $global:cptDefaultVisualStudioVersion = \"2017\"\n\n[string[]] $global:cptIgnoredFilesPool = @()\n\n# holds file items to process and their contextual properties (inherited + locally defined)\n[System.Collections.Hashtable] $global:cptFilesToProcess = @{}\n\n#-------------------------------------------------------------------------------------------------\n# Global functions\n\nFunction Exit-Script([Parameter(Mandatory=$false)][int] $code = 0)\n{\n  Write-Verbose-Array -array $global:FilesToDeleteWhenScriptQuits `\n                      -name \"Cleaning up PCH temporaries\"\n  # Clean-up\n  foreach ($file in $global:FilesToDeleteWhenScriptQuits)\n  {\n    Remove-Item -LiteralPath $file -ErrorAction SilentlyContinue > $null\n  }\n\n  if ($aTidyFixFlags)\n  {\n    Write-Verbose \"Cleaning up temporaries tidy-fix replacements\"\n    Remove-Item -path $global:tidyFixReplacementDirPath -Recurse -ErrorAction SilentlyContinue > $null\n  }\n    \n  # Restore working directory\n  Pop-Location\n\n  exit $code\n}\n\nFunction Fail-Script([parameter(Mandatory=$false)][string] $msg = \"Got errors.\")\n{\n  if (![string]::IsNullOrEmpty($msg))\n  {\n    Write-Err $msg\n  }\n  Exit-Script($kScriptFailsExitCode)\n}\n\nFunction Apply-TidyFixReplacements([Parameter(Mandatory=$true) ][WorkloadType] $workloadType)\n{\n  if ($workloadType -eq [WorkloadType]::TidyFix -and \n  (Test-Path -LiteralPath $global:tidyFixReplacementDirPath))\n  {\n    Write-Verbose \"Apply tidy-fix replacements\"\n    [string] $pathToBinary =  (Join-Path -path $global:llvmLocation `\n                                         -ChildPath $kClangApplyReplacements)\n    & $pathToBinary $global:tidyFixReplacementDirPath\n    Wait-AndProcessBuildJobs\n  }\n}\n\nFunction Get-SourceDirectory()\n{\n  [bool] $isDirectory = ($(Get-Item -LiteralPath $aSolutionsPath) -is [System.IO.DirectoryInfo])\n  if ($isDirectory)\n  {\n    return $aSolutionsPath\n  }\n  else\n  {\n    return (Get-FileDirectory -filePath $aSolutionsPath)\n  }\n}\n\nfunction Load-Solutions()\n{\n   Write-Verbose \"Scanning for solution files\"\n   [string] $pathToCheck = $aSolutionsPath\n   if ($kPsMajorVersion -lt 6)\n   {\n     # we need not bother with long path support in PowerShell 6+\n     # only in Windows PowerShell\n     $pathToCheck = \"\\\\?\\$aSolutionsPath\"\n   }\n\n   $slns = Get-ChildItem -recurse -LiteralPath $pathToCheck -Filter \"*$kExtensionSolution\"\n   foreach ($sln in $slns)\n   {\n     Write-Verbose \"Caching solution file $sln\"\n     $slnPath = $sln.FullName\n\n     # remove the UNC long path prefix\n     $slnPath = $slnPath.Replace('\\\\?\\', '')\n     $global:slnFiles[$slnPath] = (Get-Content -LiteralPath $slnPath)\n     \n     Write-Verbose \"Solution full path: $slnPath\"\n     Write-Verbose \"Solution data length: $($global:slnFiles[$slnPath].Length)\"\n   }\n\n   Write-Verbose-Array -array $global:slnFiles.Keys  -name \"Solution file paths\"\n}\n\nfunction Get-SolutionProjects([Parameter(Mandatory=$true)][string] $slnPath)\n{\n  Write-Verbose \"Retrieving project list for solution $slnPath\"\n  [string] $slnDirectory = Get-FileDirectory -file $slnPath\n\n  Write-Verbose \"Solution directory: $slnDirectory\"\n  $matches = [regex]::Matches($global:slnFiles[$slnPath], 'Project\\([{}\\\"A-Z0-9\\-]+\\) = \\\".*?\\\",\\s\\\"(.*?)\\\"')\n\n  Write-Verbose \"Intermediate solution project matches count: $($matches.Count)\"\n  foreach ($match in $matches)\n  {\n    Write-Verbose $match.Groups[1].Value\n  }\n\n  [string[]] $projectAbsolutePaths = @()\n  foreach ($projPathMatch in $matches)\n  {\n    [string] $matchValue = $projPathMatch.Groups[1].Value.Replace('\"','')\n    if ([string]::IsNullOrWhiteSpace($matchValue))\n    {\n      continue\n    }\n\n    $projExpandedPath = [Environment]::ExpandEnvironmentVariables($matchValue)\n    if ( ! $projExpandedPath.EndsWith($kExtensionVcxproj))\n    {\n      continue\n    }\n\n    # canonize-path is smart enough to figure out if this is a relative path or not\n    $projExpandedPath = Canonize-Path -base $slnDirectory -child $projExpandedPath -ignoreErrors\n  \n    $projectAbsolutePaths += @($projExpandedPath)\n  }\n  Write-Verbose-Array -array $projectAbsolutePaths -name \"Resolved project paths for solution $slnPath\"\n  return $projectAbsolutePaths\n}\n\nfunction Get-ProjectSolution()\n{\n  foreach ($slnPath in $global:slnFiles.Keys)\n  {\n    [string[]] $solutionProjectPaths = @(Get-SolutionProjects $slnPath)\n    if ($solutionProjectPaths -and $solutionProjectPaths -contains $global:vcxprojPath)\n    {\n      return $slnPath\n    }\n  }\n  return \"\"\n}\n\nFunction Get-Projects()\n{\n  [string[]] $projects = @()\n\n  foreach ($slnPath in $global:slnFiles.Keys)\n  {\n    [string[]] $solutionProjects = @(Get-SolutionProjects -slnPath $slnPath)\n    if ($solutionProjects -and $solutionProjects.Count -gt 0)\n    {\n      $projects += $solutionProjects\n    }\n  }\n\n  return ($projects | Select -Unique);\n}\n\nFunction Get-ClangIncludeDirectories( [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                                    , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                                    )\n{\n  [string[]] $returnDirs = @()\n\n  foreach ($includeDir in $includeDirectories)\n  {\n    $returnDirs += (\"-isystem\" + (Get-QuotedPath $includeDir))\n  }\n  foreach ($includeDir in $additionalIncludeDirectories)\n  {\n    if ($aTreatAdditionalIncludesAsSystemIncludes)\n    {\n      $returnDirs += (\"-isystem\" + (Get-QuotedPath $includeDir))\n    }\n    else\n    {\n      $returnDirs += (\"-I\"+ (Get-QuotedPath $includeDir))\n    }\n  }\n\n  return $returnDirs\n}\n\nFunction Get-ProjectFileLanguageFlag([Parameter(Mandatory=$true)] [string]   $fileFullName)\n{\n  [bool] $isCpp = $true\n  if ($fileFullName.EndsWith($kExtensionC))\n  {\n    $isCpp = $false\n  }\n\n  try\n  {\n    [string] $compileAsVal = (Get-ProjectFileSetting -fileFullName $fileFullName -propertyName \"CompileAs\")\n    [bool] $isDefault = [string]::IsNullOrWhiteSpace($compileAsVal) -or $compileAsVal -ieq \"Default\"\n    if ($isDefault)\n    {\n      $isCpp = ! $fileFullName.EndsWith($kExtensionC)\n    }\n    else \n    {\n      $isCpp = $compileAsVal -ine $kCProjectCompile\n    }\n  }  \n  catch {}\n\n  [string] $languageFlag = If ($isCpp) { $kClangFlagFileIsCPP } else { $kClangFlagFileIsC }\n\n  return $languageFlag\n}\n\nFunction Generate-Pch( [Parameter(Mandatory=$true)] [string]   $stdafxDir\n                     , [Parameter(Mandatory=$true)] [string]   $stdafxCpp\n                     , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                     , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                     , [Parameter(Mandatory=$true)] [string]   $stdafxHeaderName\n                     , [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions)\n{\n  [string] $stdafxSource = (Canonize-Path -base $stdafxDir -child $stdafxHeaderName)\n  [string] $stdafx = $stdafxSource + \".hpp\"\n\n  # Clients using Perforce will have their source checked-out as readonly files, so the \n  # PCH copy would be, by-default, readonly as well, which would present problems. Make sure to remove the RO attribute.\n  Copy-Item -LiteralPath $stdafxSource -Destination $stdafx -PassThru | Set-ItemProperty -name isreadonly -Value $false\n\n  $global:FilesToDeleteWhenScriptQuits.Add($stdafx) > $null\n\n  [string] $vcxprojShortName = [System.IO.Path]::GetFileNameWithoutExtension($global:vcxprojPath);\n  [string] $stdafxPch = (Join-Path -path (Get-SourceDirectory) `\n                                   -ChildPath \"$vcxprojShortName$kExtensionClangPch\")\n  Remove-Item -LiteralPath \"$stdafxPch\" -ErrorAction SilentlyContinue > $null\n\n  $global:FilesToDeleteWhenScriptQuits.Add($stdafxPch) > $null\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $stdafxCpp)\n\n  [string[]] $compilationFlags = @((Get-QuotedPath $stdafx)\n                                  ,$kClangFlagMinusO\n                                  ,(Get-QuotedPath $stdafxPch)\n                                  ,$languageFlag\n                                  ,(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n                                  ,$kClangFlagNoUnusedArg\n                                  ,$preprocessorDefinitions\n                                  )\n  if ($kLLVMVersion -ge 11)\n  {\n    # this flag gets around 15% faster PCH compilation times\n    # https://www.phoronix.com/scan.php?page=news_item&px=LLVM-Clang-11-PCH-Instant-Temp\n    $compilationFlags += $kClangFlagFasterPch\n  }\n\n  $compilationFlags += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                                   -additionalIncludeDirectories $additionalIncludeDirectories\n\n  # Remove empty arguments from the list because Start-Process will complain\n  $compilationFlags = $compilationFlags | Where-Object { $_ } | Select -Unique\n\n  [string] $exeToCallVerbosePath  = $kClangCompiler\n  if (![string]::IsNullOrWhiteSpace($global:llvmLocation))\n  {\n    $exeToCallVerbosePath = \"$($global:llvmLocation)\\$exeToCallVerbosePath\"\n  }\n  Write-Verbose \"INVOKE: $exeToCallVerbosePath $compilationFlags\"\n\n  $kClangWorkingDir = \"$(Get-SourceDirectory)\" -replace '\\[', '`[' -replace ']', '`]'\n  # We could skip the WorkingDir parameter as all paths are absolute but \n  # Powershell 3-5 has a bug when calling Start-Process from a directory containing square brackets\n  # in its path. This can be overcome by providing escaped brackets in the WorkingDirectory arg.\n  # Powershell 7 does not have this limitation.\n  [System.Diagnostics.Process] $processInfo = Start-Process -FilePath $kClangCompiler `\n                                                            -ArgumentList $compilationFlags `\n                                                            -WorkingDirectory $kClangWorkingDir `\n                                                            -NoNewWindow `\n                                                            -Wait `\n                                                            -PassThru\n  if (($processInfo.ExitCode -ne 0) -and (!$aContinueOnError))\n  {\n    Fail-Script \"Errors encountered during PCH creation\"\n  }\n\n  if (Test-Path -LiteralPath $stdafxPch)\n  {\n    return $stdafxPch\n  }\n  else\n  {\n    return \"\"\n  }\n}\n\nFunction Get-ExeToCall([Parameter(Mandatory=$true)][WorkloadType] $workloadType)\n{\n  switch ($workloadType)\n  {\n     \"Compile\"  { return $kClangCompiler }\n     \"Tidy\"     { return $kClangTidy     }\n     \"TidyFix\"  { return $kClangTidy     }\n  }\n}\n\nFunction Get-CompileCallArguments( [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions\n                                 , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                                 , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                                 , [Parameter(Mandatory=$false)][string[]] $forceIncludeFiles\n                                 , [Parameter(Mandatory=$false)][string]   $pchFilePath\n                                 , [Parameter(Mandatory=$true)][string]    $fileToCompile)\n{\n  [string[]] $projectCompileArgs = @()\n  if (! [string]::IsNullOrEmpty($pchFilePath) -and ! $fileToCompile.EndsWith($kExtensionC))\n  {\n    $projectCompileArgs += @($kClangFlagIncludePch , (Get-QuotedPath $pchFilePath))\n  }\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $fileToCompile)\n\n  $projectCompileArgs += @( $languageFlag\n                          , (Get-QuotedPath $fileToCompile)\n                          , @(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n                          , $kClangFlagSupressLINK\n                          , $preprocessorDefinitions\n                          )\n\n  $projectCompileArgs += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                                     -additionalIncludeDirectories $additionalIncludeDirectories\n\n  if ($forceIncludeFiles)\n  {\n    $projectCompileArgs += $kClangFlagNoMsInclude;\n\n    foreach ($file in $forceIncludeFiles)\n    {\n      $projectCompileArgs += \"$kClangFlagForceInclude $(Get-QuotedPath $file)\"\n    }\n  }\n\n  return $projectCompileArgs\n}\n\nFunction Get-TidyCallArguments( [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions\n                              , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                              , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                              , [Parameter(Mandatory=$false)][string[]] $forceIncludeFiles\n                              , [Parameter(Mandatory=$true)][string]   $fileToTidy\n                              , [Parameter(Mandatory=$false)][string]  $pchFilePath\n                              , [Parameter(Mandatory=$false)][switch]  $fix)\n{\n  [string[]] $tidyArgs = @()\n  if ($fix)\n  {\n    # Map tidy-fix replacements temprorary file path to original file path\n    if(![string]::IsNullOrEmpty($fileToTidy))\n    {\n      [string] $tidyFixReplacementYamlPath = Join-Path  -Path ($global:tidyFixReplacementDirPath) `\n                                                        -ChildPath ([guid]::NewGuid().ToString() + $kExtensionYaml)\n      $tidyArgs += $kClangTidyFixExportFixes + @((Get-QuotedPath $tidyFixReplacementYamlPath))\n    }\n  }\n\n  $tidyArgs += (Get-QuotedPath $fileToTidy)\n  if (![string]::IsNullOrWhiteSpace($aTidyFlags) -and ($aTidyFlags -ne $kClangTidyUseFile) -and !(Test-Path $aTidyFlags))\n  {\n    $tidyArgs += \"$kClangTidyFlagChecks`\"$aTidyFlags`\"\"\n  }  \n  if (![string]::IsNullOrWhiteSpace($aTidyFixFlags) -and ($aTidyFixFlags -ne $kClangTidyUseFile) -and !(Test-Path $aTidyFixFlags))\n  {\n    $tidyArgs += \"$kClangTidyFlagChecks`\"$aTidyFixFlags`\"\"\n  }\n\n  # The header-filter flag enables clang-tidy to run on headers too.\n  if (![string]::IsNullOrEmpty($aTidyHeaderFilter))\n  {\n    if ($aTidyHeaderFilter -eq '_')\n    {\n      [string] $fileNameMatch = \"\"\"$(Get-FileName -path $fileToTidy -noext).*\"\"\"\n      $tidyArgs += \"$kClangTidyFlagHeaderFilter$fileNameMatch\"\n    }\n    else\n    {\n      $tidyArgs += \"$kClangTidyFlagHeaderFilter\"\"$aTidyHeaderFilter\"\"\"\n    }\n  }\n\n  if ($fix)\n  {\n    if (![string]::IsNullOrEmpty($aAfterTidyFixFormatStyle))\n    {\n      $tidyArgs += \"$kClangTidyFormatStyle$aAfterTidyFixFormatStyle\"\n    }\n  }\n  $tidyArgs += $kClangTidyFlags\n\n  $tidyArgs += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                           -additionalIncludeDirectories $additionalIncludeDirectories\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $fileToTidy)\n\n  # We reuse flags used for compilation and preprocessor definitions.\n  $tidyArgs += @(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n  $tidyArgs += $preprocessorDefinitions\n  $tidyArgs += $languageFlag\n\n  if (! [string]::IsNullOrEmpty($pchFilePath) -and ! $fileToTidy.EndsWith($kExtensionC))\n  {\n    $tidyArgs += @($kClangFlagIncludePch , (Get-QuotedPath $pchFilePath))\n  }\n\n  if ($forceIncludeFiles)\n  {\n    $tidyArgs += $kClangFlagNoMsInclude;\n\n    foreach ($file in $forceIncludeFiles)\n    {\n      $tidyArgs += \"$kClangFlagForceInclude $file\"\n    }\n  }\n\n  return $tidyArgs\n}\n\nFunction Get-ExeCallArguments( [Parameter(Mandatory=$false)][string]       $pchFilePath\n                             , [Parameter(Mandatory=$false)][string[]]     $includeDirectories\n                             , [Parameter(Mandatory=$false)][string[]]     $additionalIncludeDirectories\n                             , [Parameter(Mandatory=$false)][string[]]     $preprocessorDefinitions\n                             , [Parameter(Mandatory=$false)][string[]]     $forceIncludeFiles\n                             , [Parameter(Mandatory=$true) ][string]       $currentFile\n                             , [Parameter(Mandatory=$true) ][WorkloadType] $workloadType)\n{\n  switch ($workloadType)\n  {\n    Compile { return Get-CompileCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                              -includeDirectories            $includeDirectories `\n                                              -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                              -forceIncludeFiles             $forceIncludeFiles `\n                                              -pchFilePath                   $pchFilePath `\n                                              -fileToCompile                 $currentFile }\n    Tidy    { return Get-TidyCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                           -includeDirectories            $includeDirectories `\n                                           -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                           -forceIncludeFiles             $forceIncludeFiles `\n                                           -pchFilePath                   $pchFilePath `\n                                           -fileToTidy                    $currentFile }\n    TidyFix { return Get-TidyCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                           -includeDirectories            $includeDirectories `\n                                           -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                           -forceIncludeFiles             $forceIncludeFiles `\n                                           -pchFilePath                   $pchFilePath `\n                                           -fileToTidy                    $currentFile `\n                                           -fix}\n  }\n}\n\nFunction Process-ProjectResult($compileResult)\n{\n  $global:cptCurrentClangJobCounter = $compileResult.JobCounter\n  Write-Debug \"Receiving results for clang job $($global:cptCurrentClangJobCounter)\"\n\n  if (!$compileResult.Success)\n  {\n    Write-Err ($compileResult.Output)\n\n    if (!$aContinueOnError)\n    {\n      # Wait for other workers to finish. They have a lock on the PCH file\n      Get-Job -state Running | Wait-Job | Remove-Job > $null\n      Fail-Script\n    }\n\n    $global:FoundErrors = $true\n  }\n  else\n  {\n    if ( $compileResult.Output.Length -gt 0)\n    {\n      Write-Output $compileResult.Output\n    }\n  }\n}\n\nFunction Wait-AndProcessBuildJobs([switch]$any)\n{\n  $runningJobs = @(Get-Job -state Running)\n\n  if ($any)\n  {\n    $runningJobs | Wait-Job -Any > $null\n  }\n  else\n  {\n    $runningJobs | Wait-Job > $null\n  }\n\n  $jobData = Get-Job -State Completed\n  foreach ($job in $jobData)\n  {\n    $buildResult = Receive-Job $job\n    Process-ProjectResult -compileResult $buildResult\n  }\n\n  Remove-Job -State Completed\n}\n\nFunction Wait-ForWorkerJobSlot()\n{\n  # We allow as many background workers as we have logical CPU cores\n  $runningJobs = @(Get-Job -State Running)\n\n  if ($runningJobs.Count -ge $kLogicalCoreCount)\n  {\n    Wait-AndProcessBuildJobs -any\n  }\n}\n\nFunction Run-ClangJobs( [Parameter(Mandatory=$true)] $clangJobs\n                      , [Parameter(Mandatory=$true)][WorkloadType] $workloadType\n                      )\n{\n  # Script block (lambda) for logic to be used when running a clang job.\n  $jobWorkToBeDone = `\n  {\n    param( $job )\n\n    Push-Location -LiteralPath $job.WorkingDirectory\n\n    # This temp file will hold compilation args for clang++ and clang-tidy, not to be\n    # confused with check-flags for clang-tidy.\n    [string] $clangConfigFile = [System.IO.Path]::GetTempFileName()\n\n    [string] $clangConfigContent = \"\"\n    if ($job.FilePath -like '*tidy*')\n    {\n      # We have to separate Clang args from Tidy args\n      $splitparams = $job.ArgumentList -split \" -- \"\n      $clangConfigContent = $splitparams[1]\n\n      # We may have an explicit .clang-tidy check-flag config file to be used\n      if (![string]::IsNullOrWhiteSpace($job.TidyFlagsTempFile) -and (Test-Path -LiteralPath $job.TidyFlagsTempFile))\n      {\n        $splitparams[0] += \" --config-file=\"\"$($job.TidyFlagsTempFile)\"\" \"\n      }\n\n      $job.ArgumentList = \"$($splitparams[0]) -- --config \"\"$clangConfigFile\"\"\"\n    }\n    else\n    {\n      # Tell Clang to take its compilation args from a config file\n      $clangConfigContent = $job.ArgumentList\n      $job.ArgumentList = \"--config \"\"$clangConfigFile\"\"\"\n    }\n\n    # escape slashes for file paths\n    # make sure escaped double quotes are not messed up\n    $clangConfigContent = $clangConfigContent -replace '\\\\([^\"])', '\\\\$1'\n\n    # save compilation arguments to clang config file\n    $clangConfigContent > $clangConfigFile\n\n    # When PowerShell encounters errors, the first one is handled differently from consecutive ones\n    # To circumvent this, do not execute the job directly, but execute it via cmd.exe\n    # See also https://stackoverflow.com/a/35980675\n    \n    $callOutput = cmd /c \"$($job.FilePath) $($job.ArgumentList) 2>&1\" | Out-String\n\n    $callSuccess = $LASTEXITCODE -eq 0\n    if (!$callSuccess)\n    {\n    }\n\n    Remove-Item $clangConfigFile\n    Pop-Location\n\n    return New-Object PsObject -Prop @{ \"File\"    = $job.File\n                                      ; \"Success\" = $callSuccess\n                                      ; \"Output\"  = $callOutput\n                                      ; \"JobCounter\" = $job.JobCounter\n                                      }\n  }\n\n  if (!$aResumeAfterError)\n  {\n    $global:cptCurrentClangJobCounter = $clangJobs.Count\n  }\n  else\n  {\n    if (!(VariableExists 'cptCurrentClangJobCounter'))\n    {\n      Write-Warning \"Can't resume. Previous state is unreliable. Processing all files...\"\n      $global:cptCurrentClangJobCounter = $clangJobs.Count\n    }\n    else\n    {\n      if ($global:cptCurrentClangJobCounter -gt 0)\n      {\n        Write-Output \"Resuming from file #$($global:cptCurrentClangJobCounter)\"\n      }\n    }\n  }\n\n  [int] $crtJobCount = $clangJobs.Count\n\n  foreach ($job in $clangJobs)\n  {\n    if ($global:cptCurrentClangJobCounter -ge 0 -and $crtJobCount -gt $global:cptCurrentClangJobCounter)\n    {\n      $crtJobCount--\n      continue\n    }\n\n    $job.JobCounter = $crtJobCount\n\n    # Check if we must wait for background jobs to complete\n    Wait-ForWorkerJobSlot\n\n    # Inform console what CPP we are processing next\n    Write-Output \"$($crtJobCount): $($job.File)\"\n\n    if ($aUseParallelCompile)\n    {\n      Start-Job -ScriptBlock  $jobWorkToBeDone `\n                -ArgumentList $job `\n                -ErrorAction Continue > $null\n    }\n    else\n    {\n      $compileResult = Invoke-Command -ScriptBlock  $jobWorkToBeDone `\n                                      -ArgumentList $job\n      Process-ProjectResult -compileResult $compileResult\n      $global:cptCurrentClangJobCounter = $compileResult.JobCounter\n    }\n\n    $crtJobCount -= 1\n  }\n\n  Wait-AndProcessBuildJobs\n\n  $global:cptCurrentClangJobCounter = -1 # stop the mechanism after one project\n}\n\nFunction Get-ProjectFileSetting( [Parameter(Mandatory=$true)] [string] $fileFullName\n                               , [Parameter(Mandatory=$true)] [string] $propertyName\n                               , [Parameter(Mandatory=$false)][string] $defaultValue)\n{\n  if (!$global:cptFilesToProcess.ContainsKey($fileFullName))\n  {\n    throw \"File $aFileFullName is not in processing queue.\"\n  }\n\n  if ($global:cptFilesToProcess[$fileFullName].Properties -and\n      $global:cptFilesToProcess[$fileFullName].Properties.ContainsKey($propertyName))\n  {\n    return $global:cptFilesToProcess[$fileFullName].Properties[$propertyName]\n  }\n\n  if ($defaultValue -ne $null)\n  {\n    return $defaultValue\n  }\n\n  throw \"Could not find $propertyName for $fileFullName. No default value specified.\"\n}\n\nFunction Process-Project( [Parameter(Mandatory=$true)] [string]       $vcxprojPath\n                        , [Parameter(Mandatory=$true)] [WorkloadType] $workloadType\n                        , [Parameter(Mandatory=$false)][string]       $platformConfig\n                        )\n{\n  #-----------------------------------------------------------------------------------------------\n  $global:cptCurrentConfigPlatform = $platformConfig\n\n  $projCounter = $global:cptProjectCounter\n  [string] $projectOutputString = (\"PROJECT$(if ($projCounter -gt 1) { \" #$projCounter\" } else { } ): \" + $vcxprojPath)\n  \n  [bool] $loadedFromCache = $false\n  try\n  { \n    Set-Variable 'kCacheRepositorySaveIsNeeded' -value $false\n    Write-InformationTimed \"Before project load\"\n    \n    if (Is-CacheLoadingEnabled)\n    {\n      Write-InformationTimed \"Trying to load project from cache\"\n      $loadedFromCache = Load-ProjectFromCache $vcxprojPath\n      \n      if (!$loadedFromCache)\n      {\n        LoadProject $vcxprojPath\n        Set-Variable 'kCacheRepositorySaveIsNeeded' -value $true\n      }\n    }\n    else \n    {\n      LoadProject $vcxprojPath\n    }\n    \n    Write-InformationTimed \"After project load\"\n    Write-Output \"$projectOutputString [$($global:cptCurrentConfigPlatform)]\"\n  }\n  catch [ProjectConfigurationNotFound]\n  {\n    [string] $configPlatform = ([ProjectConfigurationNotFound]$_.Exception).ConfigPlatform\n    \n    Write-Output \"$projectOutputString [$($global:cptCurrentConfigPlatform)]\"\n    Write-Output (\"Skipped. Configuration not present: \" + $configPlatform);\n    \n    Pop-Location\n    return\n  }\n  \n  Write-InformationTimed \"Detecting toolset\"\n\n  #-----------------------------------------------------------------------------------------------\n  # DETECT PLATFORM TOOLSET\n\n  if (! $loadedFromCache)\n  {\n    [string] $global:platformToolset = Get-ProjectPlatformToolset\n    Write-Verbose \"Platform toolset: $platformToolset\"\n    Add-ToProjectSpecificVariables 'platformToolset'\n\n    if ( $platformToolset -match \"^v\\d+(_xp)?$\" )\n    {\n      [int] $toolsetVersion = [int]$platformToolset.Remove(0, 1).Replace(\"_xp\", \"\")\n\n      [string] $desiredVisualStudioVer = \"\"\n\n      # toolsets attached to specific Visual Studio versions\n      if ($toolsetVersion -le 120)\n      {\n        $desiredVisualStudioVer = \"2013\"\n      }\n      elseif ($toolsetVersion -eq 140)\n      {\n        $desiredVisualStudioVer = \"2015\"\n      }\n      elseif ($toolsetVersion -eq 141)\n      {\n        $desiredVisualStudioVer = \"2017\"\n      }\n      elseif ($toolsetVersion -eq 142)\n      {\n        $desiredVisualStudioVer = \"2019\";\n      }\n      elseif ($toolsetVersion -eq 143)\n      {\n        $desiredVisualStudioVer = \"2022\";\n      }\n\n      [string] $desiredVisualStudioVerNumber = (Get-VisualStudio-VersionNumber $desiredVisualStudioVer)\n      if ($VisualStudioVersion -ne $desiredVisualStudioVerNumber)\n      {\n        [bool] $shouldReload = $false\n\n        if ([double]::Parse($VisualStudioVersion) -gt [double]::Parse($desiredVisualStudioVerNumber))\n        {\n          # in this case we may have a newer Visual Studio with older toolsets installed\n          [string[]] $supportedVsToolsets = Get-VisualStudioToolsets\n    \n          if ($supportedVsToolsets -notcontains $toolsetVersion)\n          {\n              $shouldReload = $true\n          }\n          else \n          {\n            Write-Verbose \"[ INFO ] Detected project using older toolset ($toolsetVersion)\"\n            Write-Verbose \"Loading using Visual Studio $VisualStudioVersion with toolset $toolsetVersion\"\n          }\n        }\n        else \n        {\n          # project uses a newer VS version, clearly we should reload using the newer version\n          $shouldReload = $true\n        }\n\n        if ($shouldReload)\n        {\n          # We need to reload everything and use the VS version we decided upon above\n          Write-Verbose \"[ RELOAD ] Project will reload because of toolset requirements change...\"\n          Write-Verbose \"Current = $VisualStudioVersion. Required = $desiredVisualStudioVerNumber.\"\n\n          $global:cptVisualStudioVersion = $desiredVisualStudioVer\n          LoadProject($vcxprojPath)\n          \n          Write-InformationTimed \"Project reloaded\"\n        }\n      }\n    }\n  \n    Write-InformationTimed \"Detected toolset\"\n\n    #-----------------------------------------------------------------------------------------------\n    # FIND FORCE INCLUDES\n\n    [string[]] $global:forceIncludeFiles = @(Get-ProjectForceIncludes)\n    Write-Verbose-Array -array $forceIncludeFiles -name \"Force includes\"\n    Add-ToProjectSpecificVariables 'forceIncludeFiles'\n\n    #-----------------------------------------------------------------------------------------------\n    # DETECT PROJECT PREPROCESSOR DEFINITIONS\n\n    [string[]] $global:preprocessorDefinitions = @(Get-ProjectPreprocessorDefines)\n    if ([int]$global:cptVisualStudioVersion -ge 2017)\n    {\n      # [HACK] pch generation crashes on VS 15.5 because of STL library, known bug.\n      # Triggered by addition of line directives to improve std::function debugging.\n      # There's a definition that supresses line directives.\n\n      $preprocessorDefinitions += @('\"-D_DEBUG_FUNCTIONAL_MACHINERY\"')\n    }\n    Add-ToProjectSpecificVariables 'preprocessorDefinitions'\n    \n    Write-InformationTimed \"Detected preprocessor definitions\"\n\n    Write-Verbose-Array -array $preprocessorDefinitions -name \"Preprocessor definitions\"\n\n    #-----------------------------------------------------------------------------------------------\n    # DETECT PROJECT ADDITIONAL INCLUDE DIRECTORIES AND CONSTRUCT INCLUDE PATHS\n\n    [string[]] $global:additionalIncludeDirectories = @(Get-ProjectAdditionalIncludes)\n    Write-Verbose-Array -array $additionalIncludeDirectories -name \"Additional include directories\"\n    Add-ToProjectSpecificVariables 'additionalIncludeDirectories'\n\n    [string[]] $includeDirectories = @(Get-ProjectIncludeDirectories)\n    Write-Verbose-Array -array $includeDirectories -name \"Include directories\"\n    Add-ToProjectSpecificVariables 'includeDirectories'\n\n    Write-InformationTimed \"Detected include directories\"\n\n    #-----------------------------------------------------------------------------------------------\n    # FIND LIST OF CPPs TO PROCESS\n\n    $global:projectAllCpps = @{}\n    foreach ($fileToCompileInfo in (Get-ProjectFilesToCompile))\n    {\n      if ($fileToCompileInfo.File)\n      {\n        $global:projectAllCpps[$fileToCompileInfo.File] = $fileToCompileInfo\n      }\n    }\n    \n    Add-ToProjectSpecificVariables 'projectAllCpps'\n    \n    Write-InformationTimed \"Detected cpps to process\"\n  } # past the caching boundary here, we must see what else needs to be computed live \n  \n  $global:cptFilesToProcess = $global:projectAllCpps # reset to full project cpp list\n  \n  #-----------------------------------------------------------------------------------------------\n  # LOCATE STDAFX.H DIRECTORY\n\n  [string] $stdafxCpp    = \"\"\n  [string] $stdafxDir    = \"\"\n  [string] $stdafxHeader = \"\"\n  [string] $stdafxHeaderFullPath = \"\"\n\n  [bool] $kPchIsNeeded = $global:cptFilesToProcess.Keys.Count -ge 2\n  if ($kPchIsNeeded)\n  {\n    # if we have only one rooted file in the script parameters, then we don't need to detect PCH\n    if ($aCppToCompile.Count -eq 1 -and [System.IO.Path]::IsPathRooted($aCppToCompile[0]))\n    {\n      $kPchIsNeeded = $false\n    }\n  }\n\n  foreach ($projCpp in $global:cptFilesToProcess.Keys)\n  {\n    if ( (Get-ProjectFileSetting -fileFullName $projCpp -propertyName 'PrecompiledHeader') -ieq 'Create')\n    {\n      $stdafxCpp = $projCpp\n    }\n  }\n\n  if (![string]::IsNullOrEmpty($stdafxCpp))\n  {\n    Write-Verbose \"PCH cpp name: $stdafxCpp\"\n\n    if ($forceIncludeFiles.Count -gt 0)\n    {\n      $stdafxHeader = $forceIncludeFiles[0]\n    }\n\n    if (!$stdafxHeader)\n    {\n      $stdafxHeader = Get-PchCppIncludeHeader -pchCppFile $stdafxCpp\n    }\n\n    if (!$stdafxHeader)\n    {\n      try\n      {\n        $stdafxHeader = Get-ProjectFileSetting -fileFullName $stdafxCpp -propertyName 'PrecompiledHeaderFile'\n      }\n      catch {}\n    }\n\n    Write-Verbose \"PCH header name: $stdafxHeader\"\n    $stdafxDir = Get-ProjectStdafxDir -pchHeaderName                $stdafxHeader       `\n                                      -includeDirectories           $includeDirectories `\n                                      -additionalIncludeDirectories $additionalIncludeDirectories\n  }\n\n  if ([string]::IsNullOrEmpty($stdafxDir))\n  {\n    Write-Verbose (\"No PCH information for this project!\")\n    $kPchIsNeeded = $false\n  }\n  else\n  {\n    Write-Verbose (\"PCH directory: $stdafxDir\")\n\n    $includeDirectories = @(Remove-PathTrailingSlash -path $stdafxDir) + $includeDirectories\n\n    $stdafxHeaderFullPath = Canonize-Path -base $stdafxDir -child $stdafxHeader -ignoreErrors\n\n    if (!$kPchIsNeeded)\n    {\n      Write-Verbose \"PCH is disabled for this project. Will not generate.\"\n    }\n  }\n  \n  Write-InformationTimed \"Detected PCH information\"\n\n\n  #-----------------------------------------------------------------------------------------------\n  # FILTER LIST OF CPPs TO PROCESS\n  if ($global:cptFilesToProcess.Count -gt 0 -and $aCppToIgnore.Count -gt 0)\n  {\n    [System.Collections.Hashtable] $filteredCpps = @{}\n    foreach ($cpp in $global:cptFilesToProcess.Keys)\n    {\n      if ( ! (Should-IgnoreFile -file $cpp) )\n      {\n        $filteredCpps[$cpp] = $global:cptFilesToProcess[$cpp]\n      }\n    }\n    $global:cptFilesToProcess = $filteredCpps\n  }\n\n  if ($global:cptFilesToProcess.Count -gt 0 -and $aCppToCompile.Count -gt 0)\n  {\n    [System.Collections.Hashtable] $filteredCpps = @{}\n    [bool] $dirtyStdafx = $false\n    foreach ($cpp in $aCppToCompile)\n    {\n      if ($cpp -ieq $stdafxHeaderFullPath)\n      {\n        # stdafx modified => compile all\n        $dirtyStdafx = $true\n        break\n      }\n\n      if (![string]::IsNullOrEmpty($cpp))\n      {\n        if ([System.IO.Path]::IsPathRooted($cpp))\n        {\n          if ($global:cptFilesToProcess.ContainsKey($cpp))\n          {\n            # really fast, use cache\n            $filteredCpps[$cpp] = $global:cptFilesToProcess[$cpp]\n          }\n        }\n        else\n        {\n          # take the slow road and check if it matches\n          $global:cptFilesToProcess.Keys | Where-Object {  IsFileMatchingName -filePath $_ -matchName $cpp } | `\n                                           ForEach-Object { $filteredCpps[$_] = $global:cptFilesToProcess[$_] }\n        }\n      }\n    }\n\n    if (!$dirtyStdafx)\n    {\n      $global:cptFilesToProcess = $filteredCpps\n    }\n    else\n    {\n      Write-Verbose \"PCH header has been targeted as dirty. Building entire project\"\n    }\n  }\n  \n  Write-InformationTimed \"Filtered out CPPs from bucket\"\n\n  Write-Verbose (\"Processing \" + $global:cptFilesToProcess.Count + \" cpps\")\n\n  #-----------------------------------------------------------------------------------------------\n  # CREATE PCH IF NEED BE, ONLY FOR TWO CPPS OR MORE\n  #\n  # JSON Compilation Database file will outlive this execution run, while the PCH is temporary \n  # so we disable PCH creation for that case as well.\n\n  if ($kPchIsNeeded -and $global:cptFilesToProcess.Count -lt 2)\n  {\n    $kPchIsNeeded = $false\n  }\n\n  [string] $pchFilePath = \"\"\n  if ($kPchIsNeeded -and !$aExportJsonDB)\n  {\n    # COMPILE PCH\n    Write-Verbose \"Generating PCH...\"\n    $pchFilePath = Generate-Pch -stdafxDir        $stdafxDir    `\n                                -stdafxCpp        $stdafxCpp    `\n                                -stdafxHeaderName $stdafxHeader `\n                                -preprocessorDefinitions $preprocessorDefinitions `\n                                -includeDirectories $includeDirectories `\n                                -additionalIncludeDirectories $additionalIncludeDirectories\n    Write-Verbose \"PCH: $pchFilePath\"\n    if ([string]::IsNullOrEmpty($pchFilePath) -and $aContinueOnError)\n    {\n      Write-Output \"Skipping project. Reason: cannot create PCH.\"\n      return\n    }\n    Write-InformationTimed \"Created PCH\"\n  }  \n\n  if ($kCacheRepositorySaveIsNeeded)\n  {\n    Write-InformationTimed \"Before serializing project\"\n    Save-ProjectToCacheRepo\n    Write-InformationTimed \"After serializing project\"\n  }\n\n  #-----------------------------------------------------------------------------------------------\n  # PROCESS CPP FILES. CONSTRUCT COMMAND LINE JOBS TO BE INVOKED\n\n  $clangJobs = @()\n\n  # Create directory where to store tidy fix replacements\n  if ($aTidyFixFlags)\n  {\n    $global:tidyFixReplacementDirPath = (Join-Path -path $kCptTidyFixReplacementsDir `\n                                                   -ChildPath (Split-Path (Get-SourceDirectory) -Leaf)) `\n                                                   + \"_\" + ([guid]::NewGuid().ToString())\n    # check if SolutionDir for tidy fix replacements already exists\n    if (Test-Path -LiteralPath $global:tidyFixReplacementDirPath)\n    {\n      Remove-Item $global:tidyFixReplacementDirPath -Recurse\n      New-Item -Path $global:tidyFixReplacementDirPath -ItemType \"directory\" > $null\n    }\n    else\n    {\n      New-Item -Path $global:tidyFixReplacementDirPath -ItemType \"directory\" > $null\n    }\n  }\n\n  foreach ($cpp in $global:cptFilesToProcess.Keys)\n  {\n    [string] $cppPchSetting = Get-ProjectFileSetting -propertyName 'PrecompiledHeader' -fileFullName $cpp -defaultValue 'Use'\n\n    if ($cppPchSetting -ieq 'Create')\n    {\n        continue # no point in compiling the PCH CPP\n    }\n\n    [string[]] $cppForceIncludes = Get-FileForceIncludes -fileFullName $cpp\n    [string] $exeToCall = Get-ExeToCall -workloadType $workloadType\n\n    [string] $finalPchPath = $pchFilePath\n    if ($cppPchSetting -ieq 'NotUsing')\n    {\n      $finalPchPath = \"\"\n      Write-Verbose \"`n[PCH] Will ignore precompiled headers for $cpp`n\"\n    }\n\n    [string] $exeArgs   = Get-ExeCallArguments -workloadType            $workloadType `\n                                               -pchFilePath             $finalPchPath `\n                                               -preprocessorDefinitions $preprocessorDefinitions `\n                                               -forceIncludeFiles       $cppForceIncludes `\n                                               -currentFile             $cpp `\n                                               -includeDirectories      $includeDirectories `\n                                               -additionalIncludeDirectories $additionalIncludeDirectories\n\n    $newJob = New-Object PsObject -Prop @{ 'FilePath'          = $exeToCall\n                                         ; 'WorkingDirectory'  = Get-SourceDirectory\n                                         ; 'ArgumentList'      = $exeArgs\n                                         ; 'File'              = $cpp\n                                         ; 'JobCounter'        = 0 <# will be lazy initialized #>\n                                         ; 'TidyFlagsTempFile' = $kClangTidyFlagTempFile\n                                         }\n    $clangJobs += $newJob\n  }\n  \n  Write-InformationTimed \"Created job workers\"\n\n  #-----------------------------------------------------------------------------------------------\n  # PRINT DIAGNOSTICS\n\n  if ($clangJobs.Count -ge 1)\n  {\n    [string] $exeToCallVerbosePath  = $exeToCall\n    if (![string]::IsNullOrWhiteSpace($global:llvmLocation))\n    {\n      $exeToCallVerbosePath = \"$($global:llvmLocation)\\$exeToCallVerbosePath\"\n    }\n    Write-Verbose \"INVOKE: $exeToCallVerbosePath $($clangJobs[0].ArgumentList)\"\n  }\n\n  Write-InformationTimed \"Running workers\"\n\n  #-----------------------------------------------------------------------------------------------\n  # RUN CLANG JOBS\n  \n  if ($aExportJsonDB)\n  {\n   foreach ($job in $clangJobs)\n   {\n     [string] $clangToolPath = $job.FilePath\n     if (Exists-Command $clangToolPath)\n     {\n       # see precisely what path the tool has, to prevent ambiguities.\n       $clangToolPath = (Get-Command $job.FilePath).Source\n     }\n     [string] $clangCommand = \"\"\"$clangToolPath\"\" $($job.ArgumentList)\"\n     JsonDB-Push -directory $job.WorkingDirectory -file $job.File -command $clangCommand\n   }\n  }\n  else \n  {\n    Run-ClangJobs -clangJobs $clangJobs -workloadType $workloadType\n    Apply-TidyFixReplacements -workloadType $workloadType\n  }\n}\n\n#-------------------------------------------------------------------------------------------------\n# Script entry point\n\nClear-Host # clears console\n\nWrite-InformationTimed \"Cleared console. Let's begin...\"\n\n#-------------------------------------------------------------------------------------------------\n# If we didn't get a location to run CPT at, use the current working directory\n\nif (!$aSolutionsPath)\n{\n  $aSolutionsPath = (Get-Location).Path\n}\n\n# ------------------------------------------------------------------------------------------------\n# Load param values from configuration file (if exists)\n\nUpdate-ParametersFromConfigFile\nWrite-InformationTimed \"Updated script parameters from cpt.config\"\n\n# ------------------------------------------------------------------------------------------------\n# Initialize the Visual Studio version variable\n\n$global:cptVisualStudioVersion = If ( $aVisualStudioVersion ) `\n                                    { $aVisualStudioVersion } Else `\n                                    { $global:cptDefaultVisualStudioVersion }\n\n#-------------------------------------------------------------------------------------------------\n# Print script parameters\n\nPrint-InvocationArguments\nWrite-InformationTimed \"Print args\"\n\n[WorkloadType] $workloadType = [WorkloadType]::Compile\n\nif (![string]::IsNullOrEmpty($aTidyFlags))\n{\n   $workloadType = [WorkloadType]::Tidy\n   if (Test-Path -LiteralPath $aTidyFlags)\n   {\n     $kClangTidyFlagTempFile = $aTidyFlags\n   }\n}\n\nif (![string]::IsNullOrEmpty($aTidyFixFlags))\n{\n   $workloadType = [WorkloadType]::TidyFix\n   if (Test-Path -LiteralPath $aTidyFixFlags)\n   {\n     $kClangTidyFlagTempFile = $aTidyFixFlags\n   }\n}\n\n#-------------------------------------------------------------------------------------------------\n# Script entry point\n\nWrite-Verbose \"CPU logical core count: $kLogicalCoreCount\"\n\n# If LLVM is not in PATH try to detect it automatically\n[string] $global:llvmLocation = \"\"\n\n$clangToolWeNeed = Get-ExeToCall -workloadType $workloadType\n\n$global:llvmLocation = Ensure-LLVMTool-IsPresent $clangToolWeNeed\nif ($aTidyFixFlags)\n{\n  Ensure-LLVMTool-IsPresent $kClangApplyReplacements\n}\nif (![string]::IsNullOrEmpty($global:llvmLocation))\n{\n  $env:Path += \";\" + $global:llvmLocation\n}\nSet-Variable -name \"kLLVMVersion\" -value (Get-ClangVersion $clangToolWeNeed) -scope Global\n\n# initialize JSON compilation db support, if required\nif ($aExportJsonDB) \n{ \n  JsonDB-Init \n}\n\nPush-Location -LiteralPath (Get-SourceDirectory)\n\nWrite-InformationTimed \"Searching for solutions\"\n\n# fetch .sln paths and data\nLoad-Solutions\n\nWrite-InformationTimed \"End solution search\"\n\n# This PowerShell process may already have completed jobs. Discard them.\nRemove-Job -State Completed\nWrite-InformationTimed \"Discarded already finished jobs\"\n\nWrite-Verbose \"Source directory: $(Get-SourceDirectory)\"\nWrite-Verbose \"Scanning for project files\"\n\nWrite-InformationTimed \"Searching for project files\"\n[System.IO.FileInfo[]] $projects = @(Get-Projects)\n[int] $initialProjectCount       = $projects.Count\nWrite-Verbose (\"Found $($projects.Count) projects\")\nWrite-InformationTimed \"End project files search\"\n\n# ------------------------------------------------------------------------------------------------\n# If we get headers in the -file arg we have to detect CPPs that include that header\n\nif ($aCppToCompile -and $aCppToCompile.Count -gt 0)\n{\n  # We've been given particular files to compile. If headers are among them\n  # we'll find all source files that include them and tag them for processing.\n  Write-Progress -Activity \"#Include discovery\" -Status \"Detecting CPPs which include the specified headers...\"\n  [string[]] $headerRefs = @(Get-HeaderReferences -files $aCppToCompile)\n  Write-Progress -Activity \"#Include discovery\" -Completed\n  if ($headerRefs.Count -gt 0)\n  {\n    Write-Verbose-Array -name \"Detected referenced source files to process\" -array $headerRefs\n\n    $aCppToCompile += @($headerRefs | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n  }\n}\n\nif ($aCppToIgnore -and $aCppToIgnore.Count -gt 0)\n{\n  # We've been given particular files to ignore. If headers are among them\n  # we'll find all source files that include them and tag them to be ignored.\n\n  Write-Progress -Activity \"CPP Ignore Detection\" -Status \"Detecting CPPs which include the specified ignore-headers...\"\n  [string[]] $headerRefs = @(Get-HeaderReferences -files $aCppToIgnore)\n  Write-Progress -Activity \"CPP Ignore Detection\" -Completed\n\n  if ($headerRefs.Count -gt 0)\n  {\n    Write-Verbose-Array -name \"Detected referenced source files to ignore\" -array $headerRefs\n\n    $global:cptIgnoredFilesPool += @($headerRefs | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n  }\n}\n\n# ------------------------------------------------------------------------------------------------\n\nWrite-InformationTimed \"Starting projects\"\n\n[System.IO.FileInfo[]] $projectsToProcess = @()\n[System.IO.FileInfo[]] $ignoredProjects   = @()\n\nif (!$aVcxprojToCompile -and !$aVcxprojToIgnore)\n{\n  $projectsToProcess = $projects # we process all projects\n}\nelse\n{\n  # some filtering has to be done\n\n  if ($aVcxprojToCompile)\n  {\n    $projects = $projects | Where-Object { Should-CompileProject -vcxprojPath $_.FullName }\n    $projectsToProcess = @($projects)\n  }\n\n  if ($aVcxprojToIgnore)\n  {\n    $projectsToProcess = @($projects | `\n                         Where-Object { !(Should-IgnoreProject  -vcxprojPath $_.FullName ) })\n\n    $ignoredProjects = ($projects | Where-Object { $projectsToProcess -notcontains $_ })\n  }\n}\n\nif ($projectsToProcess.Count -eq 0)\n{\n  Write-Err \"Cannot find given project(s)\"\n}\n\nif ($aCppToCompile -and $projectsToProcess.Count -gt 1)\n{\n  # We've been given particular files to compile, we can narrow down\n  # the projects to be processed (those that include any of the particular files)\n\n  # For obvious performance reasons, no filtering is done when there's only one project to process.\n  [System.IO.FileInfo[]] $projectsThatIncludeFiles = @(Get-SourceCodeIncludeProjects -projectPool $projectsToProcess `\n                                                                                     -files $aCppToCompile)\n  Write-Verbose-Array -name \"Detected projects\" -array $projectsThatIncludeFiles\n\n  # some projects include files using wildcards, we won't match anything in them\n  # so when matching nothing we don't do filtering at all\n  if ($projectsThatIncludeFiles)\n  {\n    $projectsToProcess = $projectsThatIncludeFiles\n  }\n}\n\nif ($projectsToProcess.Count -eq $initialProjectCount)\n{\n  Write-Verbose \"PROCESSING ALL PROJECTS\"\n}\nelse\n{\n  if ($projectsToProcess.Count -gt 1)\n  {\n      Write-Array -name \"PROJECTS\" -array $projectsToProcess\n  }\n\n  if ($ignoredProjects)\n  {\n    Write-Array -name \"IGNORED PROJECTS\" -array $ignoredProjects\n  }\n}\n\n# ------------------------------------------------------------------------------------------------\n\nif (!$aResumeAfterError)\n{\n  $global:cptProjectCounter = $projectsToProcess.Length\n}\nelse\n{\n  if (!(VariableExists 'cptProjectCounter') -or !(VariableExists 'cptProjectsBucket'))\n  {\n    Write-Warning \"Can't resume. Previous state is unreliable. Processing all projects...\"\n    $global:cptProjectCounter = $projectsToProcess.Length\n  }\n  elseif ((Compare-Object $projectsToProcess $global:cptProjectsBucket))\n  {\n    Write-Warning \"Can't resume. Previous state is unreliable. Processing all projects...`n`nREMINDER: Don't change arguments when adding -resume.`n`n\"\n    $global:cptProjectCounter = $projectsToProcess.Length\n  }\n  else\n  {\n    Write-Output \"Resuming from project #$($global:cptProjectCounter)\"\n  }\n}\n\n[System.IO.FileInfo[]] $global:cptProjectsBucket = $projectsToProcess\n\n[int] $localProjectCounter = $projectsToProcess.Length;\nforeach ($project in $projectsToProcess)\n{\n  if ($localProjectCounter -gt $global:cptProjectCounter)\n  {\n    $localProjectCounter--;\n    continue\n  }\n\n  [string] $vcxprojPath = $project.FullName;\n  \n\n  [string[]] $configPlatforms = $aVcxprojConfigPlatform\n  if ($configPlatforms.Count -eq 0)\n  {\n    $configPlatforms += @(\"\")\n  }\n\n  foreach ($crtPlatformConfig in $configPlatforms)\n  {    \n    Write-InformationTimed \"Before project process\"\n    Process-Project -vcxprojPath $vcxprojPath -workloadType $workloadType -platformConfig $crtPlatformConfig\n    Write-InformationTimed \"After project process\"\n\n    Write-Output \"\" # empty line separator\n  }\n\n  $localProjectCounter -= 1\n  $global:cptProjectCounter = $localProjectCounter\n}\n\nif ($aExportJsonDB) \n{ \n  JsonDB-Finalize\n}\n\n\nWrite-InformationTimed \"Goodbye\"\n\nif ($global:FoundErrors)\n{\n  Fail-Script\n}\nelse\n{\n  Exit-Script\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/get-header-references.ps1",
    "content": "# line limit for scanning files for #include\n[int] $global:cpt_header_include_line_limit = 30\n\n# after the line limit, if any includes are still found we\n# extend the limit with this value\n[int] $global:cpt_header_include_line_extension = 10\n\n[string[]] $global:headerExtensions = @('h', 'hh', 'hpp', 'hxx')\n[string[]] $global:sourceExtensions = @('c', 'cc', 'cpp', 'cxx')\n\nFunction detail:FindHeaderReferences( [Parameter(Mandatory = $false)] [string[]] $headers\n                                    , [Parameter(Mandatory = $false)] [System.IO.FileInfo[]] $filePool\n                                    , [Parameter(Mandatory = $false)] [System.Collections.Hashtable] $alreadyFound = @{}\n                                    )\n{\n    if (!$headers)\n    {\n        return @()\n    }\n\n    [string] $regexHeaders = @($headers | ForEach-Object { ([System.IO.FileInfo]$_).BaseName } `\n                                       | Select-Object -Unique `\n                                       | Where-Object { $_ -ine \"stdafx\" -and $_ -ine \"resource\" } `\n                              ) -join '|'\n\n    if ($regexHeaders.Length -eq 0)\n    {\n        return @()\n    }\n\n    [string] $regex = \"[/\"\"]($regexHeaders)\\.($($global:headerExtensions -join '|'))\"\"\"\n    Write-Debug \"Regex for header reference find: $regex`n\"\n\n    [string[]] $returnRefs = @()\n    if (!$filePool)\n    {\n        # initialize pool of files that we look into\n        [string[]] $allFileExts = @(($global:sourceExtensions + `\n                                     $global:headerExtensions) | ForEach-Object { \"*.$_\" })\n        $filePool = Get-ChildItem -recurse -include $allFileExts\n    }\n\n    foreach ($file in $filePool)\n    {\n        if ($alreadyFound.ContainsKey($file.FullName))\n        {\n            continue\n        }\n\n        [int] $lineCount = 0\n        [int] $lineLimit = $global:cpt_header_include_line_limit\n        foreach($line in [System.IO.File]::ReadLines($file))\n        {\n            if ([string]::IsNullOrWhiteSpace($line))\n            {\n                # skip empty lines\n                continue\n            }\n\n            if ($line -match $regex)\n            {\n                if ( ! $alreadyFound.ContainsKey($file.FullName))\n                {\n                    $alreadyFound[$file.FullName] = $true\n                    $returnRefs += $file.FullName\n                }\n\n                if ($lineCount -eq $lineLimit)\n                {\n                    # we still have includes to scan\n                    $lineLimit += $global:cpt_header_include_line_extension\n                }\n            }\n\n            if ( (++$lineCount) -gt $lineLimit)\n            {\n                break\n            }\n        }\n    }\n\n    if ($returnRefs.Count -gt 0)\n    {\n        [string[]] $headersLeftToSearch = @($returnRefs | Where-Object `\n                                            { FileHasExtension -filePath $_ `\n                                                               -ext $global:headerExtensions } )\n        if ($headersLeftToSearch.Count -gt 0)\n        {\n            Write-Debug \"[!] Recursive reference detection in progress for: \"\n            Write-Debug ($headersLeftToSearch -join \"`n\")\n            $returnRefs += detail:FindHeaderReferences -headers      $headersLeftToSearch `\n                                                       -filePool     $filePool `\n                                                       -alreadyFound $alreadyFound\n        }\n    }\n\n    $returnRefs = $returnRefs | Select-Object -Unique\n    Write-Debug \"Found header refs (regex $regex)\"\n    Write-Debug ($returnRefs -join \"`n\")\n    return $returnRefs\n}\n\n<#\n.SYNOPSIS\nDetects source files that reference given headers.\n\nReturns an array with full paths of files that reference the header(s).\n.DESCRIPTION\nWhen modifying a header, all translation units that include that header\nhave to compiled. This function detects those files that include it.\n.PARAMETER files\nHeader files of which we want references to be found\nAny files that are not headers will be ignored.\n#>\nFunction Get-HeaderReferences([Parameter(Mandatory = $false)][string[]] $files)\n{\n    if ($files.Count -eq 0)\n    {\n        return @()\n    }\n\n    # we take interest only in files that reference headers\n    $files = @($files | Where-Object { FileHasExtension -filePath $_ `\n                                                        -ext $global:headerExtensions })\n    if ($files.Count -eq 0)\n    {\n        return @()\n    }\n\n    [string[]] $refs = @()\n\n    if ($files.Count -gt 0)\n    {\n        Write-Verbose-Timed \"Headers changed. Detecting which source files to process...\"\n        $refs = detail:FindHeaderReferences -headers $files\n        Write-Verbose-Timed \"Finished detecting source files.\"\n\n        $refs = $refs | Where-Object { ! [string]::IsNullOrWhiteSpace($_) }\n    }\n\n    return $refs\n}\n\n<#\n.SYNOPSIS\nDetects projects that reference given source files (i.e. cpps).\n\nReturns an array with full paths of detected projects.\n.DESCRIPTION\nWhen modifying a file, only projects that reference that file should be recompiled.\n.PARAMETER projectPool\nProjects in which to look\n.PARAMETER files\nSource files to be found in projects.\n#>\nFunction Get-SourceCodeIncludeProjects([Parameter(Mandatory = $false)][System.IO.FileInfo[]] $projectPool,\n                                       [Parameter(Mandatory = $false)][string[]] $files)\n{\n    [System.Collections.Hashtable] $fileCache = @{}\n    foreach ($file in $files)\n    {\n        if ($file)\n        {\n            $fileCache[$file.Trim().ToLower()] = $true\n        }\n    }\n\n    [System.IO.FileInfo[]] $matchedProjects = @()\n\n    [string] $clPrefix    = '<ClCompile Include=\"'\n    [string] $clSuffix    = '\" />'\n    [string] $endGroupTag = '</ItemGroup>'\n\n    foreach ($proj in $projectPool)\n    {\n        [string] $projDir  = $proj.Directory.FullName\n\n        [bool] $inClIncludeSection = $false\n        foreach($line in [System.IO.File]::ReadLines($proj.FullName))\n        {\n            $line = $line.Trim()\n\n            if ($line.StartsWith($clPrefix))\n            {\n                if (!$inClIncludeSection)\n                {\n                    $inClIncludeSection = $true\n                }\n\n                [string] $filePath = $line.Substring($clPrefix.Length, `\n                                                     $line.Length - $clPrefix.Length - $clSuffix.Length)\n                if (![System.IO.Path]::IsPathRooted($filePath))\n                {\n                    $filePath = Canonize-Path -base $projDir -child $filePath -ignoreErrors\n                }\n                if ([string]::IsNullOrEmpty($filePath))\n                {\n                    continue\n                }\n\n                [System.IO.FileInfo] $sourceFile = $filePath\n                if ($fileCache.ContainsKey($sourceFile.FullName.Trim().ToLower()) -or `\n                    $fileCache.ContainsKey($sourceFile.Name.Trim().ToLower()))\n                {\n                    $matchedProjects += $proj\n                    break\n                }\n            }\n\n            if ($inClIncludeSection -and $line -eq $endGroupTag)\n            {\n                # nothing more to check in this project\n                break\n            }\n        }\n    }\n\n    return $matchedProjects\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/get-llvm-helper.ps1",
    "content": "# This helper makes sure we have the LLVM tool we require present on disk.\n# If it's not available then we download it from GitHub.\n \n# REQUIRES \"io.ps1\" to be included\n\n# ------------------------------------------------------------------------------------------------\n# Default install locations of LLVM. If present there, we automatically use it\n\nSet-Variable -name kLLVMInstallLocations    -value @(\"${Env:ProgramW6432}\\LLVM\\bin\"\n                                                    ,\"${Env:ProgramFiles(x86)}\\LLVM\\bin\"\n                                                    )                   -option Constant\n#Url to assets (clang++ and clang-tidy) from previous release made by Clang Power Tools on github \nSet-Variable -name kCptGithubLlvm -value \"https://github.com/Caphyon/clang-power-tools/releases/download/v2023.6.0\" `\n                                  -option Constant\nSet-Variable -name kCptGithubLlvmVersion -value \"16.0.6 (LLVM 16.0.6)\" -Option Constant\n\n# Clang Constants\n\nSet-Variable -name kCss            -value \"clang-doc-default-stylesheet.css\"       -option Constant\nSet-Variable -name kClangDoc       -value \"clang-doc.exe\"                          -option Constant\nSet-Variable -name kIndex          -value \"index.js\"                               -option Constant\n\nFunction Move-Tool-To-LlvmBin([Parameter(Mandatory = $true)][string] $clangToolWeNeed,\n                              [Parameter(Mandatory = $true)][string] $llvmLiteBinDir)\n{\n\n  $llvmLiteDir = (get-item $llvmLiteBinDir).Parent.FullName\n\n  if(Test-Path \"$llvmLiteDir\\$clangToolWeNeed\")\n  {\n    Move-Item -Path \"$llvmLiteDir\\$clangToolWeNeed\" -Destination \"$llvmLiteBinDir\\$clangToolWeNeed\"\n  }\n\n}\n\nFunction Ensure-LLVMTool-IsPresent([Parameter(Mandatory = $true)][string] $clangToolWeNeed) {\n  [string] $ret = \"\"\n\n  # see if we can reach the tool through PATH\n  if (Exists-Command $clangToolWeNeed )\n  {\n    [System.IO.FileInfo] $toolPath = (Get-Command $clangToolWeNeed).Source\n    return $toolPath.Directory.FullName\n  }\n  \n  # search in predefined locations\n  foreach ($locationLLVM in $kLLVMInstallLocations)\n  {\n    if (Test-Path -LiteralPath \"$locationLLVM\\$clangToolWeNeed\")\n    {\n      return $locationLLVM\n    }\n  }\n  # download read-to-use binary from github\n\n  [string] $llvmLiteDirParent = \"${env:APPDATA}\\ClangPowerTools\"\n  [string] $llvmLiteDir       = \"$llvmLiteDirParent\\LLVM_Lite\\Bin\"\n\n  [string] $llvmLiteToolPath = \"$llvmLiteDir\\$clangToolWeNeed\"\n  if (Test-Path $llvmLiteToolPath)\n  {\n    $versionPresent = (Get-Item $llvmLiteToolPath).VersionInfo.ProductVersion\n    if ($versionPresent -eq $kCptGithubLlvmVersion)\n    {\n      # we already have downloaded the latest standalone tool, reuse it\n      return $llvmLiteDir\n    }\n  }\n\n  if (Test-InternetConnectivity)\n  {\n    if ([string]::IsNullOrEmpty($ret))\n    {\n      if (!(Test-Path $llvmLiteDirParent))\n      {\n        New-Item -Path $llvmLiteDirParent -ItemType Directory | Out-Null\n      }\n      if (!(Test-Path $llvmLiteDir))\n      {\n        New-Item -Path $llvmLiteDir -ItemType Directory | Out-Null\n      }\n      \n      # check if tool already exists Llvm_lite folder, to move it in Llvm_lite/bin\n      Move-Tool-To-LlvmBin $clangToolWeNeed $llvmLiteDir\n\n      # the displayed progress slows downloads considerably, so disable it\n      $prevPreference = $ProgressPreference\n      $ProgressPreference = 'SilentlyContinue'\n      [string] $clangCompilerWebPath = \"$kCptGithubLlvm/$clangToolWeNeed\"\n      \n      if (Test-Path  $llvmLiteToolPath)\n      {\n        # we have an older version downloaded, remove it first\n        Remove-Item $llvmLiteToolPath -Force\n      }\n\n      Write-Verbose \"Downloading $clangToolWeNeed $kCptGithubLlvmVersion ...\"\n      # grab ready-to-use LLVM binaries from Github\n      Invoke-WebRequest -Uri $clangCompilerWebPath -OutFile $llvmLiteToolPath\n      # download css file if needed tool is clang-doc.exe\n      if($clangToolWeNeed -eq $kClangDoc)\n      {\n        [string] $parentDirLite = (get-item $llvmLiteDir ).Parent.FullName\n        [string] $llvmLiteCssFolderPath = \"$parentDirLite\\share\\clang\"\n        if (!(Test-Path $llvmLiteCssFolderPath))\n        {\n          New-Item $llvmLiteCssFolderPath -ItemType Directory | Out-Null\n        }\n        Invoke-WebRequest -Uri \"$kCptGithubLlvm/$kCss\" -OutFile \"$llvmLiteCssFolderPath\\$kCss\"\n        Invoke-WebRequest -Uri \"$kCptGithubLlvm/$kIndex\" -OutFile \"$llvmLiteCssFolderPath\\$kIndex\"\n      } \n      $ProgressPreference = $prevPreference\n\n      $ret = $llvmLiteDir\n    }\n  }\n  return $ret\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/get-llvm.ps1",
    "content": "<#\n.SYNOPSIS\n    Downloads ready-to-use one or more LLVM binaries, if not already available on system.\n\n.DESCRIPTION\n    Purpose of this script is to ensure that LLVM binaries are available for use.\n    The strategy used, for each tool, is: \n     * search in PATH\n     * search in Program Files\n     * search in %APPDATA%\\ClangPowerTools\\LLVM_Lite\n     * if not found, download tool and save in LLVM_Lite location\n\n.PARAMETER aTool\n    Alias 'tool'. The LLVM tool(s) to potentially download.\n\n.NOTES\n    Author: Gabriel Diaconita, Marina Rusu\n#>\n#Requires -Version 3\nparam( [alias(\"tool\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"LLVM tool(s) to ensure exist\")]\n       [string[]] $aTools = @()\n     )\n\nSet-StrictMode -version latest\n$ErrorActionPreference = 'Continue'\n\n. \"$PSScriptRoot\\io.ps1\"\n. \"$PSScriptRoot\\get-llvm-helper.ps1\"\n\n$ret = @()\nforeach ($tool in $aTools)\n{\n  [string] $toolLocation = Ensure-LLVMTool-IsPresent $tool\n  $ret += @($toolLocation)\n}\n\nWrite-Output $ret"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/io.ps1",
    "content": "#Console IO\n# ------------------------------------------------------------------------------------------------\nFunction Write-Message([parameter(Mandatory = $true)][string] $msg\n    , [Parameter(Mandatory = $true)][System.ConsoleColor] $color)\n{\n    $foregroundColor = $host.ui.RawUI.ForegroundColor\n    $host.ui.RawUI.ForegroundColor = $color\n    Write-Output $msg\n    $host.ui.RawUI.ForegroundColor = $foregroundColor\n}\n\nfunction Write-InformationTimed($message)\n{\n  if ($InformationPreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n  [DateTime] $lastTime = [DateTime]::Now\n  [string] $kTimeStampVar = \"lastCptTimestamp\"\n  if (VariableExists -name $kTimeStampVar)\n  {\n     $lastTime = (Get-Variable -name $kTimeStampVar -scope Global).Value\n  }\n  Set-Variable -name $kTimeStampVar -scope Global -value ([DateTime]::Now)\n  \n  [DateTime] $now = [DateTime]::Now;\n  [System.TimeSpan] $delta = $now - $lastTime\n\n  Write-Information \"$message at $([DateTime]::Now.ToString(\"mm:ss:fff\")). dt = $($delta.TotalMilliseconds)\"\n}\n\n# Writes an error without the verbose PowerShell extra-info (script line location, etc.)\nFunction Write-Err([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n  Write-Message -msg $msg -color Red\n}\n\nFunction Write-Success([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n  Write-Message -msg $msg -color Green\n}\n\nFunction Write-Array($array, $name)\n{\n    Write-Output \"$($name):\"\n    $array | ForEach-Object { Write-Output \"  $_\" }\n    Write-Output \"\" # empty line separator\n}\n\nFunction Write-Verbose-Array($array, $name)\n{\n  if ($VerbosePreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n  Write-Verbose \"$($name):\"\n  $array | ForEach-Object { Write-Verbose \"  $_\" }\n  Write-Verbose \"\" # empty line separator\n}\n\nFunction Write-Verbose-Timed([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n    Write-Verbose \"$([DateTime]::Now.ToString(\"[HH:mm:ss]\")) $msg\"\n}\n\nFunction Print-InvocationArguments()\n{\n  if ($VerbosePreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n\n  $bParams = $PSCmdlet.MyInvocation.BoundParameters\n  if ($bParams)\n  {\n    [string] $paramStr = \"clang-build.ps1 invocation args: `n\"\n    foreach ($key in $bParams.Keys)\n    {\n      $paramStr += \"  $($key) = $($bParams[$key]) `n\"\n    }\n    Write-Verbose $paramStr\n  }\n}\n\nFunction Print-CommandParameters([Parameter(Mandatory = $true)][string] $command)\n{\n    $params = @()\n    foreach ($param in ((Get-Command $command).ParameterSets[0].Parameters))\n    {\n        if (!$param.HelpMessage)\n        {\n            continue\n        }\n\n        $params += New-Object PsObject -Prop @{ \"Option\" = \"-$($param.Aliases[0])\"\n                                              ; \"Description\" = $param.HelpMessage\n                                              }\n    }\n\n   $params | Sort-Object -Property \"Option\" | Out-Default\n}\n\n\n\n# Function that gets the name of a command argument when it is only known by its alias\n# For streamlining purposes, it also accepts the name itself.\nFunction Get-CommandParameterName([Parameter(Mandatory = $true)][string] $command\n                                 ,[Parameter(Mandatory = $true)][string] $nameOrAlias)\n{\n  foreach ($param in ((Get-Command $command).ParameterSets[0].Parameters))\n  {\n    if ($param.Name    -eq       $nameOrAlias -or\n        $param.Aliases -contains $nameOrAlias)\n    {\n      return $param.Name\n    }\n  }\n  return \"\"\n}\nFunction VariableExists([Parameter(Mandatory = $true)][string] $name)\n{\n    if ( ! ( Get-Variable $name  -ErrorAction 'Ignore') )\n    {\n        return $false\n    }\n    return $true\n}\n\nFunction VariableExistsAndNotEmpty([Parameter(Mandatory = $true)][string] $name)\n{\n    if ( ! (VariableExists $name) )\n    {\n        return $false\n    }\n\n    if ( [string]::IsNullOrWhiteSpace( (Get-Variable $name).Value ) )\n    {\n        return $false\n    }\n    return $true\n}\nfunction HasProperty($object, $property)\n{\n    return ($property -in $object.PSobject.Properties.Name)\n}\n\n# File IO\n# ------------------------------------------------------------------------------------------------\nFunction Get-QuotedPath([Parameter(Mandatory = $false)][string] $path)\n{\n    if ([string]::IsNullOrWhiteSpace($path))\n    {\n        return $path\n    }\n\n    [string] $returnPath = $path\n\n    if (!$path.StartsWith('\"'))\n    {\n        $returnPath = \"\"\"$path\"\"\"\n    }\n\n    return $returnPath\n}\n\nFunction Get-UnquotedPath([Parameter(Mandatory = $false)][string] $path)\n{\n    [string] $retPath = $path\n    if ( ! [string]::IsNullOrWhiteSpace($retPath) -and $retPath.StartsWith('\"') )\n    {\n        $retPath = $retPath.Remove(0, 1);\n\n        if ( $retPath.EndsWith('\"') )\n        {\n            $retPath = $retPath.Remove($retPath.Length - 1, 1)\n        }\n        else \n        {\n            # if it begins with double quote, should end with double quote...\n            # something else may be going on, return the original path.\n            $retPath = $path\n        }\n    }\n    return $retPath\n}\n\nFunction Remove-PathTrailingSlash([Parameter(Mandatory = $true)][string] $path)\n{\n    return $path -replace '\\\\$', ''\n}\n\nFunction Get-FileDirectory([Parameter(Mandatory = $true)][string] $filePath)\n{\n    return ([System.IO.Path]::GetDirectoryName($filePath) + \"\\\")\n}\n\nFunction Get-FileName( [Parameter(Mandatory = $false)][string] $path\n                     , [Parameter(Mandatory = $false)][switch] $noext)\n{\n    if ($noext)\n    {\n        return ([System.IO.Path]::GetFileNameWithoutExtension($path))\n    }\n    else\n    {\n        return ([System.IO.Path]::GetFileName($path))\n    }\n}\n\nFunction IsFileMatchingName( [Parameter(Mandatory = $true)][string] $filePath\n                           , [Parameter(Mandatory = $true)] $matchName)\n{\n    [string] $matchString = $matchName.ToString() # works for both strings and regex types\n\n    if ($matchName -is [string])\n    {\n        if ([System.IO.Path]::IsPathRooted($matchString))\n        {\n            if ($matchName.Length -le $filePath.Length -and\n                ($filePath.Substring(0, $matchName.Length) -ieq $matchName))\n            {\n              return $true\n            }\n        }\n\n        [string] $fileName      = (Get-FileName -path $filePath)\n        if ($fileName -ieq $matchString)\n        {\n            return $true\n        }\n\n        [string] $fileNameNoExt = (Get-FileName -path $filePath -noext)\n        if ($fileNameNoExt -ieq $matchString)\n        {\n            return $true\n        }\n\n        if ($filePath.ToLower().EndsWith($matchName.ToLower()))\n        {\n            return $true\n        }\n\n        while (![string]::IsNullOrWhiteSpace($filePath))\n        {\n            if ($filePath.ToLower().EndsWith($matchName.ToLower()))\n            {\n                return $true\n            }\n            $filePath = [System.IO.Path]::GetDirectoryName($filePath)\n        }\n\n        return $false\n    }\n    elseif ($matchName -is [regex])\n    {\n        return $filePath -match $matchString\n    }\n    else\n    {\n        throw \"Unsupported match object type $($matchName.GetType().ToString())\"\n    }\n}\n\nFunction FileHasExtension( [Parameter(Mandatory = $true)][string]   $filePath\n                         , [Parameter(Mandatory = $true)][string[]] $ext\n                         )\n{\n    foreach ($e in $ext)\n    {\n        if ($filePath.EndsWith($e))\n        {\n            return $true\n        }\n    }\n    return $false\n}\n\nFunction Get-RandomString( [Parameter(Mandatory=$false)][int] $aLength = 10)\n{\n  return (-Join ((65..90) + (97..122) | Get-Random -Count $aLength | % { [char] $_ }))\n}\n\n<#\n  .DESCRIPTION\n  Merges an absolute and a relative file path.\n  .EXAMPLE\n  Having base = C:\\Windows\\System32 and child = .. we get C:\\Windows\n  .EXAMPLE\n  Having base = C:\\Windows\\System32 and child = ..\\..\\..\\.. we get C:\\ (cannot go further up)\n  .PARAMETER base\n  The absolute path from which we start.\n  .PARAMETER child\n  The relative path(s) to be merged into base. If multiple paths are specified, they can be separated \n  semicolon or space.\n  .PARAMETER ignoreErrors\n  If this switch is not present, an error will be triggered if the resulting path\n  is not present on disk (e.g. c:\\Windows\\System33).\n\n  If present and the resulting path does not exist, the function returns an empty string.\n  #>\nFunction Canonize-Path( [Parameter(Mandatory = $true)][string] $base\n    , [Parameter(Mandatory = $true)][string] $child\n    , [switch] $ignoreErrors)\n{\n    [string[]] $children = @()\n\n    $tokensBySemicolon = $child.Trim().Split(';')\n\n    foreach ($semicolonTok in $tokensBySemicolon)\n    {\n        if ([string]::IsNullOrWhiteSpace($semicolonTok))\n        {\n            continue\n        }\n        $tokensBySpace = $semicolonTok.Trim().Split(' ')\n        $currentToken = \"\"\n        foreach ($tok in $tokensBySpace)\n        {\n            if ($tok -match \"[A-Z]:.*\")\n            {\n                if ( ! [string]::IsNullOrWhiteSpace($currentToken))\n                {\n                    $children += $currentToken\n                }\n                $currentToken = $tok\n            }\n            else\n            {\n                if ($tok -ne $tokensBySpace[0])\n                {\n                    $currentToken += ' '\n                }\n                $currentToken += $tok\n            }\n        }\n        $children += $currentToken\n    }\n\n    Write-Debug \"Canonizing for base = $base and children = $children\"\n\n    [string[]] $retPaths = @()\n    [string] $errorAction = If ($ignoreErrors) {\"SilentlyContinue\"} Else {\"Stop\"}\n\n    if (Test-Path -LiteralPath $base)\n    {\n        # Join-Path doesn't support LiteralPath so make sure we sanitize\n        # the base path for unsupported characters\n        $base = $base.Replace('[', '`[');\n        $base = $base.Replace(']', '`]');\n    }\n\n    foreach ($childPath in $children)\n    {\n        $childPath = Get-UnquotedPath $childPath\n        $childPath = $childPath -replace \"`r\", \"\"\n        $childPath = $childPath -replace \"`n\", \"\"\n\n        if ([System.IO.Path]::IsPathRooted($childPath))\n        {\n            if ((Test-Path -LiteralPath $childPath))\n            {\n              $retPaths += @($childPath)\n            }\n        }\n        else\n        {\n            [string[]] $paths = @(Join-Path -Path \"$base\" -ChildPath \"$childPath\" -Resolve -ErrorAction $errorAction)\n            $retPaths += $paths\n        }\n    }\n\n    return $retPaths\n}\n\nfunction cpt::HasTrailingSlash([Parameter(Mandatory = $true)][string] $str)\n{\n    return $str.EndsWith('\\') -or $str.EndsWith('/')\n}\n\n\nfunction EnsureTrailingSlash([Parameter(Mandatory = $true)][string] $str)\n{\n    [string] $ret = If (cpt::HasTrailingSlash($str)) { $str } else { \"$str\\\" }\n    return $ret\n}\n\nfunction cpt::Exists([Parameter(Mandatory = $false)][string] $path)\n{\n    if ([string]::IsNullOrEmpty($path))\n    {\n        return $false\n    }\n\n    return Test-Path -LiteralPath $path\n}\n\nfunction cpt::MakePathRelative( [Parameter(Mandatory = $true)][string] $base\n                         , [Parameter(Mandatory = $true)][string] $target\n                         )\n{\n    Push-Location \"$base\\\"\n    [string] $relativePath = (Resolve-Path -Relative $target) -replace '^\\.\\\\',''\n    Pop-Location\n    if ( (cpt::HasTrailingSlash $target) -or $target.EndsWith('.') )\n    {\n        $relativePath += '\\'\n    }\n    return \"$relativePath\"\n}\n\n\nfunction cpt::GetDirNameOfFileAbove( [Parameter(Mandatory = $true)][string] $startDir\n                                   , [Parameter(Mandatory = $true)][string] $targetFile\n                                   )\n{\n    if ($targetFile.Contains('$'))\n    {\n        $targetFile = Invoke-Expression $targetFile\n    }\n    if ($startDir.Contains('$'))\n    {\n        $startDir = Invoke-Expression $startDir\n    }\n\n    [string] $base = $startDir\n    while ([string]::IsNullOrEmpty((Canonize-Path -base  $base        `\n                    -child $targetFile  `\n                    -ignoreErrors)))\n    {\n        $base = [System.IO.Path]::GetDirectoryName($base)\n        if ([string]::IsNullOrEmpty($base))\n        {\n            return \"\"\n        }\n    }\n    return $base\n}\n\nfunction cpt::GetPathOfFileAbove([Parameter(Mandatory = $true)][string] $targetFile,\n                                 [Parameter(Mandatory = $true)][string] $startDir\n                                )\n{\n    if ($targetFile.Contains('$'))\n    {\n        $targetFile = Invoke-Expression $targetFile\n    }\n\n    $base = (cpt::GetDirNameOfFileAbove -targetFile $targetFile -startDir $startDir)\n    if ([string]::IsNullOrWhiteSpace($base))\n    {\n        return \"\"\n    }\n    return \"$(EnsureTrailingSlash $base)$targetFile\"\n}\n\n# Command IO\n# ------------------------------------------------------------------------------------------------\nFunction Exists-Command([Parameter(Mandatory = $true)][string] $command)\n{\n    try\n    {\n        Get-Command -name $command -ErrorAction Stop | out-null\n        return $true\n    }\n    catch\n    {\n        return $false\n    }\n}\n\nFunction Get-ClangVersion([Parameter(Mandatory = $true)][string] $toolToCheck)\n{\n    if (Exists-Command $toolToCheck)\n    {\n        [string] $s = &\"$toolToCheck\" --version\n        $regexMatch = [regex]::match($s, 'version (\\d+).')\n        if ($regexMatch)\n        {\n            return ($regexMatch.Groups[1].Value -as [int])\n        }\n    }\n    return 0\n}\n\nFunction Test-InternetConnectivity\n{  \n  $resp = Get-WmiObject -Class Win32_PingStatus -Filter 'Address=\"github.com\" and Timeout=100' | Select-Object ResponseTime\n  [bool] $hasInternetConnectivity = ($resp.ResponseTime -and $resp.ResponseTime -gt 0)\n  return $hasInternetConnectivity\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/itemdefinition-context.ps1",
    "content": "# Powershell code for creating item definition group contexts\n\n[System.Collections.Hashtable] $global:itemProperties = @{}\n[string] $global:itemPropertyNamespace = \"\"\n\nfunction Reset-ProjectItemContext()\n{\n    $global:itemProperties = @{}\n    $global:itemPropertyNamespace = \"\"\n}\n\nfunction Push-ProjectItemContext([Parameter(Mandatory = $true)][string] $name)\n{\n    [string] $toAdd = \"\"\n    if ($global:itemPropertyNamespace.Length -gt 0)\n    {\n        $toAdd = \".\";\n    }\n    $toAdd += $name\n\n    $global:itemPropertyNamespace += $toAdd\n\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Pop-ProjectItemContext()\n{\n    [int] $dotPos = $global:itemPropertyNamespace.LastIndexOf(\".\")\n    if ($dotPos -ge 0)\n    {\n        $global:itemPropertyNamespace = $global:itemPropertyNamespace.Substring(0, $dotPos)\n    }\n    else\n    {\n        $global:itemPropertyNamespace = \"\"\n    }\n\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Set-ProjectItemContext([Parameter(Mandatory = $true)][AllowEmptyString()][string] $name)\n{\n    if ( (VariableExists 'itemPropertyNameSpace') -and ($global:itemPropertyNamespace -eq $name) )\n    {\n        return\n    }\n\n    $global:itemPropertyNamespace = $name\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Get-ProjectItemContext()\n{\n    return $global:itemPropertyNamespace\n}\n\nfunction Get-ProjectItemProperty([Parameter(Mandatory = $false)][string] $propertyName)\n{\n    if (! $global:itemProperties.ContainsKey($global:itemPropertyNamespace))\n    {\n        return $null\n    }\n\n    [System.Collections.Hashtable] $propMap = $global:itemProperties[$global:itemPropertyNamespace]\n    if (!$propertyName)\n    {\n        return $propMap\n    }\n\n    if (! $propMap.ContainsKey($propertyName))\n    {\n        return $null\n    }\n\n    return $propMap[$propertyName]\n}\n\nfunction Set-ProjectItemProperty([Parameter(Mandatory = $true)][string] $propertyName,\n                                 [Parameter(Mandatory = $true)] $value)\n{\n    if (! $global:itemProperties.ContainsKey($global:itemPropertyNamespace))\n    {\n        $global:itemProperties.Add($global:itemPropertyNamespace, @{})\n        $global:ProjectSpecificVariables.Add('itemProperties') | out-null\n    }\n\n    [System.Collections.Hashtable] $propMap = $global:itemProperties[$global:itemPropertyNamespace]\n    if (! $propMap.ContainsKey($propertyName))\n    {\n        $propMap.Add($propertyName, $value)\n    }\n    else\n    {\n        $propMap[$propertyName] = $value\n    }\n\n    Write-Verbose \"[CONTEXT] propSet: $propertyName = $value\"\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/jsondb-export.ps1",
    "content": "function JsonDB-Init()\n{\n  [string] $outputPath = (EnsureTrailingSlash( Get-SourceDirectory ))\n  $outputPath += \"compile_commands.json\"\n  Set-Variable -name \"kJsonCompilationDbPath\" -value $outputPath -option Constant -scope Global\n  Set-Variable -name \"kJsonCompilationDbCount\" -value 0 -scope Global\n  \n  \"[\" | Out-File $kJsonCompilationDbPath -Encoding \"UTF8\"\n}\n\nfunction JsonDB-Append($text)\n{\n  $text | Out-File $kJsonCompilationDbPath -append -Encoding \"UTF8\"\n}\n\nfunction JsonDB-Finalize()\n{\n  JsonDB-Append \"]\"\n  Write-Output \"Exported JSON Compilation Database to $kJsonCompilationDbPath\"\n}\n\nfunction JsonDB-Push($directory, $file, $command)\n{\n  if ($kJsonCompilationDbCount -ge 1)\n  {\n    JsonDB-Append \"  ,\"\n  }\n  \n  # use only slashes\n  $command = $command.Replace('\\', '/')\n  $file = $file.Replace('\\', '/')\n  $directory = $directory.Replace('\\', '/')\n  \n  # escape double quotes\n  $command = $command.Replace('\"', '\\\"')\n  \n  # make paths relative to directory\n  $command = $command.Replace(\"$directory/\", \"\")\n  $file = $file.Replace(\"$directory/\", \"\")\n  \n  JsonDB-Append \"  {`r`n    \"\"directory\"\": \"\"$directory\"\",`r`n    \"\"command\"\": \"\"$command\"\",`r`n    \"\"file\"\": \"\"$file\"\"`r`n  }\"\n   \n  Set-Variable -name \"kJsonCompilationDbCount\" -value ($kJsonCompilationDbCount + 1) -scope Global\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/msbuild-expression-eval.ps1",
    "content": "# REQUIRES io.ps1 to be included\n\n[string[]] $buildUtilPaths = @(\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Enterprise\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Professional\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Enterprise\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Professional\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n)\n\nforeach ($buildUtilPath in $buildUtilPaths)\n{\n    if (Test-Path -LiteralPath $buildUtilPath)\n    {\n        Add-Type -path $buildUtilPath\n        Write-Verbose \"Loaded assembly $buildUtilPath\"\n        break\n    }\n}\n\nSet-Variable -name \"kMsbuildExpressionToPsRules\" <#-option Constant#>     `\n    -value @(                                                             `\n        <# backticks are control characters in PS, replace them #>        `\n          ('`'                               , ''''                      )`\n        <# Temporarily replace $( #>                                      `\n        , ('\\$\\s*\\('                         , '!@#'                     )`\n        <# Escape $ #>                                                    `\n        , ('\\$'                              , '`$'                      )`\n        <# Put back $( #>                                                 `\n        , ('!@#'                             , '$('                      )`\n        <# Various operators #>                                           `\n        , (\"([\\s\\)\\'\"\"])!=\"                  , '$1 -ne '                 )`\n        , (\"([\\s\\)\\'\"\"])<=\"                  , '$1 -le '                 )`\n        , (\"([\\s\\)\\'\"\"])>=\"                  , '$1 -ge '                 )`\n        , (\"([\\s\\)\\'\"\"])==\"                  , '$1 -eq '                 )`\n        , (\"([\\s\\)\\'\"\"])<\"                   , '$1 -lt '                 )`\n        , (\"([\\s\\)\\'\"\"])>\"                   , '$1 -gt '                 )`\n        , (\"([\\s\\)\\'\"\"])or\"                  , '$1 -or '                 )`\n        , (\"([\\s\\)\\'\"\"])and\"                 , '$1 -and '                )`\n        <# Use only double quotes #>                                      `\n        , (\"\\'\"                              , '\"'                       )`\n        , (\"Exists\\((.*?)\\)(\\s|$)\"           , '(cpt::Exists($1))$2'          )`\n        , (\"HasTrailingSlash\\((.*?)\\)(\\s|$)\" , '(cpt::HasTrailingSlash($1))$2')`\n        , (\"(\\`$\\()(Registry:)(.*?)(\\))\"     , '$$(GetRegValue(\"$3\"))'   )`\n        , (\"\\[MSBuild\\]::GetDirectoryNameOfFileAbove\\((.+?),\\s*`\"?'?((\\$.+?\\))|(.+?))((|`\"|')\\))+\"`\n        ,'cpt::GetDirNameOfFileAbove -startDir $1 -targetFile ''$2'')'        )`\n        , (\"\\(\\[MSBuild\\]::GetPathOfFileAbove\\(`\"?(.+?)`\"?,\\s*((`\"(.+)`\"\\)+)|((\\$\\(.+?\\))\\)*))\"`\n        ,'(cpt::GetPathOfFileAbove -startDir \"$4$6\" -targetFile ''$1'')'    )`\n        , (\"\\[MSBuild\\]::MakeRelative\\((.+?),\\s*\"\"?'?((\\$.+?\\))|(.+?))((|\"\"|')\\)\\))+\"`\n        ,'cpt::MakePathRelative -base $1 -target \"$2\")'                       )`\n        , ('SearchOption\\.', '[System.IO.SearchOption]::'                )`\n        , (\"@\\((.*?)\\)\", '$(Get-Project-Item(\"$1\"))'                     )`\n        , (\"%\\((.*?)\\)\", '$(Get-ProjectItemProperty(\"$1\"))'              )`\n        , ('\\$\\(HOME\\)', '$(CPT_SHIM_HOME)'                              )`\n        <# Rules for making sure the $ sign is put on correctly in expressions #> `\n        , ('\\$\\(([a-zA-Z_][a-zA-Z0-9_\\-]+)\\)', '$${$1}'                  )`\n        , ('\\(([a-zA-Z_][a-zA-Z0-9_\\-]+\\.)', '($$$1'                     )`\n)\n\nfunction GetRegValue([Parameter(Mandatory = $true)][string] $regPath)\n{\n    Write-Debug \"REG_READ $regPath\"\n\n    [int] $separatorIndex = $regPath.IndexOf('@')\n    [string] $valueName = \"\"\n    if ($separatorIndex -gt 0)\n    {\n        [string] $valueName = $regPath.Substring($separatorIndex + 1)\n        $regPath = $regPath.Substring(0, $separatorIndex)\n    }\n    if ([string]::IsNullOrEmpty($valueName))\n    {\n        throw \"Cannot retrieve an empty registry value\"\n    }\n    $regPath = $regPath -replace \"HKEY_LOCAL_MACHINE\\\\\", \"HKLM:\\\"\n\n    if (Test-Path $regPath)\n    {\n        return (Get-Item $regPath).GetValue($valueName)\n    }\n    else\n    {\n        return \"\"\n    }\n}\n\nfunction Initialize-ExpressionVariables([string] $expression)\n{\n    # expressions that call member functions of unintialized variables will throw\n    # unless we initialize those variables\n    $regexMatches = [regex]::matches($expression, '\\$(\\w+)\\.')\n    if ($regexMatches.Count -gt 0)\n    {\n        foreach ($regexMatch in $regexMatches)\n        {\n            $varName = $regexMatch.Groups[1].Value\n            if (! ( Get-Variable $varName  -ErrorAction 'Ignore') )\n            {\n                Write-Debug \"Initializing expression variable $varName to empty value\"\n                Set-Var -name $varName -value \"\" \n            }\n        }\n    }\n}\n\nfunction Evaluate-MSBuildExpression([string] $expression, [switch] $isCondition)\n{\n    # A lot of MSBuild expressions refer uninitialized variables\n    Set-StrictMode -Off\n\n    Write-Debug \"Start evaluate MSBuild expression $expression\"\n\n    foreach ($rule in $kMsbuildExpressionToPsRules)\n    {\n        $expression = $expression -replace $rule[0], $rule[1]\n    }\n\n    if ( !$isCondition -and ($expression.IndexOf('$') -lt 0))\n    {\n        # we can stop here, further processing is not required\n        return $expression\n    }\n\n    Write-Debug \"Intermediate PS expression: $expression\"\n\n    Initialize-ExpressionVariables $expression\n    [string] $res = \"\"\n\n    try\n    {\n        if ( ($expression.IndexOf('::') -ge 0) -or $isCondition)\n        {\n            try\n            {\n                $resInvokeResult = Invoke-Expression $expression\n\n                if ($resInvokeResult -is [array])\n                {\n                    $res = $resInvokeResult -join ';'\n                }\n                else\n                {\n                    $res = $resInvokeResult\n                }\n            }\n            catch\n            {\n                Write-Verbose $_.Exception.Message\n                $res = $ExecutionContext.InvokeCommand.ExpandString($expression)\n            }\n        }\n        else\n        {\n            $res = $ExecutionContext.InvokeCommand.ExpandString($expression)\n        }\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n    }\n\n    Write-Debug \"Evaluated expression to: $res\"\n\n    return $res\n}\nfunction Evaluate-MSBuildCondition([Parameter(Mandatory = $true)][string] $condition)\n{\n    Write-Debug \"Evaluating condition $condition\"\n\n    try\n    {\n        [string] $expression = Evaluate-MSBuildExpression -expression $condition -isCondition\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n        return $false\n    }\n\n    if ($expression -ieq \"true\")\n    {\n        return $true\n    }\n\n    if ($expression -ieq \"false\")\n    {\n        return $false\n    }\n\n    $expression = $expression -replace 'False', '$false'\n    $expression = $expression -replace 'True', '$true'\n\n    try\n    {\n        [bool] $res = (Invoke-Expression $expression) -eq $true\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n        return $false\n    }\n    Write-Debug \"Evaluated condition to $res\"\n\n    return $res\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/msbuild-project-cache-repository.ps1",
    "content": "Set-Variable -name kCptCacheRepo -value \"$env:APPDATA\\ClangPowerTools\\CacheRepository\" -option Constant\n\nFunction Is-CacheLoadingEnabled()\n{\n  if (\"${Env:CPT_CACHEREPO}\" -eq \"0\")\n  {\n    return $false\n  }\n  # if the cache repository directory exists, then we use caching\n  return (Test-Path $kCptCacheRepo)\n}\n\nFunction Remove-CachedProjectFile([Parameter(Mandatory = $true)][string] $aCachedFilePath)\n{\n  if ($aCachedFilePath.StartsWith($kCptCacheRepo))\n  {\n    Remove-Item $aCachedFilePath | Out-Null\n  }\n}\n\nFunction Get-CacheRepositoryIndex()\n{\n  Write-Verbose \"Loading project cache repository index\"\n  [System.Collections.Hashtable] $cacheIndex = @{}\n  if (Is-CacheLoadingEnabled)\n  {\n    [string] $cptCacheRepoIndex = \"$kCptCacheRepo\\index.dat\"\n    if (Test-Path $cptCacheRepoIndex)\n    {\n      try\n      {\n        $cacheIndex = [System.Management.Automation.PSSerializer]::Deserialize((Get-Content $cptCacheRepoIndex))\n      }\n      catch\n      {\n        Write-Verbose \"Error: Could not deserialize corrupted cache repository index. Rebuilding from scratch...\"\n        return $cacheIndex\n      }\n    }\n  }\n  return $cacheIndex\n}\n\nFunction Save-CacheRepositoryIndex([Parameter(Mandatory = $true)][System.Collections.Hashtable] $cacheIndex)\n{\n  Write-Verbose \"Saving project cache repository index\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    return\n  }\n\n  [System.Collections.ArrayList] $indexKeys = @()\n  foreach ($keyIndex in $cacheIndex.Keys)\n  {\n    # make sure we don't invalidate the cacheIndex.Keys collection iterators when modifying it\n    $indexKeys.Add($keyIndex) > $null\n  }\n\n  foreach ($indexKey in $indexKeys)\n  {\n    [string] $CachedDataPath = $cacheIndex[$indexKey].CachedDataPath\n    if (! (Test-Path $CachedDataPath))\n    {\n      Write-Verbose \"Pruning zombie entry ($($indexKey) : $($CachedDataPath)) from cache repository index\"\n      $cacheIndex.Remove($indexKey) > $null\n    }\n  }\n\n  [string] $cptCacheRepoIndex = \"$kCptCacheRepo\\index.dat\"\n  $serialized = [System.Management.Automation.PSSerializer]::Serialize($cacheIndex)\n  $serialized > $cptCacheRepoIndex\n}\n\nFunction Join-ConfigurationPlatformScriptArgs()\n{\n  return ($aVcxprojConfigPlatform -join \",\")\n}\n\nFunction Save-ProjectToCacheRepo()\n{\n  Write-Verbose \"Saving current project data to cache repository\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    return\n  }\n\n  Write-Verbose \"Collecting $($global:ProjectSpecificVariables.Count) project specific variables\"\n  [System.Collections.Hashtable] $projectVariablesMap = @{}\n  foreach ($varName in $global:ProjectSpecificVariables)\n  {\n    $projectVariablesMap[$varName] = Get-Variable -name $varName -ValueOnly\n  }\n  \n  [System.Collections.Hashtable] $genericVariablesMap = @{}\n  $genericVariablesMap['cptVisualStudioVersion'  ] = Get-Variable 'cptVisualStudioVersion'   -scope Global -ValueOnly\n  $genericVariablesMap['cptCurrentConfigPlatform'] = Get-Variable 'cptCurrentConfigPlatform' -scope Global -ValueOnly\n\n  $dataToSerialize = New-Object PsObject -Prop @{ \"ProjectSpecificVariables\"  = $projectVariablesMap\n                                                ; \"GenericVariables\"          = $genericVariablesMap\n                                                }\n  [string] $pathToSave = \"\"\n  while ($true)\n  {\n    [string] $pathToSave = \"$kCptCacheRepo\\$(Get-RandomString).dat\"\n    # make sure we don't overwrite an already existing cache entry\n    if (! (Test-Path $pathToSave))\n    {\n      break\n    }\n  }\n  $serialized = [System.Management.Automation.PSSerializer]::Serialize($dataToSerialize)\n  $serialized > $pathToSave\n  Write-Verbose \"Wrote project to cache repository using moniker $pathToSave\"\n  \n  [System.Collections.Hashtable] $projectFilesHashes = @{}\n  foreach ($projectFile in $global:ProjectInputFiles)\n  {\n    $projectFilesHashes[$projectFile] = (Get-FileHash $projectFile -Algorithm \"SHA1\").Hash\n  }\n  \n  [System.Collections.Hashtable] $cacheIndex = Get-CacheRepositoryIndex\n\n  $cacheObject = New-Object PsObject -Prop @{ \"ProjectFilesHashes\"     = $projectFilesHashes\n                                            ; \"CachedDataPath\"         = $pathToSave\n                                            ; \"ConfigurationPlatform\"  = Join-ConfigurationPlatformScriptArgs\n                                            ; \"CptCacheSyntaxVersion\"  = $kCacheSyntaxVer\n                                            }\n  $cacheIndex[$MSBuildProjectFullPath] = $cacheObject\n  \n  Save-CacheRepositoryIndex $cacheIndex\n}\n\nFunction Load-ProjectFromCache([Parameter(Mandatory = $true)][string] $aVcxprojPath)\n{\n  Write-Verbose \"Trying to load project $aVcxprojPath from cache repository\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    Write-Verbose \"Cache repository not enabled in %APPDATA%/ClangPowerTools/CacheRepository\"\n    return $false\n  }\n\n  [System.Collections.Hashtable] $cacheIndex = Get-CacheRepositoryIndex\n  if ( ! $cacheIndex.ContainsKey($aVcxprojPath))\n  {\n    Write-Verbose \"Cache repository does not contain record of project\"\n    return $false\n  }\n\n  $projectCacheObject = $cacheIndex[$aVcxprojPath]\n\n  if ( ! (Test-Path $projectCacheObject.CachedDataPath))\n  {\n    Write-Verbose \"Error: Cache repository contains record of project but cached file no longer exists\"\n    return $false\n  }\n  \n  if ($projectCacheObject.CptCacheSyntaxVersion -ne $kCacheSyntaxVer)\n  {\n    Write-Verbose \"Cached version of project uses older syntax version. Discarding...\"\n    # the cached version uses an outdated syntax, safely discard it\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n  \n  [System.Collections.Hashtable] $projectFilesHashes = $projectCacheObject.ProjectFilesHashes\n  foreach ($projectFilePath in $projectFilesHashes.Keys)\n  {\n    Write-Verbose \"Checking hash of project file $projectFilePath\"\n\n    $newFileHash = (Get-FileHash $projectFilePath -Algorithm \"SHA1\").Hash\n\n    if ($newFileHash -ne $projectFilesHashes[$projectFilePath])\n    {\n      Write-Verbose \"Cached version of project has different file hash. Discarding...\"\n      # project file hash not matching, safely discard cached version\n      Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n      return $false\n    }\n  }\n\n  if ($projectCacheObject.ConfigurationPlatform -ne (Join-ConfigurationPlatformScriptArgs))\n  {\n    Write-Verbose \"Cached version of project uses different configuration platform. Discarding...\"\n    # config-platform not maching, safely discard cached version\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  # Clean global variables that have been set by a previous project load\n  Clear-Vars\n\n  $global:vcxprojPath = $aVcxprojPath\n\n  Write-Verbose \"Loading cached project from $($projectCacheObject.CachedDataPath)\"\n  [string] $data = Get-Content $projectCacheObject.CachedDataPath\n  $deserialized = $null\n  try \n  {\n    $deserialized = [System.Management.Automation.PSSerializer]::Deserialize($data)\n  }\n  catch\n  {\n    Write-Verbose \"Error: Failure to deserialize cached project data. Discarding corrupted file\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  [System.Collections.Hashtable] $projectSpecificVariablesMap = $deserialized.ProjectSpecificVariables\n  [System.Collections.Hashtable] $genericVariablesMap = $deserialized.GenericVariables\n\n  Write-Verbose \"Cached version of project has $($projectSpecificVariablesMap.Count) variables to load\"\n  if ($projectSpecificVariablesMap.Keys -notcontains \"MSBuildThisFileFullPath\")\n  {\n    Write-Verbose \"Cached project does not contain MSBuildThisFileFullPath. Discarding...\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n  \n  if ( $projectSpecificVariablesMap['MSBuildThisFileFullPath'] -ne $aVcxprojPath )\n  {\n    Write-Verbose \"Cached project looks to be a different project ($($projectSpecificVariablesMap['MSBuildThisFileFullPath'])). Discarding...\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  foreach ($var in $projectSpecificVariablesMap.Keys)\n  {\n    Set-Var -name $var -value $projectSpecificVariablesMap[$var]\n  }\n  \n  # these variables should be garbage collected between projects\n  # using our custom Set-Var would allow that to happen\n  foreach ($var in $genericVariablesMap.Keys)\n  {\n    Set-Variable -name $var -value $genericVariablesMap[$var] -scope Global\n  }\n\n  Write-Verbose \"Cache repository - project load was successful\"\n  return $true\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/msbuild-project-data.ps1",
    "content": "#-------------------------------------------------------------------------------------------------\n# PlatformToolset constants\n\nSet-Variable -name kDefinesUnicode   -value @('\"-DUNICODE\"'\n                                             ,'\"-D_UNICODE\"'\n                                             ) `\n                                     -option Constant\n\nSet-Variable -name kDefinesClangXpTargeting `\n             -value @('\"-D_USING_V110_SDK71_\"') `\n             -option Constant\n\nSet-Variable -name kIncludePathsXPTargetingSDK  `\n             -value \"${Env:ProgramFiles(x86)}\\Microsoft SDKs\\Windows\\v7.1A\\Include\"  `\n             -option Constant\n\nSet-Variable -name kVStudioDefaultPlatformToolset -Value \"v141\" -option Constant\n\nSet-Variable -name kClangFlag32BitPlatform        -value \"-m32\" -option Constant\n\n# ------------------------------------------------------------------------------------------------\n# Default platform sdks and standard\n\nSet-Variable -name kVSDefaultWinSDK            -value '8.1'             -option Constant\nSet-Variable -name kVSDefaultWinSDK_XP         -value '7.0'             -option Constant\nSet-Variable -name kDefaultCppStd              -value \"stdcpp14\"        -option Constant\n\n# ------------------------------------------------------------------------------------------------\nSet-Variable -name kCProjectCompile         -value \"CompileAsC\" -option Constant\n\nFunction Should-CompileProject([Parameter(Mandatory = $true)][string] $vcxprojPath)\n{\n    if ($aVcxprojToCompile -eq $null)\n    {\n        return $true\n    }\n\n    foreach ($projMatch in $aVcxprojToCompile)\n    {\n        if (IsFileMatchingName -filePath $vcxprojPath -matchName $projMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Should-IgnoreProject([Parameter(Mandatory = $true)][string] $vcxprojPath)\n{\n    if ($aVcxprojToIgnore -eq $null)\n    {\n        return $false\n    }\n\n    foreach ($projIgnoreMatch in $aVcxprojToIgnore)\n    {\n        if (IsFileMatchingName -filePath $vcxprojPath -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Should-IgnoreFile([Parameter(Mandatory = $true)][string] $file)\n{\n    if ($aCppToIgnore -eq $null)\n    {\n        return $false\n    }\n\n    foreach ($projIgnoreMatch in $aCppToIgnore)\n    {\n        if (IsFileMatchingName -filePath $file -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    foreach ($projIgnoreMatch in $global:cptIgnoredFilesPool)\n    {\n        if (IsFileMatchingName -filePath $file -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Get-ProjectFilesToCompile()\n{\n    $projectCompileItems = @(Get-Project-ItemList \"ClCompile\")\n    if (!$projectCompileItems)\n    {\n        Write-Verbose \"Project does not have any items to compile\"\n        return @()\n    }\n\n    $files = @()\n    foreach ($item in $projectCompileItems)\n    {\n        [System.Collections.Hashtable] $itemProps = $item[1];\n\n        if ($itemProps -and $itemProps.ContainsKey('ExcludedFromBuild'))\n        {\n            if ($itemProps['ExcludedFromBuild'] -ieq 'true')\n            {\n                Write-Verbose \"Skipping $($item[0]) because it is excluded from build\"\n                continue\n            }\n        }\n\n        [string[]] $matchedFiles = @(Canonize-Path -base $ProjectDir -child $item[0] -ignoreErrors)\n        if ($matchedFiles.Count -gt 0)\n        {\n            foreach ($file in $matchedFiles)\n            {\n                $files += New-Object PsObject -Prop @{ \"File\"       = $file\n                                                     ; \"Properties\" = $itemProps\n                                                     }\n            }\n        }\n    }\n\n    return $files\n}\n\nFunction Get-ProjectHeaders()\n{\n    $projectCompileItems = @(Get-Project-ItemList \"ClInclude\")\n\n    [string[]] $headerPaths = @()\n\n    foreach ($item in $projectCompileItems)\n    {\n        [string[]] $paths = @(Canonize-Path -base $ProjectDir -child $item[0] -ignoreErrors)\n        if ($paths.Count -gt 0)\n        {\n            $headerPaths += $paths\n        }\n    }\n    return $headerPaths\n}\n\nFunction Get-Project-SDKVer()\n{\n    if (! (VariableExists 'WindowsTargetPlatformVersion'))\n    {\n        return \"\"\n    }\n\n    if ([string]::IsNullOrEmpty($WindowsTargetPlatformVersion))\n    { \n        return \"\" \n    } \n    \n    return $WindowsTargetPlatformVersion.Trim()\n}\n\nFunction Get-Project-MultiThreaded-Define()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    [string] $runtimeLibrary = Get-ProjectItemProperty \"RuntimeLibrary\"\n\n    # /MT or /MTd\n    if (@(\"MultiThreaded\", \"MultiThreadedDebug\") -contains $runtimeLibrary)\n    {\n        return @('\"-D_MT\"')\n    }\n\n    return @('\"-D_MT\"', '\"-D_DLL\"') # default value /MD\n}\n\nFunction Is-Project-Unicode()\n{\n    if (VariableExists 'CharacterSet')\n    {\n        return $CharacterSet -ieq \"Unicode\"\n    }\n    return $false\n}\n\nFunction Get-Project-CppStandard()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $cppStd = Get-ProjectItemProperty \"LanguageStandard\"\n    if (!$cppStd)\n    {\n        $cppStd = $kDefaultCppStd\n    }\n\n    $cppStdMap = @{ 'stdcpplatest' = 'c++20'\n                  ; 'stdcpp14'     = 'c++14'\n                  ; 'stdcpp17'     = 'c++17'\n                  ; 'stdcpp20'     = 'c++20'\n                  }\n    if ($kLLVMVersion -ge 13)\n    {\n        $cppStdMap['stdcpplatest'] = 'c++2b'\n    }\n\n    [string] $cppStdClangValue = $cppStdMap[$cppStd]\n\n    return $cppStdClangValue\n}\n\nFunction Get-ClangCompileFlags([Parameter(Mandatory = $false)][bool] $isCpp = $true)\n{\n    [string[]] $flags = $aClangCompileFlags\n    if ($isCpp -and !($flags -match \"-std=.*\"))\n    {\n        [string] $cppStandard = Get-Project-CppStandard\n\n        $flags = @(\"-std=$cppStandard\") + $flags\n    }\n\n    if ($Platform -ieq \"x86\" -or $Platform -ieq \"Win32\")\n    {\n        $flags += @($kClangFlag32BitPlatform)\n    }\n\n    return $flags\n}\n\nFunction Get-ProjectPlatformToolset()\n{\n    if (VariableExists 'PlatformToolset')\n    {\n        return $PlatformToolset\n    }\n    else\n    {\n        return $kVStudioDefaultPlatformToolset\n    }\n}\nfunction Get-LatestSDKVersion()\n{\n    [string] $parentDir = \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\\"\n    if (!(Test-Path -LiteralPath $parentDir))\n    {\n        Write-Verbose \"Windows 10 SDK parent directory could not be located\"\n        return \"\"\n    }\n\n    [System.IO.DirectoryInfo[]]$subdirs = @( get-childitem -path $parentDir      | `\n                                             where { $_.Name.StartsWith(\"10.\") } | `\n                                             sort -Descending -Property Name )\n    if ($subdirs.Count -eq 0)\n    {\n        Write-Verbose \"[ERR] Could not detect latest Windows 10 SDK location\"\n        return \"\"\n    }\n\n    return $subdirs[0].Name\n}\n\nFunction Get-ProjectIncludesFromIncludePathVar\n{\n    [string[]] $returnArray = @()\n    if ( (VariableExists 'IncludePath') )\n    {\n        $returnArray += ($IncludePath -split \";\")                                                         | `\n                        Where-Object { ![string]::IsNullOrWhiteSpace($_) }                                | `\n                        ForEach-Object { Canonize-Path -base $ProjectDir -child $_.Trim() -ignoreErrors } | `\n                        Where-Object { ![string]::IsNullOrEmpty($_) }                                     | `\n                        ForEach-Object { $_ -replace '\\\\$', '' }\n    }\n    return $returnArray\n}\n\nFunction Get-ProjectIncludeDirectories()\n{\n    [string[]] $returnArray = @()\n\n    [string] $vsPath = Get-VisualStudio-Path\n    Write-Verbose \"Visual Studio location: $vsPath\"\n\n    [string] $platformToolset = Get-ProjectPlatformToolset\n\n    if (([int] $global:cptVisualStudioVersion) -lt 2017)\n    {\n        $returnArray += Get-VisualStudio-Includes -vsPath $vsPath\n    }\n    else\n    {\n        $mscVer = Get-MscVer -visualStudioPath $vsPath\n        Write-Verbose \"MSCVER: $mscVer\"\n\n        $returnArray += Get-VisualStudio-Includes -vsPath $vsPath -mscVer $mscVer\n    }\n\n    $sdkVer = Get-Project-SDKVer\n\n    # We did not find a WinSDK version in the vcxproj. We use Visual Studio's defaults\n    if ([string]::IsNullOrEmpty($sdkVer))\n    {\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $sdkVer = $kVSDefaultWinSDK_XP\n        }\n        else\n        {\n            $sdkVer = $kVSDefaultWinSDK\n        }\n    }\n\n    Write-Verbose \"WinSDK version: $sdkVer\"\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 10\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"10\")))\n    {\n        if ($sdkVer -eq \"10.0\")\n        {\n            # Project uses the latest Win10 SDK. We have to detect its location.\n            $sdkVer = Get-LatestSDKVersion\n        }\n\n        $returnArray += @(\"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\ucrt\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @($kIncludePathsXPTargetingSDK)\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\um\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\shared\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\winrt\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\cppwinrt\"\n            )\n        }\n    }\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 8 / 8.1\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"8.\")))\n    {\n        $returnArray += @(\"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @($kIncludePathsXPTargetingSDK)\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\um\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\shared\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\winrt\"\n            )\n        }\n    }\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 7\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"7.0\")))\n    {\n        $returnArray += @(\"$vsPath\\VC\\Auxiliary\\VS\\include\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\"\n                , $kIncludePathsXPTargetingSDK\n            )\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\7.0\\ucrt\")\n        }\n    }\n\n    if ($env:CPT_LOAD_ALL -eq '1')\n    {\n        return @(Get-ProjectIncludesFromIncludePathVar)\n    }\n    else \n    {\n        $returnArray += @(Get-ProjectIncludesFromIncludePathVar)    \n    }\n\n    return ( $returnArray | ForEach-Object { Remove-PathTrailingSlash -path $_ } )\n}\n\n<#\n.DESCRIPTION\n  Retrieve array of preprocessor definitions for a given project, in Clang format (-DNAME )\n#>\nFunction Get-ProjectPreprocessorDefines()\n{\n    [string[]] $defines = @()\n\n    if (Is-Project-Unicode)\n    {\n        $defines += $kDefinesUnicode\n    }\n\n    $defines += @(Get-Project-MultiThreaded-Define)\n\n    if ( (VariableExists 'UseOfMfc') -and $UseOfMfc -ieq \"Dynamic\")\n    {\n        $defines += @('\"-D_AFXDLL\"')\n    }\n\n    [string] $platformToolset = Get-ProjectPlatformToolset\n    if ($platformToolset.EndsWith(\"xp\"))\n    {\n        $defines += $kDefinesClangXpTargeting\n    }\n\n    Set-ProjectItemContext \"ClCompile\"\n    $preprocDefNodes = Get-ProjectItemProperty \"PreprocessorDefinitions\"\n    if (!$preprocDefNodes)\n    {\n        return $defines\n    }\n\n    [string[]] $tokens = @($preprocDefNodes -split \";\")\n\n    # make sure we add the required prefix and escape double quotes\n    $defines += @( $tokens | `\n                   ForEach-Object { $_.Trim() } | `\n                   Where-Object { $_ } | `\n                   ForEach-Object { '\"' + $(($kClangDefinePrefix + $_) -replace '\"', '\\\"') + '\"' } )\n\n    return $defines\n}\n\nFunction Get-ProjectAdditionalIncludes()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $data = Get-ProjectItemProperty \"AdditionalIncludeDirectories\"\n\n    [string[]] $tokens = @($data -split \";\")\n\n    foreach ($token in $tokens)\n    {\n        if ([string]::IsNullOrWhiteSpace($token))\n        {\n            continue\n        }\n\n        [string] $includePath = Canonize-Path -base $ProjectDir -child $token.Trim() -ignoreErrors\n        if (![string]::IsNullOrEmpty($includePath))\n        {\n            $includePath -replace '\\\\$', ''\n        }\n    }\n}\n\nFunction Get-ProjectForceIncludes()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $forceIncludes = Get-ProjectItemProperty \"ForcedIncludeFiles\"\n    if ($forceIncludes)\n    {\n        return @($forceIncludes -split \";\" | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n    }\n\n    return $null\n}\n\nFunction Get-FileForceIncludes([Parameter(Mandatory=$true)] [string] $fileFullName)\n{\n    try\n    {\n        [string] $forceIncludes = Get-ProjectFileSetting -fileFullName $fileFullName -propertyName \"ForcedIncludeFiles\"\n        return ($forceIncludes -split \";\")                                                       | `\n               Where-Object { ![string]::IsNullOrWhiteSpace($_) }                                | `\n               ForEach-Object { Canonize-Path -base $ProjectDir -child $_.Trim() -ignoreErrors } | `\n               Where-Object { ![string]::IsNullOrEmpty($_) }                                     | `\n               ForEach-Object { $_ -replace '\\\\$', '' }\n    }\n    catch\n    {\n        return $null\n    }\n}\n\n\n<#\n.DESCRIPTION\n  Retrieve directory in which stdafx.h resides\n#>\nFunction Get-ProjectStdafxDir( [Parameter(Mandatory = $true)]  [string]   $pchHeaderName\n    , [Parameter(Mandatory = $false)] [string[]] $includeDirectories\n    , [Parameter(Mandatory = $false)] [string[]] $additionalIncludeDirectories\n)\n{\n    [string] $stdafxPath = \"\"\n\n    [string[]] $projectHeaders = @(Get-ProjectHeaders)\n    if ($projectHeaders.Count -gt 0)\n    {\n        # we need to use only backslashes so that we can match against file header paths\n        $pchHeaderName = $pchHeaderName.Replace(\"/\", \"\\\")\n\n        $stdafxPath = $projectHeaders | Where-Object { (Get-FileName -path $_) -eq $pchHeaderName }\n    }\n\n    if ([string]::IsNullOrEmpty($stdafxPath))\n    {\n        [string[]] $searchPool = @($ProjectDir);\n        if ($includeDirectories.Count -gt 0)\n        {\n            $searchPool += $includeDirectories\n        }\n        if ($additionalIncludeDirectories.Count -gt 0)\n        {\n            $searchPool += $additionalIncludeDirectories\n        }\n\n        foreach ($dir in $searchPool)\n        {\n            [string] $stdafxPath = Canonize-Path -base $dir -child $pchHeaderName -ignoreErrors\n            if (![string]::IsNullOrEmpty($stdafxPath))\n            {\n                break\n            }\n        }\n    }\n\n    if ([string]::IsNullOrEmpty($stdafxPath))\n    {\n        return \"\"\n    }\n    else\n    {\n        [string] $stdafxDir = Get-FileDirectory($stdafxPath)\n        return $stdafxDir\n    }\n}\n\nFunction Get-PchCppIncludeHeader([Parameter(Mandatory = $true)][string] $pchCppFile)\n{\n    [string] $cppPath = Canonize-Path -base $ProjectDir -child $pchCppFile\n\n    [string[]] $fileLines = @(Get-Content -LiteralPath $cppPath)\n    foreach ($line in $fileLines)\n    {\n        $regexMatch = [regex]::match($line, '^\\s*#include\\s+\"(\\S+)\"')\n        if ($regexMatch.Success)\n        {\n            return $regexMatch.Groups[1].Value\n        }\n    }\n    return \"\"\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/msbuild-project-load.ps1",
    "content": "#-------------------------------------------------------------------------------------------------\n# Global variables\n\n# vcxproj and property sheet files declare MsBuild properties (e.g. $(MYPROP)).\n# they are used in project xml nodes expressions. we have a\n# translation engine (MSBUILD-POWERSHELL) for these. it relies on\n# PowerShell to evaluate these expressions. We have to inject project\n# properties in the PowerShell runtime context. We keep track of them in\n# this list, so that each project can know to clean previous vars before loading begins.\nif (! (Test-Path variable:global:ProjectSpecificVariables))\n{\n  [System.Collections.ArrayList] $global:ProjectSpecificVariables    = @()\n}\n\nif (! (Test-Path variable:global:ProjectInputFiles))\n{\n  [System.Collections.ArrayList] $global:ProjectInputFiles = @{}\n}\n\nFunction Add-ToProjectSpecificVariables([Parameter(Mandatory = $true)] [string] $variableName)\n{\n  $global:ProjectSpecificVariables.Add($variableName) > $null\n}\n\nif (! (Test-Path variable:global:ScriptParameterBackupValues))\n{\n  [System.Collections.Hashtable] $global:ScriptParameterBackupValues = @{}\n}\n\n# path of current project\n[string] $global:vcxprojPath                     = \"\";\n\n\nSet-Variable -name \"kRedundantSeparatorsReplaceRules\" -option Constant `\n              -value @( <# handle multiple consecutive separators #>   `\n                        (\";+\" , \";\")                                   `\n                        <# handle separator at end                #>   `\n                      , (\";$\" , \"\")                                    `\n                        <# handle separator at beginning          #>   `\n                      , (\"^;\" , \"\")                                    `\n                      )\nSet-Variable -name \"kCacheSyntaxVer\" -Option Constant -value \"1\"\n\nAdd-Type -TypeDefinition @\"\npublic class ProjectConfigurationNotFound : System.Exception\n{\n    public string ConfigPlatform;\n    public string Project;\n\n    public ProjectConfigurationNotFound(string proj, string configPlatform)\n    {\n        this.Project = proj;\n        this.ConfigPlatform = configPlatform;\n    }\n}\n\"@\n\nFunction Set-Var([parameter(Mandatory = $false)][string] $name\n                ,[parameter(Mandatory = $false)]         $value\n                ,[parameter(Mandatory = $false)][switch] $asScriptParameter\n                )\n{\n    if ($name -ieq \"home\")\n    {\n        Write-Verbose \"Shimming HOME variable\"\n        # the HOME PowerShell variable is protected and we can't overwrite it\n        $name = \"CPT_SHIM_HOME\"\n    }\n\n    if ($asScriptParameter)\n    {\n        if (Test-Path \"variable:$name\")\n        {\n          $oldVar = Get-Variable $name\n          $oldValue = $oldVar.Value\n\n          if ($oldValue           -and\n              $oldValue.GetType() -and\n              $oldValue.GetType().ToString() -eq \"System.Management.Automation.SwitchParameter\")\n          {\n            $oldValue = $oldValue.ToBool()\n          }\n\n          $global:ScriptParameterBackupValues[$name] = $oldValue\n        }\n        else\n        {\n          $global:ScriptParameterBackupValues[$name] = $null\n        }\n    }\n\n    Write-Verbose \"SET_VAR $($name): $value\"\n    if ($asScriptParameter)\n    {\n      Set-Variable -name $name -Value $value -Scope Script\n    }\n    else\n    {\n      Set-Variable -name $name -Value $value -Scope Global\n    }\n\n    if (!$asScriptParameter -and !$global:ProjectSpecificVariables.Contains($name))\n    {\n      Add-ToProjectSpecificVariables $name\n    }\n}\n\nFunction Add-Project-Item([parameter(Mandatory = $false)][string] $name\n                         ,[parameter(Mandatory = $false)]         $value\n                         ,[parameter(Mandatory = $false)]         $properties = $null)\n{\n    if (!$value)\n    {\n        return\n    }\n\n    $itemVarName = \"CPT_PROJITEM_$name\"\n    if (!(Get-Variable $itemVarName -ErrorAction SilentlyContinue))\n    {\n        $itemList = New-Object System.Collections.ArrayList\n        Set-Var -name $itemVarName -value $itemList\n    }\n\n    $itemList = (Get-Variable $itemVarName).Value\n    if ($value -is [array])\n    {\n        foreach ($arrayValue in $value)\n        {\n            $itemList.Add( @($arrayValue, $properties) ) > $null\n        }\n    }\n    else\n    {\n        $itemList.Add(@($value, $properties)) > $null\n    }\n}\n\nFunction Get-Project-Item([parameter(Mandatory = $true)][string] $name)\n{\n    $itemVarName = \"CPT_PROJITEM_$name\"\n\n    $itemVar = Get-Variable $itemVarName -ErrorAction SilentlyContinue\n    if ($itemVar)\n    {\n        $retStr = \"\"\n\n        if ($itemVar.Value.GetType().Name -ieq \"ArrayList\")\n        {\n            foreach ($v in $itemVar.Value)\n            {\n                if ($retStr)\n                {\n                    $retStr += \";\"\n                }\n                $retStr += $v[0] # index0 = item; index1 = properties\n            }\n        }\n        else\n        {\n            $retStr = $itemVar.Value[0] # index0 = item; index1 = properties\n        }\n\n        return $retStr\n    }\n\n    return $null\n}\n\nFunction Get-Project-ItemList([parameter(Mandatory = $true)][string] $name)\n{\n    $retList = New-Object System.Collections.ArrayList\n\n    $itemVarName = \"CPT_PROJITEM_$name\"\n\n    $itemVar = Get-Variable $itemVarName -ErrorAction SilentlyContinue\n    if ($itemVar)\n    {\n        $retStr = \"\"\n\n        if ($itemVar.Value.GetType().Name -ieq \"ArrayList\")\n        {\n            foreach ($v in $itemVar.Value)\n            {\n                if ($retStr)\n                {\n                    $retStr += \";\"\n                }\n                $retList.Add($v) > $null # v is a pair. index0 = item; index1 = properties\n            }\n        }\n        else\n        {\n            $retList.Add($itemVar.Value) > $null\n        }\n    }\n\n    return $retList\n}\n\nFunction Clear-Vars()\n{\n    Write-Verbose-Array -array $global:ProjectSpecificVariables `\n        -name \"Deleting variables initialized by previous project\"\n\n    foreach ($var in $global:ProjectSpecificVariables)\n    {\n        Remove-Variable -name $var -scope Global -ErrorAction SilentlyContinue\n    }\n\n    foreach ($varName in $global:ScriptParameterBackupValues.Keys)\n    {\n        Write-Verbose \"Restoring $varName to old value $($ScriptParameterBackupValues[$varName])\"\n        Set-Variable -name $varName -value $ScriptParameterBackupValues[$varName]\n    }\n\n    $global:ScriptParameterBackupValues.Clear()\n\n    $global:ProjectSpecificVariables.Clear()\n\n    $global:ProjectInputFiles.Clear()\n\n    Reset-ProjectItemContext\n}\n\nFunction UpdateScriptParameter([Parameter(Mandatory = $true)] [string] $paramName\n                              ,[Parameter(Mandatory = $false)][string] $paramValue)\n{\n  [bool]   $isSwitch  = $false\n  $evalParamValue     = \"\" # no type specified because we don't know it yet\n\n  if ($paramValue) # a parameter\n  {\n    $evalParamValue = Invoke-Expression $paramValue # evaluate expression to get actual value\n  }\n  else # a switch\n  {\n    $isSwitch = $true\n  }\n\n  # the parameter name we detected may be an alias => translate it into the real name\n  [string] $realParamName = Get-CommandParameterName -command \"$PSScriptRoot\\..\\clang-build.ps1\" `\n                                                     -nameOrAlias $paramName\n  if (!$realParamName)\n  {\n    Write-Output \"OVERVIEW: Clang Power Tools: compiles or tidies up code from Visual Studio .vcxproj project files`n\"\n\n    Write-Output \"USAGE: clang-build.ps1 [options]`n\"\n\n    Write-Output \"OPTIONS: \"\n    Print-CommandParameters \"$PSScriptRoot\\..\\clang-build.ps1\"\n\n    Fail-Script \"Unsupported option '$paramName'. Check cpt.config.\"\n  }\n\n  if ($isSwitch)\n  {\n    Set-Var -name $realParamName -value $true -asScriptParameter\n  }\n  else\n  {\n    Set-Var -name $realParamName -value $evalParamValue -asScriptParameter\n  }\n}\n\nFunction Get-ConfigFileParameters()\n{\n  [System.Collections.Hashtable] $retArgs = @{}\n\n  [string] $startDir = If ( VariableExistsAndNotEmpty 'ProjectDir' )  { $ProjectDir } else { $aSolutionsPath }\n  [string] $configFile = (cpt::GetDirNameOfFileAbove -startDir $startDir -targetFile \"cpt.config\") + \"\\cpt.config\"\n  if (!(Test-Path -LiteralPath $configFile))\n  {\n      return $retArgs\n  }\n  Write-Verbose \"Found cpt.config in $configFile\"\n\n  [xml] $configXml = Get-Content $configFile\n  $configXpathNS= New-Object System.Xml.XmlNamespaceManager($configXml.NameTable)\n  $configXpathNS.AddNamespace(\"ns\", $configXml.DocumentElement.NamespaceURI)\n\n  [System.Xml.XmlElement[]] $argElems = $configXml.SelectNodes(\"/ns:cpt-config/*\", $configXpathNS)\n\n  foreach ($argEl in $argElems)\n  {\n    if ($argEl.Name.StartsWith(\"vsx-\"))\n    {\n        continue # settings for the Visual Studio Extension\n    }\n\n    if ($argEl.HasAttribute(\"Condition\"))\n    {\n      [bool] $isApplicable = Evaluate-MSBuildCondition -condition $argEl.GetAttribute(\"Condition\")\n      if (!$isApplicable)\n      {\n        continue\n      }\n    }\n    $retArgs[$argEl.Name] = $argEl.InnerText\n  }\n\n  return $retArgs\n}\n\nFunction Update-ParametersFromConfigFile()\n{\n  [System.Collections.Hashtable] $configParams = Get-ConfigFileParameters\n  if (!$configParams)\n  {\n      return\n  }\n\n  foreach ($paramName in $configParams.Keys)\n  {\n    UpdateScriptParameter -paramName $paramName -paramValue $configParams[$paramName]\n  }\n}\n\nFunction InitializeMsBuildProjectProperties()\n{\n    Write-Verbose \"Importing environment variables into current scope\"\n    foreach ($var in (Get-ChildItem Env:))\n    {\n        Set-Var -name $var.Name -value $var.Value\n    }\n\n    Set-Var -name \"MSBuildProjectFullPath\"   -value $global:vcxprojPath\n    Set-Var -name \"ProjectDir\"               -value (Get-FileDirectory -filePath $global:vcxprojPath)\n    Set-Var -name \"MSBuildProjectExtension\"  -value ([IO.Path]::GetExtension($global:vcxprojPath))\n    Set-Var -name \"MSBuildProjectFile\"       -value (Get-FileName -path $global:vcxprojPath)\n    Set-Var -name \"MSBuildProjectName\"       -value (Get-FileName -path $global:vcxprojPath -noext)\n    Set-Var -name \"MSBuildProjectDirectory\"  -value (Get-FileDirectory -filePath $global:vcxprojPath)\n    Set-Var -name \"MSBuildProgramFiles32\"    -value \"${Env:ProgramFiles(x86)}\"\n    # defaults for projectname and targetname, may be overriden by project settings\n    Set-Var -name \"ProjectName\"              -value $MSBuildProjectName\n    Set-Var -name \"TargetName\"               -value $MSBuildProjectName\n\n    Set-Var -name \"UserRootDir\"              -value \"$LocalAppData\\Microsoft\\MSBuild\\v4.0\"\n    # These would enable full project platform references parsing, experimental right now\n    if ($env:CPT_LOAD_ALL -eq '1')\n    {\n        Set-Var -name \"ConfigurationType\"        -value \"Application\"\n        Set-Var -name \"VCTargetsPath\"            -value \"$(Get-VisualStudio-Path)\\Common7\\IDE\\VC\\VCTargets\\\"\n        Set-Var -name \"VsInstallRoot\"            -value (Get-VisualStudio-Path)\n        Set-Var -name \"MSBuildExtensionsPath\"    -value \"$(Get-VisualStudio-Path)\\MSBuild\"\n        Set-Var -name \"LocalAppData\"             -value $env:LOCALAPPDATA\n        Set-Var -name \"UniversalCRT_IncludePath\" -value \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\"\n    }\n\n    [string] $vsVer = (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n    Set-Var -name \"VisualStudioVersion\"    -value $vsVer\n    Set-Var -name \"MSBuildToolsVersion\"    -value $vsVer\n\n    [string] $projectSlnPath = Get-ProjectSolution\n    [string] $projectSlnDir = Get-FileDirectory -filePath $projectSlnPath\n    Set-Var -name \"SolutionDir\" -value $projectSlnDir\n    [string] $projectSlnName = Get-FileName -path $projectSlnPath -noext\n    Set-Var -name \"SolutionName\" -value $projectSlnName\n\n    # pre-initialize Configuration and Platform properties\n    if ( VariableExistsAndNotEmpty -name 'aVcxprojConfigPlatform')\n    {\n        Detect-ProjectDefaultConfigPlatform\n    }\n\n    Update-ParametersFromConfigFile\n}\n\nFunction InitializeMsBuildCurrentFileProperties([Parameter(Mandatory = $true)][string] $filePath)\n{\n    Set-Var -name \"MSBuildThisFileFullPath\"  -value $filePath\n    Set-Var -name \"MSBuildThisFileExtension\" -value ([IO.Path]::GetExtension($filePath))\n    Set-Var -name \"MSBuildThisFile\"          -value (Get-FileName -path $filePath)\n    Set-Var -name \"MSBuildThisFileName\"      -value (Get-FileName -path $filePath -noext)\n    Set-Var -name \"MSBuildThisFileDirectory\" -value (Get-FileDirectory -filePath $filePath)\n}\n\n<#\n.DESCRIPTION\n   Sets the Configuration and Platform project properties so that\n   conditions can be properly evaluated.\n#>\nfunction Detect-ProjectDefaultConfigPlatform()\n{\n    [string] $configPlatformName = \"\"\n\n    # detect the first platform/config pair from the project itemgroup\n    $configItems = @(Get-Project-ItemList \"ProjectConfiguration\")\n\n    if (![string]::IsNullOrWhiteSpace($global:cptCurrentConfigPlatform))\n    {\n        # we have script parameters we can use to set the platform/config\n        $configPlatformName = $global:cptCurrentConfigPlatform\n    }\n    \n\n    if ((!$configItems -or $configItems.Count -eq 0))\n    {\n        if ([string]::IsNullOrWhiteSpace($configPlatformName))\n        {\n            throw [ProjectConfigurationNotFound]::new($global:vcxprojPath, \"\");\n        }\n    }\n    else \n    {\n        $targetConfiguration = $null\n\n        if ([string]::IsNullOrEmpty($configPlatformName))\n        {\n            $targetConfiguration = $configItems[0]\n        }\n        else \n        {\n            foreach ($configItem in $configItems)\n            {\n                [string] $platformName = $configItem[0]\n                if ($platformName -ieq $configPlatformName)\n                {\n                    $targetConfiguration = $configItem\n                \n                    break\n                }\n            }\n            if ($null -eq $targetConfiguration)\n            {\n                throw [ProjectConfigurationNotFound]::new($global:vcxprojPath, $configPlatformName);\n            }\n        }\n        \n        $configPlatformName = $targetConfiguration[0]\n    }\n\n    $global:cptCurrentConfigPlatform = $configPlatformName\n\n    [string[]] $configAndPlatform = $configPlatformName.Split('|')\n    Set-Var -Name \"Configuration\" -Value $configAndPlatform[0]\n    Set-Var -Name \"Platform\"      -Value $configAndPlatform[1]\n}\n\nfunction SanitizeProjectNode([System.Xml.XmlNode] $node)\n{\n    if ($node.Name -ieq \"#comment\")\n    {\n        return\n    }\n\n    [System.Collections.ArrayList] $nodesToRemove = @()\n\n    if ($node.Name -ieq \"#text\" -and $node.InnerText.Length -gt 0)\n    {\n        # evaluate node content\n        $node.InnerText = Evaluate-MSBuildExpression $node.InnerText\n    }\n\n    if ($node.Name -ieq \"Import\")\n    {\n        [string] $relPath = Evaluate-MSBuildExpression $node.GetAttribute(\"Project\")\n        if (!$relPath)\n        {\n            return\n        }\n        [string[]] $paths = @(Canonize-Path -base (Get-Location) -child $relPath -ignoreErrors)\n\n        [bool] $loadedProjectSheet = $false\n        foreach ($path in $paths)\n        {\n            if (![string]::IsNullOrEmpty($path) -and (Test-Path -LiteralPath $path))\n            {\n                Write-Verbose \"Property sheet: $path\"\n                ParseProjectFile($path)\n                $loadedProjectSheet = $true\n            }\n        }\n        if (!$loadedProjectSheet)\n        {\n            Write-Verbose \"Could not find property sheet $relPath\"\n            if ($relPath -like \"\\Microsoft.Cpp.props\")\n            {\n                # now we can begin to evaluate directory.build.props XML element conditions, load it\n                LoadDirectoryBuildPropSheetFile\n            }\n        }\n    }\n\n    if ( ($node.Name -ieq \"ClCompile\" -or $node.Name -ieq \"ClInclude\") -and\n        ![string]::IsNullOrEmpty($node.GetAttribute(\"Include\")) )\n    {\n        [string] $expandedAttr = Evaluate-MSBuildExpression $node.GetAttribute(\"Include\")\n        $node.Attributes[\"Include\"].Value = $expandedAttr\n    }\n\n    if ($node.Name -ieq \"Otherwise\")\n    {\n        [System.Xml.XmlElement[]] $siblings = @($node.ParentNode.ChildNodes | `\n            Where-Object { $_.GetType().Name -ieq \"XmlElement\" -and $_ -ne $node })\n        if ($siblings.Count -gt 0)\n        {\n            # means there's a <When> element that matched\n            # <Otherwise> should not be evaluated, we could set unwated properties\n            return\n        }\n    }\n\n    if ($node.Name -ieq \"ItemGroup\")\n    {\n        [string] $oldItemContextName = Get-ProjectItemContext\n        foreach ($child in $node.ChildNodes)\n        {\n            if ($child.GetType().Name -ine \"XmlElement\")\n            {\n                continue\n            }\n\n            [string] $childEvaluatedValue = Evaluate-MSBuildExpression $child.GetAttribute(\"Include\")\n            $itemProperties = @{}\n\n            Set-ProjectItemContext $child.Name\n            $contextProperties = Get-ProjectItemProperty\n            if ($contextProperties -ne $null)\n            {\n                foreach ($k in $contextProperties.Keys)\n                {\n                    $itemProperties[$k] = $contextProperties[$k]\n                }\n            }\n\n            foreach ($nodePropChild in $child.ChildNodes)\n            {\n                if ($nodePropChild.GetType().Name -ine \"XmlElement\")\n                {\n                    continue\n                }                \n\n                if ($nodePropChild.HasAttribute(\"Condition\"))\n                {\n                    [string] $nodeCondition = $nodePropChild.GetAttribute(\"Condition\")\n                    [bool] $conditionSatisfied = ((Evaluate-MSBuildCondition($nodeCondition)) -eq $true)\n                    if (!$conditionSatisfied)\n                    {\n                        continue\n                    }\n                }\n\n                $itemProperties[$nodePropChild.Name] = Evaluate-MSBuildExpression $nodePropChild.InnerText\n            }\n\n            Add-Project-Item -name $child.Name -value $childEvaluatedValue -properties $itemProperties\n        }\n\n        Set-ProjectItemContext $oldItemContextName\n\n        if ($node.GetAttribute(\"Label\") -ieq \"ProjectConfigurations\")\n        {\n            Detect-ProjectDefaultConfigPlatform\n        }\n    }\n\n    if ($node.Name -ieq \"ItemDefinitionGroup\")\n    {\n        foreach ($child in $node.ChildNodes)\n        {\n            if ($child.GetType().Name -ine \"XmlElement\")\n            {\n                continue\n            }\n\n            Push-ProjectItemContext $child.Name\n\n            foreach ($propNode in $child.ChildNodes)\n            {\n                if ($propNode.GetType().Name -ine \"XmlElement\")\n                {\n                    continue\n                }\n\n                [string] $propVal = Evaluate-MSBuildExpression $propNode.InnerText\n                Set-ProjectItemProperty $propNode.Name $propVal\n            }\n\n            Pop-ProjectItemContext\n        }\n    }\n\n    if ($node.ParentNode -and $node.ParentNode.Name -ieq \"PropertyGroup\")\n    {\n        # set new property value\n        [string] $propertyName = $node.Name\n        [string] $propertyValue = Evaluate-MSBuildExpression $node.InnerText\n\n        Set-Var -Name $propertyName -Value $propertyValue\n\n        return\n    }\n\n    if ($node.ChildNodes.Count -eq 0)\n    {\n        return\n    }\n\n    foreach ($child in $node.ChildNodes)\n    {\n        [bool] $validChild = $true\n        if ($child.GetType().Name -ieq \"XmlElement\")\n        {\n            if ($child.HasAttribute(\"Condition\"))\n            {\n                # process node condition\n                [string] $nodeCondition = $child.GetAttribute(\"Condition\")\n                $validChild = ((Evaluate-MSBuildCondition($nodeCondition)) -eq $true)\n                if ($validChild)\n                {\n                    $child.RemoveAttribute(\"Condition\")\n                }\n            }\n        }\n        if (!$validChild)\n        {\n            $nodesToRemove.Add($child) > $null\n            continue\n        }\n        else\n        {\n            SanitizeProjectNode($child)\n        }\n    }\n\n    foreach ($nodeToRemove in $nodesToRemove)\n    {\n        $nodeToRemove.ParentNode.RemoveChild($nodeToRemove) > $null\n    }\n}\n\n<#\n.DESCRIPTION\n   Parses a project file and loads data into corresponding data structures.\n   Project elements that are conditioned will be evaluated and discarded if their\n   condition is evaluted to False.\n#>\nfunction ParseProjectFile([string] $projectFilePath)\n{\n    # keep current file path, we'll need to restore it\n    [string] $currentFile = \"\"\n    if (VariableExistsAndNotEmpty 'MSBuildThisFileFullPath')\n    {\n        $currentFile = $MSBuildThisFileFullPath\n    }\n\n    Write-Verbose \"`nSanitizing $projectFilePath\"\n\n    [xml] $fileXml = Get-Content -LiteralPath $projectFilePath\n\n    $global:ProjectInputFiles.Add($projectFilePath) > $null\n\n    Push-Location -LiteralPath (Get-FileDirectory -filePath $projectFilePath)\n\n    InitializeMsBuildCurrentFileProperties -filePath $projectFilePath\n    SanitizeProjectNode($fileXml.Project)\n\n    Pop-Location\n    \n    # restore previous path\n    if (![string]::IsNullOrWhiteSpace(($currentFile)))\n    {\n        Write-Verbose \"[INFO] Restoring project file properties localstate to parent file\"\n        InitializeMsBuildCurrentFileProperties -filePath $currentFile\n    }\n}\n\nfunction LoadDirectoryBuildPropSheetFile()\n{\n    if ($env:CPT_LOAD_ALL -ne \"1\")\n    {\n        # Tries to find a Directory.Build.props property sheet, starting from the\n        # project directory, going up. When one is found, the search stops.\n        # Multiple Directory.Build.props sheets are not supported.\n        [string] $directoryBuildSheetPath = (cpt::GetDirNameOfFileAbove -startDir $ProjectDir `\n                                             -targetFile \"Directory.Build.props\") + \"\\Directory.Build.props\"\n        if (Test-Path -LiteralPath $directoryBuildSheetPath)\n        {\n            ParseProjectFile($directoryBuildSheetPath)\n        }\n\n        [string] $vcpkgIncludePath = \"$env:LOCALAPPDATA\\vcpkg\\vcpkg.user.targets\"\n        if (Test-Path -LiteralPath $vcpkgIncludePath)\n        {\n            ParseProjectFile($vcpkgIncludePath)\n        }\n    }\n}\n\n<#\n.DESCRIPTION\nLoads vcxproj and property sheets into memory. This needs to be called only once\nwhen processing a project. Accessing project data can be done using ItemGroups and Properties\n#>\nfunction LoadProject([string] $vcxprojPath)\n{\n    # Clean global variables that have been set by a previous project load\n    Clear-Vars\n\n    $global:vcxprojPath = $vcxprojPath\n\n    InitializeMsBuildProjectProperties\n\n    ParseProjectFile -projectFilePath $global:vcxprojPath\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/Tooling/v1/psClang/visualstudio-detection.ps1",
    "content": "# ------------------------------------------------------------------------------------------------\n# Helpers for locating Visual Studio on the computer\n\n# VsWhere is available starting with Visual Studio 2017 version 15.2.\nSet-Variable -name   kVsWhereLocation `\n    -value  \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\Installer\\vswhere.exe\" #`\n#-option Constant\n\nFunction Convert-MSVCFolderName2Toolset([Parameter(Mandatory = $true)][string] $internalVer)\n{\n    # https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering\n    $internalVer = $internalVer.Replace('.', '');\n\n    return $internalVer.Substring(0, 3);\n}\n\nFunction Convert-PlatformToolset2VsVer([Parameter(Mandatory = $true)][string] $toolset)\n{\n    switch ($toolset)\n    {\n        \"141\" { \"2017\" }\n        \"142\" { \"2019\" }\n        \"143\" { \"2022\" }\n    }\n}\n\nFunction Get-VisualStudioToolsets()\n{\n    $toolsetFolders = (Get-Item \"$(Get-VisualStudio-Path)\\VC\\Tools\\MSVC\\\" | Get-ChildItem)\n    [string[]] $toolsets = @()\n\n    foreach ($folder in $toolsetFolders)\n    {\n        $toolsets += @(Convert-MSVCFolderName2Toolset -internalVer $folder.Name)\n    }\n\n    return ($toolsets | Where-Object { ![string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique)\n}\n\nFunction Get-MscVer()\n{\n    [string[]] $mscVerFolders = ((Get-Item \"$(Get-VisualStudio-Path)\\VC\\Tools\\MSVC\\\" | Get-ChildItem).Name | Sort-Object -Descending)\n    foreach ($mscVerFolderName in $mscVerFolders)\n    {\n        # get the latest toolset (mscver) that matches our target Visual Studio version\n\n        [string] $platformToolset = Convert-MSVCFolderName2Toolset $mscVerFolderName\n        [string] $vsTargetVer = Convert-PlatformToolset2VsVer $platformToolset\n        if ($vsTargetVer -eq $global:cptVisualStudioVersion)\n        {\n            return $mscVerFolderName\n        }\n    }\n}\n \nFunction Get-VisualStudio-Includes([Parameter(Mandatory = $true)][string]  $vsPath,\n    [Parameter(Mandatory = $false)][string] $mscVer)\n{\n    [string] $mscVerToken = \"\"\n    If (![string]::IsNullOrEmpty($mscVer))\n    {\n        $mscVerToken = \"Tools\\MSVC\\$mscVer\\\"\n    }\n\n    return @( \"$vsPath\\VC\\$($mscVerToken)include\"\n            , \"$vsPath\\VC\\$($mscVerToken)atlmfc\\include\"\n            , \"$vsPath\\VC\\Auxiliary\\VS\\include\"\n            )\n}\n\nFunction Get-VsWhere-VisualStudio-Version()\n{\n    switch ($global:cptVisualStudioVersion)\n    {\n        \"2013\"  { return \"[12.0, 13)\" }\n        \"2015\"  { return \"[14.0, 15)\" }\n        \"2017\"  { return \"[15.0, 16)\" }\n        \"2019\"  { return \"[16.0, 17)\" }\n        \"2022\"  { return \"[17.0, 18)\" }\n        default { throw \"Unsupported Visual Studio version: $cptVisualStudioVersion\" }\n    }\n}\n\nFunction Get-VisualStudio-VersionNumber([Parameter(Mandatory = $true)][string]  $vsYearVersion)\n{\n    switch ($vsYearVersion)\n    {\n        \"2013\"  { return \"12.0\" }\n        \"2015\"  { return \"14.0\" }\n        \"2017\"  { return \"15.0\" }\n        \"2019\"  { return \"16.0\" }\n        \"2022\"  { return \"17.0\" }\n        default { throw \"Unsupported Visual Studio version: $vsYearVersion\" }\n    }\n}\n\n# Newer Visual Studio versions support installing older toolset versions, for compatibility reasons.\n# Returns default instalation path of the current VS version/toolset.\nFunction Get-VisualStudio-CompatiblityToolset-InstallLocation()\n{\n     if ( ([int] $global:cptVisualStudioVersion) -le 2022)\n     {\n        return \"${Env:ProgramFiles}\\Microsoft Visual Studio \" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n     }\n       \n    return \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio \" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n}\n\nFunction Get-VisualStudio-RegistryLocation()\n{\n     if ( ([int] $global:cptVisualStudioVersion) -le 2022)\n     {\n        return \"HKLM:SOFTWARE\\Microsoft\\VisualStudio\\\" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n     }\n    return \"HKLM:SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\\" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n}\n\nFunction Get-VisualStudio-Path()\n{\n    # Depending of the version of Visual Studio, we have different approaches to locating it.\n\n    if ( ([int] $global:cptVisualStudioVersion) -le 2015 )\n    {\n        # Older Visual Studio (<= 2015). VSWhere is not available.\n\n        [string] $installLocation = (Get-Item (Get-VisualStudio-RegistryLocation)).GetValue(\"InstallDir\")\n        if ($installLocation)\n        {\n            $installLocation = Canonize-Path -base $installLocation -child \"..\\..\" -ignoreErrors\n        }\n        if ($installLocation)\n        {\n            return $installLocation\n        }\n\n        # we may have a newer VS installation with an older toolset feature installed\n        [string] $toolsetDiskLocation = (Get-VisualStudio-CompatiblityToolset-InstallLocation)\n        [string] $iostreamLocation = Canonize-Path -base toolsetDiskLocation `\n                                                   -child \"VC\\include\\iostream\" -ignoreErrors\n        if ($iostreamLocation)\n        {\n            return $toolsetDiskLocation\n        }\n\n        Write-Err \"Visual Studio $($global:cptVisualStudioVersion) installation location could not be detected\"\n    }\n    else\n    {\n        # modern Visual Studio (> 2017). Use VSWhere to locate it.\n        if (Test-Path -LiteralPath $kVsWhereLocation)\n        {\n\n            [string] $product = \"*\"\n            if (![string]::IsNullOrEmpty($aVisualStudioSku))\n            {\n              $product = \"Microsoft.VisualStudio.Product.$aVisualStudioSku\"\n            }\n\n            [string] $version = Get-VsWhere-VisualStudio-Version\n            [string[]] $output = @(& \"$kVsWhereLocation\" -nologo `\n                                                        -property installationPath `\n                                                        -products $product `\n                                                        -version $version `\n                                                        -prerelease)\n\n            # the -prerelease switch is not available on older VS2017 versions\n            if (($output -join \"\").Contains(\"0x57\")) <# error code for unknown parameter #>\n            {\n                $output = (& \"$kVsWhereLocation\" -nologo `\n                                                 -property installationPath `\n                                                 -version $version `\n                                                 -products $product)\n            }\n\n            if (!$output)\n            {\n                throw \"VsWhere could not detect Visual Studio $($global:cptVisualStudioVersion) $product.\"\n            }\n\n            [string] $installationPath = $output[0]\n            Write-Verbose \"Detected (vswhere) VisualStudio installation path: $installationPath\"\n            return $installationPath\n        }\n\n        if ( ([int] $global:cptVisualStudioVersion) -le 2022)\n        {\n           [string] $kVsDefaultLocation = \"${Env:ProgramFiles}\\Microsoft Visual Studio\\$global:cptVisualStudioVersion\\$aVisualStudioSku\"\n        }\n        else\n        {\n           [string] $kVsDefaultLocation = \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\$global:cptVisualStudioVersion\\$aVisualStudioSku\"\n        }\n      \n        if (Test-Path -LiteralPath $kVsDefaultLocation)\n        {\n            return $kVsDefaultLocation\n        }\n\n        throw \"Cannot locate Visual Studio $($global:cptVisualStudioVersion)\"\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/VSPackage.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n    VS SDK Notes: This resx file contains the resources that will be consumed from your package by Visual Studio.\n    For example, Visual Studio will attempt to load resource '400' from this resource stream when it needs to\n    load your package's icon. Because Visual Studio will always look in the VSPackage.resources stream first for\n    resources it needs, you should put additional resources that Visual Studio will load directly into this resx\n    file.\n\n    Resources that you would like to access directly from your package in a strong-typed fashion should be stored\n    in Resources.resx or another resx file.\n-->\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"110\" xml:space=\"preserve\">\n    <value>RunPowerShellCommand Extension</value>\n  </data>\n  <data name=\"112\" xml:space=\"preserve\">\n    <value>RunPowerShellCommand Visual Studio Extension Detailed Info</value>\n  </data>\n</root>"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/cpt.config",
    "content": "<cpt-config>\n\n  <!--\n\n  Clang Power Tools configuration file (SAMPLE)\n\n  Using cpt.config you can specify configuration options for ClangPowerTools,\n  allowing your entire team to share a single CPT configuration.\n\n  This file just has to be put in your codebase directory hierarchy's top level and\n  it'll be automatically picked up.\n\n  All clang-build.ps1 parameters are accepted, either full name or alias, as XML elements.\n\n  -->\n\n  <clang-flags>  \"-Werror\"\n               , \"-Wall\"\n               , \"-fms-compatibility-version=19.10\"\n               , \"-Wmicrosoft\"\n               , \"-Wno-invalid-token-paste\"\n               , \"-Wno-unknown-pragmas\"\n               , \"-Wno-unused-value\"\n  </clang-flags>\n\n  <header-filter>'.*'</header-filter>\n\n  <parallel/>\n\n  <treat-sai/>\n\n  <!-- \n\t  'vs-sku' tells ClangPowerTools to use a specific Visual Studio edition.\n\t  If you do not specify the 'vs-sku' parameter then ClangPowerTools will use \n\t  the first detected edition by vswhere.\n  -->\n  <!-- <vs-sku>'Professional'</vs-sku> -->\n\n</cpt-config>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools/source.extension.vsixmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PackageManifest Version=\"2.0.0\" xmlns=\"http://schemas.microsoft.com/developer/vsx-schema/2011\" xmlns:d=\"http://schemas.microsoft.com/developer/vsx-schema-design/2011\">\n  <Metadata>\n    <Identity Id=\"Caphyon.705559db-5755-43fa-a023-41a3b14d2935\" Version=\"2025.11.0\" Language=\"en-US\" Publisher=\"Caphyon\" />\n    <DisplayName>Clang Power Tools</DisplayName>\n    <Description xml:space=\"preserve\">A tool bringing clang-tidy magic to Visual Studio C++ developers.</Description>\n    <MoreInfo>http://www.clangpowertools.com/QaA</MoreInfo>\n    <License>Resources\\LICENSE.txt</License>\n    <GettingStartedGuide>http://www.clangpowertools.com</GettingStartedGuide>\n    <ReleaseNotes>http://www.clangpowertools.com/CHANGELOG</ReleaseNotes>\n    <Icon>Resources\\CPTLogoManageExtensionVS.png</Icon>\n    <PreviewImage>Resources\\CPTLogoManageExtensionVS.png</PreviewImage>\n    <Tags>clang;clang-tidy;clang-format;compile;modernize;CoreGuidelines;static analysis;tidy;C++;cpp;analyze</Tags>\n  </Metadata>\n  <Installation InstalledByMsi=\"false\">\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Community\" Version=\"[15.0,17.0)\">\n      <ProductArchitecture>x86</ProductArchitecture>\n    </InstallationTarget>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Community\" Version=\"[17.0,18.0)\">\n      <ProductArchitecture>amd64</ProductArchitecture>\n    </InstallationTarget>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Professional\" Version=\"[15.0,17.0)\">\n      <ProductArchitecture>x86</ProductArchitecture>\n    </InstallationTarget>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Professional\" Version=\"[17.0,18.0)\">\n      <ProductArchitecture>amd64</ProductArchitecture>\n    </InstallationTarget>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Enterprise\" Version=\"[15.0,17.0)\">\n      <ProductArchitecture>x86</ProductArchitecture>\n    </InstallationTarget>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Enterprise\" Version=\"[17.0,18.0)\">\n      <ProductArchitecture>amd64</ProductArchitecture>\n    </InstallationTarget>\n  </Installation>\n  <Dependencies>\n    <Dependency Id=\"Microsoft.Framework.NDP\" DisplayName=\"Microsoft .NET Framework\" d:Source=\"Manual\" Version=\"[4.5,)\" />\n  </Dependencies>\n  <Prerequisites>\n    <Prerequisite Id=\"Microsoft.VisualStudio.Component.CoreEditor\" Version=\"[15.0,)\" DisplayName=\"Visual Studio core editor\" />\n  </Prerequisites>\n  <Assets>\n    <Asset Type=\"Microsoft.VisualStudio.VsPackage\" d:Source=\"Project\" d:ProjectName=\"%CurrentProject%\" Path=\"|%CurrentProject%;PkgdefProjectOutputGroup|\" />\n    <Asset Type=\"Microsoft.VisualStudio.ToolboxControl\" d:Source=\"Project\" d:ProjectName=\"%CurrentProject%\" Path=\"|%CurrentProject%;PkgdefProjectOutputGroup|\" />\n    <Asset Type=\"Microsoft.VisualStudio.MefComponent\" d:Source=\"Project\" d:ProjectName=\"%CurrentProject%\" Path=\"|%CurrentProject%|\" />\n  </Assets>\n</PackageManifest>"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools.aip",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<DOCUMENT Type=\"Advanced Installer\" CreateVersion=\"19.1\" version=\"21.5.1\" Modules=\"vsix\" RootPath=\".\" Language=\"en\" Id=\"{4BC191C4-3036-4EAA-AD6F-B3743A78763D}\">\n  <COMPONENT cid=\"caphyon.advinst.msicomp.GenericPropertyComponent\">\n    <ROW Name=\"Author\" Value=\"Caphyon\" Type=\"0\"/>\n    <ROW Name=\"Description\" Value=\"A tool bringing clang-tidy magic to Visual Studio C++ developers.\" Type=\"0\" ValueLocId=\"*\"/>\n    <ROW Name=\"Icon\" Value=\"EXTENSIONS_FOLDER\\Resources\\ClangPowerToolsIco.ico\" Type=\"1\"/>\n    <ROW Name=\"Identifier\" Value=\"Caphyon.705559db-5755-43fa-a023-41a3b14d2935\" Type=\"0\"/>\n    <ROW Name=\"License\" Value=\"EXTENSIONS_FOLDER\\Resources\\LICENSE.txt\" Type=\"1\"/>\n    <ROW Name=\"Locale\" Value=\"1033\" Type=\"0\"/>\n    <ROW Name=\"Name\" Value=\"Clang Power Tools\" Type=\"0\" ValueLocId=\"*\"/>\n    <ROW Name=\"Version\" Value=\"2025.11.0\" Type=\"0\"/>\n    <ROW Name=\"VsixLanguage\" Value=\"en-US\" Type=\"0\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.DictionaryComponent\">\n    <ROW Path=\"&lt;AI_DICTS&gt;vsix.ail\"/>\n    <ROW Path=\"&lt;AI_DICTS&gt;vsix_en.ail\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.DigCertStoreComponent\">\n    <ROW DigitalCertificate=\"cert.pfx\" SignerDescription=\"[|ProductName]\" SignOptions=\"0\" SignTool=\"2\" UseSha256=\"1\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.GenericDirectoryComponent\">\n    <ROW Id=\"1\" Name=\"EXTENSIONS_FOLDER\" Flags=\"1\"/>\n    <ROW Id=\"2\" Name=\"Resources\" Parent=\"1\" Flags=\"0\"/>\n    <ROW Id=\"3\" Name=\"Tooling\" Parent=\"1\" Flags=\"0\"/>\n    <ROW Id=\"4\" Name=\"v1\" Parent=\"3\" Flags=\"0\"/>\n    <ROW Id=\"5\" Name=\"psClang\" Parent=\"4\" Flags=\"0\"/>\n    <ROW Id=\"6\" Name=\"integration-projects\" Parent=\"5\" Flags=\"0\"/>\n    <ROW Id=\"7\" Name=\"itemgroups\" Parent=\"6\" Flags=\"0\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.GenericFileComponent\">\n    <ROW Id=\"1\" Name=\"ClangPowerToolsLib16.dll\" Path=\"ClangPowerTools\\bin\\Release\\ClangPowerToolsLib16.dll\" ParentDir=\"1\"/>\n    <ROW Id=\"2\" Name=\"ClangPowerToolsLib17.dll\" Path=\"ClangPowerTools\\bin\\Release\\ClangPowerToolsLib17.dll\" ParentDir=\"1\"/>\n    <ROW Id=\"3\" Name=\"ClangPowerTools.dll\" Path=\"ClangPowerTools\\bin\\Release\\ClangPowerTools.dll\" ParentDir=\"1\"/>\n    <ROW Id=\"4\" Name=\"ClangPowerTools.pkgdef\" Path=\"ClangPowerTools\\bin\\Release\\ClangPowerTools.pkgdef\" ParentDir=\"1\"/>\n    <ROW Id=\"5\" Name=\"System.ComponentModel.Annotations.dll\" Path=\"ClangPowerTools\\bin\\Release\\System.ComponentModel.Annotations.dll\" ParentDir=\"1\"/>\n    <ROW Id=\"6\" Name=\"Microsoft.VisualStudio.DpiAwareness.dll\" Path=\"ClangPowerTools\\bin\\Release\\Microsoft.VisualStudio.DpiAwareness.dll\" ParentDir=\"1\"/>\n    <ROW Id=\"7\" Name=\"CPTLogoManageExtensionVS.png\" Path=\"ClangPowerTools\\bin\\Release\\Resources\\CPTLogoManageExtensionVS.png\" ParentDir=\"2\"/>\n    <ROW Id=\"8\" Name=\"LICENSE.txt\" Path=\"ClangPowerTools\\bin\\Release\\Resources\\LICENSE.txt\" ParentDir=\"2\"/>\n    <ROW Id=\"12\" Name=\"clang-build.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\clang-build.ps1\" ParentDir=\"4\"/>\n    <ROW Id=\"13\" Name=\"get-header-references.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-header-references.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"14\" Name=\"get-llvm-helper.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm-helper.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"15\" Name=\"get-llvm.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\get-llvm.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"16\" Name=\"integration-project.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\integration-project.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"17\" Name=\"CptIntegrationProjects.sln\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\integration-projects\\CptIntegrationProjects.sln\" ParentDir=\"6\"/>\n    <ROW Id=\"18\" Name=\"test.vcxproj\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\integration-projects\\itemgroups\\test.vcxproj\" ParentDir=\"7\"/>\n    <ROW Id=\"19\" Name=\"io.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\io.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"20\" Name=\"io.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\io.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"21\" Name=\"itemdefinition-context.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\itemdefinition-context.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"22\" Name=\"jsondb-export.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\jsondb-export.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"23\" Name=\"jsondb-export.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\jsondb-export.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"24\" Name=\"msbuild-expression-eval.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-expression-eval.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"25\" Name=\"msbuild-expression-eval.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-expression-eval.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"26\" Name=\"msbuild-project-cache-repository.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-cache-repository.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"27\" Name=\"msbuild-project-cache-repository.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-cache-repository.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"28\" Name=\"msbuild-project-data.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-data.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"29\" Name=\"msbuild-project-data.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-data.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"30\" Name=\"Clang Format Editor.msi\" Path=\"ClangPowerToolsShared\\Executables\\Clang Format Editor.msi\" ParentDir=\"1\"/>\n    <ROW Id=\"31\" Name=\"clang-format.exe\" Path=\"ClangPowerToolsShared\\Executables\\clang-format.exe\" ParentDir=\"1\"/>\n    <ROW Id=\"32\" Name=\"ClangPowerToolsIco.ico\" Path=\"ClangPowerToolsShared\\Resources\\ClangPowerToolsIco.ico\" ParentDir=\"2\"/>\n    <ROW Id=\"33\" Name=\"msbuild-project-load.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-load.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"34\" Name=\"msbuild-project-load.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\msbuild-project-load.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"35\" Name=\"visualstudio-detection.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\visualstudio-detection.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"36\" Name=\"visualstudio-detection.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\visualstudio-detection.tests.ps1\" ParentDir=\"5\"/>\n    <ROW Id=\"37\" Name=\"~advinst.tests.ps1\" Path=\"ClangPowerToolsShared\\Tooling\\v1\\psClang\\~advinst.tests.ps1\" ParentDir=\"5\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.VsixContentComponent\">\n    <ROW File=\"4\" Type=\"6\"/>\n    <ROW File=\"4\" Type=\"5\"/>\n    <ROW File=\"3\" Type=\"3\"/>\n    <ATTRIBUTE name=\"OutputFileName\" value=\"ClangPowerTools.vsix\"/>\n    <ATTRIBUTE name=\"OutputFolder\" value=\"VsixAI\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.VsixReferencesComponent\">\n    <ROW Id=\"Microsoft.Framework.NDP\" Name=\"Microsoft .NET Framework\" MinVersion=\"4.5\" Flags=\"2\"/>\n    <ROW Id=\"Microsoft.VisualStudio.Component.CoreEditor\" Name=\"Visual Studio core editor\" MinVersion=\"15.0\" Type=\"1\" Flags=\"2\"/>\n  </COMPONENT>\n  <COMPONENT cid=\"caphyon.advinst.msicomp.VsixSupportedProductComponent\">\n    <ROW Name=\"Community\" Version=\"15.0\" MaxVersion=\"18.0\" Type=\"0\" Flags=\"2\" Architecture=\"amd64\"/>\n    <ROW Name=\"Pro\" Version=\"15.0\" MaxVersion=\"18.0\" Type=\"0\" Flags=\"2\" Architecture=\"amd64\"/>\n    <ROW Name=\"Enterprise\" Version=\"15.0\" MaxVersion=\"18.0\" Type=\"0\" Flags=\"2\" Architecture=\"amd64\"/>\n  </COMPONENT>\n</DOCUMENT>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerTools.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.0\nMinimumVisualStudioVersion = 15.0.0\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ClangPowerToolsShared\", \"ClangPowerToolsShared\\ClangPowerToolsShared.shproj\", \"{A0CEA277-F6A1-4F62-862C-357C8C5654AA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClangPowerTools\", \"ClangPowerTools\\ClangPowerTools.csproj\", \"{51237463-9F4D-44DE-8BC0-587384B9E8B8}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A} = {C866AF9F-8754-4C75-8A47-A8055F7E2D3A}\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129} = {B71297DD-B444-4AA5-AC7B-99BD812E9129}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClangPowerToolsLib16\", \"ClangPowerToolsLib16\\ClangPowerToolsLib16.csproj\", \"{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClangPowerToolsLib17\", \"ClangPowerToolsLib17\\ClangPowerToolsLib17.csproj\", \"{B71297DD-B444-4AA5-AC7B-99BD812E9129}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Debug|x86.Build.0 = Debug|x86\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|x64.Build.0 = Release|Any CPU\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|x86.ActiveCfg = Release|x86\n\t\t{51237463-9F4D-44DE-8BC0-587384B9E8B8}.Release|x86.Build.0 = Release|x86\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|x64.Build.0 = Release|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B71297DD-B444-4AA5-AC7B-99BD812E9129}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {15C5DC16-7442-43C6-8076-5E27B900176B}\n\tEndGlobalSection\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tClangPowerToolsShared\\ClangPowerToolsShared.projitems*{a0cea277-f6a1-4f62-862c-357c8c5654aa}*SharedItemsImports = 13\n\t\tClangPowerToolsShared\\ClangPowerToolsShared.projitems*{b71297dd-b444-4aa5-ac7b-99bd812e9129}*SharedItemsImports = 4\n\t\tClangPowerToolsShared\\ClangPowerToolsShared.projitems*{c866af9f-8754-4c75-8a47-a8055f7e2d3a}*SharedItemsImports = 4\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib16/ClangPowerToolsLib16.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <RuntimeIdentifiers>win</RuntimeIdentifiers>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SignAssembly>true</SignAssembly>\n  </PropertyGroup>\n  <PropertyGroup>\n    <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{C866AF9F-8754-4C75-8A47-A8055F7E2D3A}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClangPowerTools</RootNamespace>\n    <AssemblyName>ClangPowerToolsLib16</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <Deterministic>true</Deterministic>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Windows\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"WindowsBase\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" Version=\"15.0.1\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Shell.15.0\">\n      <Version>15.9.28307</Version>\n    </PackageReference>\n    <PackageReference Include=\"Microsoft.VisualStudio.Shell.Framework\" Version=\"15.9.28307\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Threading\" Version=\"15.8.209\" />\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.3.2094\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"9.0.1\" />\n    <PackageReference Include=\"System.ComponentModel.Annotations\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Management\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Properties\\Resource.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resource.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Key.snk\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Properties\\Resource.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n  <Import Project=\"..\\ClangPowerToolsShared\\ClangPowerToolsShared.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>xcopy \"$(TargetPath)\" \"$(SolutionDir)ClangPowerTools\" /y</PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib16/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClangPowerToolsLib16\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClangPowerToolsLib16\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2021\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"c866af9f-8754-4c75-8a47-a8055f7e2d3a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib16/Properties/Resource.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ClangPowerTools.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resource {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resource() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ClangPowerTools.Properties.Resource\", typeof(Resource).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Deselect all.\n        /// </summary>\n        internal static string DeselectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"DeselectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Encoding Converter.\n        /// </summary>\n        internal static string EncodingConverterWindowTitle {\n            get {\n                return ResourceManager.GetString(\"EncodingConverterWindowTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to encoding is not supported.\n        /// </summary>\n        internal static string EncodingError {\n            get {\n                return ResourceManager.GetString(\"EncodingError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The following files are not encoded in UTF-8. Do you want to change their encoding?.\n        /// </summary>\n        internal static string EncodingErrorText {\n            get {\n                return ResourceManager.GetString(\"EncodingErrorText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Select all.\n        /// </summary>\n        internal static string SelectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"SelectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unicode (UTF-8).\n        /// </summary>\n        internal static string UTF8Encoding {\n            get {\n                return ResourceManager.GetString(\"UTF8Encoding\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib16/Properties/Resource.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"DeselectAllTooltipText\" xml:space=\"preserve\">\n    <value>Deselect all</value>\n  </data>\n  <data name=\"EncodingConverterWindowTitle\" xml:space=\"preserve\">\n    <value>Encoding Converter</value>\n  </data>\n  <data name=\"EncodingError\" xml:space=\"preserve\">\n    <value>encoding is not supported</value>\n  </data>\n  <data name=\"EncodingErrorText\" xml:space=\"preserve\">\n    <value>The following files are not encoded in UTF-8. Do you want to change their encoding?</value>\n  </data>\n  <data name=\"SelectAllTooltipText\" xml:space=\"preserve\">\n    <value>Select all</value>\n  </data>\n  <data name=\"UTF8Encoding\" xml:space=\"preserve\">\n    <value>Unicode (UTF-8)</value>\n  </data>\n</root>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib17/ClangPowerToolsLib17.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <RuntimeIdentifiers>win</RuntimeIdentifiers>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SignAssembly>true</SignAssembly>\n  </PropertyGroup>\n  <PropertyGroup>\n    <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B71297DD-B444-4AA5-AC7B-99BD812E9129}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClangPowerTools</RootNamespace>\n    <AssemblyName>ClangPowerToolsLib17</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <Deterministic>true</Deterministic>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Windows\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"WindowsBase\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" Version=\"17.9.37000\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Shell.Framework\" Version=\"17.9.37000\" />\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.9.3174\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"System.ComponentModel.Annotations\">\n      <Version>5.0.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Management\">\n      <Version>8.0.0</Version>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Properties\\Resource.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resource.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Key.snk\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Properties\\Resource.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n  <Import Project=\"..\\ClangPowerToolsShared\\ClangPowerToolsShared.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>xcopy \"$(TargetPath)\" \"$(SolutionDir)ClangPowerTools\" /y</PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib17/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClangPowerToolsLib16\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClangPowerToolsLib16\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2021\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"c866af9f-8754-4c75-8a47-a8055f7e2d3a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib17/Properties/Resource.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ClangPowerTools.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resource {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resource() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"ClangPowerTools.Properties.Resource\", typeof(Resource).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Deselect all.\n        /// </summary>\n        internal static string DeselectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"DeselectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Encoding Converter.\n        /// </summary>\n        internal static string EncodingConverterWindowTitle {\n            get {\n                return ResourceManager.GetString(\"EncodingConverterWindowTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to encoding is not supported.\n        /// </summary>\n        internal static string EncodingError {\n            get {\n                return ResourceManager.GetString(\"EncodingError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The following files are not encoded in UTF-8. Do you want to change their encoding?.\n        /// </summary>\n        internal static string EncodingErrorText {\n            get {\n                return ResourceManager.GetString(\"EncodingErrorText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Select all.\n        /// </summary>\n        internal static string SelectAllTooltipText {\n            get {\n                return ResourceManager.GetString(\"SelectAllTooltipText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unicode (UTF-8).\n        /// </summary>\n        internal static string UTF8Encoding {\n            get {\n                return ResourceManager.GetString(\"UTF8Encoding\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsLib17/Properties/Resource.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"DeselectAllTooltipText\" xml:space=\"preserve\">\n    <value>Deselect all</value>\n  </data>\n  <data name=\"EncodingConverterWindowTitle\" xml:space=\"preserve\">\n    <value>Encoding Converter</value>\n  </data>\n  <data name=\"EncodingError\" xml:space=\"preserve\">\n    <value>encoding is not supported</value>\n  </data>\n  <data name=\"EncodingErrorText\" xml:space=\"preserve\">\n    <value>The following files are not encoded in UTF-8. Do you want to change their encoding?</value>\n  </data>\n  <data name=\"SelectAllTooltipText\" xml:space=\"preserve\">\n    <value>Select all</value>\n  </data>\n  <data name=\"UTF8Encoding\" xml:space=\"preserve\">\n    <value>Unicode (UTF-8)</value>\n  </data>\n</root>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Attributes/ClangCheckAttribute.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools\n{\n  [AttributeUsage(AttributeTargets.Property)]\n  public class ClangCheckAttribute : Attribute\n  {\n    public bool IsFlag { get; private set; }\n    public ClangCheckAttribute(bool aIsFlag)\n    {\n      IsFlag = aIsFlag;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Attributes/ClangFormatPathAttribute.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools\n{\n  [AttributeUsage(AttributeTargets.Property)]\n  public class ClangFormatPathAttribute : Attribute\n  {\n    public bool Activate { get; set; }\n\n    public ClangFormatPathAttribute(bool aActivate)\n    {\n      Activate = aActivate;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Attributes/ClangTidyPathAttribute.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools\n{\n  [AttributeUsage(AttributeTargets.Property)]\n  public class ClangTidyPathAttribute : Attribute\n  {\n    public bool Activate { get; set; }\n\n    public ClangTidyPathAttribute(bool aActivate)\n    {\n      Activate = aActivate;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Builder/IAsyncBuilder.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClangPowerTools.Builder\n{\n  public interface IBuilderAsync<T>\n  {\n    Task BuildAsync();\n\n    T GetAsyncResult();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Builder/IBuilder.cs",
    "content": "﻿namespace ClangPowerTools.Builder\n{\n  public interface IBuilder<T>\n  {\n    void Build();\n    T GetResult();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/CMake/CMakeBuilder.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System.IO;\n\nnamespace ClangPowerTools.CMake\n{\n  public class CMakeBuilder\n  {\n    #region Members\n\n    private readonly string directoryName = \"CPTCMakeBuild\";\n    private FileStream VcxprojFile;\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Create the build directory(\"CPTCMakeBuild\") for the current CMake project\n    /// </summary>\n    /// <param name=\"newDirName\">The name of the created directory</param>\n    /// <param name=\"dirPath\">The full path of the created directory</param>\n    /// <returns>True if the directory is created successfully. False otherwise.</returns>\n    public bool CreateBuildDirectory(string newDirName, out string dirPath)\n    {\n      dirPath = null;\n      SolutionInfo.GetSolutionInfo(out string dir, out _, out _);\n      if (Directory.Exists(dir) == false)\n        return false;\n\n      dirPath = Path.Combine(dir, newDirName);\n      if (Directory.Exists(dirPath))\n        return true;\n\n      Directory.CreateDirectory(dirPath);\n      return true;\n    }\n\n    /// <summary>\n    /// Build the current CMake project. The process will generate one .sln file and posible more .vcxproj files.\n    /// </summary>\n    public void Build()\n    {\n      if (CreateBuildDirectory(directoryName, out string dirPath) == false)\n        return;\n\n      LockVcxprojFile();\n\n      var command = \"cmake -G \\\"Visual Studio 16 2019\\\" ..\";\n\n      using (System.Diagnostics.Process process = new System.Diagnostics.Process()\n      {\n        StartInfo = new System.Diagnostics.ProcessStartInfo()\n        {\n          CreateNoWindow = true,\n          WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,\n          WorkingDirectory = dirPath,\n          FileName = \"cmd.exe\",\n          Arguments = \"/c \" + command,\n          UseShellExecute = false\n        }\n      })\n      {\n        process.Start();\n        process.WaitForExit();\n      }\n      UnlockVcxprojFile();\n    }\n\n\n    /// <summary>\n    /// Locks vcxproj file by opening it. This function is used before generating\n    /// .sln and .vcxproj, because if user already have a\n    /// .vcxproj generated, this file will be overriden.\n    /// We need to lock user .vcxproj file and gerenate .sln \n    /// and .vcxproj in a temp folder\n    /// </summary>\n    private void LockVcxprojFile()\n    {\n      SolutionInfo.GetSolutionInfo(out string dir, out _, out _);\n      if (Directory.Exists(dir) == false)\n        return;\n      var dirName = new DirectoryInfo(dir).Name;\n      var vcxprojPath = Path.Combine(dir, dirName, dirName + ScriptConstants.kProjectFileExtension);\n      if(File.Exists(vcxprojPath))\n        VcxprojFile = File.Open(vcxprojPath, FileMode.Open, FileAccess.Write);\n    }\n\n    private void UnlockVcxprojFile()\n    {\n      if (VcxprojFile != null)\n      {\n        VcxprojFile.Close();\n        VcxprojFile.Dispose();\n      }\n    }\n\n    /// <summary>\n    /// Delete from the disk the CMake build directory and all its content.\n    /// </summary>\n    public void ClearBuildCashe()\n    {\n      CreateBuildDirectory(directoryName, out string dirPath);\n      if (string.IsNullOrWhiteSpace(dirPath))\n        return;\n\n      Directory.Delete(dirPath, true);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsPackage.cs",
    "content": "﻿using ClangPowerTools.Commands;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.Output;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.CommandBars;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Threading;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  /// <summary>\n  /// This is the class that implements the package exposed by this assembly.\n  /// </summary>\n  /// <remarks>\n  /// <para>\n  /// The minimum requirement for a class to be considered a valid package for Visual Studio\n  /// is to implement the IVsPackage interface and register itself with the shell.\n  /// This package uses the helper classes defined inside the Managed Package Framework (MPF)\n  /// to do it: it derives from the Package class that provides the implementation of the\n  /// IVsPackage interface and uses the registration attributes defined in the framework to\n  /// register itself and its components with the shell. These attributes tell the pkgdef creation\n  /// utility what data to put into .pkgdef file.\n  /// </para>\n  /// <para>\n  /// To get loaded into VS, the package must be referred by &lt;Asset Type=\"Microsoft.VisualStudio.VsPackage\" ...&gt; in .vsixmanifest file.\n  /// </para>\n  /// </remarks>\n  [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]\n  [InstalledProductRegistration(\"#110\", \"#112\", \"1.0\", IconResourceID = 400)] // Info on this package for Help/About\n  [ProvideMenuResource(\"Menus.ctmenu\", 1)]\n  [ProvideToolWindow(typeof(TidyToolWindow), Style = VsDockStyle.Tabbed, DockedWidth = 300, Window = \"DocumentWell\", Orientation = ToolWindowOrientation.Left)]\n  [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string, PackageAutoLoadFlags.BackgroundLoad)]\n  [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string, PackageAutoLoadFlags.BackgroundLoad)]\n  [ProvideMenuResource(\"Menus.ctmenu\", 1)]\n  [ProvideToolWindow(typeof(TidyToolWindow), Style = VsDockStyle.Tabbed, DockedWidth = 300, Window = \"DocumentWell\", Orientation = ToolWindowOrientation.Left, Transient = true)]\n  [Guid(PackageGuidString)]\n  public sealed class RunClangPowerToolsPackage : AsyncPackage, IVsSolutionEvents, IVsSolutionLoadEvents, IVsSolutionEvents7\n  {\n    #region Members\n\n    /// <summary>\n    /// RunPowerShellCommandPackage GUID string.\n    /// </summary>\n    public const string PackageGuidString = \"f564f9d3-01ae-493e-883b-18deebdb975e\";\n\n    private uint mHSolutionEvents = uint.MaxValue;\n    private RunningDocTableEvents mRunningDocTableEvents;\n    private ErrorWindowController mErrorWindowController;\n    private OutputWindowController mOutputWindowController;\n    private CommandController mCommandController;\n\n    private CommandEvents mCommandEvents;\n    private BuildEvents mBuildEvents;\n    private DTEEvents mDteEvents;\n    private WindowEvents windowEvents;\n\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TidyCommand\"/> class.\n    /// </summary>\n    public RunClangPowerToolsPackage()\n    {\n      // Inside this method you can place any initialization code that does not require\n      // any Visual Studio service because at this point the package object is created but\n      // not sited yet inside Visual Studio environment. The place to do all the other\n      // initialization is the Initialize method.\n    }\n\n    #endregion\n\n\n    #region Initialize Package\n\n\n    /// <summary>\n    /// Initialization of the package; this method is called right after the package is sited, so this is the place\n    /// where you can put all the initialization code that rely on services provided by VisualStudio.\n    /// </summary>\n    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)\n    {\n      // Switches to the UI thread in order to consume some services used in command initialization\n      await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);\n\n      await RegisterVsServicesAsync();\n\n      mCommandController = new CommandController(this);\n\n      CommandControllerInstance.CommandController = mCommandController;\n\n      var vsOutputWindow = VsServiceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;\n\n      mOutputWindowController = new OutputWindowController();\n      mOutputWindowController.Initialize(this, vsOutputWindow);\n\n      mRunningDocTableEvents = new RunningDocTableEvents(this);\n      mErrorWindowController = new ErrorWindowController(this);\n\n      #region Get Pointer to IVsSolutionEvents\n\n      if (VsServiceProvider.TryGetService(typeof(SVsSolution), out object vsSolutionService))\n      {\n        var vsSolution = vsSolutionService as IVsSolution;\n        UnadviseSolutionEvents(vsSolution);\n        AdviseSolutionEvents(vsSolution);\n      }\n\n      #endregion\n\n      // Get-Set the build and command events from DTE\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var dte2 = dte as DTE2;\n\n        mBuildEvents = dte2.Events.BuildEvents;\n        mCommandEvents = dte2.Events.CommandEvents;\n        mDteEvents = dte2.Events.DTEEvents;\n        windowEvents = dte2.Events.WindowEvents;\n      }\n\n      var settingsHandler = new SettingsHandler();\n      settingsHandler.InitializeSettings();\n      await settingsHandler.InitializeAccountSettingsAsync();\n\n      string version = SettingsProvider.GeneralSettingsModel.Version;\n\n      ShowToolbar(version);\n      UpdateVersion(version);\n\n      await mCommandController.InitializeCommandsAsync(this);\n\n      await RegisterToEventsAsync();\n\n      await base.InitializeAsync(cancellationToken, progress);\n    }\n\n    //public override IVsAsyncToolWindowFactory GetAsyncToolWindowFactory(Guid toolWindowType)\n    //{\n    //  return toolWindowType.Equals(Guid.Parse(TidyToolWindow.WindowGuidString)) ? this : null;\n    //}\n\n    //protected override string GetToolWindowTitle(Type toolWindowType, int id)\n    //{\n    //  return toolWindowType == typeof(TidyToolWindow) ? TidyToolWindow.Title : base.GetToolWindowTitle(toolWindowType, id);\n    //}\n\n    #endregion\n\n\n    #region Get Pointer to IVsSolutionEvents\n\n\n    private void AdviseSolutionEvents(IVsSolution aVsSolution)\n    {\n      try\n      {\n        aVsSolution?.AdviseSolutionEvents(this, out mHSolutionEvents);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    private void UnadviseSolutionEvents(IVsSolution aVsSolution)\n    {\n      if (null == aVsSolution)\n        return;\n\n      if (uint.MaxValue != mHSolutionEvents)\n      {\n        aVsSolution.UnadviseSolutionEvents(mHSolutionEvents);\n        mHSolutionEvents = uint.MaxValue;\n      }\n\n      aVsSolution = null;\n    }\n\n    #endregion\n\n\n    #region IVsSolutionEvents Implementation\n\n\n    public int OnAfterOpenProject(IVsHierarchy aPHierarchy, int aFAdded)\n    {\n      CreateCacheRepository();\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryCloseProject(IVsHierarchy aPHierarchy, int aFRemoving, ref int aPfCancel)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      DeleteCacheReporitory();\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeCloseProject(IVsHierarchy aPHierarchy, int aFRemoved)\n    {\n      aPHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out object projectObject);\n      if (projectObject is Project project)\n        mErrorWindowController.RemoveErrors(aPHierarchy);\n\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterLoadProject(IVsHierarchy aPStubHierarchy, IVsHierarchy aPRealHierarchy)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      DeleteCacheReporitory();\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryUnloadProject(IVsHierarchy aPRealHierarchy, ref int aPfCancel)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeUnloadProject(IVsHierarchy aPRealHierarchy, IVsHierarchy aPStubHierarchy)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterOpenSolution(object aPUnkReserved, int aFNewSolution)\n    {\n      CreateCacheRepository();\n      return VSConstants.S_OK;\n    }\n\n\n    public int OnQueryCloseSolution(object aPUnkReserved, ref int aPfCancel)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeCloseSolution(object aPUnkReserved)\n    {\n      DeleteTempSolution();\n      var tidyToolWindow = FindToolWindow(typeof(TidyToolWindow), 0, false);\n      if (tidyToolWindow is null) return VSConstants.S_OK;\n      var window = tidyToolWindow.Frame as IVsWindowFrame;\n      window.Hide();\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterCloseSolution(object aPUnkReserved)\n    {\n      return VSConstants.S_OK;\n    }\n\n    #endregion\n\n\n    #region IVsSolutionLoadEvents implementation\n\n\n    public int OnBeforeOpenSolution(string pszSolutionFilename)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeBackgroundSolutionLoadBegins()\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryBackgroundLoadProjectBatch(out bool pfShouldDelayLoadToNextIdle)\n    {\n      pfShouldDelayLoadToNextIdle = false;\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeLoadProjectBatch(bool fIsBackgroundIdleBatch)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterLoadProjectBatch(bool fIsBackgroundIdleBatch)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterBackgroundSolutionLoadComplete()\n    {\n      return VSConstants.S_OK;\n    }\n\n    #endregion\n\n\n    #region IVsSolution7 implementation\n\n    public void OnAfterOpenFolder(string folderPath)\n    {\n    }\n\n    public void OnBeforeCloseFolder(string folderPath)\n    {\n    }\n\n    public void OnQueryCloseFolder(string folderPath, ref int pfCancel)\n    {\n    }\n\n    public void OnAfterCloseFolder(string folderPath)\n    {\n    }\n\n    public void OnAfterLoadAllDeferredProjects()\n    {\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void UpdateVersion(string version)\n    {\n      var generalSettingsModel = SettingsProvider.GeneralSettingsModel;\n\n      string currentVersion = PackageUtility.GetVersion();\n      if (string.IsNullOrWhiteSpace(currentVersion) == false && 0 > string.Compare(version, currentVersion))\n      {\n        generalSettingsModel.Version = currentVersion;\n\n        var settingsHandler = new SettingsHandler();\n        settingsHandler.SaveSettings();\n\n        //var freeTrialController = new FreeTrialController();\n        //bool activeLicense = await new LocalLicenseValidator().ValidateAsync();\n\n        //if (activeLicense)\n        //  freeTrialController.MarkAsExpired();\n\n        ReleaseNotesView.WasShown = false;\n      }\n    }\n\n    private void ShowToolbar(string version)\n    {\n      // Detect the first install \n      if (!string.IsNullOrWhiteSpace(version)) return;\n\n      // Show the toolbar on the first install\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var cbs = ((CommandBars)(dte as DTE2).CommandBars);\n        CommandBar cb = cbs[\"Clang Power Tools\"];\n        cb.Enabled = true;\n        cb.Visible = true;\n      }\n    }\n\n    private async Task RegisterVsServicesAsync()\n    {\n      // Get DTE service async \n      var dte = await GetServiceAsync(typeof(DTE)) as DTE2;\n      VsServiceProvider.Register(typeof(DTE2), dte);\n\n      // Get VS Output Window service async\n      var vsOutputWindow = await GetServiceAsync(typeof(SVsOutputWindow));\n      VsServiceProvider.Register(typeof(SVsOutputWindow), vsOutputWindow);\n\n      // Get the status bar service async\n      var vsStatusBar = await GetServiceAsync(typeof(SVsStatusbar));\n      VsServiceProvider.Register(typeof(SVsStatusbar), vsStatusBar);\n\n      // Get Vs Running Document Table service async\n      var vsRunningDocumentTable = await GetServiceAsync(typeof(SVsRunningDocumentTable));\n      VsServiceProvider.Register(typeof(SVsRunningDocumentTable), vsRunningDocumentTable);\n\n      // Get Vs File Change service async\n      var vsFileChange = await GetServiceAsync(typeof(SVsFileChangeEx));\n      VsServiceProvider.Register(typeof(SVsFileChangeEx), vsFileChange);\n\n      // Get VS Solution service async\n      var vsSolution = await GetServiceAsync(typeof(SVsSolution));\n      VsServiceProvider.Register(typeof(SVsSolution), vsSolution);\n    }\n\n\n    private async Task RegisterToEventsAsync()\n    {\n      //await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.Run(async delegate\n      {\n        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n\n        RegisterToCPTEvents();\n        RegisterToVsEvents();\n      });\n    }\n\n    private void RegisterToCPTEvents()\n    {\n      mCommandController.ClangCommandMessageEvent += mOutputWindowController.Write;\n      mCommandController.ClearOutputWindowEvent += mOutputWindowController.ClearPanel;\n\n      mCommandController.HierarchyDetectedEvent += mOutputWindowController.OnFileHierarchyDetected;\n\n      mCommandController.HasEncodingErrorEvent += mOutputWindowController.OnEncodingErrorDetected;\n      mOutputWindowController.HasEncodingErrorEvent += mCommandController.OnEncodingErrorDetected;\n\n      mCommandController.ClearErrorListEvent += mErrorWindowController.OnClangCommandBegin;\n\n      CompileCommand.Instance.HierarchyDetectedEvent += mCommandController.OnFileHierarchyChanged;\n      TidyCommand.Instance.HierarchyDetectedEvent += mCommandController.OnFileHierarchyChanged;\n\n      mCommandController.ErrorDetectedEvent += mOutputWindowController.OnErrorDetected;\n      mOutputWindowController.ErrorDetectedEvent += mErrorWindowController.OnErrorDetected;\n\n      mOutputWindowController.JsonCompilationDbFilePathEvent += JsonCompilationDatabaseCommand.Instance.OpenInFileExplorer;\n\n      CompileCommand.Instance.CloseDataStreamingEvent += mCommandController.OnAfterRunCommand;\n      TidyCommand.Instance.CloseDataStreamingEvent += mCommandController.OnAfterRunCommand;\n      JsonCompilationDatabaseCommand.Instance.CloseDataStreamingEvent += mCommandController.OnAfterRunCommand;\n      FormatCommand.Instance.FormatEvent += mCommandController.OnAfterFormatCommand;\n\n      CompileCommand.Instance.ActiveDocumentEvent += mCommandController.OnActiveDocumentCheck;\n      TidyCommand.Instance.ActiveDocumentEvent += mCommandController.OnActiveDocumentCheck;\n\n      CompileCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n      TidyCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n      FormatCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n\n      PowerShellWrapper.DataHandler += mOutputWindowController.OutputDataReceived;\n      PowerShellWrapper.DataErrorHandler += mOutputWindowController.OutputDataErrorReceived;\n      PowerShellWrapper.ExitedHandler += mOutputWindowController.ClosedDataConnection;\n    }\n\n    private void RegisterToVsEvents()\n    {\n\n      if (null != mBuildEvents)\n      {\n        mBuildEvents.OnBuildBegin += mErrorWindowController.OnBuildBegin;\n        mBuildEvents.OnBuildBegin += mCommandController.OnMSVCBuildBegin;\n        mBuildEvents.OnBuildDone += mCommandController.OnMSVCBuildDone;\n      }\n\n      if (null != mCommandEvents)\n        mCommandEvents.BeforeExecute += mCommandController.CommandEventsBeforeExecute;\n\n      if (null != mRunningDocTableEvents)\n        mRunningDocTableEvents.BeforeSave += mCommandController.OnBeforeSave;\n\n      if (null != mDteEvents)\n        mDteEvents.OnBeginShutdown += UnregisterFromEvents;\n\n      if (windowEvents != null)\n        windowEvents.WindowActivated += mCommandController.OnWindowActivated;\n    }\n\n    private void UnregisterFromEvents()\n    {\n      UnregisterFromCPTEvents();\n      UnregisterFromVsEvents();\n    }\n\n    private void UnregisterFromCPTEvents()\n    {\n      mCommandController.ClangCommandMessageEvent -= mOutputWindowController.Write;\n      mCommandController.ClearOutputWindowEvent -= mOutputWindowController.ClearPanel;\n\n      mCommandController.HierarchyDetectedEvent -= mOutputWindowController.OnFileHierarchyDetected;\n\n      mCommandController.HasEncodingErrorEvent -= mOutputWindowController.OnEncodingErrorDetected;\n      mOutputWindowController.HasEncodingErrorEvent -= mCommandController.OnEncodingErrorDetected;\n\n      mCommandController.ClearErrorListEvent -= mErrorWindowController.OnClangCommandBegin;\n\n      CompileCommand.Instance.HierarchyDetectedEvent -= mCommandController.OnFileHierarchyChanged;\n      TidyCommand.Instance.HierarchyDetectedEvent -= mCommandController.OnFileHierarchyChanged;\n\n      mCommandController.ErrorDetectedEvent -= mOutputWindowController.OnErrorDetected;\n      mOutputWindowController.ErrorDetectedEvent -= mErrorWindowController.OnErrorDetected;\n\n      mOutputWindowController.JsonCompilationDbFilePathEvent -= JsonCompilationDatabaseCommand.Instance.OpenInFileExplorer;\n\n      CompileCommand.Instance.CloseDataStreamingEvent -= mCommandController.OnAfterRunCommand;\n      TidyCommand.Instance.CloseDataStreamingEvent -= mCommandController.OnAfterRunCommand;\n      JsonCompilationDatabaseCommand.Instance.CloseDataStreamingEvent += mCommandController.OnAfterRunCommand;\n      FormatCommand.Instance.FormatEvent -= mCommandController.OnAfterFormatCommand;\n\n      CompileCommand.Instance.ActiveDocumentEvent -= mCommandController.OnActiveDocumentCheck;\n      TidyCommand.Instance.ActiveDocumentEvent -= mCommandController.OnActiveDocumentCheck;\n\n      CompileCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n      TidyCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n      FormatCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n\n      PowerShellWrapper.DataHandler -= mOutputWindowController.OutputDataReceived;\n      PowerShellWrapper.DataErrorHandler -= mOutputWindowController.OutputDataErrorReceived;\n      PowerShellWrapper.ExitedHandler -= mOutputWindowController.ClosedDataConnection;\n    }\n\n    private void DeleteTempSolution()\n    {\n      var solutionPath = Path.Combine(TidyConstants.TempsFolderPath, TidyConstants.SolutionTempGuid);\n      if (Directory.Exists(solutionPath))\n      {\n        Directory.Delete(TidyConstants.LongFilePrefix + solutionPath, true);\n      }\n    }\n\n    private int HideToolWindow()\n    {\n      var tidyToolWindow = FindToolWindow(typeof(TidyToolWindow), 0, false);\n      if (tidyToolWindow is null) return VSConstants.S_OK;\n      var window = tidyToolWindow.Frame as IVsWindowFrame;\n      window.Hide();\n      return VSConstants.S_OK;\n    }\n\n    private void DeleteCacheReporitory()\n    {\n      //Delete cache repository;\n      if (Directory.Exists(PathConstants.CacheRepositoryPath))\n      {\n        Directory.Delete(PathConstants.CacheRepositoryPath, true);\n      }\n    }\n\n    private void CreateCacheRepository()\n    {\n      //Create cache repository\n      if (Directory.Exists(PathConstants.CacheRepositoryPath))\n      {\n        DeleteCacheReporitory();\n      }\n      Directory.CreateDirectory(PathConstants.CacheRepositoryPath);\n    }\n\n    private void UnregisterFromVsEvents()\n    {\n      if (null != mBuildEvents)\n      {\n        mBuildEvents.OnBuildBegin -= mErrorWindowController.OnBuildBegin;\n        mBuildEvents.OnBuildBegin -= mCommandController.OnMSVCBuildBegin;\n        mBuildEvents.OnBuildDone -= mCommandController.OnMSVCBuildDone;\n      }\n\n      if (null != mCommandEvents)\n        mCommandEvents.BeforeExecute -= mCommandController.CommandEventsBeforeExecute;\n\n      if (null != mRunningDocTableEvents)\n        mRunningDocTableEvents.BeforeSave -= mCommandController.OnBeforeSave;\n\n      if (null != mDteEvents)\n        mDteEvents.OnBeginShutdown -= UnregisterFromEvents;\n\n      if (windowEvents != null)\n        windowEvents.WindowActivated -= mCommandController.OnWindowActivated;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsPackageImpl.cs",
    "content": "using ClangPowerTools.Commands;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.Output;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.Helpers;\nusing ClangPowerToolsShared.MVVM;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Provider;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.CommandBars;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  public class ClangPowerToolsPackageImpl : IVsSolutionEvents, IVsSolutionLoadEvents, IVsSolutionEvents7\n  {\n    #region Members\n\n    /// <summary>\n    /// RunPowerShellCommandPackage GUID string.\n    /// </summary>\n    public const string PackageGuidString = \"f564f9d3-01ae-493e-883b-18deebdb975e\";\n\n    private uint mHSolutionEvents = uint.MaxValue;\n    private RunningDocTableEvents mRunningDocTableEvents;\n    private ErrorWindowController mErrorWindowController;\n    private CommandController mCommandController;\n\n    private CommandEvents mCommandEvents;\n    private BuildEvents mBuildEvents;\n    private DTEEvents mDteEvents;\n    private WindowEvents windowEvents;\n\n    private AsyncPackage mPackage;\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TidyCommand\"/> class.\n    /// </summary>\n    public ClangPowerToolsPackageImpl(AsyncPackage aPackage)\n    {\n      mPackage = aPackage;\n    }\n\n    #endregion\n\n\n    #region Initialize Package\n\n\n    /// <summary>\n    /// Initialization of the package; this method is called right after the package is sited, so this is the place\n    /// where you can put all the initialization code that rely on services provided by VisualStudio.\n    /// </summary>\n    public async Task InitializeAsync()\n    {\n      try\n      {\n        await RegisterVsServicesAsync();\n\n        mCommandController = new CommandController(mPackage);\n        CommandControllerInstance.CommandController = mCommandController;\n\n        var vsOutputWindow = VsServiceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;\n\n        PowerShellWrapper.mOutputWindowController = new OutputWindowController();\n        PowerShellWrapper.mOutputWindowController.Initialize(mPackage, vsOutputWindow);\n\n        mRunningDocTableEvents = new RunningDocTableEvents(mPackage);\n        mErrorWindowController = new ErrorWindowController(mPackage);\n\n        #region Get Pointer to IVsSolutionEvents\n\n        if (VsServiceProvider.TryGetService(typeof(SVsSolution), out object vsSolutionService))\n        {\n          var vsSolution = vsSolutionService as IVsSolution;\n          UnadviseSolutionEvents(vsSolution);\n          AdviseSolutionEvents(vsSolution);\n        }\n\n        #endregion\n\n        // Get-Set the build and command events from DTE\n        if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        {\n          var dte2 = dte as DTE2;\n\n          mBuildEvents = dte2.Events.BuildEvents;\n          mCommandEvents = dte2.Events.CommandEvents;\n          mDteEvents = dte2.Events.DTEEvents;\n          windowEvents = dte2.Events.WindowEvents;\n        }\n\n        var findToolWindowHandler = new FindToolWindowHandler();\n        findToolWindowHandler.Initialize();\n\n        var settingsHandler = new SettingsHandler();\n        settingsHandler.InitializeSettings();\n        await settingsHandler.InitializeAccountSettingsAsync();\n\n        string version = SettingsProvider.GeneralSettingsModel.Version;\n\n        ShowToolbar(version);\n        UpdateVersion(version);\n\n        await mCommandController.InitializeCommandsAsync(mPackage);\n\n        await RegisterToEventsAsync();\n      }\n      catch (Exception ex)\n      {\n      }\n    }\n\n    #endregion\n\n\n    #region Get Pointer to IVsSolutionEvents\n\n\n    private void AdviseSolutionEvents(IVsSolution aVsSolution)\n    {\n      try\n      {\n        aVsSolution?.AdviseSolutionEvents(this, out mHSolutionEvents);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    private void UnadviseSolutionEvents(IVsSolution aVsSolution)\n    {\n      if (null == aVsSolution)\n        return;\n\n      if (uint.MaxValue != mHSolutionEvents)\n      {\n        aVsSolution.UnadviseSolutionEvents(mHSolutionEvents);\n        mHSolutionEvents = uint.MaxValue;\n      }\n\n      aVsSolution = null;\n    }\n\n    #endregion\n\n\n    #region IVsSolutionEvents Implementation\n\n\n    public int OnAfterOpenProject(IVsHierarchy aPHierarchy, int aFAdded)\n    {\n      CreateCacheRepository();\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryCloseProject(IVsHierarchy aPHierarchy, int aFRemoving, ref int aPfCancel)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      DeleteCacheReporitory();\n      DeleteFromFindToolWindowHistory();\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeCloseProject(IVsHierarchy aPHierarchy, int aFRemoved)\n    {\n      aPHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out object projectObject);\n      if (projectObject is Project project)\n        mErrorWindowController.RemoveErrors(aPHierarchy);\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterLoadProject(IVsHierarchy aPStubHierarchy, IVsHierarchy aPRealHierarchy)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryUnloadProject(IVsHierarchy aPRealHierarchy, ref int aPfCancel)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeUnloadProject(IVsHierarchy aPRealHierarchy, IVsHierarchy aPStubHierarchy)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n\n    public int OnAfterOpenSolution(object aPUnkReserved, int aFNewSolution)\n    {\n      CreateCacheRepository();\n      return VSConstants.S_OK;\n    }\n\n\n    public int OnQueryCloseSolution(object aPUnkReserved, ref int aPfCancel)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeCloseSolution(object aPUnkReserved)\n    {\n      DeleteTempSolution();\n      HideToolWindow();\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterCloseSolution(object aPUnkReserved)\n    {\n      return VSConstants.S_OK;\n    }\n\n    #endregion\n\n\n    #region IVsSolutionLoadEvents implementation\n\n\n    public int OnBeforeOpenSolution(string pszSolutionFilename)\n    {\n      CreateCacheRepository();\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeBackgroundSolutionLoadBegins()\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnQueryBackgroundLoadProjectBatch(out bool pfShouldDelayLoadToNextIdle)\n    {\n      pfShouldDelayLoadToNextIdle = false;\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeLoadProjectBatch(bool fIsBackgroundIdleBatch)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterLoadProjectBatch(bool fIsBackgroundIdleBatch)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterBackgroundSolutionLoadComplete()\n    {\n      return VSConstants.S_OK;\n    }\n\n    #endregion\n\n\n    #region IVsSolution7 implementation\n\n    public void OnAfterOpenFolder(string folderPath)\n    {\n    }\n\n    public void OnBeforeCloseFolder(string folderPath)\n    {\n    }\n\n    public void OnQueryCloseFolder(string folderPath, ref int pfCancel)\n    {\n    }\n\n    public void OnAfterCloseFolder(string folderPath)\n    {\n    }\n\n    public void OnAfterLoadAllDeferredProjects()\n    {\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void UpdateVersion(string version)\n    {\n      var generalSettingsModel = SettingsProvider.GeneralSettingsModel;\n\n      string currentVersion = PackageUtility.GetVersion();\n      if (string.IsNullOrWhiteSpace(currentVersion) == false && 0 > string.Compare(version, currentVersion))\n      {\n        generalSettingsModel.Version = currentVersion;\n\n        var findToolWindowHandler = new FindToolWindowHandler();\n        findToolWindowHandler.SaveMatchersHistoryData();\n\n        var settingsHandler = new SettingsHandler();\n        settingsHandler.SaveSettings();\n\n        //var freeTrialController = new FreeTrialController();\n        //bool activeLicense = await new LocalLicenseValidator().ValidateAsync();\n\n        //if (activeLicense)\n        //  freeTrialController.MarkAsExpired();\n\n        ReleaseNotesView.WasShown = false;\n      }\n    }\n\n    private void ShowToolbar(string version)\n    {\n      // Detect the first install \n      if (!string.IsNullOrWhiteSpace(version)) return;\n\n      // Show the toolbar on the first install\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var cbs = ((CommandBars)(dte as DTE2).CommandBars);\n        CommandBar cb = cbs[\"Clang Power Tools\"];\n        cb.Enabled = true;\n        cb.Visible = true;\n      }\n    }\n\n    private async Task RegisterVsServicesAsync()\n    {\n      // Get DTE service async \n      var dte = await mPackage.GetServiceAsync(typeof(DTE)) as DTE2;\n      VsServiceProvider.Register(typeof(DTE2), dte);\n\n      // Get VS Output Window service async\n      var vsOutputWindow = await mPackage.GetServiceAsync(typeof(SVsOutputWindow));\n      VsServiceProvider.Register(typeof(SVsOutputWindow), vsOutputWindow);\n\n      // Get the status bar service async\n      var vsStatusBar = await mPackage.GetServiceAsync(typeof(SVsStatusbar));\n      VsServiceProvider.Register(typeof(SVsStatusbar), vsStatusBar);\n\n      // Get Vs Running Document Table service async\n      var vsRunningDocumentTable = await mPackage.GetServiceAsync(typeof(SVsRunningDocumentTable));\n      VsServiceProvider.Register(typeof(SVsRunningDocumentTable), vsRunningDocumentTable);\n\n      // Get Vs File Change service async\n      var vsFileChange = await mPackage.GetServiceAsync(typeof(SVsFileChangeEx));\n      VsServiceProvider.Register(typeof(SVsFileChangeEx), vsFileChange);\n\n      // Get VS Solution service async\n      var vsSolution = await mPackage.GetServiceAsync(typeof(SVsSolution));\n      VsServiceProvider.Register(typeof(SVsSolution), vsSolution);\n    }\n\n\n    private async Task RegisterToEventsAsync()\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      RegisterToCPTEvents();\n      RegisterToVsEvents();\n    }\n\n    private void RegisterToCPTEvents()\n    {\n      mCommandController.ClangCommandMessageEvent += PowerShellWrapper.mOutputWindowController.Write;\n      mCommandController.ClearOutputWindowEvent += PowerShellWrapper.mOutputWindowController.ClearPanel;\n\n      mCommandController.HierarchyDetectedEvent += PowerShellWrapper.mOutputWindowController.OnFileHierarchyDetected;\n\n      mCommandController.HasEncodingErrorEvent += PowerShellWrapper.mOutputWindowController.OnEncodingErrorDetected;\n      PowerShellWrapper.mOutputWindowController.HasEncodingErrorEvent += mCommandController.OnEncodingErrorDetected;\n\n      mCommandController.ClearErrorListEvent += mErrorWindowController.OnClangCommandBegin;\n\n      CompileCommand.Instance.HierarchyDetectedEvent += mCommandController.OnFileHierarchyChanged;\n      TidyCommand.Instance.HierarchyDetectedEvent += mCommandController.OnFileHierarchyChanged;\n      OptimizeIncludesCommand.Instance.HierarchyDetectedEvent += mCommandController.OnFileHierarchyChanged;\n\n\n      mCommandController.ErrorDetectedEvent += PowerShellWrapper.mOutputWindowController.OnErrorDetected;\n      PowerShellWrapper.mOutputWindowController.ErrorDetectedEvent += mErrorWindowController.OnErrorDetected;\n\n      PowerShellWrapper.mOutputWindowController.JsonCompilationDbFilePathEvent += JsonCompilationDatabaseCommand.Instance.OpenInFileExplorer;\n\n\n      RunController.CloseDataStreamingEvent += mCommandController.OnAfterRunCommand;\n      FormatCommand.Instance.FormatEvent += mCommandController.OnAfterFormatCommand;\n\n      CompileCommand.Instance.ActiveDocumentEvent += mCommandController.OnActiveDocumentCheck;\n      TidyCommand.Instance.ActiveDocumentEvent += mCommandController.OnActiveDocumentCheck;\n      OptimizeIncludesCommand.Instance.ActiveDocumentEvent += mCommandController.OnActiveDocumentCheck;\n\n      CompileCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n      TidyCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n      OptimizeIncludesCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n      FormatCommand.Instance.IgnoredItemsEvent += mCommandController.OnItemIgnore;\n\n      PowerShellWrapper.DataHandler += PowerShellWrapper.mOutputWindowController.OutputDataReceived;\n      PowerShellWrapper.DataErrorHandler += PowerShellWrapper.mOutputWindowController.OutputDataErrorReceived;\n      PowerShellWrapper.ExitedHandler += PowerShellWrapper.mOutputWindowController.ClosedDataConnection;\n      PowerShellWrapper.ExitedHandler += GenerateDocumentation.ClosedDataConnection;\n    }\n\n    private void RegisterToVsEvents()\n    {\n      if (null != mBuildEvents)\n      {\n        mBuildEvents.OnBuildBegin += mErrorWindowController.OnBuildBegin;\n        mBuildEvents.OnBuildBegin += mCommandController.OnMSVCBuildBegin;\n        mBuildEvents.OnBuildDone += mCommandController.OnMSVCBuildDone;\n      }\n\n      if (null != mCommandEvents)\n        mCommandEvents.BeforeExecute += mCommandController.CommandEventsBeforeExecute;\n\n      if (null != mRunningDocTableEvents)\n        mRunningDocTableEvents.BeforeSave += mCommandController.OnBeforeSave;\n\n      if (null != mDteEvents)\n        mDteEvents.OnBeginShutdown += UnregisterFromEvents;\n\n      if (windowEvents != null)\n        windowEvents.WindowActivated += mCommandController.OnWindowActivated;\n    }\n\n    private void UnregisterFromEvents()\n    {\n      UnregisterFromCPTEvents();\n      UnregisterFromVsEvents();\n    }\n\n    private void UnregisterFromCPTEvents()\n    {\n      mCommandController.ClangCommandMessageEvent -= PowerShellWrapper.mOutputWindowController.Write;\n      mCommandController.ClearOutputWindowEvent -= PowerShellWrapper.mOutputWindowController.ClearPanel;\n\n      mCommandController.HierarchyDetectedEvent -= PowerShellWrapper.mOutputWindowController.OnFileHierarchyDetected;\n\n      mCommandController.HasEncodingErrorEvent -= PowerShellWrapper.mOutputWindowController.OnEncodingErrorDetected;\n      PowerShellWrapper.mOutputWindowController.HasEncodingErrorEvent -= mCommandController.OnEncodingErrorDetected;\n\n      mCommandController.ClearErrorListEvent -= mErrorWindowController.OnClangCommandBegin;\n\n      CompileCommand.Instance.HierarchyDetectedEvent -= mCommandController.OnFileHierarchyChanged;\n      TidyCommand.Instance.HierarchyDetectedEvent -= mCommandController.OnFileHierarchyChanged;\n      OptimizeIncludesCommand.Instance.HierarchyDetectedEvent -= mCommandController.OnFileHierarchyChanged;\n\n      mCommandController.ErrorDetectedEvent -= PowerShellWrapper.mOutputWindowController.OnErrorDetected;\n      PowerShellWrapper.mOutputWindowController.ErrorDetectedEvent -= mErrorWindowController.OnErrorDetected;\n\n      PowerShellWrapper.mOutputWindowController.JsonCompilationDbFilePathEvent -= JsonCompilationDatabaseCommand.Instance.OpenInFileExplorer;\n\n      RunController.CloseDataStreamingEvent -= mCommandController.OnAfterRunCommand;\n      FormatCommand.Instance.FormatEvent -= mCommandController.OnAfterFormatCommand;\n\n      CompileCommand.Instance.ActiveDocumentEvent -= mCommandController.OnActiveDocumentCheck;\n      TidyCommand.Instance.ActiveDocumentEvent -= mCommandController.OnActiveDocumentCheck;\n      OptimizeIncludesCommand.Instance.ActiveDocumentEvent -= mCommandController.OnActiveDocumentCheck;\n\n      CompileCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n      TidyCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n      OptimizeIncludesCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n      FormatCommand.Instance.IgnoredItemsEvent -= mCommandController.OnItemIgnore;\n\n      PowerShellWrapper.DataHandler -= PowerShellWrapper.mOutputWindowController.OutputDataReceived;\n      PowerShellWrapper.DataErrorHandler -= PowerShellWrapper.mOutputWindowController.OutputDataErrorReceived;\n      PowerShellWrapper.ExitedHandler -= PowerShellWrapper.mOutputWindowController.ClosedDataConnection;\n      PowerShellWrapper.ExitedHandler -= GenerateDocumentation.ClosedDataConnection;\n    }\n\n    private void DeleteTempSolution()\n    {\n      var solutionPath = Path.Combine(TidyConstants.TempsFolderPath, TidyConstants.SolutionTempGuid);\n      if (Directory.Exists(solutionPath))\n      {\n        Directory.Delete(solutionPath, true);\n      }\n    }\n\n    /// <summary>\n    /// Hide Find Tool Window and Tidy Tool Window\n    /// </summary>\n    /// <returns></returns>\n    private int HideToolWindow()\n    {\n      PowerShellWrapper.EndInteractiveMode();\n\n      var tidyToolWindow = mPackage.FindToolWindow(typeof(TidyToolWindow), 0, false);\n      if (tidyToolWindow is null) return VSConstants.S_OK;\n      var tidyWindow = tidyToolWindow.Frame as IVsWindowFrame;\n      tidyWindow?.Hide();\n\n      var findToolWindow = mPackage.FindToolWindow(typeof(FindToolWindow), 0, false);\n      if (findToolWindow is null) return VSConstants.S_OK;\n      var findWindow = findToolWindow.Frame as IVsWindowFrame;\n      findWindow?.Hide();\n\n      return VSConstants.S_OK;\n    }\n\n    private void DeleteCacheReporitory()\n    {\n      //Delete cache repository;\n      if (Directory.Exists(PathConstants.CacheRepositoryPath))\n      {\n        Directory.Delete(PathConstants.CacheRepositoryPath, true);\n      }\n    }\n\n    private void DeleteFromFindToolWindowHistory()\n    {\n      FindToolWindowProvider.RemoveFromFullList();\n      FindToolWindowHandler findToolWindowHandler = new FindToolWindowHandler();\n      findToolWindowHandler.SaveMatchersHistoryData();\n    }\n\n    private void CreateCacheRepository()\n    {\n      //Create cache repository\n      if (Directory.Exists(PathConstants.CacheRepositoryPath))\n      {\n        DeleteCacheReporitory();\n      }\n      Directory.CreateDirectory(PathConstants.CacheRepositoryPath);\n    }\n\n    private void UnregisterFromVsEvents()\n    {\n      if (null != mBuildEvents)\n      {\n        mBuildEvents.OnBuildBegin -= mErrorWindowController.OnBuildBegin;\n        mBuildEvents.OnBuildBegin -= mCommandController.OnMSVCBuildBegin;\n        mBuildEvents.OnBuildDone -= mCommandController.OnMSVCBuildDone;\n      }\n\n      if (null != mCommandEvents)\n        mCommandEvents.BeforeExecute -= mCommandController.CommandEventsBeforeExecute;\n\n      if (null != mRunningDocTableEvents)\n        mRunningDocTableEvents.BeforeSave -= mCommandController.OnBeforeSave;\n\n      if (null != mDteEvents)\n        mDteEvents.OnBeginShutdown -= UnregisterFromEvents;\n\n      if (windowEvents != null)\n        windowEvents.WindowActivated -= mCommandController.OnWindowActivated;\n    }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects Condition=\"'$(MSBuildVersion)' == '' Or '$(MSBuildVersion)' &lt; '16.0'\">$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n    <HasSharedItems>true</HasSharedItems>\n    <SharedGUID>a0cea277-f6a1-4f62-862c-357c8c5654aa</SharedGUID>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <Import_RootNamespace>ClangPowerToolsShared</Import_RootNamespace>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangCheckAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangFormatPathAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangTidyPathAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Builder\\IAsyncBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Builder\\IBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)ClangPowerToolsPackageImpl.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)CMake\\CMakeBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\BackgroundTidy.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\DataProcessor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\DocumentationHtmlCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\DocumentationMdCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\DocumentationYamlCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\FindCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\FindCommandIds.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\FindViewMenuCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\LookInMenu.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\OptimizeIncludesCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\BooleanToGridLengthConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\LaunchCompilationDbProgrammatically.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ManageEncoding.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\AutoCompleteHistory\\ASTMatchers.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\AutoCompleteHistory\\AutoCompleteBehavior.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\LookInMenuController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\RunController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\GenerateDocumentation.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\MatchConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\FindController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IViewMatche.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\FindToolWindowHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\AutoCompleteHistoryModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\ComponentVisibility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\CustomMatchesModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\DefaultArgsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\FindControllerModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\FindToolWindowModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Provider\\FindToolWindowProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\AboutSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\AutoCompleteHistoryViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FindToolWindowViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\DialogWindow.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\PowerShellWrapperBackground.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BasicCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\ClangCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandIds.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandUILocation.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CompileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\FormatCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreCompileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreFormatCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\JsonCompilationDatabaseCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\Models\\CacheProjectsItemsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\SettingsCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\StopCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandControllerInstance.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\TidyCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\VsCommands.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\BooleanToVisibilityConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangFormatFallbackStyleConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangFormatStyleConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangGeneralAdditionalIncludesConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangTidyHeaderFiltersConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangTidyUseChecksFromConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorDetector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorFormatter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorParserConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorModelBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ActiveDocumentEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\BoolEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ClangCommandEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CleanErrorListEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CloseDataConnectionEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CloseDataStreamingEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ErrorDetectedEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\FormatCommandEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\HasEncodingErrorEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\JsonFilePathArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\VsHierarchyDetectedEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Export Config\\TidyConfigFile.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\IntExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\ObjectExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\StringExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\TaskExtensions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FileChangerWatcher.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FileOpener.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FilePathCollector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ActiveWindowProperties.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ApiUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\AutomationUtil.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ClangTidyCleaner.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\DocumentHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\FileSystem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\FormatEditorUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\JoinUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\NetworkUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PackageUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PCHCleaner.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ProjectConfigurationHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PropertyHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\RegistryUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\RunningDocTableEvents.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ScriptGenerator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SettingsApi.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SettingsPathBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SolutionInfo.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\StatusBarHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\UIUpdater.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\Vsix.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\VsWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)IgnoreActions\\IgnoreItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentDocument.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentProject.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentProjectItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentSolution.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\IItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\ItemsCollector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\CollectionElementsCounter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\RelayCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\FileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\VSThemeCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Command\\RelayCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\CommonSettingsFunctionality.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\IconResourceConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ComboBoxConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\CPPKeywords.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\FormatEditorConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\EncodingConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\PathConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\PsUpdaterConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ResourceConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LlvmConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LlvmVersions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LLVMVersionsAlternate.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ThemeConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\TidyConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\UIElementsConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\AccountController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\FormatEditorController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\FreeTrialController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\LicenseController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\LlvmController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IAccountValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IDownload.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IInstall.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\ILicense.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IView.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\CommercialLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\LicenseType.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\LocalLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\PersonalLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\Token.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LlvmUri.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\AccountApiModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\AccountModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\CompilerSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\FileModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\FormatSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\GeneralSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\IconModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\InputDataModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LicenseModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LlvmModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LlvmSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\MessageModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\SelectedFileModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidyCheckModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidySettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\CountStateFilesModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\FileType.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToolWindowModels\\TidyToolWindowModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToggleModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TokenModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\UserModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\ClangFormatPathValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\ClangTidyPathValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\HeaderFiltersValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangFormatOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangTidyOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\DefaultOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\PreinstalledLlvm.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Provider\\SettingsProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\SettingsHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\SettingsTooltips.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TextManipulation.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TidyChecks.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TidyChecksDefault.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\CompilerSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\DetectedStyleInfoViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\EncodingErrorViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FeedbackViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FolderExplorerViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FormatSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\InputDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\InputMultipleDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LicenseViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LlvmSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LoginViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\ReleaseNotesViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\SettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidyChecksViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidySettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidyToolWindowViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\ToggleMultipleDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\TidyToolWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TrialExpiredViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FindToolWindowView.xaml.cs\">\n      <DependentUpon>FindToolWindowView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FolderExplorerView.xaml.cs\">\n      <DependentUpon>FolderExplorerView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyToolWindowView.xaml.cs\">\n      <DependentUpon>TidyToolWindowView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ToolWindows\\FindToolWindow.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ToolWindows\\TidyToolWindow.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\WebApi\\WebApiUrl.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\XmlSerializer.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputContentModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputProcessor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ClangTidyModeParametersFactory.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\GenericScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ItemRelatedScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\PowerShellWrapper.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\RunModeScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\RunningProcesses.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ScriptConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\VerbosityScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Services\\PowerShellService.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Services\\VsServiceProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerEqualityComparer.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTag.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTagger.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTaggerProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquigglesFactory.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)TextOperationsInterfaces\\IDetector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)TextOperationsInterfaces\\ITextFormatter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\AboutSettingsView.xaml.cs\">\n      <DependentUpon>AboutSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CMakeBetaWarning.xaml.cs\">\n      <DependentUpon>CMakeBetaWarning.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CompilerSettingsView.xaml.cs\">\n      <DependentUpon>CompilerSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\BuyNowFooter.xaml.cs\">\n      <DependentUpon>BuyNowFooter.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\InputList.xaml.cs\">\n      <DependentUpon>InputList.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\MessageBanner.xaml.cs\">\n      <DependentUpon>MessageBanner.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceButton.xaml.cs\">\n      <DependentUpon>ThreePieceButton.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceComponent.xaml.cs\">\n      <DependentUpon>ThreePieceComponent.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\EncodingErrorView.xaml.cs\">\n      <DependentUpon>EncodingErrorView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FeedbackView.xaml.cs\">\n      <DependentUpon>FeedbackView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatEditorWarning.xaml.cs\">\n      <DependentUpon>FormatEditorWarning.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatSettingsView.xaml.cs\">\n      <DependentUpon>FormatSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\InputDataView.xaml.cs\">\n      <DependentUpon>InputDataView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LicenseView.xaml.cs\">\n      <DependentUpon>LicenseView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LlvmSettingsView.xaml.cs\">\n      <DependentUpon>LlvmSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LoginView.xaml.cs\">\n      <DependentUpon>LoginView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ReleaseNotesView.xaml.cs\">\n      <DependentUpon>ReleaseNotesView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SearchBoxView.xaml.cs\">\n      <DependentUpon>SearchBoxView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SettingsView.xaml.cs\">\n      <DependentUpon>SettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyChecksView.xaml.cs\">\n      <DependentUpon>TidyChecksView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidySettingsView.xaml.cs\">\n      <DependentUpon>TidySettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TrialExpiredView.xaml.cs\">\n      <DependentUpon>TrialExpiredView.xaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\AboutSettingsView.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CMakeBetaWarning.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CompilerSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FindToolWindowView.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FolderExplorerView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\BuyNowFooter.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\InputList.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\MessageBanner.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceButton.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceComponent.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\EncodingErrorView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FeedbackView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatEditorWarning.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\InputDataView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LicenseView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LlvmSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LoginView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ReleaseNotesView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SearchBoxView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\AppResources.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\HyperlinkStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\ImageResources.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\SettingsButtonStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\ToggleStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\YellowButtonStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyChecksView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidySettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyToolWindowView.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TrialExpiredView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.projitems.bak",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects Condition=\"'$(MSBuildVersion)' == '' Or '$(MSBuildVersion)' &lt; '16.0'\">$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n    <HasSharedItems>true</HasSharedItems>\n    <SharedGUID>a0cea277-f6a1-4f62-862c-357c8c5654aa</SharedGUID>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <Import_RootNamespace>ClangPowerToolsShared</Import_RootNamespace>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangCheckAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangFormatPathAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Attributes\\ClangTidyPathAttribute.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Builder\\IAsyncBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Builder\\IBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)ClangPowerToolsPackageImpl.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)CMake\\CMakeBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\BackgroundTidy.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\DataProcessor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BackgroundTidy\\PowerShellWrapperBackground.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\BasicCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\ClangCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandIds.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandUILocation.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CompileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\FormatCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreCompileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\IgnoreFormatCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\JsonCompilationDatabaseCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\Models\\CacheProjectsItemsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\SettingsCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\StopCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\CommandControllerInstance.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\TidyCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Commands\\VsCommands.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\BooleanToVisibilityConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangFormatFallbackStyleConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangFormatStyleConverter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangGeneralAdditionalIncludesConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangTidyHeaderFiltersConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Convertors\\ClangTidyUseChecksFromConvertor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorDetector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorFormatter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorParserConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\ErrorWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorModelBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Error\\TaskErrorViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ActiveDocumentEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\BoolEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ClangCommandEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CleanErrorListEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CloseDataConnectionEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\CloseDataStreamingEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\ErrorDetectedEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\FormatCommandEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\HasEncodingErrorEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\JsonFilePathArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\MissingLlvmEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Events\\VsHierarchyDetectedEventArgs.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Export Config\\TidyConfigFile.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\IntExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\ObjectExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\StringExtension.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Extensions\\TaskExtensions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FileChangerWatcher.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FileOpener.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Files Operations\\FilePathCollector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ActiveWindowProperties.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ApiUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\AutomationUtil.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ClangTidyCleaner.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\DocumentHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\FileSystem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\FormatEditorUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\JoinUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\NetworkUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PackageUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PCHCleaner.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ProjectConfigurationHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\PropertyHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\RegistryUtility.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\RunningDocTableEvents.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\ScriptGenerator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SettingsApi.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SettingsPathBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\SolutionInfo.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\StatusBarHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\UIUpdater.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\Vsix.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Helpers\\VsWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)IgnoreActions\\IgnoreItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentDocument.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentProject.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentProjectItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\CurrentSolution.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\IItem.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Items\\ItemsCollector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\CollectionElementsCounter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\RelayCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\FileCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Commands\\VSThemeCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Command\\RelayCommand.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\CommonSettingsFunctionality.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\IconResourceConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ComboBoxConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\CPPKeywords.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\FormatEditorConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\EncodingConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\PathConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\PsUpdaterConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ResourceConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LlvmConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LlvmVersions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\LLVMVersionsAlternate.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\ThemeConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\TidyConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\UIElementsConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\AccountController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\FormatEditorController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\FreeTrialController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\LicenseController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Controllers\\LlvmController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IAccountValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IDownload.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IInstall.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\ILicense.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Interfaces\\IView.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\CommercialLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\LicenseType.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\LocalLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\PersonalLicenseValidator.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LicenseValidation\\Token.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\LlvmUri.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\AccountApiModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\AccountModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\CompilerSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\FileModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\FormatSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\GeneralSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\IconModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\InputDataModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LicenseModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LlvmModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\LlvmSettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\MessageModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\SelectedFileModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidyCheckModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidySettingsModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidyToolWindowModels\\FileType.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidyToolWindowModels\\TidyToolWindowModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TidyToolWindowModels\\Class1.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\ToggleModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\TokenModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Models\\UserModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\ClangFormatPathValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\ClangTidyPathValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\HeaderFiltersValue.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangFormatOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangTidyOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\ClangTidyPredefinedChecksOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\OldSettings\\OldModels\\DefaultOptions.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\PreinstalledLlvm.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Provider\\SettingsProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\SettingsHandler.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\SettingsTooltips.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TextManipulation.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TidyChecks.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\TidyChecksDefault.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\AccountViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\CompilerSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\DetectedStyleInfoViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\EncodingErrorViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FeedbackViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FolderExplorerViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\FormatSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\InputDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\InputMultipleDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LicenseViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LlvmSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\LoginViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\ReleaseNotesViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\SettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TeamSettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidyChecksViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidySettingsViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TidyToolWindowViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\ToggleMultipleDataViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\ToolWindow\\TidyToolWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\ViewModels\\TrialExpiredViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FolderExplorerView.xaml.cs\">\n      <DependentUpon>FolderExplorerView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyToolWindowView.xaml.cs\">\n      <DependentUpon>TidyToolWindowView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ToolWindows\\TidyToolWindow.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\WebApi\\WebApiUrl.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\XmlSerializer.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputContentModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputProcessor.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Output\\OutputWindowModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ClangTidyModeParametersFactory.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\GenericScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ItemRelatedScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\PowerShellWrapper.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\RunModeScriptBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\RunningProcesses.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Script\\ScriptConstants.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Services\\PowerShellService.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Services\\VsServiceProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerBuilder.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerController.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerEqualityComparer.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)SilentFile\\SilentFileChangerModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTag.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTagger.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleErrorTaggerProvider.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquigglesFactory.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Squiggle\\SquiggleViewModel.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)TextOperationsInterfaces\\IDetector.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)TextOperationsInterfaces\\ITextFormatter.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\AccountView.xaml.cs\">\n      <DependentUpon>AccountView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CMakeBetaWarning.xaml.cs\">\n      <DependentUpon>CMakeBetaWarning.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CompilerSettingsView.xaml.cs\">\n      <DependentUpon>CompilerSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\BuyNowFooter.xaml.cs\">\n      <DependentUpon>BuyNowFooter.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\InputList.xaml.cs\">\n      <DependentUpon>InputList.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\MessageBanner.xaml.cs\">\n      <DependentUpon>MessageBanner.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceButton.xaml.cs\">\n      <DependentUpon>ThreePieceButton.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceComponent.xaml.cs\">\n      <DependentUpon>ThreePieceComponent.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\EncodingErrorView.xaml.cs\">\n      <DependentUpon>EncodingErrorView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FeedbackView.xaml.cs\">\n      <DependentUpon>FeedbackView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatEditorWarning.xaml.cs\">\n      <DependentUpon>FormatEditorWarning.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatSettingsView.xaml.cs\">\n      <DependentUpon>FormatSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\InputDataView.xaml.cs\">\n      <DependentUpon>InputDataView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LicenseView.xaml.cs\">\n      <DependentUpon>LicenseView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LlvmSettingsView.xaml.cs\">\n      <DependentUpon>LlvmSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LoginView.xaml.cs\">\n      <DependentUpon>LoginView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ReleaseNotesView.xaml.cs\">\n      <DependentUpon>ReleaseNotesView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SearchBoxView.xaml.cs\">\n      <DependentUpon>SearchBoxView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SettingsView.xaml.cs\">\n      <DependentUpon>SettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TeamSettingsView.xaml.cs\">\n      <DependentUpon>TeamSettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyChecksView.xaml.cs\">\n      <DependentUpon>TidyChecksView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidySettingsView.xaml.cs\">\n      <DependentUpon>TidySettingsView.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TrialExpiredView.xaml.cs\">\n      <DependentUpon>TrialExpiredView.xaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\AccountView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CMakeBetaWarning.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\CompilerSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FolderExplorerView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\BuyNowFooter.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\InputList.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\MessageBanner.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceButton.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Components\\ThreePieceComponent.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\EncodingErrorView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FeedbackView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatEditorWarning.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\FormatSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\InputDataView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LicenseView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LlvmSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\LoginView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\ReleaseNotesView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SearchBoxView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\SettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\AppResources.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\HyperlinkStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\ImageResources.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\SettingsButtonStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\SettingsComboBoxStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\ToggleStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\Styles\\YellowButtonStyle.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TeamSettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyChecksView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidySettingsView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TidyToolWindowView.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"$(MSBuildThisFileDirectory)MVVM\\Views\\TrialExpiredView.xaml\">\n      <SubType>Designer</SubType>\n      <Generator>MSBuild:Compile</Generator>\n    </Page>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"$(MSBuildThisFileDirectory)MVVM\\Constants\\NewFolder\\\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/ClangPowerToolsShared.shproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>a0cea277-f6a1-4f62-862c-357c8c5654aa</ProjectGuid>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.props\" />\n  <PropertyGroup />\n  <Import Project=\"ClangPowerToolsShared.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.CSharp.targets\" />\n</Project>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/BackgroundTidy/BackgroundTidy.cs",
    "content": "﻿using ClangPowerTools.CMake;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\n\nnamespace ClangPowerTools.Commands.BackgroundTidy\n{\n  public class BackgroundTidy : IDisposable\n  {\n    #region Members\n\n    private readonly DataProcessor dataProcessor = new DataProcessor();\n    private readonly PowerShellWrapperBackground powerShell = new PowerShellWrapperBackground();\n\n    private readonly Dictionary<string, string> mVsVersions = new Dictionary<string, string>\n    {\n      {\"11.0\", \"2010\"},\n      {\"12.0\", \"2012\"},\n      {\"13.0\", \"2013\"},\n      {\"14.0\", \"2015\"},\n      {\"15.0\", \"2017\"},\n      {\"16.0\", \"2019\"},\n      {\"17.0\", \"2022\"}\n    };\n\n    #endregion\n\n\n    #region Constructor\n\n    public BackgroundTidy()\n    {\n      powerShell.DataHandler += dataProcessor.ReceiveData;\n      powerShell.DataErrorHandler += dataProcessor.ReceiveData;\n      powerShell.ExitedHandler += dataProcessor.ClosedDataConnection;\n    }\n\n    public void Dispose()\n    {\n      powerShell.DataHandler -= dataProcessor.ReceiveData;\n      powerShell.DataErrorHandler -= dataProcessor.ReceiveData;\n      powerShell.ExitedHandler -= dataProcessor.ClosedDataConnection;\n    }\n\n    #endregion\n\n    public void Run(Document document, int commandId)\n    {\n      try\n      {\n        #region Create currnet project item \n\n        if (document == null || document.ProjectItem == null)\n          return;\n\n        var projectName = document.ProjectItem.ContainingProject.FullName;\n        if (string.IsNullOrWhiteSpace(projectName))\n          return;\n\n        IItem item = new CurrentProjectItem(document.ProjectItem);\n\n        #endregion\n\n\n        #region Get VS edition and version\n\n        var dte = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n\n        var vsEdition = dte.Edition;\n        mVsVersions.TryGetValue(dte.Version, out string vsVersion);\n\n        #endregion\n\n\n        #region Generate powershell script\n\n        string runModeParameters = ScriptGenerator.GetRunModeParamaters();\n        string genericParameters = ScriptGenerator.GetGenericParamaters(commandId, vsEdition, vsVersion, false);\n\n        CMakeBuilder cMakeBuilder = new CMakeBuilder();\n        if (SolutionInfo.IsOpenFolderModeActive())\n        {\n          cMakeBuilder.Build();\n        }\n\n        var vsSolution = SolutionInfo.IsOpenFolderModeActive() == false ?\n          (IVsSolution)VsServiceProvider.GetService(typeof(SVsSolution)) : null;\n\n        var itemRelatedParameters = ScriptGenerator.GetItemRelatedParameters(item);\n\n        var psScript = JoinUtility.Join(\" \", runModeParameters.Remove(runModeParameters.Length - 1), itemRelatedParameters, genericParameters, \"'\");\n\n        #endregion\n\n\n        #region PowerShell Invocation\n\n        powerShell.Invoke(psScript, new RunningProcesses(true));\n\n        #endregion\n\n        if (SolutionInfo.IsOpenFolderModeActive())\n        {\n          cMakeBuilder.ClearBuildCashe();\n        }\n      }\n      catch (Exception)\n      {\n        //MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/BackgroundTidy/DataProcessor.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Error;\nusing ClangPowerTools.Output;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace ClangPowerTools.Commands.BackgroundTidy\n{\n  public class DataProcessor\n  {\n    #region Members \n\n    private readonly ErrorDetector errorDetector = new ErrorDetector();\n    private readonly OutputContentModel outputContent = new OutputContentModel();\n\n    private readonly int kBufferSize = 5;\n\n    #endregion\n\n\n    #region Methods\n\n\n    #region Public methods\n\n    public void ReceiveData(object sender, DataReceivedEventArgs e)\n    {\n      if (null == e.Data)\n        return;\n\n      if (outputContent.HasEncodingError)\n        return;\n\n      Process(e.Data);\n    }\n\n    public void ClosedDataConnection(object sender, EventArgs e)\n    {\n      if (outputContent.Errors.Count <= 0)\n        return;\n\n      TaskErrorViewModel.FileErrorsPair = new Dictionary<string, List<TaskErrorModel>>();\n      foreach (var error in outputContent.Errors)\n      {\n        if (TaskErrorViewModel.FileErrorsPair.ContainsKey(error.Document))\n        {\n          TaskErrorViewModel.FileErrorsPair[error.Document]\n            .Add(error);\n        }\n        else\n        {\n          TaskErrorViewModel.FileErrorsPair\n            .Add(error.Document, new List<TaskErrorModel>() { error });\n        }\n      }\n\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private void Process(string message)\n    {\n      outputContent.Buffer.Add(message);\n\n      var text = String.Join(\"\\n\", outputContent.Buffer.ToList()) + \"\\n\";\n      if (errorDetector.Detect(text, ErrorParserConstants.kErrorMessageRegex, out _))\n      {\n        GetErrors(text, null, out List<TaskErrorModel> aDetectedErrors);\n        outputContent.Errors.UnionWith(aDetectedErrors);\n        outputContent.Buffer.Clear();\n      }\n      else if (kBufferSize <= outputContent.Buffer.Count)\n      {\n        outputContent.Buffer.RemoveAt(0);\n      }\n    }\n\n    private void GetErrors(string text, IVsHierarchy hierarchy, out List<TaskErrorModel> detectedErrors)\n    {\n      detectedErrors = new List<TaskErrorModel>();\n\n      while (errorDetector.Detect(text, ErrorParserConstants.kErrorMessageRegex, out Match aMatchResult))\n      {\n        detectedErrors.Add(GetDetectedError(hierarchy, aMatchResult));\n        GetOutput(ref text, detectedErrors.Last().FullMessage);\n      }\n    }\n\n    private void GetOutput(ref string aText, string aSearchedSubstring)\n    {\n      var errorFormatter = new ErrorFormatter();\n      aText = errorFormatter.Format(aText, aSearchedSubstring);\n      aText = aText.SubstringAfter(aSearchedSubstring);\n    }\n\n    private TaskErrorModel GetDetectedError(IVsHierarchy aHierarchy, Match aMarchResult)\n    {\n      IBuilder<TaskErrorModel> errorBuilder = new TaskErrorModelBuilder(aHierarchy, aMarchResult);\n      errorBuilder.Build();\n      return errorBuilder.GetResult();\n    }\n\n    #endregion\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/BackgroundTidy/PowerShellWrapperBackground.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace ClangPowerTools.Commands.BackgroundTidy\n{\n  public class PowerShellWrapperBackground\n  {\n    #region Properties\n\n    public DataReceivedEventHandler DataErrorHandler { get; set; }\n    public DataReceivedEventHandler DataHandler { get; set; }\n    public EventHandler ExitedHandler { get; set; }\n\n    #endregion\n\n    #region Public Methods\n\n    public void Invoke(string script, RunningProcesses runningProcesses)\n    {\n      Process process = new Process();\n      try\n      {\n        process.StartInfo = new ProcessStartInfo()\n        {\n          FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\",\n          RedirectStandardError = true,\n          RedirectStandardOutput = true,\n          CreateNoWindow = true,\n          UseShellExecute = false,\n          Arguments = script,\n        };\n        process.StartInfo.EnvironmentVariables[\"Path\"] = CreatePathEnvironmentVariable();\n\n        process.EnableRaisingEvents = true;\n        process.ErrorDataReceived += DataErrorHandler;\n        process.OutputDataReceived += DataHandler;\n        process.Exited += ExitedHandler;\n        process.Disposed += ExitedHandler;\n\n        runningProcesses.Add(process);\n\n        process.Start();\n\n        process.BeginErrorReadLine();\n        process.BeginOutputReadLine();\n\n        process.WaitForExit();\n      }\n      catch (Exception e)\n      {\n        process.EnableRaisingEvents = false;\n        process.ErrorDataReceived -= DataErrorHandler;\n        process.OutputDataReceived -= DataHandler;\n        process.Exited -= ExitedHandler;\n        process.Disposed -= ExitedHandler;\n\n        process.Close();\n\n        throw e;\n      }\n    }\n\n    #endregion\n\n\n    #region Private Methods\n    private string CreatePathEnvironmentVariable()\n    {\n      var path = Environment.GetEnvironmentVariable(\"Path\");\n      var llvmModel = SettingsProvider.LlvmSettingsModel;\n\n      if (string.IsNullOrEmpty(llvmModel.LlvmSelectedVersion)) return path;\n\n      var paths = path.Split(';').ToList();\n      paths.RemoveAt(paths.Count - 1);\n      paths.RemoveAll(ContainsLlvm);\n\n      if (string.IsNullOrWhiteSpace(llvmModel.PreinstalledLlvmPath) == false\n        && llvmModel.LlvmSelectedVersion == llvmModel.PreinstalledLlvmVersion)\n      {\n        paths.Add(llvmModel.PreinstalledLlvmPath);\n      }\n      else\n      {\n        paths.Add(GetUsedLlvmVersionPath(llvmModel.LlvmSelectedVersion));\n      }\n\n      return String.Join(\";\", paths);\n    }\n\n    private static string GetUsedLlvmVersionPath(string llvmVersion)\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      return settingsPathBuilder.GetLlvmBinPath(llvmVersion);\n    }\n\n    private static bool ContainsLlvm(string input)\n    {\n      return input.ToLower().Contains(\"llvm\");\n    }\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/BasicCommand.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.Shell;\n\nnamespace ClangPowerTools\n{\n  public abstract class BasicCommand\n  {\n    #region Properties\n\n    protected int Id { get; set; }\n\n    protected Guid CommandSet { get; set; }\n\n    protected AsyncPackage AsyncPackage { get; set; }\n\n    protected Package Package => AsyncPackage;\n\n    protected IAsyncServiceProvider AsyncServiceProvider => AsyncPackage;\n\n    protected IServiceProvider ServiceProvider => Package;\n\n    #endregion\n\n    #region Constructor\n\n    protected BasicCommand(AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      AsyncPackage = aPackage ?? throw new ArgumentNullException(\"AsyncPackage\");\n      CommandSet = aGuid;\n      Id = aId;\n    }\n\n    #endregion\n\n  }\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/ClangCommand.cs",
    "content": "﻿using ClangPowerTools.CMake;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Events;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.IgnoreActions;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.Commands.Models;\nusing ClangPowerToolsShared.Helpers;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  public abstract class ClangCommand : BasicCommand\n  {\n    #region Members\n\n    //public static RunningProcesses runningProcesses = new RunningProcesses();\n\n    private CacheProjectsItemsModel cacheProjectsItemsModel = new CacheProjectsItemsModel();\n\n    protected ItemsCollector mItemsCollector;\n    protected FilePathCollector mFilePahtCollector;\n    private readonly Dictionary<string, string> mVsVersions = new Dictionary<string, string>\n    {\n      {\"11.0\", \"2010\"},\n      {\"12.0\", \"2012\"},\n      {\"13.0\", \"2013\"},\n      {\"14.0\", \"2015\"},\n      {\"15.0\", \"2017\"},\n      {\"16.0\", \"2019\"},\n      {\"17.0\", \"2022\"},\n      {\"18.0\", \"2026\"}\n    };\n\n    private IVsHierarchy mHierarchy;\n\n    // private object \n\n    public event EventHandler<VsHierarchyDetectedEventArgs> HierarchyDetectedEvent;\n    public event EventHandler<ActiveDocumentEventArgs> ActiveDocumentEvent;\n\n    public event EventHandler<ClangCommandMessageEventArgs> IgnoredItemsEvent;\n    protected static object mutex = new object();\n\n    #endregion\n\n\n    #region Properties\n\n    public string Script { get; private set; }\n\n    protected string VsEdition { get; set; }\n\n    protected string VsVersion { get; set; }\n\n    protected string WorkingDirectoryPath { get; set; }\n\n    public List<string> DirectoryPaths { get; set; } = new List<string>();\n\n    protected IVsHierarchy ItemHierarchy\n    {\n      get => mHierarchy;\n      set\n      {\n        if (null == value)\n          return;\n        mHierarchy = value;\n        OnFileHierarchyChanged(new VsHierarchyDetectedEventArgs(mHierarchy));\n      }\n    }\n\n\n    #endregion\n\n\n    #region Constructor\n\n\n    public ClangCommand(AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var dte2 = dte as DTE2;\n        VsEdition = dte2.Edition;\n        mVsVersions.TryGetValue(dte2.Version, out string version);\n        VsVersion = version;\n      }\n    }\n\n    #endregion\n\n    #region Protected Methods\n\n    protected void CacheProjectsFromItems()\n    {\n      cacheProjectsItemsModel.Projects.Clear();\n      cacheProjectsItemsModel.ProjectItems.Clear();\n\n      foreach (var item in mItemsCollector.Items)\n      {\n        if (item.GetObject() is Project)\n        {\n          var project = item.GetObject() as Project;\n          cacheProjectsItemsModel.Projects.Add(project);\n        }\n        else if (item.GetObject() is ProjectItem)\n        {\n          var projectItem = item.GetObject() as ProjectItem;\n          cacheProjectsItemsModel.ProjectItems.Add(projectItem);\n        }\n      }\n    }\n\n    protected void RunScript(int aCommandId, bool jsonCompilationDbActive, List<string> paths = null)\n    {\n      string runModeParameters = ScriptGenerator.GetRunModeParamaters();\n      string genericParameters = ScriptGenerator.GetGenericParamaters(aCommandId, VsEdition, VsVersion, jsonCompilationDbActive);\n\n      CMakeBuilder cMakeBuilder = new CMakeBuilder();\n      if (SolutionInfo.IsOpenFolderModeActive())\n      {\n        cMakeBuilder.Build();\n      }\n\n      if (jsonCompilationDbActive)\n        ExportJsonCompilationDatabase(runModeParameters, genericParameters);\n      else\n        Compile(runModeParameters, genericParameters, aCommandId, paths);\n\n      if (SolutionInfo.IsOpenFolderModeActive())\n      {\n        cMakeBuilder.ClearBuildCashe();\n      }\n    }\n\n    //Collect files\n    protected void CollectItemsDependingOnCommandLocation(\n      CommandUILocation commandUILocation = CommandUILocation.ContextMenu, bool jsonCompilationDbActive = false)\n    {\n      mItemsCollector = new ItemsCollector(jsonCompilationDbActive);\n      switch (commandUILocation)\n      {\n        case CommandUILocation.Toolbar:\n          mItemsCollector.CollectActiveProjectItem();\n          SetActiveDocumentEvent();\n          break;\n        case CommandUILocation.ContextMenu:\n          mItemsCollector.CollectSelectedItems();\n          break;\n        case CommandUILocation.ViewMenu:\n          mItemsCollector.CollectProjectItems();\n          break;\n      }\n    }\n\n    private void SetActiveDocumentEvent()\n    {\n      if (mItemsCollector.Items.Count == 0)\n      {\n        OnActiveFileCheck(new ActiveDocumentEventArgs(false));\n      }\n      else\n      {\n        OnActiveFileCheck(new ActiveDocumentEventArgs(true));\n      }\n    }\n\n    protected async Task PrepareCommmandAsync(CommandUILocation commandUILocation, bool jsonCompilationDbActive = false)\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n\n      DocumentHandler.SaveActiveDocuments();\n\n      if (!VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        return;\n\n      AutomationUtil.SaveDirtyProjects((dte as DTE2).Solution);\n      CollectItemsDependingOnCommandLocation(commandUILocation, jsonCompilationDbActive);\n    }\n\n    protected void OnActiveFileCheck(ActiveDocumentEventArgs e)\n    {\n      ActiveDocumentEvent?.Invoke(this, e);\n    }\n\n    protected void OnFileHierarchyChanged(VsHierarchyDetectedEventArgs e)\n    {\n      HierarchyDetectedEvent?.Invoke(this, e);\n    }\n\n    protected void OnIgnoreItem(ClangCommandMessageEventArgs e)\n    {\n      IgnoredItemsEvent?.Invoke(this, e);\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    protected void InvokeFindCommand(FindToolWindow findToolWindow)\n    {\n      if (findToolWindow != null)\n        findToolWindow.RunQuery();\n\n      if (RunController.StopCommandActivated)\n      {\n        RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(true));\n        RunController.StopCommandActivated = false;\n      }\n      else\n      {\n        RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(false));\n      }\n    }\n\n    /// <summary>\n    /// Use include-what-to-use tool to remove includes.\n    /// Download all needed tools: iwyu.exe, iwyu_tool.py, fix_includes.py.\n    /// Use iwyu_tool.py to generate output in iwyuUTF8.txt and apply fix with fix_includes.py\n    /// </summary>\n    protected void OptimizeIncludes()\n    {\n      if (string.IsNullOrEmpty(PathConstants.JsonCompilationDBPath))\n      {\n        CommandControllerInstance.CommandController.DisplayMessage(false, \"Cannot find compilation database\");\n        return;\n      }\n\n      string jsonCompilationDatabasePath = Path.Combine(PathConstants.SolutionDirPath, \"iwyu_compilation_db.json\");\n      ManageEncoding.ChangeEncodingFromBomToUtf8(PathConstants.JsonCompilationDBPath,\n        jsonCompilationDatabasePath);\n\n      string iwyuUTF8BOMPath = Path.Combine(new FileInfo(jsonCompilationDatabasePath).Directory.FullName,\n        \"iwyuUTF8BOM.txt\");\n      string iwyuUTF8Path = Path.Combine(new FileInfo(jsonCompilationDatabasePath).Directory.FullName,\n        \"iwyuUTF8.txt\");\n\n      try\n      {\n        //downlaod tools\n        string iwyuTool = Path.Combine(PowerShellWrapper.DownloadTool(ScriptConstants.kIwyuTool),\n          ScriptConstants.kIwyuTool);\n\n        var pythonPath = PowerShellWrapper.GetFilePathFromEnviromentVar(\"python.exe\");\n        if (string.IsNullOrEmpty(pythonPath))\n        {\n          CommandControllerInstance.CommandController.DisplayMessage(false, \"To use optimize includes you must add in PATH python 3.x\");\n          return;\n        }\n\n        string Script = $\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command \\\"& \" +\n          $\"cmd.exe /c python.exe \" +\n          $\" '{iwyuTool}'  -v -p '{jsonCompilationDatabasePath}' \" +\n          $\"--j {PowerShellWrapper.GetNumberOfProcessors()} > '{iwyuUTF8BOMPath}' \\\"\";\n\n        //generate iwyu output in iwyuOutput.txt\n        PowerShellWrapper.StartProcess(Script);\n\n        //change encoding from utf8 BOM to utf8\n        ManageEncoding.ChangeEncodingFromBomToUtf8(iwyuUTF8BOMPath ,iwyuUTF8Path);\n\n        //apply fixes based on generated iwyuOutput.txt (encoding utf-8) file\n        string iwyuFixIncludes = Path.Combine(PowerShellWrapper.DownloadTool(ScriptConstants.kIwyuFixIncludes),\n          ScriptConstants.kIwyuFixIncludes);\n\n        string includeFixScript = $\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command \\\"& \" +\n          $\"cmd.exe /c python.exe '{iwyuFixIncludes}' \" +\n          $\" '<' '{iwyuUTF8Path}' \\\"\";\n\n        PowerShellWrapper.StartProcess(includeFixScript);\n      }\n      catch (Exception e)\n      {\n        CommandControllerInstance.CommandController.DisplayMessage(false, e.Message);\n      }\n      finally\n      {\n        //Remove files\n        FileSystem.DeleteFile(iwyuUTF8Path);\n        FileSystem.DeleteFile(iwyuUTF8BOMPath);\n        FileSystem.DeleteFile(jsonCompilationDatabasePath);\n      }\n\n      if (RunController.StopCommandActivated)\n      {\n        RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(true));\n        RunController.StopCommandActivated = false;\n      }\n      else\n      {\n        RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(false));\n      }\n    }\n\n    /// <summary>\n    /// Create a process for running clang-doc.exe resulted\n    /// format, depends on passed command\n    /// </summary>\n    /// <param name=\"commandId\"></param>\n    /// <param name=\"jsonCompilationDbActive\"></param>\n    /// <param name=\"paths\"></param>\n    /// <returns></returns>\n    protected void GenerateDocumentationForProject(int commandId, AsyncPackage package)\n    {\n\n      var jsonCompilationDatabasePath = PathConstants.JsonCompilationDBPath;\n      string documentationOutoutePath = GenerateDocumentation.FindOutputFolderName(\n        Path.Combine(new FileInfo(jsonCompilationDatabasePath).Directory.FullName,\n        \"Documentation\\\\\"));\n      string clangDocPath = PowerShellWrapper.DownloadTool(ScriptConstants.kClangDoc);\n      clangDocPath = Path.Combine(clangDocPath, ScriptConstants.kClangDoc);\n\n      if (File.Exists(jsonCompilationDatabasePath) && File.Exists(clangDocPath))\n      {\n        string projectArguments = GetProjectName() == string.Empty ? string.Empty : $\"--project-name='{GetProjectName()}'\";\n\n        GenerateDocumentation.OutputDir = documentationOutoutePath;\n        CommandControllerInstance.CommandController.DisplayMessage(false, \"Please wait ...\");\n        string Script = $\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command \\\"& \" +\n        $\"'{clangDocPath}' --public {projectArguments} --format={GenerateDocumentation.Formats[commandId]}  \" +\n        $\"-output='{documentationOutoutePath}' '{jsonCompilationDatabasePath}' \\\"\";\n\n        PowerShellWrapper.Invoke(Script);\n\n        //Replace a string in index_json.js if is generated with html format, to avoid a json error\n        string indexJsonFileName = Path.Combine(documentationOutoutePath, \"index_json.js\");\n        if (File.Exists(indexJsonFileName) && commandId == CommandIds.kDocumentationHtmlId)\n        {\n          string indexJsonFileContent = File.ReadAllText(indexJsonFileName);\n          indexJsonFileContent = indexJsonFileContent.Replace(\"var JsonIndex = `\", \"var JsonIndex = String.raw `\");\n          File.WriteAllText(indexJsonFileName, indexJsonFileContent);\n        }\n\n        DeleteJsonCompilationDB();\n\n        if (RunController.StopCommandActivated)\n        {\n          RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(true));\n          RunController.StopCommandActivated = false;\n        }\n        else\n        {\n          RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(false));\n        }\n      }\n    }\n\n    private void DeleteJsonCompilationDB()\n    {\n      var jsonCompilationDatabasePath = PathConstants.JsonCompilationDBPath;\n      if (File.Exists(jsonCompilationDatabasePath))\n        File.Delete(jsonCompilationDatabasePath);\n    }\n\n    private void Compile(string runModeParameters, string genericParameters, int commandId, List<string> paths)\n    {\n      var vsSolution = SolutionInfo.IsOpenFolderModeActive() == false ?\n        (IVsSolution)VsServiceProvider.GetService(typeof(SVsSolution)) : null;\n\n      try\n      {\n        var tempClangTidyFilePath = string.Empty;\n        if (paths is not null)\n        {\n          var itemRelatedParameters = ScriptGenerator.GetItemRelatedParametersCustomPaths(paths, cacheProjectsItemsModel);\n          Script = JoinUtility.Join(\" \", runModeParameters, itemRelatedParameters, genericParameters, \"\\\"\");\n        }\n        else\n        {\n          var item = mItemsCollector.Items[0];\n          var ignoreItem = new IgnoreItem();\n\n          //TODO Display all ignored files\n          //if (ignoreItem.Check(item))\n          //{\n          //  OnIgnoreItem(new ClangCommandMessageEventArgs(ignoreItem.IgnoreCompileOrTidyMessage, false));\n          //}\n\n          //TODO Handle CreateTemporaryFileForTidy\n          if (commandId == CommandIds.kTidyId || commandId == CommandIds.kTidyFixId || CommandIds.kTidyToolWindowId == commandId ||\n            commandId == CommandIds.kTidyToolbarId || commandId == CommandIds.kTidyFixToolbarId)\n          {\n            tempClangTidyFilePath = CreateTemporaryFileForTidy(item);\n          }\n\n          var itemRelatedParameters = string.Empty;\n          if (item is CurrentProject || item is Project || item is Solution)\n          {\n            itemRelatedParameters = ScriptGenerator.GetProjectRelatedParameters(cacheProjectsItemsModel);\n          }\n          else if (item is CurrentProjectItem || item is ProjectItem)\n          {\n            itemRelatedParameters = ScriptGenerator.GetItemRelatedParameters(mItemsCollector.Items);\n          }\n\n          // From the first parameter is removed the last character which is mandatory \"'\"\n          // and added to the end of the string to close the script escaping command\n          Script = JoinUtility.Join(\" \", runModeParameters, itemRelatedParameters, genericParameters, \"\\\"\");\n\n          ItemHierarchy = vsSolution != null ? AutomationUtil.GetItemHierarchy(vsSolution, item) : null;\n        }\n        PowerShellWrapper.Invoke(Script);\n\n        if (RunController.StopCommandActivated)\n        {\n          RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(true));\n          RunController.StopCommandActivated = false;\n        }\n        else\n        {\n          if (File.Exists(tempClangTidyFilePath))\n          {\n            File.Delete(tempClangTidyFilePath);\n          }\n          RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(false));\n        }\n\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    private string CreateTemporaryFileForTidy(IItem item)\n    {\n      var directoryPath = Directory.GetParent(item.GetPath()).FullName;\n      StopCommand.Instance.DirectoryPaths.Add(directoryPath);\n\n      var clangTidyFilePath = Path.Combine(directoryPath, ScriptConstants.kTidyFile);\n      if (File.Exists(clangTidyFilePath))\n      {\n        var settingsPathBuilder = new SettingsPathBuilder();\n        var settingsPath = settingsPathBuilder.GetPath(\"\");\n\n        var tempClangTidyFilePath = Path.Combine(settingsPath, ScriptConstants.kTidyFile);\n        File.Copy(clangTidyFilePath, tempClangTidyFilePath, true);\n        return tempClangTidyFilePath;\n      }\n\n      return string.Empty;\n    }\n\n    private void ExportJsonCompilationDatabase(string runModeParameters, string genericParameters)\n    {\n      if (mItemsCollector.IsEmpty)\n        return;\n\n      var item = mItemsCollector.Items[0];\n\n      if (item is CurrentSolution)\n        Script = JoinUtility.Join(\" \", runModeParameters, genericParameters, \"\\\"\");\n      else if (item is CurrentProject)\n      {\n        var itemRelatedParameters = ScriptGenerator.GetItemRelatedParameters(item, true);\n        Script = JoinUtility.Join(\" \", runModeParameters, itemRelatedParameters, genericParameters, \"\\\"\");\n      }\n      else if (item is CurrentProjectItem)\n      {\n        var itemRelatedParameters = mItemsCollector.Items.Count == 1 ?\n          ScriptGenerator.GetItemRelatedParameters(item, true) : ScriptGenerator.GetItemRelatedParameters(mItemsCollector.Items, true);\n\n        Script = JoinUtility.Join(\" \", runModeParameters, itemRelatedParameters, genericParameters, \"\\\"\");\n      }\n\n      PowerShellWrapper.Invoke(Script);\n    }\n\n    private string GetProjectName()\n    {\n      string projectName = string.Empty;\n      try\n      {\n        if (cacheProjectsItemsModel.Projects.Count > 0)\n        {\n          projectName = cacheProjectsItemsModel.Projects[0].FullName;\n        }\n        else\n        {\n          projectName = cacheProjectsItemsModel.ProjectItems[0].ContainingProject.FullName;\n        }\n      }\n      catch (NullReferenceException e)\n      {\n\n      }\n      return projectName;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/CommandController.cs",
    "content": "﻿using ClangPowerTools.CMake;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Commands.BackgroundTidy;\nusing ClangPowerTools.Error;\nusing ClangPowerTools.Events;\nusing ClangPowerTools.Handlers;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.Helpers;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  /// <summary>\n  /// Contains all the logic of disable and enable the clang custom commands\n  /// </summary>\n  public class CommandController\n  {\n    #region Members\n\n    public bool running = false;\n    public bool vsBuildRunning = false;\n    public bool tokenExists = false;\n    public bool clearOutputOnFormat = false;\n    public bool keepJsonCompilationDb = false;\n\n    public bool showOpenFolderWarning = true;\n\n    public static readonly Guid mCommandSet = new Guid(\"498fdff5-5217-4da9-88d2-edad44ba3874\");\n\n    public event EventHandler<VsHierarchyDetectedEventArgs> HierarchyDetectedEvent;\n    public event EventHandler<ClangCommandMessageEventArgs> ClangCommandMessageEvent;\n    public event EventHandler<ClearEventArgs> ClearErrorListEvent;\n    public event EventHandler<ClearEventArgs> ClearOutputWindowEvent;\n    public event EventHandler<EventArgs> ErrorDetectedEvent;\n    public event EventHandler<EventArgs> HasEncodingErrorEvent;\n\n    private bool mFormatted = false;\n    private readonly Commands2 mCommand;\n    private CommandUILocation commandUILocation;\n    private int currentCommand = 0;\n    private bool mSaveCommandWasGiven = false;\n    private bool mFormatAfterTidyFlag = false;\n    private string oldActiveDocumentName = null;\n    private AsyncPackage package;\n    private LaunchCompilationDbProgrammatically launchCompilationDbProgrammatically = new();\n\n    public AsyncPackage Package\n    {\n      get { return package; }\n    }\n\n    private readonly object mutex = new object();\n\n    private readonly string registryName = @\"Software\\Caphyon\\Clang Power Tools\";\n    private readonly string keyName = \"CMakeBetaWarning\";\n\n    #endregion\n\n    #region Constructor\n\n    public CommandController(AsyncPackage aAsyncPackage)\n    {\n      package = aAsyncPackage;\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var dte2 = (DTE2)dte;\n        mCommand = (Commands2)dte2.Commands;\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public async Task InitializeCommandsAsync(AsyncPackage aAsyncPackage)\n    {\n      if (CompileCommand.Instance == null)\n      {\n        await CompileCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                             CommandIds.kCompileId);\n        await CompileCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                             CommandIds.kCompileToolbarId);\n      }\n\n      if (TidyCommand.Instance == null)\n      {\n        await TidyCommand.InitializeAsync(this, aAsyncPackage, mCommandSet, CommandIds.kTidyId);\n        await TidyCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                          CommandIds.kTidyToolbarId);\n      }\n\n      if (FormatCommand.Instance == null)\n      {\n        await FormatCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                            CommandIds.kClangFormat);\n        await FormatCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                            CommandIds.kClangFormatToolbarId);\n      }\n\n      if (FindCommand.Instance == null)\n      {\n        await FindCommand.InitializeAsync(this, aAsyncPackage, mCommandSet, CommandIds.kClangFind);\n      }\n\n      if (OptimizeIncludesCommand.Instance == null)\n      {\n        await OptimizeIncludesCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                             CommandIds.kOptimizeIncludesId);\n      }\n\n      if (IgnoreFormatCommand.Instance == null)\n      {\n        await IgnoreFormatCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                  CommandIds.kIgnoreFormatId);\n      }\n\n      if (IgnoreCompileCommand.Instance == null)\n      {\n        await IgnoreCompileCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                   CommandIds.kIgnoreCompileId);\n      }\n\n      if (StopCommand.Instance == null)\n      {\n        await StopCommand.InitializeAsync(this, aAsyncPackage, mCommandSet, CommandIds.kStopClang);\n      }\n\n      if (JsonCompilationDatabaseCommand.Instance == null)\n      {\n        await JsonCompilationDatabaseCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                             CommandIds.kJsonCompilationDatabase);\n      }\n\n      if (DocumentationYamlCommand.Instance == null)\n      {\n        await DocumentationYamlCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                       CommandIds.kDocumentationYamlId);\n      }\n\n      if (DocumentationHtmlCommand.Instance == null)\n      {\n        await DocumentationHtmlCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                       CommandIds.kDocumentationHtmlId);\n      }\n\n      if (DocumentationMdCommand.Instance == null)\n      {\n        await DocumentationMdCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                     CommandIds.kDocumentationMdId);\n      }\n\n      if (SettingsCommand.Instance == null)\n      {\n        await SettingsCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                              CommandIds.kSettingsId);\n      }\n\n      if (FindViewMenuCommand.Instance == null)\n      {\n        await FindViewMenuCommand.InitializeAsync(this, aAsyncPackage, mCommandSet,\n                                                  CommandIds.kFindViewMenuId);\n      }\n    }\n\n    public async void Execute(object sender, EventArgs e)\n    {\n      var command = CreateCommand(sender);\n      if (command == null)\n        return;\n\n      await LaunchCommandAsync(command.CommandID.ID, commandUILocation);\n    }\n\n    public int GetCurrentCommandId() { return currentCommand; }\n\n    public async Task LaunchCommandAsync(int aCommandId,\n                                         CommandUILocation aCommandUILocation,\n                                         List<string> paths = null,\n                                         bool openCompilationDatabaseInExplorer = true)\n    {\n      // If ApplyTidy-Fix is enabled, switch command\n      ChooseCommandIdDependingOnTidy(ref aCommandId);\n\n      switch (aCommandId)\n      {\n        case CommandIds.kFindViewMenuId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kFindViewMenuId);\n\n            await FindViewMenuCommand.Instance.FindAsync(aCommandUILocation);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kSettingsId:\n          {\n            await SettingsCommand.Instance.ShowSettingsAsync();\n            break;\n          }\n        case CommandIds.kStopClang:\n          {\n            await StopCommand.Instance.RunStopClangCommandAsync(false);\n            break;\n          }\n        case CommandIds.kClangFormat:\n          {\n            clearOutputOnFormat = true;\n            FormatCommand.Instance.RunClangFormat(aCommandUILocation);\n            break;\n          }\n        case CommandIds.kClangFormatToolbarId:\n          {\n            clearOutputOnFormat = true;\n            FormatCommand.Instance.RunClangFormat(aCommandUILocation);\n            break;\n          }\n        case CommandIds.kClangFind:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kClangFind);\n\n            await FindCommand.Instance.FindAsync(aCommandUILocation);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kClangFindRun:\n          {\n            await launchCompilationDbProgrammatically.FromFindToolWindowAsync();\n            OnBeforeClangCommand(CommandIds.kClangFindRun);\n\n            await FindCommand.Instance.RunQueryAsync();\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kOptimizeIncludesId:\n          {\n            //generate compilation database here, before setting the CommandId with OptimizeIncludesId\n            await launchCompilationDbProgrammatically.FromOptimizeIncludesAsync();\n\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kOptimizeIncludesId);\n\n            await OptimizeIncludesCommand.Instance.RunOptimizeIncludes(aCommandUILocation);\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kCompileId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kCompileId);\n\n            await CompileCommand.Instance.RunClangCompileAsync(CommandIds.kCompileId,\n                                                               aCommandUILocation);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kCompileToolbarId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kCompileId);\n\n            await CompileCommand.Instance.RunClangCompileAsync(CommandIds.kCompileId,\n                                                               aCommandUILocation);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kTidyId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kTidyId);\n\n            await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyId, aCommandUILocation);\n            await TidyCommand.Instance.ShowTidyToolWindowEmptyAsync();\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kTidyToolbarId:\n          {\n            await StopBackgroundRunnersAsync();\n\n            await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyId, aCommandUILocation);\n            await TidyCommand.Instance.ShowTidyToolWindowEmptyAsync();\n\n            break;\n          }\n        case CommandIds.kTidyToolWindowId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kTidyToolWindowId);\n\n            await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyToolWindowId,\n                                                         aCommandUILocation, paths);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kTidyToolWindowFilesId:\n          {\n            OnAfterClangCommand();\n            await StopBackgroundRunnersAsync();\n\n            await TidyCommand.Instance.ShowTidyToolWindowAsync(paths);\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kTidyFixId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kTidyFixId);\n\n            await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyFixId, aCommandUILocation,\n                                                         paths);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kTidyFixToolbarId:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kTidyFixId);\n\n            await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyFixId, aCommandUILocation);\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kIgnoreFormatId:\n          {\n            IgnoreFormatCommand.Instance.RunIgnoreFormatCommand();\n            break;\n          }\n        case CommandIds.kIgnoreCompileId:\n          {\n            IgnoreCompileCommand.Instance.RunIgnoreCompileCommand();\n            break;\n          }\n        case CommandIds.kDocumentationYamlId:\n          {\n            await launchCompilationDbProgrammatically.FromGenerateDocumentationAsync();\n\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kDocumentationYamlId);\n\n            await DocumentationYamlCommand.Instance.GenerateDocumentationAsync(\n                CommandIds.kDocumentationYamlId);\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kDocumentationMdId:\n          {\n            await launchCompilationDbProgrammatically.FromGenerateDocumentationAsync();\n\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kDocumentationMdId);\n\n            await DocumentationMdCommand.Instance.GenerateDocumentationAsync(\n                CommandIds.kDocumentationMdId);\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kDocumentationHtmlId:\n          {\n            await launchCompilationDbProgrammatically.FromGenerateDocumentationAsync();\n\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kDocumentationHtmlId);\n\n            await DocumentationHtmlCommand.Instance.GenerateDocumentationAsync(\n                CommandIds.kDocumentationHtmlId);\n\n            OnAfterClangCommand();\n            break;\n          }\n        case CommandIds.kJsonCompilationDatabase:\n          {\n            await StopBackgroundRunnersAsync();\n            OnBeforeClangCommand(CommandIds.kJsonCompilationDatabase);\n\n            await JsonCompilationDatabaseCommand.Instance.ExportAsync(\n                aCommandUILocation, openCompilationDatabaseInExplorer);\n            OnAfterClangCommand();\n            break;\n          }\n        default:\n          break;\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    /// <summary>\n    /// Return commandId depending on tidy settings\n    /// </summary>\n    /// <param name=\"commandId\"></param>\n    /// <returns></returns>\n    private void ChooseCommandIdDependingOnTidy(ref int aCommandId)\n    {\n      var tidySettings = SettingsProvider.TidySettingsModel;\n      if (aCommandId == CommandIds.kTidyToolbarId && tidySettings.ApplyTidyFix)\n      {\n        aCommandId = CommandIds.kTidyFixToolbarId;\n      }\n\n      if (aCommandId == CommandIds.kTidyId && tidySettings.ApplyTidyFix)\n      {\n        aCommandId = CommandIds.kTidyFixId;\n      }\n    }\n\n    private OleMenuCommand CreateCommand(object sender)\n    {\n      if ((sender is OleMenuCommand) == false)\n        return null;\n\n      OleMenuCommand command = sender as OleMenuCommand;\n      if (running && command.CommandID.ID != CommandIds.kStopClang)\n        return null;\n\n      if (command.CommandID.ID != CommandIds.kStopClang)\n        currentCommand = command.CommandID.ID;\n\n      SetCommandLocation();\n      return command;\n    }\n\n    private void SetCommandLocation()\n    {\n      switch (currentCommand)\n      {\n        case CommandIds.kClangFormatToolbarId:\n        case CommandIds.kCompileToolbarId:\n        case CommandIds.kTidyToolbarId:\n        case CommandIds.kTidyFixToolbarId:\n          commandUILocation = CommandUILocation.Toolbar;\n          break;\n        case CommandIds.kFindViewMenuId:\n          commandUILocation = CommandUILocation.ViewMenu;\n          break;\n        default:\n          commandUILocation = CommandUILocation.ContextMenu;\n          break;\n      }\n    }\n\n    private async Task StopBackgroundRunnersAsync()\n    {\n      await StopCommand.Instance.RunStopClangCommandAsync(true);\n    }\n\n    private void StopBackgroundRunners() { StopCommand.Instance.StopClangCommand(true); }\n\n    private void OnBeforeClangCommand(int aCommandId)\n    {\n      currentCommand = aCommandId;\n      running = true;\n\n      OnClangCommandBegin(new ClearEventArgs());\n\n      if (OutputWindowConstants.commandName.ContainsKey(aCommandId))\n        DisplayStartedMessage(aCommandId, true);\n    }\n\n    private void OnClangCommandBegin(ClearEventArgs e) { ClearErrorListEvent?.Invoke(this, e); }\n\n    private void OnAfterClangCommand()\n    {\n      running = false;\n      var cMakeBuilder = new CMakeBuilder();\n      cMakeBuilder.ClearBuildCashe();\n    }\n\n\n\n    public void OnAfterFormatCommand(object sender, FormatCommandEventArgs e)\n    {\n      if (e.FormatConfigFound == false)\n      {\n        DisplayMessage(\n            e.Clear,\n            $\"\\n--- ERROR ---\\nFormat config file not found.\\nCreate the config file and place it in the solution folder or select one of the predefined format styles from Clang Power Tools settings -> Format -> Style.\");\n      }\n      else if (e.Clear)\n      {\n        ClearOutputWindowEvent?.Invoke(this, new ClearEventArgs());\n      }\n    }\n\n    public void OnAfterRunCommand(object sender, CloseDataStreamingEventArgs e)\n    {\n      if (e.IsStopped)\n      {\n        DisplayStoppedMessage(false);\n        running = false;\n        return;\n      }\n\n      DisplayFinishedMessage(false);\n\n      if (currentCommand != CommandIds.kJsonCompilationDatabase)\n        OnErrorDetected(new EventArgs());\n    }\n\n    protected void OnErrorDetected(EventArgs e)\n    {\n      ErrorDetectedEvent?.Invoke(this, e);\n      HasEncodingErrorEvent?.Invoke(this, new EventArgs());\n    }\n\n    public void OnEncodingErrorDetected(object sender, HasEncodingErrorEventArgs e)\n    {\n      if (!e.Model.HasEncodingError)\n      {\n        return;\n      }\n      DisplayErrorWindow();\n    }\n\n    private void DisplayErrorWindow()\n    {\n      try\n      {\n        UIUpdater\n            .InvokeAsync(new Action(() =>\n            {\n              var itemsCollector = new ItemsCollector();\n              var window = new EncodingErrorView(itemsCollector.GetDocumentsToEncode());\n              window.ShowDialog();\n            }))\n            .SafeFireAndForget();\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    public void OnActiveDocumentCheck(object sender, ActiveDocumentEventArgs e)\n    {\n      if (e.IsActiveDocument == false)\n      {\n        DisplayNoActiveDocumentMessage(true);\n      }\n    }\n\n    private void OnClangCommandMessageTransfer(ClangCommandMessageEventArgs e)\n    {\n      ClangCommandMessageEvent?.Invoke(this, e);\n    }\n\n    public void OnFileHierarchyChanged(object sender, VsHierarchyDetectedEventArgs e)\n    {\n      HierarchyDetectedEvent?.Invoke(this, e);\n    }\n\n    private void DisplayStartedMessage(int aCommandId, bool clearOutput)\n    {\n      OnClangCommandMessageTransfer(new ClangCommandMessageEventArgs(\n          $\"\\n--- {OutputWindowConstants.commandName[aCommandId].ToUpper()} STARTED ---\\n\",\n          clearOutput));\n      StatusBarHandler.Status(OutputWindowConstants.commandName[aCommandId] + \" started...\", 1,\n                              vsStatusAnimation.vsStatusAnimationBuild, 1);\n    }\n\n    private void DisplayNoActiveDocumentMessage(bool clearOutput)\n    {\n      OnClangCommandMessageTransfer(new ClangCommandMessageEventArgs(\n          $\"\\nToolbar Clang commands can only run on open files. Open a file or use the context menu commands by right-clicking in the Solution Explorer.\\n\",\n          clearOutput));\n      StatusBarHandler.Status(\"Ready\", 0, vsStatusAnimation.vsStatusAnimationBuild, 0);\n    }\n\n    private void DisplayFinishedMessage(bool clearOutput)\n    {\n      OnClangCommandMessageTransfer(new ClangCommandMessageEventArgs(\n          $\"\\n--- {OutputWindowConstants.commandName[currentCommand].ToUpper()} FINISHED ---\\n\",\n          clearOutput));\n      StatusBarHandler.Status(OutputWindowConstants.commandName[currentCommand] + \" finished\", 0,\n                              vsStatusAnimation.vsStatusAnimationBuild, 0);\n    }\n\n    private void DisplayStoppedMessage(bool clearOutput)\n    {\n      OnClangCommandMessageTransfer(new ClangCommandMessageEventArgs(\n          $\"\\n--- {OutputWindowConstants.commandName[currentCommand].ToUpper()} STOPPED ---\",\n          clearOutput));\n      StatusBarHandler.Status(\"Command stopped\", 0, vsStatusAnimation.vsStatusAnimationBuild, 0);\n    }\n\n    public void DisplayMessage(bool clearOutput = false, string message = \"\")\n    {\n      OnClangCommandMessageTransfer(new ClangCommandMessageEventArgs(message, clearOutput));\n      StatusBarHandler.Status(\"Command stopped\", 0, vsStatusAnimation.vsStatusAnimationBuild, 0);\n    }\n\n    private string GetCommandName(string aGuid, int aId)\n    {\n      try\n      {\n        if (null == aGuid)\n          return string.Empty;\n\n        if (null == mCommand)\n          return string.Empty;\n\n        Command cmd = mCommand.Item(aGuid, aId);\n        if (null == cmd)\n          return string.Empty;\n\n        return cmd.Name;\n      }\n      catch (Exception)\n      {\n        // MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n\n      return string.Empty;\n    }\n\n    #endregion\n\n    #region Events\n\n    internal void OnItemIgnore(object sender, ClangCommandMessageEventArgs e)\n    {\n      ClangCommandMessageEvent?.Invoke(this, e);\n    }\n\n    public void VisibilityOnBeforeCommand(object sender, EventArgs e)\n    {\n      if (sender is OleMenuCommand == false)\n        return;\n      var command = (OleMenuCommand)sender;\n\n      var itemsCollector = new ItemsCollector();\n      itemsCollector.CollectSelectedProjectItems();\n      if (itemsCollector.Items != null && itemsCollector.Items.Count == 1 &&\n          (command.CommandID.ID == CommandIds.kIgnoreCompileId) &&\n          ScriptConstants.kAcceptedFileExtensionsWithoutHeaders.Contains(\n              Path.GetExtension(itemsCollector.Items[0].GetName())) == false)\n      {\n        command.Visible = command.Enabled = false;\n      }\n      else\n      {\n        command.Enabled = !itemsCollector.IsEmpty;\n      }\n    }\n\n    /// <summary>\n    /// It is called before every command. Update the running state.\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    public void OnBeforeClangCommand(object sender, EventArgs e)\n    {\n      if (!(sender is OleMenuCommand command))\n        return;\n\n      var itemsCollector = new ItemsCollector();\n      itemsCollector.CollectSelectedProjectItems();\n\n      var tidySettings = SettingsProvider.TidySettingsModel;\n      // Change button name for tidy depending on settings property\n      if (tidySettings.ApplyTidyFix && (command.CommandID.ID == CommandIds.kTidyId ||\n                                        command.CommandID.ID == CommandIds.kTidyToolbarId))\n      {\n        command.Text = \"Tidy-Fix\";\n      }\n      else if (command.CommandID.ID == CommandIds.kTidyId ||\n                 command.CommandID.ID == CommandIds.kTidyToolbarId)\n      {\n        command.Text = \"Tidy\";\n      }\n\n      if (IsAToolbarCommand(command))\n      {\n        if (SolutionInfo.AreToolbarCommandsEnabled() == false)\n        {\n          command.Enabled = command.CommandID.ID == CommandIds.kClangFormatToolbarId &&\n                            SolutionInfo.ActiveDocumentValidation();\n          return;\n        }\n      }\n      else if (SolutionInfo.AreContextMenuCommandsEnabled() == false)\n      {\n        command.Enabled = false;\n        return;\n      }\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte) &&\n          !(dte as DTE2).Solution.IsOpen)\n      {\n        command.Visible = command.Enabled = false;\n      }\n      else if (itemsCollector.Items != null && itemsCollector.Items.Count == 1 &&\n                 (command.CommandID.ID == CommandIds.kCompileId ||\n                  command.CommandID.ID == CommandIds.kTidyId ||\n                  command.CommandID.ID == CommandIds.kOptimizeIncludesId ||\n                  command.CommandID.ID == CommandIds.kJsonCompilationDatabase ||\n                  command.CommandID.ID == CommandIds.kClangFindRun ||\n                  command.CommandID.ID == CommandIds.kIgnoreCompileId ||\n                  command.CommandID.ID == CommandIds.kDocumentationMdId ||\n                  command.CommandID.ID == CommandIds.kDocumentationHtmlId ||\n                  command.CommandID.ID == CommandIds.kDocumentationYamlId ||\n                  command.CommandID.ID == CommandIds.kClangFind) &&\n                 ScriptConstants.kAcceptedFileExtensionsWithoutHeaders.Contains(\n                     Path.GetExtension(itemsCollector.Items[0].GetName())) == false)\n      {\n        command.Visible = command.Enabled = false;\n        return;\n      }\n      else if (vsBuildRunning && command.CommandID.ID != CommandIds.kSettingsId)\n      {\n        command.Visible = command.Enabled = false;\n      }\n      else\n      {\n        command.Visible = command.Enabled =\n            command.CommandID.ID != CommandIds.kStopClang ? !running : running;\n      }\n    }\n\n    /// <summary>\n    /// Set the VS running build flag to true when the VS build begin.\n    /// </summary>\n    /// <param name=\"Scope\"></param>\n    /// <param name=\"Action\"></param>\n    public void OnMSVCBuildBegin(vsBuildScope Scope, vsBuildAction Action)\n    {\n      vsBuildRunning = true;\n    }\n\n    /// <summary>\n    /// Set the VS running build flag to false when the VS build finished.\n    /// </summary>\n    /// <param name=\"Scope\"></param>\n    /// <param name=\"Action\"></param>\n    public void OnMSVCBuildDone(vsBuildScope Scope, vsBuildAction Action)\n    {\n      vsBuildRunning = false;\n      OnMSVCBuildSucceededAsync().SafeFireAndForget();\n    }\n\n    private async Task OnMSVCBuildSucceededAsync()\n    {\n      if (SettingsProvider.CompilerSettingsModel.ClangAfterMSVC == false ||\n          SolutionInfo.ContainsCppProject() == false)\n        return;\n\n      var exitCode = int.MaxValue;\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        exitCode = (dte as DTE2).Solution.SolutionBuild.LastBuildInfo;\n\n      // VS compile detected errors and there is not necessary to run clang compile\n      if (exitCode != 0)\n      {\n        return;\n      }\n\n      // Run clang compile after the VS compile succeeded\n\n      OnBeforeClangCommand(CommandIds.kCompileId);\n      await CompileCommand.Instance.RunClangCompileAsync(CommandIds.kCompileId,\n                                                         CommandUILocation.ContextMenu);\n      OnAfterClangCommand();\n    }\n\n    private int HideFindToolWindow()\n    {\n      var findToolWindow = package.FindToolWindow(typeof(FindToolWindow), 0, false);\n      if (findToolWindow is null)\n        return VSConstants.S_OK;\n      var findWindow = findToolWindow.Frame as IVsWindowFrame;\n      findWindow?.Hide();\n\n      return VSConstants.S_OK;\n    }\n\n    private int HideTidyToolWindow()\n    {\n      var tidyToolWindow = package.FindToolWindow(typeof(TidyToolWindow), 0, false);\n      if (tidyToolWindow is null)\n        return VSConstants.S_OK;\n      var tidyWindow = tidyToolWindow.Frame as IVsWindowFrame;\n      tidyWindow?.Hide();\n\n      return VSConstants.S_OK;\n    }\n\n    public void OnBeforeSave(object sender, Document aDocument)\n    {\n      StopBackgroundRunners();\n\n      BeforeSaveClangTidyAsync(aDocument).SafeFireAndForget();\n      BeforeSaveClangFormat(aDocument);\n    }\n\n    private async Task BeforeSaveClangTidyAsync(Document document)\n    {\n      // OnBeforeActiveDocumentChange(new object(), document);\n\n      // The save event was not triggered by Save File or SaveAll commands\n      if (false == mSaveCommandWasGiven)\n        return;\n\n      var tidySettings = SettingsProvider.TidySettingsModel;\n\n      // The clang-tidy on save option is disable\n      if (false == tidySettings.TidyOnSave)\n        return;\n\n      // Clang compile/tidy command is running\n      if (true == running)\n        return;\n\n      await StopBackgroundRunnersAsync();\n      OnBeforeClangCommand(CommandIds.kTidyFixId);\n      await TidyCommand.Instance.RunClangTidyAsync(CommandIds.kTidyFixId,\n                                                   CommandUILocation.ContextMenu);\n      OnAfterClangCommand();\n\n      mSaveCommandWasGiven = false;\n    }\n\n    private void BeforeSaveClangFormat(Document aDocument)\n    {\n      var formatSettings = SettingsProvider.FormatSettingsModel;\n      var tidySettings = SettingsProvider.TidySettingsModel;\n\n      if (currentCommand == CommandIds.kTidyFixId && running && tidySettings.FormatAfterTidy && formatSettings.FormatOnSave)\n      {\n        mFormatAfterTidyFlag = true;\n        return;\n      }\n\n      if (false == formatSettings.FormatOnSave)\n        return;\n\n      if (currentCommand == CommandIds.kTidyFixId && false == Vsix.IsDocumentDirty(aDocument) && false == mFormatAfterTidyFlag)\n        return;\n\n      FormatCommand.Instance.FormatOnSave(aDocument);\n    }\n\n    public void CommandEventsBeforeExecute(string aGuid,\n                                           int aId,\n                                           object aCustomIn,\n                                           object aCustomOut,\n                                           ref bool aCancelDefault)\n    {\n      BeforeExecuteClangCompile(aGuid, aId);\n      BeforeExecuteClangTidy(aGuid, aId);\n    }\n\n    private void BeforeExecuteClangCompile(string aGuid, int aId)\n    {\n      var compilerSettings = SettingsProvider.CompilerSettingsModel;\n\n      if (compilerSettings.ClangAfterMSVC == false)\n        return;\n\n      string commandName = GetCommandName(aGuid, aId);\n      if (0 != string.Compare(VsCommands.Compile, commandName))\n        return;\n    }\n\n    private void BeforeExecuteClangTidy(string aGuid, int aId)\n    {\n      string commandName = GetCommandName(aGuid, aId);\n\n      if (VsCommands.SaveCommands.Contains(commandName))\n        mSaveCommandWasGiven = true;\n    }\n\n    public void OnWindowActivated(Window GotFocus, Window LostFocus)\n    {\n      VsWindowController.SetPreviousActiveWindow(LostFocus);\n\n      if (ReleaseNotesView.WasShown == false)\n      {\n        var releaseNotesView = new ReleaseNotesView(true);\n        releaseNotesView.Show();\n      }\n\n      if (showOpenFolderWarning)\n      {\n        var registryUtility = new RegistryUtility(registryName);\n        string showCMakeBetaWarning = registryUtility.ReadCurrentUserKey(keyName);\n\n        if (showCMakeBetaWarning == null && SolutionInfo.IsOpenFolderModeActive())\n        {\n          showOpenFolderWarning = false;\n          CMakeBetaWarning cMakeBetaWarning = new CMakeBetaWarning();\n          cMakeBetaWarning.Show();\n        }\n      }\n\n      if (SettingsProvider.CompilerSettingsModel.ShowSquiggles == false)\n        return;\n\n      if (running || vsBuildRunning)\n        return;\n\n      Document document = GotFocus.Document;\n      if (document == null)\n        return;\n\n      if (!string.IsNullOrEmpty(oldActiveDocumentName) &&\n          oldActiveDocumentName == document.FullName)\n        return;\n\n      oldActiveDocumentName = document.FullName;\n      if (!ScriptConstants.kAcceptedFileExtensions.Contains(Path.GetExtension(document.FullName)))\n        return;\n\n      _ = Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            TaskErrorViewModel.FileErrorsPair.Clear();\n            using BackgroundTidy backgroundTidyCommand = new BackgroundTidy();\n            backgroundTidyCommand.Run(document, CommandIds.kTidyId);\n          }\n          catch (Exception e)\n          {\n            MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n          }\n        }\n      });\n    }\n\n    private bool IsAToolbarCommand(OleMenuCommand command)\n    {\n      return command.CommandID.ID == CommandIds.kCompileToolbarId ||\n             command.CommandID.ID == CommandIds.kClangFormatToolbarId ||\n             command.CommandID.ID == CommandIds.kTidyToolbarId ||\n             command.CommandID.ID == CommandIds.kTidyFixToolbarId;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/CommandControllerInstance.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class CommandControllerInstance\n  {\n    public static CommandControllerInstance Instance { get { return instance; } }\n    public static CommandController CommandController { get; set; }\n    public static readonly CommandControllerInstance instance = new();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/CommandIds.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public class CommandIds\n  {\n    #region Constants\n\n    public static readonly HashSet<int> idsHexa = new HashSet<int>()\n    {\n      0x1A20,\n      0x0102,\n      0x1100,\n      0x010A,\n      0x010B,\n      0x0101,\n      0x1101,\n      0x0109,\n      0x1102,\n      0x0115,\n      0x0117,\n      0x01A7,\n      0x0105,\n      0x1103,\n      0x0104,\n      0x0103,\n      0x0107,\n      0x0108,\n      0x1032,\n      0x1033,\n      0X0106,\n      0x0216,\n      0X0116,\n      0x0126,\n    };\n\n    public static readonly HashSet<int> idsNumeric = new HashSet<int>()\n    {\n      6688,\n      258,\n      4352,\n      266,\n      267,\n      257,\n      4353,\n      277,\n      279,\n      423,\n      265,\n      4354,\n      261,\n      4355,\n      260,\n      259,\n      263,\n      264,\n      4146,\n      4147,\n      262,\n      534,\n      278,\n      294\n    };\n\n    public const int kFindViewMenuId = 0x1A20;\n\n    public const int kCompileId = 0x0102;\n    public const int kCompileToolbarId = 0x1100;\n\n    public const int kTidyToolWindowId = 0x010A;\n    public const int kTidyToolWindowFilesId = 0x010B;\n\n    public const int kTidyId = 0x0101;\n    public const int kTidyToolbarId = 0x1101;\n\n    public const int kTidyFixId = 0x0109;\n    public const int kTidyFixToolbarId = 0x1102;\n\n    public const int kClangFind = 0x0115;\n    public const int kClangFindRun = 0x0117;\n\n    public const int kOptimizeIncludesId = 0x01A7;\n\n    public const int kClangFormat = 0x0105;\n    public const int kClangFormatToolbarId = 0x1103;\n\n    public const int kStopClang = 0x0104;\n    public const int kSettingsId = 0x0103;\n\n    public const int kIgnoreFormatId = 0x0107;\n    public const int kIgnoreCompileId = 0x0108;\n\n    public const int kITidyExportConfigId = 0x1032;\n    public const int kLogoutId = 0x1033;\n\n    public const int kJsonCompilationDatabase = 0x0106;\n\n    public const int kDocumentationYamlId = 0x0216;\n    public const int kDocumentationHtmlId = 0x0116;\n    public const int kDocumentationMdId = 0x0126;\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/CommandUILocation.cs",
    "content": "﻿namespace ClangPowerTools.Commands\n{\n  public enum CommandUILocation\n  {\n    Toolbar,\n    ContextMenu,\n    ViewMenu\n  };\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/CompileCommand.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.ComponentModel.Design;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public class CompileCommand : ClangCommand\n  {\n    #region Properties\n\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static CompileCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CompileCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    protected CompileCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in CompileCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new CompileCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n\n    public async Task RunClangCompileAsync(int aCommandId, CommandUILocation commandUILocation, bool jsonCompilationDbActive = false)\n    {\n      await PrepareCommmandAsync(commandUILocation, jsonCompilationDbActive);\n      CacheProjectsFromItems();\n\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            RunScript(aCommandId, jsonCompilationDbActive);\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n\n      });\n    }\n\n    #endregion\n\n  }\n}\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/DocumentationHtmlCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Events;\nusing ClangPowerToolsShared.Helpers;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public sealed class DocumentationHtmlCommand : ClangCommand\n  {\n    private AsyncPackage package;\n\n    public static DocumentationHtmlCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    protected DocumentationHtmlCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      package = aPackage;\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to DocumentationCommand in TidyCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new DocumentationHtmlCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public async Task GenerateDocumentationAsync(int commandId)\n    {\n      await PrepareCommmandAsync(CommandUILocation.ContextMenu, false);\n      CacheProjectsFromItems();\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            GenerateDocumentationForProject(commandId, package);\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n      });\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/DocumentationMdCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Events;\nusing ClangPowerToolsShared.Helpers;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.IO;\nusing System.Linq;\nusing Task = System.Threading.Tasks.Task;\n\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public sealed class DocumentationMdCommand : ClangCommand\n  {\n    private AsyncPackage package;\n\n    public static DocumentationMdCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    private DocumentationMdCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      package = aPackage;\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to DocumentationCommand in TidyCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new DocumentationMdCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public async Task GenerateDocumentationAsync(int commandId)\n    {\n      await PrepareCommmandAsync(CommandUILocation.ContextMenu, false);\n      CacheProjectsFromItems();\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            GenerateDocumentationForProject(commandId, package);\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/DocumentationYamlCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Events;\nusing ClangPowerToolsShared.Helpers;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.ComponentModel.Design;\nusing System.Diagnostics;\nusing System.IO;\nusing Task = System.Threading.Tasks.Task;\n\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public sealed class DocumentationYamlCommand : ClangCommand\n  {\n    //public event EventHandler<CloseDataStreamingEventArgs> CloseDataStreamingEvent;\n    //protected void OnDataStreamClose(CloseDataStreamingEventArgs e)\n    //{\n    //  CloseDataStreamingEvent?.Invoke(this, e);\n    //}\n    private AsyncPackage package;\n\n    public static DocumentationYamlCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    private DocumentationYamlCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      package = aPackage;\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to DocumentationCommand in TidyCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new DocumentationYamlCommand(commandService, aCommandController, aPackage, aGuid, aId);\n\n    }\n\n    public async Task GenerateDocumentationAsync(int commandId)\n    {\n      await PrepareCommmandAsync(CommandUILocation.ContextMenu, false);\n      CacheProjectsFromItems();\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            GenerateDocumentationForProject(commandId, package);\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/FindCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.IO;\nusing System.Linq;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public class FindCommand : ClangCommand\n  {\n    #region Properties\n    private readonly AsyncPackage package;\n\n    public static FindCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n    #region Constructor\n\n    protected FindCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        package = aPackage;\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in CompileCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new FindCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public async Task FindAsync(CommandUILocation commandUILocation)\n    {\n      await PrepareCommmandAsync(commandUILocation);\n\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      ToolWindowPane window = await package.ShowToolWindowAsync(\n      typeof(FindToolWindow),\n      0,\n      create: true,\n      cancellationToken: package.DisposalToken);\n      var findToolWindow = (FindToolWindow)window;\n      ItemsCollector itemsCollector = new ItemsCollector();\n      itemsCollector.CollectSelectedProjectItems();\n      FilePathCollector fileCollector = new FilePathCollector();\n      var paths = fileCollector.Collect(itemsCollector.Items).ToList();\n      if (findToolWindow != null)\n        findToolWindow.OpenFindToolWindow(paths);\n    }\n\n    public async Task RunQueryAsync()\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      ToolWindowPane window = await package.ShowToolWindowAsync(\n      typeof(FindToolWindow),\n      0,\n      create: true,\n      cancellationToken: package.DisposalToken);\n      var findToolWindow = (FindToolWindow)window;\n\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            InvokeFindCommand(findToolWindow);\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n      });\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/FindCommandIds.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public static class FindCommandIds\n  {\n    public const int kDefaultArgsId = 1;\n    public const int kCustomMatchesId = 2;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/FindViewMenuCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.ComponentModel.Design;\nusing System.Linq;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public class FindViewMenuCommand : ClangCommand\n  {\n    private readonly AsyncPackage package;\n    public static FindViewMenuCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    protected FindViewMenuCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        package = aPackage;\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in CompileCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new FindViewMenuCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public async Task FindAsync(CommandUILocation commandUILocation)\n    {\n      await PrepareCommmandAsync(commandUILocation);\n\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      ToolWindowPane window = await package.ShowToolWindowAsync(\n      typeof(FindToolWindow),\n      0,\n      create: true,\n      cancellationToken: package.DisposalToken);\n      var findToolWindow = (FindToolWindow)window;\n      ItemsCollector itemsCollector = new ItemsCollector();\n      itemsCollector.CollectSelectedProjectItems();\n      FilePathCollector fileCollector = new FilePathCollector();\n      var paths = fileCollector.Collect(itemsCollector.Items).ToList();\n      if (findToolWindow != null)\n        findToolWindow.OpenFindToolWindow(paths);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/FormatCommand.cs",
    "content": "﻿using ClangPowerTools.Events;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.IgnoreActions;\nusing EnvDTE;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing Microsoft.VisualStudio.Text;\nusing Microsoft.VisualStudio.Text.Editor;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\nusing System.Xml.Linq;\nusing Process = System.Diagnostics.Process;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class FormatCommand : ClangCommand\n  {\n    #region Members\n    public event EventHandler<FormatCommandEventArgs> FormatEvent;\n\n    private bool clearOutput = false;\n    private Document mDocument = null;\n\n    #endregion\n\n\n    #region Properties\n\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static FormatCommand Instance\n    {\n      get;\n      private set;\n    }\n\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FormatCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    private FormatCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    #endregion\n\n\n    #region Methods\n\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in ClangFormatCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new FormatCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public void RunClangFormat(CommandUILocation commandUILocation)\n    {\n      if (clearOutput == false)\n        OnFormatFile(new FormatCommandEventArgs() { CanFormat = true, Clear = clearOutput });\n\n      clearOutput = true;\n\n      if (CommandUILocation.ContextMenu == commandUILocation)\n      {\n        FormatAllSelectedDocuments();\n      }\n      else\n      {\n        FormatActiveDocument();\n      }\n    }\n\n    private void FormatActiveDocument()\n    {\n      mDocument = DocumentHandler.GetActiveDocument();\n      ExecuteFormatCommand();\n    }\n\n    public void FormatOnSave(Document document)\n    {\n      clearOutput = true;\n      mDocument = document;\n      ExecuteFormatCommand();\n    }\n\n    public string RunFormatProcess(string dirPath, string filePath, string text, int startPosition, int length)\n    {\n      var process =  CreateProcess(text, startPosition, length, dirPath, filePath);\n\n      try\n      {\n        process.Start();\n      }\n      catch (Exception exception)\n      {\n        throw new Exception(\n            $\"Cannot execute {process.StartInfo.FileName}.\\n{exception.Message}.\");\n      }\n\n      process.StandardInput.Write(text);\n      process.StandardInput.Close();\n\n      var output = process.StandardOutput.ReadToEnd();\n      process.WaitForExit();\n\n      if (0 != process.ExitCode)\n        throw new Exception(process.StandardError.ReadToEnd());\n      return output;\n    }\n\n    private void ExecuteFormatCommand()\n    {\n      try\n      {\n        if (ValidExecution(out IWpfTextView view) == false)\n          return;\n\n        var dirPath = string.Empty;\n        var filePath = Vsix.GetDocumentPath(view);\n        var text = view.TextBuffer.CurrentSnapshot.GetText();\n\n        var startPosition = 0;\n        var length = text.Length;\n\n        if (false == view.Selection.StreamSelectionSpan.IsEmpty)\n        {\n          // get the necessary elements for format selection\n          FindStartPositionAndLengthOfSelectedText(view, text, out startPosition, out length);\n          dirPath = Vsix.GetDocumentParent(view);\n        }\n        else\n        {\n          // format the end of the file for format document\n          text = FormatEndOfFile(view, filePath, out dirPath);\n        }\n\n        string output = RunFormatProcess(dirPath, filePath, text, startPosition, length);\n\n        ApplyClangFormat(output, view);\n      }\n      catch (Exception exception)\n      {\n        VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error while running clang-format\",\n          OLEMSGICON.OLEMSGICON_INFO, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n      }\n    }\n\n\n    #region Validation\n\n    private bool ValidExecution(out IWpfTextView view)\n    {\n      var formatSettings = SettingsProvider.FormatSettingsModel;\n\n      view = Vsix.GetDocumentView(mDocument);\n      if (view == null)\n        return false;\n\n      if (IsFileStyleSelected(formatSettings))\n      {\n        var fileToFormatPath = Vsix.GetDocumentParent(view);\n        if (!FileSystem.SearchAllTopDirectories(fileToFormatPath, FileSystem.ConfigClangFormatFileTypes))\n        {\n          OnFormatFile(new FormatCommandEventArgs()\n          {\n            Clear = clearOutput,\n            FormatConfigFound = false\n          });\n\n          if (clearOutput)\n            clearOutput = false;\n\n          return false;\n        }\n      }\n\n      if (FileHasExtension(mDocument.FullName, formatSettings.FileExtensions) == false)\n      {\n        OnFormatFile(new FormatCommandEventArgs()\n        {\n          IgnoreExtension = true,\n          FileName = mDocument.Name,\n          Clear = clearOutput\n        });\n\n        if (clearOutput)\n          clearOutput = false;\n\n        return false;\n      }\n\n      var ignoreItem = new IgnoreItem();\n\n      if (ignoreItem.Check(mDocument))\n      {\n        OnFormatFile(new FormatCommandEventArgs()\n        {\n          IgnoreFile = true,\n          FileName = mDocument.Name,\n          Clear = clearOutput\n        });\n\n        if (clearOutput)\n          clearOutput = false;\n\n        OnIgnoreItem(new ClangCommandMessageEventArgs(ignoreItem.IgnoreFormatMessage, false));\n\n        return false;\n      }\n\n      if (ScriptConstants.kCMakeConfigFile == mDocument.Name.ToLower())\n        return false;\n\n      OnFormatFile(new FormatCommandEventArgs()\n      {\n        Clear = true\n      });\n\n      return true;\n    }\n\n    private void OnFormatFile(FormatCommandEventArgs e)\n    {\n      FormatEvent?.Invoke(this, e);\n    }\n\n    private bool IsFileStyleSelected(FormatSettingsModel formatSettings)\n    {\n      return formatSettings.Style == ClangFormatStyle.file && \n        formatSettings.FallbackStyle == ClangFormatFallbackStyle.none;\n    }\n\n    private bool FileHasExtension(string filePath, string fileExtensions)\n    {\n      var extensions = fileExtensions.ToLower().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);\n      return extensions.Contains(Path.GetExtension(filePath).ToLower());\n    }\n\n    #endregion\n\n    private void FormatAllSelectedDocuments()\n    {\n      ItemsCollector itemsCollector = new ItemsCollector();\n      itemsCollector.CollectSelectedProjectItems();\n      List<Document> activeDocs = DocumentHandler.GetListOfActiveDocuments();\n      Document activeDocument = DocumentHandler.GetActiveDocument();\n\n      foreach (var item in itemsCollector.Items)\n      {\n        try\n        {\n          var projectItem = item.GetObject() as ProjectItem;\n          mDocument = projectItem.Open().Document;\n          ExecuteFormatCommand();\n\n          if (DocumentHandler.IsOpen(mDocument, activeDocs))\n          {\n            mDocument.Save();\n          }\n          else\n          {\n            mDocument.Close(vsSaveChanges.vsSaveChangesYes);\n          }\n        }\n        catch (Exception e)\n        {\n          MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n        finally\n        {\n          mDocument = null;\n        }\n      }\n      if (activeDocument != null)\n      {\n        activeDocument.Activate();\n      }\n    }\n\n    private string FormatEndOfFile(IWpfTextView aView, string aFilePath, out string aDirPath)\n    {\n      aDirPath = Path.GetDirectoryName(aFilePath);\n\n      var text = aView.TextBuffer.CurrentSnapshot.GetText();\n      var newline = text.Contains(Environment.NewLine) ? Environment.NewLine : \"\\n\";\n\n      if (!text.EndsWith(newline))\n      {\n        aView.TextBuffer.Insert(aView.TextBuffer.CurrentSnapshot.Length, newline);\n        text += newline;\n      }\n\n      return text;\n    }\n\n\n    private void FindStartPositionAndLengthOfSelectedText(IWpfTextView aView, string aText, out int aStartPosition, out int aLength)\n    {\n      aStartPosition = aView.Selection.Start.Position.GetContainingLine().Start.Position;\n      int end = aView.Selection.End.Position.GetContainingLine().End.Position;\n      aLength = end - aStartPosition;\n\n      // formatting a range that starts at the end of the file is not supported.\n      if (aStartPosition >= aText.Length && aText.Length > 0)\n        aStartPosition = aText.Length - 1;\n    }\n\n\n    private Process CreateProcess(string aText, int aOffset, int aLength, string aPath, string aFilePath)\n    {\n      var formatSettings = SettingsProvider.FormatSettingsModel;\n      string vsixPath = Path.GetDirectoryName(\n        GetType().Assembly.Location);\n\n      Process process = new Process();\n      process.StartInfo.UseShellExecute = false;\n      process.StartInfo.CreateNoWindow = true;\n      process.StartInfo.RedirectStandardInput = true;\n      process.StartInfo.RedirectStandardOutput = true;\n      process.StartInfo.RedirectStandardError = true;\n      process.StartInfo.FileName =\n        true == (string.IsNullOrWhiteSpace(formatSettings.CustomExecutable) == false) ?\n          formatSettings.CustomExecutable : Path.Combine(vsixPath, ScriptConstants.kClangFormat);\n\n      process.StartInfo.Arguments = \" -offset \" + aOffset +\n                                    \" -length \" + aLength +\n                                    \" -output-replacements-xml \" +\n                                    $\" {ScriptConstants.kStyle} \\\"{formatSettings.Style}\\\"\" +\n                                    $\" {ScriptConstants.kFallbackStyle} \\\"{formatSettings.FallbackStyle}\\\"\";\n\n      var assumeFilename = formatSettings.AssumeFilename;\n      if (string.IsNullOrEmpty(assumeFilename))\n        assumeFilename = aFilePath;\n      if (!string.IsNullOrEmpty(assumeFilename))\n        process.StartInfo.Arguments += $\" -assume-filename \\\"{assumeFilename}\\\"\";\n\n      if (null != aPath)\n        process.StartInfo.WorkingDirectory = aPath;\n\n      return process;\n    }\n\n    private void ApplyClangFormat(string replacements, IWpfTextView view)\n    {\n      if (string.IsNullOrWhiteSpace(replacements))\n        return;\n\n      var root = XElement.Parse(replacements);\n      var edit = view.TextBuffer.CreateEdit();\n      foreach (XElement replacement in root.Descendants(\"replacement\"))\n      {\n        var span = new Span(\n            int.Parse(replacement.Attribute(\"offset\").Value),\n            int.Parse(replacement.Attribute(\"length\").Value));\n        edit.Replace(span, replacement.Value);\n      }\n      edit.Apply();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/IgnoreCommand.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools.Commands\n{\n  public class IgnoreCommand : BasicCommand\n  {\n    #region Constructor\n\n    public IgnoreCommand(AsyncPackage aPackage, Guid aGuid, int aId) : base(aPackage, aGuid, aId)\n    {\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// the method will add to ignored files the items meant to be ignored\n    /// </summary>\n    /// <typeparam name=\"T\">template</typeparam>\n    /// <param name=\"itemsToIgnore\">list of items to ignore</param>\n    /// <param name=\"settings\">settings from SettingsProvider</param>\n    /// <param name=\"PropertyName\">name of property meant to be get and set using reflection</param>\n    public void AddItemsToIgnore<T>(List<string> itemsToIgnore, T settings, string PropertyName)\n    {\n      if (itemsToIgnore.Any() == false)\n      {\n        return;\n      }\n\n      string filesToIgnore = (string)PropertyHandler.Get<T>(settings, PropertyName);\n\n      if (filesToIgnore.Length > 0)\n      {\n        filesToIgnore += \";\";\n      }\n\n      filesToIgnore += string.Join(\";\", RemoveDuplicateDocuments(itemsToIgnore, filesToIgnore));\n      PropertyHandler.Set(settings, PropertyName, filesToIgnore);\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private List<string> RemoveDuplicateDocuments(List<string> documentsToIgnore, string filesToIgnore)\n    {\n      List<string> trimmedDocumentToIgnore = new List<string>();\n\n      foreach (var item in documentsToIgnore)\n      {\n        if (filesToIgnore.Contains(item) == false)\n        {\n          trimmedDocumentToIgnore.Add(item);\n        }\n      }\n      return trimmedDocumentToIgnore;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/IgnoreCompileCommand.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.Linq;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class IgnoreCompileCommand : IgnoreCommand\n  {\n    #region Properties\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static IgnoreCompileCommand Instance\n    {\n      get;\n      private set;\n    }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"IgnoreCompileCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    /// <param name=\"commandService\">Command service to add command to, not null.</param>\n    private IgnoreCompileCommand(CommandController aCommandController, OleMenuCommandService aCommandService, AsyncPackage aPackage, Guid aGuid, int aId)\n      : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuItem = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuItem.BeforeQueryStatus += aCommandController.VisibilityOnBeforeCommand;\n        aCommandService.AddCommand(menuItem);\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in IgnoreCompileCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new IgnoreCompileCommand(aCommandController, commandService, aPackage, aGuid, aId);\n    }\n\n    /// <summary>\n    /// This function is the callback used to execute the command when the menu item is clicked.\n    /// See the constructor to see how the menu item is associated with this function using\n    /// OleMenuCommandService service and MenuCommand class.\n    /// </summary>\n    /// <param name=\"sender\">Event sender.</param>\n    /// <param name=\"e\">Event args.</param>\n    public void RunIgnoreCompileCommand()\n    {\n      _ = Task.Run(() =>\n      {\n        var settingsHandler = new SettingsHandler();\n        var itemsCollector = new ItemsCollector();\n        List<string> projectsToIgnore = itemsCollector.GetProjectsToIgnore();\n\n        var settingsModel = SettingsProvider.CompilerSettingsModel;\n        AddItemsToIgnore(projectsToIgnore, settingsModel, \"ProjectsToIgnore\");\n\n        if (projectsToIgnore.Any() == false)\n        {\n          List<string> filesToIgnore = itemsCollector.GetFilesToIgnore();\n          AddItemsToIgnore(filesToIgnore, settingsModel, \"FilesToIgnore\");\n        }\n\n        settingsHandler.SaveSettings();\n      });\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/IgnoreFormatCommand.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class IgnoreFormatCommand : IgnoreCommand\n  {\n    #region Properties\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static IgnoreFormatCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"IgnoreFormatCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    /// <param name=\"commandService\">Command service to add command to, not null.</param>\n    private IgnoreFormatCommand(CommandController aCommandController, OleMenuCommandService aCommandService, AsyncPackage aPackage, Guid aGuid, int aId)\n      : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuItem = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuItem.BeforeQueryStatus += aCommandController.VisibilityOnBeforeCommand;\n        aCommandService.AddCommand(menuItem);\n      }\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in IgnoreFormatCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new IgnoreFormatCommand(aCommandController, commandService, aPackage, aGuid, aId);\n    }\n\n    /// <summary>\n    /// This function is the callback used to execute the command when the menu item is clicked.\n    /// See the constructor to see how the menu item is associated with this function using\n    /// OleMenuCommandService service and MenuCommand class.\n    /// </summary>\n    /// <param name=\"sender\">Event sender.</param>\n    /// <param name=\"e\">Event args.</param>\n    public void RunIgnoreFormatCommand()\n    {\n      _ = Task.Run(() =>\n      {\n        var itemsCollector = new ItemsCollector();\n        var settingsHandler = new SettingsHandler();\n\n        var settings = SettingsProvider.FormatSettingsModel;\n        List<string> documentsToIgnore = itemsCollector.GetFilesToIgnore();\n\n        AddItemsToIgnore(documentsToIgnore, settings, \"FilesToIgnore\");\n        settingsHandler.SaveSettings();\n      });\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/JsonCompilationDatabaseCommand.cs",
    "content": "﻿using ClangPowerTools.Events;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.ComponentModel.Design;\nusing System.Diagnostics;\nusing System.IO;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  internal sealed class JsonCompilationDatabaseCommand : CompileCommand\n  {\n    #region Properties\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static new JsonCompilationDatabaseCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"JsonCompilationDatabaseCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    /// <param name=\"commandService\">Command service to add command to, not null.</param>\n    private JsonCompilationDatabaseCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId) : base(aCommandService, aCommandController, aPackage, aGuid, aId) { }\n\n    #endregion\n\n\n    #region Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static new async Task InitializeAsync(CommandController aCommandController,\n          AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in ClangFormatCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new JsonCompilationDatabaseCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    private bool OpenInExplorer { get; set; }\n    /// <summary>\n    /// This function is the callback used to execute the command when the menu item is clicked.\n    /// See the constructor to see how the menu item is associated with this function using\n    /// OleMenuCommandService service and MenuCommand class.\n    /// </summary>\n    /// <param name=\"sender\">Event sender.</param>\n    /// <param name=\"e\">Event args.</param>\n    public async Task ExportAsync(CommandUILocation aCommandUILocation, bool openInExplorer = true)\n    {\n      OpenInExplorer = openInExplorer;\n      await RunClangCompileAsync(CommandIds.kCompileId, aCommandUILocation, true);\n    }\n\n\n    internal void OpenInFileExplorer(object sender, JsonFilePathArgs e)\n    {\n      if (OpenInExplorer)\n      {\n        if (!File.Exists(e.FilePath))\n          return;\n\n        // combine the arguments together\n        // it doesn't matter if there is a space after ','\n        string argument = \"/select, \\\"\" + e.FilePath + \"\\\"\";\n\n        // open the file in File Explorer and select it\n        Process.Start(\"explorer.exe\", argument);\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/LookInMenu.cs",
    "content": "﻿namespace ClangPowerToolsShared.Commands\n{\n  public enum LookInMenu\n  {\n    EntireSolution,\n    CurrentProject,\n    CurrentActiveDocument,\n  }\n\n  public class MenuItem\n  {\n    public MenuItem() { }\n    public MenuItem(string name, LookInMenu lookInMenu)\n    {\n      Name = name;\n      LookInMenu = lookInMenu;\n    }\n\n    public string Name { get; set; }\n    public LookInMenu LookInMenu { get; set; }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/Models/CacheProjectsItemsModel.cs",
    "content": "﻿using ClangPowerTools;\nusing EnvDTE;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerToolsShared.Commands.Models\n{\n  /// <summary>\n  /// Cache projects and Items, configuration, platform - used in script generating\n  /// </summary>\n  public class CacheProjectsItemsModel\n  {\n    public List<Project> Projects { get; set; } = new List<Project>();\n    public List<ProjectItem> ProjectItems { get; set; } = new List<ProjectItem>();\n\n    public List<string> ProjectsStringList\n    {\n      get\n      {\n        if (ProjectItems.Count > 0)\n        {\n          return ProjectItems.Select(p => p.ContainingProject.FullName).ToList().Distinct().ToList();\n        }\n        else if (Projects.Count > 0)\n        {\n          return Projects.Select(e => e.FullName).ToList();\n        }\n        return new();\n      }\n    }\n\n    public string Configuration\n    {\n      get\n      {\n        if (ProjectItems.Count > 0)\n        {\n          return ProjectConfigurationHandler.GetConfiguration(ProjectItems[0].ContainingProject);\n        }\n        else if (Projects.Count > 0)\n        {\n          return ProjectConfigurationHandler.GetConfiguration(Projects[0]);\n        }\n        return string.Empty;\n      }\n    }\n\n    public string Platform\n    {\n      get\n      {\n        if (ProjectItems.Count > 0)\n        {\n          return ProjectConfigurationHandler.GetPlatform(ProjectItems[0].ContainingProject);\n        }\n        else if (Projects.Count > 0)\n        {\n          return ProjectConfigurationHandler.GetPlatform(Projects[0]);\n        }\n        return string.Empty;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/OptimizeIncludesCommand.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\nusing System.ComponentModel.Design;\nusing System;\nusing Task = System.Threading.Tasks.Task;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System.Windows.Forms;\nusing System.IO;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing Microsoft.VisualStudio.TextTemplating.VSHost;\n\nnamespace ClangPowerTools.Commands\n{\n  public class OptimizeIncludesCommand : ClangCommand\n  {\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static OptimizeIncludesCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"CompileCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    protected OptimizeIncludesCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    #endregion\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in CompileCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new OptimizeIncludesCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n    public async Task RunOptimizeIncludes(CommandUILocation commandUILocation)\n    {\n      //apply include what you use\n      await Task.Run(() =>\n      {\n        lock (mutex)\n        {\n          try\n          {\n            OptimizeIncludes();\n          }\n          catch (Exception exception)\n          {\n            VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n              OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n          }\n        }\n\n      });\n\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/RunController.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Events;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public static class RunController\n  {\n    public static bool StopCommandActivated { get; set; } = false;\n    public static RunningProcesses runningProcesses = new RunningProcesses();\n\n    public static event EventHandler<CloseDataStreamingEventArgs> CloseDataStreamingEvent;\n\n    public static void OnDataStreamClose(CloseDataStreamingEventArgs e)\n    {\n      CloseDataStreamingEvent?.Invoke(null, e);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/SettingsCommand.cs",
    "content": "﻿using ClangPowerTools.Commands.BackgroundTidy;\nusing ClangPowerTools.MVVM.LicenseValidation;\nusing ClangPowerTools.Views;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing EnvDTE;\nusing System.ComponentModel.Design;\nusing Task = System.Threading.Tasks.Task;\nusing System.Windows.Interop;\nusing Microsoft.Internal.VisualStudio.PlatformUI;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class SettingsCommand : BasicCommand\n  {\n    #region Properties\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static SettingsCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"SettingsCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    private SettingsCommand(CommandController aCommandController, OleMenuCommandService aCommandService, AsyncPackage aPackage, Guid aGuid, int aId)\n      : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuItem = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        aCommandService.AddCommand(menuItem);\n      }\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController, AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in SettingsCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new SettingsCommand(aCommandController, commandService, aPackage, aGuid, aId);\n    }\n\n\n    public async Task ShowSettingsAsync()\n    {\n      bool activeLicense = await new PersonalLicenseValidator().ValidateAsync();\n      SettingsView settingsView = new SettingsView(activeLicense);\n      DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE));\n      WindowHelper.ShowModal(settingsView, (IntPtr) dte.MainWindow.HWnd);\n    }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/StopCommand.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.ComponentModel.Design;\nusing System.Threading;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class StopCommand : ClangCommand\n  {\n    #region Members\n\n    private PCHCleaner mPCHCleaner = new PCHCleaner();\n\n    #endregion\n\n\n    #region Properties\n\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    public static StopCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"StopCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    private StopCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n      : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in StopClang's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new StopCommand(commandService, aCommandController, aPackage, aGuid, aId);\n    }\n\n\n    public Task RunStopClangCommandAsync(bool backgroundRunners)\n    {\n      return Task.Run(() =>\n      {\n        StopClangCommand(backgroundRunners);\n      });\n    }\n\n    private Mutex mutex = new Mutex();\n    public void StopClangCommand(bool backgroundRunners)\n    {\n      try\n      {\n        if (backgroundRunners == false)\n          RunController.StopCommandActivated = true;\n\n        if (RunController.runningProcesses.Exists(backgroundRunners) == false)\n          return;\n\n        mutex.WaitOne();\n        RunController.runningProcesses.Kill(backgroundRunners);\n        mutex.ReleaseMutex();\n        if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        {\n          string solutionPath = (dte as DTE2).Solution.FullName;\n\n          if (string.IsNullOrWhiteSpace(solutionPath))\n            return;\n\n          string solutionFolder = solutionPath.Substring(0, solutionPath.LastIndexOf('\\\\'));\n          mPCHCleaner.Remove(solutionFolder);\n        }\n        if (DirectoryPaths.Count > 0)\n        {\n          var tidyFileCleaner = new ClangTidyCleaner();\n          tidyFileCleaner.Remove(DirectoryPaths);\n          DirectoryPaths.Clear();\n        }\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    #endregion\n\n\n  }\n}\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/TidyCommand.cs",
    "content": "﻿using ClangPowerTools.Events;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.Services;\nusing ClangPowerTools.SilentFile;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Views.ToolWindows;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.Design;\nusing System.Linq;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Commands\n{\n  /// <summary>\n  /// Command handler\n  /// </summary>\n  public sealed class TidyCommand : ClangCommand\n  {\n\n    #region Properties\n    private readonly AsyncPackage package;\n\n    /// <summary>\n    /// Gets the instance of the command.\n    /// </summary>\n    /// \n    public static TidyCommand Instance\n    {\n      get;\n      private set;\n    }\n\n    #endregion\n\n    #region Constructor\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TidyCommand\"/> class.\n    /// Adds our command handlers for menu (commands must exist in the command table file)\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n\n    private TidyCommand(OleMenuCommandService aCommandService, CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n        : base(aPackage, aGuid, aId)\n    {\n      if (null != aCommandService)\n      {\n        package = aPackage;\n        var menuCommandID = new CommandID(CommandSet, Id);\n        var menuCommand = new OleMenuCommand(aCommandController.Execute, menuCommandID);\n        menuCommand.BeforeQueryStatus += aCommandController.OnBeforeClangCommand;\n        menuCommand.Enabled = true;\n        aCommandService.AddCommand(menuCommand);\n      }\n    }\n\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Initializes the singleton instance of the command.\n    /// </summary>\n    /// <param name=\"package\">Owner package, not null.</param>\n    public static async Task InitializeAsync(CommandController aCommandController,\n      AsyncPackage aPackage, Guid aGuid, int aId)\n    {\n      // Switch to the main thread - the call to AddCommand in TidyCommand's constructor requires\n      // the UI thread.\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(aPackage.DisposalToken);\n\n      OleMenuCommandService commandService = await aPackage.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;\n      Instance = new TidyCommand(commandService, aCommandController, aPackage, aGuid, aId);\n\n    }\n\n    //display tidy tool window - progress bar, run tidy again\n    public async Task ShowTidyToolWindowEmptyAsync()\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      ToolWindowPane window = await package.ShowToolWindowAsync(\n      typeof(TidyToolWindow),\n      0,\n      create: true,\n      cancellationToken: package.DisposalToken);\n      var tidyToolWindow = (TidyToolWindow)window;\n      FilePathCollector fileCollector = new FilePathCollector();\n      var paths = fileCollector.Collect(mItemsCollector.Items).ToList();\n      if (tidyToolWindow != null)\n        tidyToolWindow.OpenTidyToolWindow(paths);\n      RunController.OnDataStreamClose(new CloseDataStreamingEventArgs(false));\n    }\n\n    public async Task ShowTidyToolWindowAsync(List<string> paths = null)\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      ToolWindowPane window = await package.ShowToolWindowAsync(\n      typeof(TidyToolWindow),\n      0,\n      create: true,\n      cancellationToken: package.DisposalToken);\n      var tidyToolWindow = (TidyToolWindow)window;\n      if (tidyToolWindow != null && paths != null)\n        tidyToolWindow.UpdateToolWindow(paths);\n    }\n\n    public async Task RunClangTidyAsync(int aCommandId, CommandUILocation commandUILocation, List<string> paths = null)\n    {\n      if (CommandIds.kTidyToolWindowId != aCommandId && CommandIds.kTidyFixId != aCommandId)\n      {\n        await PrepareCommmandAsync(commandUILocation);\n        CacheProjectsFromItems();\n      }else if (CommandIds.kTidyFixId == aCommandId || CommandIds.kTidyFixToolbarId == aCommandId)\n      {\n        await PrepareCommmandAsync(commandUILocation);\n        CacheProjectsFromItems();\n      }\n\n      if (CommandIds.kTidyToolWindowId == aCommandId || CommandIds.kTidyFixId == aCommandId)\n      {\n        await Task.Run(() =>\n        {\n          lock (mutex)\n          {\n            try\n            {\n              using var silentFileController = new SilentFileChangerController();\n              using var fileChangerWatcher = new FileChangerWatcher();\n\n              var tidySettings = SettingsProvider.TidySettingsModel;\n\n              if (CommandIds.kTidyFixId == aCommandId || tidySettings.TidyOnSave)\n              {\n                fileChangerWatcher.OnChanged += FileOpener.Open;\n\n                var dte2 = VsServiceProvider.GetService(typeof(DTE2)) as DTE2;\n                string solutionFolderPath = SolutionInfo.IsOpenFolderModeActive() ?\n                  dte2.Solution.FullName : dte2.Solution.FullName\n                                            .Substring(0, dte2.Solution.FullName.LastIndexOf('\\\\'));\n\n                fileChangerWatcher.Run(solutionFolderPath);\n                //FilePathCollector fileCollector = new FilePathCollector();\n                //var filesPath = fileCollector.Collect(mItemsCollector.Items).ToList();\n\n                //silentFileController.SilentFiles(filesPath);\n                //silentFileController.SilentFiles(dte2.Documents);\n\n              }\n\n              if (tidySettings.DetectClangTidyFile && !mItemsCollector.IsEmpty)\n              {\n                tidySettings.UseChecksFrom = ClangTidyUseChecksFrom.TidyFile;\n\n                var settingsHandlder = new SettingsHandler();\n                settingsHandlder.SaveSettings();\n              }\n\n              if (CommandIds.kTidyToolWindowId == aCommandId)\n                RunScript(CommandIds.kTidyId, false, paths);\n              else\n                RunScript(aCommandId, false, paths);\n            }\n            catch (Exception exception)\n            {\n              VsShellUtilities.ShowMessageBox(AsyncPackage, exception.Message, \"Error\",\n                OLEMSGICON.OLEMSGICON_CRITICAL, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);\n            }\n          }\n        });\n      }\n    }\n\n    #endregion\n  }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Commands/VsCommands.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.Commands\n{\n  public static class VsCommands\n  {\n    public static List<string> SaveCommands { get; }\n      = new List<string>() { \"File.SaveAll\", \"File.SaveSelectedItems\", \"File.Save\" };\n\n    public static string Compile { get; } = \"Build.Compile\";\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/BooleanToGridLengthConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n    public class BooleanToGridLengthConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is bool valueAsBool && valueAsBool)\n            {\n                return new GridLength(1, GridUnitType.Auto);\n            }\n            return new GridLength(0);\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/BooleanToVisibilityConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class BooleanToVisibilityConverter : IValueConverter\n  {\n    private object GetVisibility(object value)\n    {\n      if (!(value is bool))\n        return Visibility.Hidden;\n\n      bool objValue = (bool)value;\n      if (objValue)\n        return Visibility.Visible;\n\n      return Visibility.Hidden;\n    }\n  \n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      return GetVisibility(value);\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      throw new NotImplementedException();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/ClangFormatFallbackStyleConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class ClangFormatFallbackStyleConverter : IValueConverter\n  {\n    private static Dictionary<ClangFormatFallbackStyle?, string> fallbackStyleDisplay =\n      new Dictionary<ClangFormatFallbackStyle?, string>()\n      {\n        { ClangFormatFallbackStyle.none, \"none\" },\n        { ClangFormatFallbackStyle.Chromium, \"Chromium\" },\n        { ClangFormatFallbackStyle.Google, \"Google\" },\n        { ClangFormatFallbackStyle.LLVM, \"LLVM\" },\n        { ClangFormatFallbackStyle.Mozilla, \"Mozilla\" },\n        { ClangFormatFallbackStyle.WebKit, \"WebKit\" },\n      };\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      ClangFormatFallbackStyle fallbackStyle = (ClangFormatFallbackStyle)value;\n      return fallbackStyleDisplay[fallbackStyle];\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      throw new NotImplementedException();\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/ClangFormatStyleConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class ClangFormatStyleConverter : IValueConverter\n  {\n\n    public static Dictionary<ClangFormatStyle?, string> styleDisplay = new Dictionary<ClangFormatStyle?, string>()\n    {\n      { ClangFormatStyle.file, \"file\" },\n      { ClangFormatStyle.Chromium, \"Chromium\" },\n      { ClangFormatStyle.Google, \"Google\" },\n      { ClangFormatStyle.LLVM, \"LLVM\" },\n      { ClangFormatStyle.Mozilla, \"Mozilla\" },\n      { ClangFormatStyle.WebKit, \"WebKit\" },\n    };\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      ClangFormatStyle style = (ClangFormatStyle)value;\n      return styleDisplay[style];\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      throw new NotImplementedException();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/ClangGeneralAdditionalIncludesConvertor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class ClangGeneralAdditionalIncludesConvertor : IValueConverter\n  {\n    #region Members\n\n    private static readonly Dictionary<ClangGeneralAdditionalIncludes?, string> mAdditionalIncludesEnumToString =\n      new Dictionary<ClangGeneralAdditionalIncludes?, string>\n      {\n        {ClangGeneralAdditionalIncludes.IncludeDirectories, ComboBoxConstants.kIncludeDirectories},\n        {ClangGeneralAdditionalIncludes.SystemIncludeDirectories, ComboBoxConstants.kSystemIncludeDirectories }\n      };\n\n    private static readonly Dictionary<string, ClangGeneralAdditionalIncludes?> mAdditionalIncludesStringToEnum =\n      new Dictionary<string, ClangGeneralAdditionalIncludes?>\n      {\n        { ComboBoxConstants.kIncludeDirectories, ClangGeneralAdditionalIncludes.IncludeDirectories },\n        { ComboBoxConstants.kSystemIncludeDirectories, ClangGeneralAdditionalIncludes.SystemIncludeDirectories }\n      };\n\n    #endregion\n\n    #region Public Methods\n\n    public static string ToString(ClangGeneralAdditionalIncludes? aAdditionalIncludes) \n      => mAdditionalIncludesEnumToString[aAdditionalIncludes];\n\n    public static ClangGeneralAdditionalIncludes? FromString(string aAdditionalIncludes)\n      => mAdditionalIncludesStringToEnum[aAdditionalIncludes];\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      ClangGeneralAdditionalIncludes additionalIncludes = (ClangGeneralAdditionalIncludes)value;\n      return mAdditionalIncludesEnumToString[additionalIncludes];\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      throw new NotImplementedException();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/ClangTidyHeaderFiltersConvertor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class ClangTidyHeaderFiltersConvertor : IValueConverter\n  {\n    #region Members \n\n    private static Dictionary<string, string> mCorrespondingHeaderScriptEncode =\n      new Dictionary<string, string>()\n      {\n        {ComboBoxConstants.kDefaultHeaderFilter, ComboBoxConstants.kDefaultHeaderFilter },\n        {ComboBoxConstants.kCorrespondingHeaderName, ComboBoxConstants.kCorrespondingHeaderValue }\n      };\n\n    private static Dictionary<string, string> mCorrespondingHeaderScriptDecode =\n      new Dictionary<string, string>()\n      {\n        {ComboBoxConstants.kDefaultHeaderFilter, ComboBoxConstants.kDefaultHeaderFilter },\n        {ComboBoxConstants.kCorrespondingHeaderValue, ComboBoxConstants.kCorrespondingHeaderName }\n      };\n\n    #endregion\n\n    #region Public Methods\n\n    public static string ScriptEncode(string aHeaderFilters)\n    {\n      if (false == mCorrespondingHeaderScriptEncode.ContainsKey(aHeaderFilters))\n        return string.Empty;\n\n      return mCorrespondingHeaderScriptEncode[aHeaderFilters];\n    }\n\n    public static string ScriptDecode(string aHeaderFilters)\n    {\n      if (false == mCorrespondingHeaderScriptDecode.ContainsKey(aHeaderFilters))\n        return string.Empty;\n\n      return mCorrespondingHeaderScriptDecode[aHeaderFilters];\n    }\n\n    #region IValueConverter Implementation\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      return ((HeaderFiltersValue)value).HeaderFilters;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      return new HeaderFiltersValue(value.ToString());\n    }\n\n    #endregion\n\n    #endregion\n\n  }\n}\n\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Convertors/ClangTidyUseChecksFromConvertor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace ClangPowerTools.Convertors\n{\n  public class ClangTidyUseChecksFromConvertor : IValueConverter\n  {\n    #region Members\n\n    private static readonly Dictionary<ClangTidyUseChecksFrom?, string> mClangTidyUseChecksFromEnumToString =\n      new Dictionary<ClangTidyUseChecksFrom?, string>\n      {\n            {ClangTidyUseChecksFrom.PredefinedChecks, ComboBoxConstants.kPredefinedChecks },\n            {ClangTidyUseChecksFrom.CustomChecks, ComboBoxConstants.kCustomChecks },\n            {ClangTidyUseChecksFrom.TidyFile, ComboBoxConstants.kTidyFile }\n      };\n\n    private static readonly Dictionary<string, ClangTidyUseChecksFrom?> mClangTidyUseChecksFromStringToEnum =\n      new Dictionary<string, ClangTidyUseChecksFrom?>\n      {\n             {ComboBoxConstants.kPredefinedChecks, ClangTidyUseChecksFrom.PredefinedChecks},\n             {ComboBoxConstants.kCustomChecks , ClangTidyUseChecksFrom.CustomChecks},\n             {ComboBoxConstants.kTidyFile,  ClangTidyUseChecksFrom.TidyFile }\n      };\n\n    #endregion\n\n\n    #region Public Methods\n\n    public static string ToString(ClangTidyUseChecksFrom? aChecksFrom)\n      => mClangTidyUseChecksFromEnumToString[aChecksFrom];\n\n    public static ClangTidyUseChecksFrom? FromString(string aChecksFrom)\n      => mClangTidyUseChecksFromStringToEnum[aChecksFrom];\n\n    #endregion\n\n\n    #region IValueConverter Implementation\n\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      ClangTidyUseChecksFrom checksFrom = (ClangTidyUseChecksFrom)value;\n      return ToString(checksFrom);\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n      throw new NotImplementedException();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/ErrorDetector.cs",
    "content": "﻿using ClangPowerTools.MVVM.Constants;\nusing ClangPowerTools.Properties;\nusing ClangPowerTools.TextOperationsInterfaces;\nusing System.Text.RegularExpressions;\n\nnamespace ClangPowerTools\n{\n  public class ErrorDetector : IDetector\n  {\n\n    #region IDetector Implementation\n\n\n    public bool Detect(string text, string pattern, out Match matchResult)\n    {\n      Regex regex = new Regex(pattern);\n      matchResult = regex.Match(text);\n      return matchResult.Success;\n    }\n\n\n    #endregion\n\n\n    #region Public Methods\n\n    public bool HasEncodingError(string message)\n    {\n      return message.Contains(ResourceConstants.EncodingError);\n    }\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/ErrorFormatter.cs",
    "content": "﻿using ClangPowerTools.TextOperationsInterfaces;\nusing System.Text.RegularExpressions;\n\nnamespace ClangPowerTools.Error\n{\n  class ErrorFormatter : ITextFormatter\n  {\n\n    #region ITextFormater Implementation\n\n    public string Format(string aText, string aReplacement)\n    {\n      Regex regex = new Regex(ErrorParserConstants.kErrorMessageRegex);\n      return regex.Replace(aText, aReplacement, 1);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/ErrorParserConstants.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class ErrorParserConstants\n  {\n    #region Constants\n\n    public const string kClangTag = \"Clang Power Tools : \";\n    public const string kCptMatcher = \"🔎 Match : \";\n    public const string kCompileClangMissingFromPath = \"'clang++.exe' is not recognized\";\n    public const string kTidyClangMissingFromPath = \"'clang-tidy.exe' is not recognized\";\n    public const string kErrorTag = \"error\";\n    public const string kWarningTag = \"warning\";\n    public const string kMessageTag = \"message\";\n    public const string kErrorMessageRegex = @\"(.\\:(\\\\|\\/)[ \\S+\\\\\\/.]*[c|C|h|H|cpp|CPP|cc|CC|cxx|CXX|c++|C++|cp|CP])(\\r\\n|\\r|\\n| |:)*(\\d+)(\\r\\n|\\r|\\n| |:)*(\\d+)(\\r\\n|\\r|\\n| |:)*(error|note|warning)[^s](\\r\\n|\\r|\\n| |:)*(.*)\";\n    public const string kMatchMessageRegex = @\"<([A-Z]:.+?\\.(cpp|cu|cc|cp|tlh|c|cxx|tli|h|hh|hpp|hxx)):(\\d+):(\\d+),\\s(?:col:\\d+|line:\\d+:\\d+)>\";\n    public const string kMatchTidyFileRegex = @\"^(?!.*and children =).*([A-Z]:\\\\.[^\"\"]+?\\.(cpp|cu|cc|cp|tlh|c|cxx|tli|h|hh|hpp|hxx))(\\W|$)\";\n    public const string kNumberMatchesRegex = @\"(\\d+)\\s(matches|match)\\.\";\n    public const string kJsonCompilationDbFilePathRegex = @\"Exported JSON Compilation Database to (.+\\.json)\";\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/ErrorWindowController.cs",
    "content": "﻿using ClangPowerTools.Error;\nusing ClangPowerTools.Events;\nusing ClangPowerTools.Handlers;\nusing ClangPowerToolsShared.Commands;\nusing EnvDTE;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ClangPowerTools\n{\n  public class ErrorWindowController : ErrorListProvider\n  {\n    #region Constructor\n\n    /// <summary>\n    /// Instance Constructor\n    /// </summary>\n    /// <param name=\"aServiceProvider\"></param>\n    public ErrorWindowController(IServiceProvider aIServiceProvider) : base(aIServiceProvider) { }\n\n    #endregion\n\n    #region Public Methods\n\n    public void OnErrorDetected(object sender, ErrorDetectedEventArgs e)\n    {\n      UIUpdater.InvokeAsync(() =>\n      {\n        SuspendRefresh();\n\n        foreach (TaskErrorModel error in e.ErrorList.ToList())\n        {\n          error.Navigate += ErrorTaskNavigate;\n          Tasks.Add(error);\n        }\n\n        ResumeRefresh();\n\n        if (SettingsProvider.CompilerSettingsModel.ShowErrorList)\n        {\n          BringToFront();\n          DocumentHandler.FocusActiveDocument();\n        }\n\n      }).SafeFireAndForget();\n    }\n\n    public void RemoveErrors(IVsHierarchy aHierarchy)\n    {\n      UIUpdater.InvokeAsync(() =>\n      {\n        SuspendRefresh();\n\n        for (int i = Tasks.Count - 1; i >= 0; --i)\n        {\n          var errorTask = Tasks[i] as ErrorTask;\n          aHierarchy.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameInHierarchy);\n\n          if (null == errorTask.HierarchyItem)\n            return;\n\n          errorTask.HierarchyItem.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameErrorTaskHierarchy);\n          if (nameInHierarchy == nameErrorTaskHierarchy)\n          {\n            errorTask.Navigate -= ErrorTaskNavigate;\n            Tasks.Remove(errorTask);\n          }\n        }\n        ResumeRefresh();\n\n      }).SafeFireAndForget();\n    }\n\n    public void Clear()\n    {\n      UIUpdater.InvokeAsync(() =>\n      {\n        Tasks.Clear();\n      }).SafeFireAndForget();\n    }\n\n    public void OnClangCommandBegin(object sender, ClearEventArgs e)\n    {\n      Clear();\n      TaskErrorViewModel.Errors.Clear();\n      TaskErrorViewModel.FileErrorsPair.Clear();\n    }\n\n    public void OnBuildBegin(vsBuildScope Scope, vsBuildAction Action)\n    {\n      Clear();\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void ErrorTaskNavigate(object sender, EventArgs e)\n    {\n      ErrorTask objErrorTask = (ErrorTask)sender;\n      objErrorTask.Line += 1;\n      objErrorTask.Column += 1;\n      bool bResult = Navigate(objErrorTask, new Guid(EnvDTE.Constants.vsViewKindCode));\n      objErrorTask.Line -= 1;\n      objErrorTask.Column -= 1;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/TaskErrorModel.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\n\nnamespace ClangPowerTools\n{\n  public class TaskErrorModel : ErrorTask\n  {\n    #region Properties\n\n    public string FullMessage { get; set; }\n\n    #endregion\n\n\n    #region Public Methods\n\n    public override bool Equals(object obj)\n    {\n      var otherObj = obj as TaskErrorModel;\n      if (null == otherObj)\n        return false;\n\n      return FullMessage.Replace('/', '\\\\') == otherObj.FullMessage.Replace('/', '\\\\');\n    }\n\n    public override int GetHashCode()\n    {\n      return FullMessage.Replace('/', '\\\\').GetHashCode();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/TaskErrorModelBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System.IO;\nusing System.Text.RegularExpressions;\n\nnamespace ClangPowerTools.Error\n{\n  public class TaskErrorModelBuilder : IBuilder<TaskErrorModel>\n  {\n    #region Members\n\n    private TaskErrorModel mError = null;\n    private Match mMatchResult = null;\n    private IVsHierarchy mHierarchy;\n\n    #endregion\n\n\n    #region Consstructor\n\n\n    public TaskErrorModelBuilder(IVsHierarchy aHierarchy, Match aMatchResult)\n    {\n      mMatchResult = aMatchResult;\n      mHierarchy = aHierarchy;\n    }\n\n    #endregion\n\n\n    #region IBuilder implementation\n\n\n    public TaskErrorModel GetResult() => mError;\n\n\n    public void Build()\n    {\n      if (CommandControllerInstance.CommandController.GetCurrentCommandId() == CommandIds.kClangFindRun)\n      {\n        BuildMatch();\n      }\n      else\n      {\n        var groups = mMatchResult.Groups;\n        string messageDescription = groups[10].Value;\n\n        if (string.IsNullOrWhiteSpace(messageDescription))\n          return;\n\n        string path = groups[1].Value.Replace('/', '\\\\');\n        int.TryParse(groups[4].Value, out int line);\n        int.TryParse(groups[6].Value, out int column);\n\n        string categoryAsString = groups[8].Value;\n        TaskErrorCategory category = FindErrorCategory(ref categoryAsString);\n\n        string fullMessage = CreateFullErrorMessage(path, line, categoryAsString, messageDescription);\n\n        // Add clang prefix for error list\n        messageDescription = messageDescription.Insert(0, ErrorParserConstants.kClangTag);\n\n        mError = new TaskErrorModel()\n        {\n          Document = path,\n          Line = line - 1,\n          Column = column - 1,\n          ErrorCategory = category,\n          Text = messageDescription,\n          FullMessage = fullMessage,\n          HierarchyItem = mHierarchy,\n          Category = TaskCategory.BuildCompile,\n          Priority = TaskPriority.High\n        };\n      }\n    }\n\n    private void BuildMatch()\n    {\n      var groups = mMatchResult.Groups;\n\n      if (string.IsNullOrWhiteSpace(groups[0].Value))\n        return;\n\n      string path = groups[1].Value.Replace('/', '\\\\');\n      int.TryParse(groups[3].Value, out int line);\n      int.TryParse(groups[4].Value, out int column);\n\n      string messageDescription = File.ReadAllLines(path)?[line - 1].Remove(0, column - 1);\n\n      string categoryAsString = ErrorParserConstants.kMessageTag;\n      TaskErrorCategory category = FindErrorCategory(ref categoryAsString);\n\n      string fullMessage = CreateFullErrorMessage(path, line, categoryAsString, messageDescription);\n\n      // Add clang prefix for error list\n      messageDescription = messageDescription.Insert(0, ErrorParserConstants.kCptMatcher);\n\n      mError = new TaskErrorModel()\n      {\n        Document = path,\n        Line = line - 1,\n        Column = column - 1,\n        ErrorCategory = category,\n        Text = messageDescription,\n        FullMessage=fullMessage,\n        HierarchyItem = mHierarchy,\n        Category = TaskCategory.CodeSense,\n        Priority = TaskPriority.High\n      };\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private TaskErrorCategory FindErrorCategory(ref string aCategoryAsString)\n    {\n      TaskErrorCategory category;\n\n      switch (aCategoryAsString)\n      {\n        case ErrorParserConstants.kErrorTag:\n          category = TaskErrorCategory.Error;\n          aCategoryAsString = ErrorParserConstants.kErrorTag;\n          break;\n\n        case ErrorParserConstants.kWarningTag:\n          category = TaskErrorCategory.Warning;\n          aCategoryAsString = ErrorParserConstants.kWarningTag;\n          break;\n\n        default:\n          category = TaskErrorCategory.Message;\n          aCategoryAsString = ErrorParserConstants.kMessageTag;\n          break;\n      }\n      return category;\n    }\n\n\n    private string CreateFullErrorMessage(string aPath, int aLine, string aCategory, string aDescription)\n    {\n      return $\"{aPath}({aLine}): {aCategory}: {aDescription}\";\n    }\n\n    #endregion\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Error/TaskErrorViewModel.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.Error\n{\n  public static class TaskErrorViewModel\n  {\n    public static List<TaskErrorModel> Errors { get; set; } = new List<TaskErrorModel>();\n\n    public static Dictionary<string, List<TaskErrorModel>> FileErrorsPair { get; set; } = new Dictionary<string, List<TaskErrorModel>>();\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/ActiveDocumentEventArgs.cs",
    "content": "﻿namespace ClangPowerTools.Events\n{\n  public class ActiveDocumentEventArgs\n  {\n    public bool IsActiveDocument { get; set; }\n\n    public ActiveDocumentEventArgs(bool isActiveDocument)\n    {\n      IsActiveDocument = isActiveDocument;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/BoolEventArgs.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.Events\n{\n  public class BoolEventArgs : EventArgs\n  {\n    public bool Value { get; set; }\n\n    public BoolEventArgs(bool value) => Value = value;\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/ClangCommandEventArgs.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.Events\n{\n  public class ClangCommandMessageEventArgs : EventArgs\n  {\n    public string Message { get; private set; }\n\n    public bool ClearFlag { get; set; }\n\n    public ClangCommandMessageEventArgs(string aMessage, bool aClear)\n    {\n      Message = aMessage;\n      ClearFlag = aClear;\n    }\n    \n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/CleanErrorListEventArgs.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.Events\n{\n  public class ClearEventArgs : EventArgs\n  {\n    public ClearEventArgs() { }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/CloseDataConnectionEventArgs.cs",
    "content": "﻿namespace ClangPowerTools.Events\n{\n  public class CloseDataConnectionEventArgs\n  {\n    public CloseDataConnectionEventArgs() { }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/CloseDataStreamingEventArgs.cs",
    "content": "﻿namespace ClangPowerTools.Events\n{\n  public class CloseDataStreamingEventArgs\n  {\n    public bool IsStopped { get; set; }\n\n    public CloseDataStreamingEventArgs(bool isStopped)\n    {\n      IsStopped = isStopped;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/ErrorDetectedEventArgs.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.Events\n{\n  public class ErrorDetectedEventArgs\n  {\n    public IEnumerable<TaskErrorModel> ErrorList { get; set; }\n\n    public ErrorDetectedEventArgs(IEnumerable<TaskErrorModel> aErrorList)\n    {\n      ErrorList = aErrorList;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/FormatCommandEventArgs.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.Events\n{\n  public class FormatCommandEventArgs : EventArgs\n  {\n    public bool CanFormat { get; set; } = false;\n    public bool IgnoreFile { get; set; } = false;\n    public bool IgnoreExtension { get; set; } = false;\n    public bool Clear{ get; set; } = false;\n    public bool FormatConfigFound { get; set; } = true;\n    public string FileName { get; set; }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/HasEncodingErrorEventArgs.cs",
    "content": "﻿using ClangPowerTools.Output;\n\nnamespace ClangPowerTools.Events\n{\n  public class HasEncodingErrorEventArgs\n  {\n    public OutputContentModel Model { get; set; }\n\n    public HasEncodingErrorEventArgs(OutputContentModel model)\n    {\n      Model = model;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/JsonFilePathArgs.cs",
    "content": "﻿namespace ClangPowerTools.Events\n{\n  public class JsonFilePathArgs\n  {\n    public string FilePath { get; set; }\n\n    public JsonFilePathArgs(string path)\n    {\n      FilePath = path;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Events/VsHierarchyDetectedEventArgs.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell.Interop;\n\nnamespace ClangPowerTools.Events\n{\n  public class VsHierarchyDetectedEventArgs\n  {\n    public IVsHierarchy Hierarchy { get; set; }\n\n\n    public VsHierarchyDetectedEventArgs(IVsHierarchy aHierarchy)\n    {\n      Hierarchy = aHierarchy;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Export Config/TidyConfigFile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClangPowerTools\n{\n  public class TidyConfigFile\n  {\n    #region Members\n\n    // Create StringBuilder to be written in the .clang-tidy file\n    private readonly StringBuilder tidyConfigOutput = new StringBuilder();\n    private readonly CompilerSettingsModel compilerSettingsModel;\n    private readonly TidySettingsModel tidySettingsModel;\n    private readonly FormatSettingsModel formatSettingsModel;\n\n    public TidyConfigFile()\n    {\n      compilerSettingsModel = SettingsProvider.CompilerSettingsModel;\n      tidySettingsModel = SettingsProvider.TidySettingsModel;\n      formatSettingsModel = SettingsProvider.FormatSettingsModel;\n    }\n\n    // Readonly list for paramaters names\n    private static readonly List<string> parameterNames = new List<string>()\n    {\n      \"Checks:\", \"WarningsAsErrors:\", \"WarningsAsErrors:\",\n      \"HeaderFilterRegex:\", \"FormatStyle:\", \"User:\"\n    };\n\n    // Max length used to add space padding for the paramater name in a line\n    private int maxNameLength = 0;\n    private readonly string NO_CHECKS_ACTIVE = \"-*\";\n\n\n    #endregion\n\n    #region Public Methods\n\n    public StringBuilder CreateOutput()\n    {\n      maxNameLength = parameterNames.OrderByDescending(s => s.Length).First().Length;\n\n      tidyConfigOutput.AppendLine(\"---\");\n\n      //Checks line\n      CreateChecksOutputLine(parameterNames.ElementAt(0));\n\n      //Treat warnings as errors line\n      string treatWarningsAsErrors = ScriptConstants.kTreatWarningsAsErrors;\n      CreateWarningAsErrorsOutputLine(parameterNames.ElementAt(1), treatWarningsAsErrors, true);\n\n      //Header filter line\n      string headerFilter = tidySettingsModel.HeaderFilter;\n      CreateHeaderFilterOutputLine(parameterNames.ElementAt(3), headerFilter, true);\n\n      //Format style line\n      string formatStyle = formatSettingsModel.Style.ToString();\n      CreateOutputLine(parameterNames.ElementAt(4), formatStyle, true);\n\n      //User line\n      CreateOutputLine(parameterNames.ElementAt(5), Environment.UserName, false);\n\n      return tidyConfigOutput;\n    }\n\n    #endregion\n\n    #region Private Methods \n\n    private void CreateChecksOutputLine(string paramaterName)\n    {\n      var tidySettings = SettingsProvider.TidySettingsModel;\n      ClangTidyUseChecksFrom clangTidyUseChecksFrom = tidySettings.UseChecksFrom;\n\n      switch (clangTidyUseChecksFrom)\n      {\n        case ClangTidyUseChecksFrom.PredefinedChecks:\n          var predefinedChecks = tidySettings.PredefinedChecks.Replace(';', ',').TrimEnd(',');\n          CreateChecksOutputLine(paramaterName, predefinedChecks, true);\n          break;\n        case ClangTidyUseChecksFrom.CustomChecks:\n        case ClangTidyUseChecksFrom.TidyFile:\n          var customChecks = tidySettings.CustomChecks.Replace(';', ',').TrimEnd(',');\n          CreateChecksOutputLine(paramaterName, customChecks, true);\n          break;\n        default:\n          CreateOutputLine(paramaterName, \"\", true);\n          break;\n      }\n    }\n\n    private string CreateLine<T>(string propertyName, int nameLength, T value, bool hasQuotationMark)\n    {\n      if (hasQuotationMark)\n      {\n        return $\"{propertyName.PadRight(maxNameLength - nameLength + nameLength, ' ')} '{value}'\";\n      }\n      return $\"{propertyName.PadRight(maxNameLength - nameLength + nameLength, ' ')} {value.ToString().ToLower()}\";\n    }\n\n    private void CreateOutputLine<T>(string paramaterName, T formatStyle, bool hasQuotationMark)\n    {\n      tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, formatStyle, hasQuotationMark));\n    }\n\n    private void CreateWarningAsErrorsOutputLine(string paramaterName, string warningsAsErrors, bool hasQuotationMark)\n    {\n      if (compilerSettingsModel.WarningsAsErrors)\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, warningsAsErrors, hasQuotationMark));\n      }\n      else\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, string.Empty, hasQuotationMark));\n      }\n    }\n\n    private void CreateChecksOutputLine(string paramaterName, string customChecks, bool hasQuotationMark)\n    {\n      if (customChecks.Length < 1)\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, NO_CHECKS_ACTIVE, hasQuotationMark));\n      }\n      else\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, $\"{NO_CHECKS_ACTIVE},{customChecks}\", hasQuotationMark));\n      }\n    }\n\n    private void CreateHeaderFilterOutputLine(string paramaterName, string headerFilter, bool hasQuotationMark)\n    {\n      if (headerFilter.Length < 1)\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, ComboBoxConstants.kNone, false));\n      }\n      else if (headerFilter == ComboBoxConstants.kCorrespondingHeaderName)\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, ComboBoxConstants.kCorrespondingHeaderValue, hasQuotationMark));\n      }\n      else\n      {\n        tidyConfigOutput.AppendLine(CreateLine(paramaterName, paramaterName.Length, headerFilter, hasQuotationMark));\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Extensions/IntExtension.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public static class IntExtension\n  {\n    public static int ForceInRange(this int number, int min, int max)\n    {\n      if (number < min)\n        number = min;\n\n      if (number > max)\n        number = max;\n\n      return number;\n    }\n\n    public static int RoundUp(this int number)\n    {\n      return 10 * ((number + 9) / 10);\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Extensions/ObjectExtension.cs",
    "content": "﻿using Newtonsoft.Json;\n\nnamespace ClangPowerTools.Extensions\n{\n  public static class ObjectExtension\n  {\n    public static T Clone<T>(this T obj)\n    {\n      return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj));\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Extensions/StringExtension.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\n\nnamespace ClangPowerTools\n{\n  public static class StringExtension\n  {\n    #region Public Methods\n\n    public static string SubstringAfter(this string aText, string aSearchedSubstring)\n    {\n      if (string.IsNullOrEmpty(aSearchedSubstring))\n        return aText;\n\n      CompareInfo compareInfo = CultureInfo.InvariantCulture.CompareInfo;\n      int index = compareInfo.IndexOf(aText, aSearchedSubstring, CompareOptions.Ordinal);\n\n      if (index < 0)\n        return string.Empty; //No such substring\n\n      return aText.Substring(index + aSearchedSubstring.Length);\n    }\n\n    public static string SubstringBefore(this string aText, string aSearchedSubstring)\n    {\n      if (string.IsNullOrEmpty(aSearchedSubstring))\n        return aSearchedSubstring;\n\n      CompareInfo compareInfo = CultureInfo.InvariantCulture.CompareInfo;\n      int index = compareInfo.IndexOf(aText, aSearchedSubstring, CompareOptions.Ordinal);\n\n      if (index < 0)\n        return string.Empty; //No such substring\n\n      return aText.Substring(0, index);\n    }\n\n    /// <summary>\n    /// String comparison using IndexOf\n    /// </summary>\n    /// <param name=\"paragrah\"></param>\n    /// <param name=\"word\"></param>\n    /// <param name=\"comp\"></param>\n    /// <returns></returns>\n    public static bool Contains(this string paragrah, string word, StringComparison comp)\n    {\n      return paragrah?.IndexOf(word, comp) >= 0;\n    }\n\n\n    /// <summary>\n    /// Get all indexes of a value\n    /// </summary>\n    /// <param name=\"str\"></param>\n    /// <param name=\"value\"></param>\n    /// <returns></returns>\n    public static IEnumerable<int> AllIndexesOf(this string str, string value)\n    {\n      if (String.IsNullOrEmpty(value))\n        throw new ArgumentException(\"the string to find may not be empty\", \"value\");\n      for (int index = 0; ; index += value.Length)\n      {\n        index = str.IndexOf(value, index);\n        if (index == -1)\n          break;\n        yield return index;\n      }\n    }\n\n    public static string Reverse(this string input)\n    {\n      char[] chars = input.ToCharArray();\n      Array.Reverse(chars);\n      return new String(chars);\n    }\n\n\n    public static string TrimEnd(this string input, string substring)\n    {\n      if (input.EndsWith(substring))\n        input = input.Substring(0, input.LastIndexOf(substring));\n\n      return input;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Extensions/TaskExtensions.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools\n{\n  /// <summary>\n  /// Extension methods for System.Threading.Tasks.Task\n  /// </summary>\n  public static class TaskExtensions\n  {\n    #region Public Methods\n    /// <summary>\n    /// Safely execute the Task without waiting for it to complete before moving to the next line of code; commonly known as \"Fire And Forget\".\n    /// </summary>\n    /// <param name=\"task\">Task.</param>\n    /// <param name=\"continueOnCapturedContext\">If set to <c>true</c> continue on captured context; this will ensure that the Synchronization Context returns to the calling thread. If set to <c>false</c> continue on a different context; this will allow the Synchronization Context to continue on a different thread</param>\n    /// <param name=\"onException\">If an exception is thrown in the Task, <c>onException</c> will execute. If onException is null, the exception will be re-thrown</param>\n#pragma warning disable VSTHRD100 // Asynchronous methods should return a Task instead of void\n    public static async void SafeFireAndForget(this Task task, bool continueOnCapturedContext = true, Action<Exception> onException = null)\n#pragma warning restore VSTHRD100 // Asynchronous methods should return a Task instead of void\n    {\n      try\n      {\n#pragma warning disable VSTHRD003 // Avoid awaiting foreign Tasks\n        await task.ConfigureAwait(continueOnCapturedContext);\n#pragma warning restore VSTHRD003 // Avoid awaiting foreign Tasks\n      }\n      catch (Exception ex) when (onException != null)\n      {\n        onException(ex);\n      }\n    }\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Files Operations/FileChangerWatcher.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public class FileChangerWatcher : IDisposable\n  {\n    #region Members\n\n    private List<FileSystemWatcher> mWatchers = new List<FileSystemWatcher>();\n\n    #endregion\n\n\n    #region Properties\n\n    public FileSystemEventHandler OnChanged { get; set; }\n\n    #endregion\n\n\n    #region Public methods\n\n\n    public void Run(string aDirectoryPath)\n    {\n      if (null == aDirectoryPath || string.IsNullOrWhiteSpace(aDirectoryPath))\n        return;\n\n      foreach (var extension in ScriptConstants.kAcceptedFileExtensions)\n        mWatchers.Add(CreateFileWatcher(aDirectoryPath, extension));\n    }\n\n\n    #region IDisposable implementation\n\n\n    public void Dispose()\n    {\n      OnChanged = null;\n      mWatchers = null;\n    }\n\n    #endregion\n\n\n    #endregion\n\n\n    #region Private Methods\n\n\n    private FileSystemWatcher CreateFileWatcher(string aDirectoryPath, string aExtension)\n    {\n      FileSystemWatcher fileWatcher = new FileSystemWatcher();\n\n      // Set the path property of FileSystemWatcher\n      fileWatcher.Path = aDirectoryPath;\n\n      // Watch for changes in LastWrite time\n      fileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite\n           | NotifyFilters.FileName | NotifyFilters.DirectoryName;\n\n      // Watch files with specific file extension\n      fileWatcher.Filter = $\"*{aExtension}\";\n\n      //Subdirectories will be also watched.\n      fileWatcher.IncludeSubdirectories = true;\n\n      // Watch every file in the directory for changes\n      fileWatcher.Changed += OnChanged;\n      fileWatcher.Deleted += OnChanged;\n\n      // Begin watching.\n      fileWatcher.EnableRaisingEvents = true;\n\n      return fileWatcher;\n    }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Files Operations/FileOpener.cs",
    "content": "﻿using System.IO;\n\nnamespace ClangPowerTools\n{\n  public class FileOpener\n  {\n    #region Members\n\n    //private static readonly string kOpenCommand = \"File.OpenFile\";\n\n    #endregion\n\n    #region Public methods\n\n    // Open the changed files in the editor\n    public static void Open(object source, FileSystemEventArgs e)\n    {\n       //if (VsServiceProvider.TryGetService(typeof(DTE), out object dte))\n       // (dte as DTE2).ExecuteCommand(kOpenCommand, e.FullPath);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Files Operations/FilePathCollector.cs",
    "content": "﻿using EnvDTE;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools\n{\n  public class FilePathCollector\n  {\n    #region Public Methods\n\n    public IEnumerable<string> Collect(IEnumerable<IItem> aItems)\n      => aItems.Select(item => item.GetPath());\n\n\n    public IEnumerable<string> Collect(Documents aDocuments)\n      => aDocuments.Cast<Document>().Select(doc => doc.FullName);\n\n\n    public string Collect(Document aDocument) => aDocument.FullName;\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ActiveWindowProperties.cs",
    "content": "﻿using ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\n\nnamespace ClangPowerTools\n{\n  public static class ActiveWindowProperties\n  {\n    #region Public Methods\n\n    public static ProjectItem GetProjectItemOfActiveWindow()\n    {\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n      {\n        var activeWindow = (dte as DTE2).ActiveWindow;\n        activeWindow.Activate();\n        return activeWindow.ProjectItem;\n      }\n      return null;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ApiUtility.cs",
    "content": "﻿using System.Net.Http;\nusing System.Net.Http.Headers;\n\nnamespace ClangPowerTools\n{\n  public static class ApiUtility\n  {\n    public static HttpClient ApiClient { get; set; }\n\n    public static void InitializeApiClient()\n    {\n      if (ApiClient != null) return;\n\n      ApiClient = new HttpClient();\n      ApiClient.DefaultRequestHeaders.Accept.Clear();\n      ApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(\"application/json\"));\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/AutomationUtil.cs",
    "content": "﻿using EnvDTE;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public class AutomationUtil\n  {\n\n    #region Public Methods\n\n    public static List<IItem> GetAllProjects(Solution aSolution)\n    {\n      List<IItem> list = new List<IItem>();\n      Projects projects = aSolution.Projects;\n\n      for (int index = 1; index <= projects.Count; ++index)\n      {\n        Project project = projects.Item(index);\n        if (null == project)\n          continue;\n\n        if (project.Kind == EnvDTE.Constants.vsProjectKindSolutionItems)\n          list.AddRange(GetSolutionFolderProjects(project));\n        else if (project.Kind != EnvDTE.Constants.vsProjectKindMisc)\n          list.Add(new CurrentProject(project));\n      }\n      return list;\n    }\n\n    public static IVsHierarchy GetProjectHierarchy(IVsSolution aSolution, Project aProject)\n    {\n      return \n        VSConstants.S_OK == aSolution.GetProjectOfUniqueName(aProject.UniqueName, out IVsHierarchy hierarchy) ?\n          hierarchy : null;\n    }\n\n    public static IVsHierarchy GetItemHierarchy(IVsSolution aSolution, IItem aItem )\n    {\n      Project project = null;\n      if( aItem is CurrentProjectItem )\n      {\n        var projectItem = aItem.GetObject() as ProjectItem;\n        project = projectItem.ContainingProject;\n      }\n      else if( aItem is CurrentProject )\n      {\n        project = aItem.GetObject() as Project;\n      }\n      if( project != null )\n      {\n        return GetProjectHierarchy(aSolution, project );\n      }\n      return null;\n    }\n\n    public static void SaveDirtyProjects(Solution aSolution)\n    {\n      var projects = GetAllProjects(aSolution);\n      if (null == projects)\n        return;\n\n      foreach (var proj in projects)\n      {\n        var project = proj.GetObject() as Project;\n        if (null == project)\n          continue;\n\n        if (true == project.IsDirty)\n          project.Save();\n      }\n    }\n\n    public static bool ContainLoadedItems(IEnumerable<IItem> aItems)\n    {\n      foreach( var item in aItems )\n      {\n        var projItem = item.GetObject() as ProjectItem;\n        if (null == projItem)\n          return true;\n\n        var project = projItem.ContainingProject;\n        if (null == project)\n          return true;\n\n        if (true == IsLoadedProject(project))\n          return true; \n      }\n\n      return false;\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private static List<IItem> GetSolutionFolderProjects(Project aSolutionFolderItem)\n    {\n      List<IItem> list = new List<IItem>();\n\n      foreach (ProjectItem projectItem in aSolutionFolderItem.ProjectItems)\n      {\n        Project subProject = projectItem.SubProject;\n        if (null == subProject)\n          continue;\n\n        if (subProject.Kind == EnvDTE.Constants.vsProjectKindSolutionItems)\n          list.AddRange(GetSolutionFolderProjects(subProject));\n        else if (subProject.Kind != EnvDTE.Constants.vsProjectKindMisc)\n          list.Add(new CurrentProject(subProject));\n      }\n      return list;\n    }\n\n    private static bool IsLoadedProject(Project aProject)\n    {\n      return 0 != string.Compare(EnvDTE.Constants.vsProjectKindMisc, aProject.Kind, System.StringComparison.OrdinalIgnoreCase) &&\n        0 != string.Compare(EnvDTE.Constants.vsProjectKindUnmodeled, aProject.Kind, System.StringComparison.OrdinalIgnoreCase);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ClangTidyCleaner.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\n\nnamespace ClangPowerTools.Helpers\n{\n  public class ClangTidyCleaner\n  {\n    #region Members\n\n    private const string CLANG_TIDY_FILE = \".clang-tidy\";\n    private const string CLANG_TIDY_BACKUP_FILE = \".clang-tidy.cpt_backup\";\n\n    #endregion\n\n\n    #region Methods\n\n    public void Remove(string directoryPath)\n    {\n      var clangTidyFilePath = Path.Combine(directoryPath, CLANG_TIDY_FILE);\n      var clangTidyBackupFilePath = Path.Combine(directoryPath, CLANG_TIDY_BACKUP_FILE);\n\n      var settingsPathBuilder = new SettingsPathBuilder();\n      var settingsPath = settingsPathBuilder.GetPath(\"\");\n      var tempClangTidyFilePath = Path.Combine(settingsPath, CLANG_TIDY_FILE);\n\n      // if in the same directory already exists a .clang-tidy file\n      if (File.Exists(tempClangTidyFilePath))\n      {\n        // if the backup file from script still exists\n        if (File.Exists(clangTidyBackupFilePath))\n        {\n          File.Copy(clangTidyBackupFilePath, clangTidyFilePath, true);\n          File.Delete(clangTidyBackupFilePath);\n        }\n        else // backup file from script was deleted but we still have the backup file from %appdata%\n        {\n          File.Copy(tempClangTidyFilePath, clangTidyFilePath, true);\n        }\n        File.Delete(tempClangTidyFilePath);\n        return;\n      }\n\n      // the .clang-tidy file was created by the script\n      // if it wasn't deteled by the script then delete it now\n      if (File.Exists(clangTidyFilePath) && File.Exists(tempClangTidyFilePath))\n        File.Delete(clangTidyFilePath);\n    }\n\n    public void Remove(List<string> mDirectoriesPath)\n    {\n      foreach (var directoryPath in mDirectoriesPath)\n        Remove(directoryPath);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/DocumentHandler.cs",
    "content": "﻿using ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools\n{\n  public class DocumentHandler\n  {\n    #region Public Methods\n\n    /// <summary>\n    /// Get active documents\n    /// </summary>\n    /// <returns>Active documents</returns>\n    public static Documents GetActiveDocuments()\n    {\n      return VsServiceProvider.TryGetService(typeof(DTE2), out object dte) ? (dte as DTE2).Documents : null;\n    }\n\n    /// <summary>\n    /// Get a list of active documents\n    /// </summary>\n    /// <returns></returns>\n    public static List<Document> GetListOfActiveDocuments()\n    {\n      List<Document> documents = new List<Document>();\n      foreach (var item in GetActiveDocuments())\n      {\n        documents.Add(item as Document);\n      }\n      return documents;\n    }\n\n    /// <summary>\n    /// Get the active document\n    /// </summary>\n    /// <returns>Active document</returns>\n    public static Document GetActiveDocument()\n    {\n      return VsServiceProvider.TryGetService(typeof(DTE2), out object dte) ? (dte as DTE2).ActiveDocument : null;\n    }\n\n    /// <summary>\n    /// Get the elected items\n    /// </summary>\n    /// <returns></returns>\n    public static SelectedItems GetSelectedItems()\n    {\n      var vsServiceProvider = VsServiceProvider.TryGetService(typeof(DTE2), out object dte) ? (dte as DTE2) : null;\n\n      return vsServiceProvider.SelectedItems;\n    }\n\n    /// <summary>\n    /// Save all the active documents\n    /// </summary>\n    public static void SaveActiveDocuments()\n    {\n      try\n      {\n        GetActiveDocuments().SaveAll();\n      }\n      catch (System.Exception)\n      {\n        CommandControllerInstance.CommandController.DisplayMessage(false, \n          \"Cannot get all active documents, close all tabs and try again\");\n      }\n    }\n\n    /// <summary>\n    /// Check if a document is open\n    /// </summary>\n    /// <param name=\"aDocument\"></param>\n    /// <returns>True if the document is open, false otherwise</returns>\n    public static bool IsOpen(Document aSearchedDocument, List<Document> aDocuments)\n    {\n      Document doc = aDocuments.FirstOrDefault(currentDoc => currentDoc.FullName == aSearchedDocument.FullName);\n      return doc != null;\n    }\n\n    public static void FocusActiveDocument()\n    {\n      var document = GetActiveDocument();\n      if (document == null)\n        return;\n\n      document.Activate();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/FileSystem.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class FileSystem\n  {\n    #region Properties\n\n    public static List<string> ConfigClangFormatFileTypes = new List<string>\n      { \".clang-format\",\n        \"_clang-format\"\n      };\n\n    public static string ConfigClangTidyFileName { get; } = \".clang-tidy\";\n\n    #endregion\n\n\n    #region Methods\n\n    public static bool SearchAllTopDirectories(string filePath, IEnumerable<string> searchedFiles)\n    {\n      while (string.IsNullOrEmpty(filePath) == false)\n      {\n        foreach (var file in searchedFiles)\n        {\n          if (DoesFileExist(filePath, file))\n            return true;\n        }\n\n        var index = filePath.LastIndexOf(\"\\\\\");\n        if (index > 0)\n          filePath = filePath.Remove(index);\n        else\n          return false;\n      }\n\n      return false;\n    }\n\n\n    public static void CreateDirectory(string path)\n    {\n      if (Directory.Exists(path) == false) Directory.CreateDirectory(path);\n    }\n\n    public static void DeleteDirectory(string path)\n    {\n      if (Directory.Exists(path))\n      {\n        try\n        {\n          Directory.Delete(path, true);\n        }\n        catch (Exception e)\n        {\n          MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n      }\n    }\n\n    public static void DeleteFile(string path)\n    {\n      if (File.Exists(path))\n      {\n        try\n        {\n          File.Delete(path);\n        }\n        catch (Exception e)\n        {\n          MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n      }\n    }\n\n    public static bool DoesFileExist(string path, string fileName)\n    {\n      var filePath = string.Concat(path, \"\\\\\", fileName);\n      return File.Exists(filePath);\n    }\n\n    public static void WriteContentToFile(string path, string content)\n    {\n      using FileStream fs = new FileStream(path, FileMode.Create);\n      using StreamWriter sw = new StreamWriter(fs);\n      sw.Write(content);\n    }\n\n    public static string ReadContentFromFile(string path)\n    {\n      if (File.Exists(path))\n      {\n        return File.ReadAllText(path);\n      }\n      return string.Empty;\n    }\n\n    public static string ReadContentFromFile(string path, string wantedLineEnding)\n    {\n      if (File.Exists(path))\n      {\n        var sb = new StringBuilder();\n        using var sr = new StreamReader(path);\n        while (sr.Peek() >= 0)\n        {\n          string line = sr.ReadLine();\n          sb.Append(line).Append(wantedLineEnding);\n        }\n        return sb.ToString();\n      }\n      return string.Empty;\n    }\n\n    public static List<string> ReadContentFromMultipleFiles(List<string> filePaths, string wantedLineEnding)\n    {\n      var filesContent = new List<string>();\n      foreach (var path in filePaths)\n      {\n        var content = ReadContentFromFile(path, wantedLineEnding);\n        if (string.IsNullOrWhiteSpace(content))\n        {\n          continue;\n        }\n        filesContent.Add(content);\n      }\n\n      return filesContent;\n    }\n\n    public static string CreateFullFileName(string path, string fileName)\n    {\n      return string.Concat(path, \"\\\\\", fileName);\n    }\n\n    public static void MoveFile(string sourceFileName, string destFileName)\n    {\n      if (File.Exists(destFileName))\n      {\n        File.Delete(destFileName);\n      }\n      File.Move(sourceFileName, destFileName);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/FormatEditorUtility.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Windows;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class FormatEditorUtility\n  {\n    #region Methods\n\n    public static void OpenBrowser()\n    {\n      try\n      {\n        Process.Start(FormatEditorConstants.FrameworkdUrlDownload);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Clang-Format Error\", MessageBoxButton.OK, MessageBoxImage.Error);\n      }\n    }\n\n    public static bool FrameworkInstalled()\n    {\n      if (Directory.Exists(FormatEditorConstants.FrameworkPath))\n      {\n        var directories = Directory.GetDirectories(FormatEditorConstants.FrameworkPath)\n                            .Select(Path.GetFileName)\n                            .ToArray();\n        foreach (var directory in directories)\n        {\n          if (directory.StartsWith(\"5.\")) return true;\n        }\n      }\n\n      return false;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/GenerateDocumentation.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.Helpers\n{\n  public static class GenerateDocumentation\n  {\n    public static string OutputDir { get; set; } = string.Empty;\n    public static EventHandler ExitedHandler { get; set; }\n\n    public static Dictionary<int, string> Formats =\n      new Dictionary<int, string>()\n      {\n        {534, \"yaml\" },\n        {278, \"html\" },\n        {294, \"md\" }\n      };\n\n\n    /// <summary>\n    /// Find a name for output documentation folder\n    /// </summary>\n    public static string FindOutputFolderName(string outputPath)\n    {\n      while (Directory.Exists(outputPath))\n      {\n        //Get number from folder path\n        FileInfo fileInfo = new FileInfo(outputPath);\n        var resultString = Regex.Match(fileInfo.Directory.Name, @\"\\d+\").Value;\n        if (resultString != string.Empty)\n        {\n          var resultNumber = Int32.Parse(resultString);\n          //Increment number and replace in foder path\n          ++resultNumber;\n          var resultFolderName = fileInfo.Directory.Name.Replace(resultString, resultNumber.ToString());\n          outputPath = outputPath.Replace(fileInfo.Directory.Name, resultFolderName);\n        }\n        else\n        {\n          //Start folder count from 1, by adding 1 to final\n          var resultFolderName = fileInfo.Directory.Name + \" (1)\";\n          outputPath = outputPath.Replace(fileInfo.Directory.Name, resultFolderName);\n        }\n      }\n      //Delete last two charachers (\\\\) from end\n      return outputPath.Remove(outputPath.Length - 1, 1);\n    }\n\n    public static void DisplayInfoMessage(string outputPath)\n    {\n      CommandControllerInstance.CommandController.DisplayMessage(false,\n      $\"Generated Documentation at path: {outputPath}\");\n    }\n\n    public static void ClosedDataConnection(object sender, EventArgs e)\n    {\n      int id = CommandControllerInstance.CommandController.GetCurrentCommandId();\n      if (Formats.ContainsKey(id))\n      {\n        OpenInFileExplorer(OutputDir);\n        DisplayInfoMessage(OutputDir);\n      }\n    }\n\n    public static void OpenInFileExplorer(string path)\n    {\n      if (!Directory.Exists(path))\n        return;\n\n      // combine the arguments together\n      // it doesn't matter if there is a space after ','\n      string argument = \" \\\"\" + path + \"\\\"\";\n\n      // open the file in File Explorer and select it\n      Process.Start(\"explorer.exe\", argument);\n    }\n  }\n\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/JoinUtility.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing EnvDTE;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class JoinUtility\n  {\n    public static string Join(string separator, params string[] text)\n    {\n      return string.Join(separator, text);\n    }\n\n    //Add matcher keyword if is needed\n    public static string AddMatcherKeyword(string matcher)\n    {\n      if ((matcher.Length > 0 && matcher[0] == 'm'))\n      {\n        return matcher;\n      }\n      else\n      {\n        return \"m \" + matcher;\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/LaunchCompilationDbProgrammatically.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing System.IO;\nusing System.Threading.Tasks;\nusing MenuItem = ClangPowerToolsShared.Commands.MenuItem;\n\nnamespace ClangPowerToolsShared.Helpers\n{\n  internal class LaunchCompilationDbProgrammatically\n  {\n    private string lastHash = string.Empty;\n    private MenuItem lastSelectedMenuOption = new();\n    private string mActiveDocumentName = string.Empty;\n\n    /// <summary>\n    /// Before launching compilation database programmatically, you need to check selected option from menu\n    /// </summary>\n    /// <returns></returns>\n    public async Task FromFindToolWindowAsync()\n    {\n      string currentHash = string.Empty;\n      if(File.Exists(PathConstants.VcxprojPath))\n      {\n        currentHash = (File.ReadAllText(PathConstants.VcxprojPath)).GetHashCode().ToString();\n      }\n\n      var selectedItem = LookInMenuController.GetSelectedMenuItem();\n\n      bool sameActiveDocument = true;\n      if (DocumentHandler.GetActiveDocument()?.FullName != mActiveDocumentName\n        && selectedItem.LookInMenu == LookInMenu.CurrentActiveDocument)\n      {\n        sameActiveDocument = false;\n        mActiveDocumentName = DocumentHandler.GetActiveDocument()?.FullName;\n      }\n\n      //Generate again compilation database on project, document, or files modifications\n      if ((lastSelectedMenuOption == selectedItem && lastHash == currentHash &&\n        selectedItem.LookInMenu == LookInMenu.EntireSolution) ||\n        (selectedItem.LookInMenu == LookInMenu.CurrentActiveDocument && sameActiveDocument))\n      {\n        return;\n      }\n      else if (lastHash != currentHash || string.IsNullOrEmpty(lastHash) ||\n        lastSelectedMenuOption != LookInMenuController.GetSelectedMenuItem())\n      {\n        lastHash = currentHash;\n        lastSelectedMenuOption = LookInMenuController.GetSelectedMenuItem();\n      }\n      await CommandControllerInstance.CommandController.LaunchCommandAsync(CommandIds.kJsonCompilationDatabase,\n        CommandUILocation.ViewMenu, null, false);\n    }\n\n    public async Task FromGenerateDocumentationAsync()\n    {\n      await CommandControllerInstance.CommandController.LaunchCommandAsync(CommandIds.kJsonCompilationDatabase, CommandUILocation.ContextMenu,\n             null, false);\n    }\n\n    public async Task FromOptimizeIncludesAsync()\n    {\n      ///generate compilation database here, before setting the CommandId with OptimizeIncludesId\n      await CommandControllerInstance.CommandController.LaunchCommandAsync(aCommandId: CommandIds.kJsonCompilationDatabase,\n        aCommandUILocation: CommandUILocation.ContextMenu, openCompilationDatabaseInExplorer: false);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ManageEncoding.cs",
    "content": "﻿using System.IO;\nusing System.Text;\n\nnamespace ClangPowerToolsShared.Helpers\n{\n  public class ManageEncoding\n  {\n    //change encoding from utf8 BOM to utf8\n    public static void ChangeEncodingFromBomToUtf8(string inputFile, string outputFile)\n    {\n      using (StreamReader reader = new StreamReader(inputFile, Encoding.UTF8, true))\n      {\n        string content = reader.ReadToEnd();\n        using (StreamWriter writer = new StreamWriter(outputFile, false, new UTF8Encoding(false)))\n        {\n          writer.Write(content);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/NetworkUtility.cs",
    "content": "﻿using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.Helpers\n{\n  public class NetworkUtility\n  {\n    public static async Task<bool> CheckInternetConnectionAsync()\n    {\n      ApiUtility.InitializeApiClient();\n\n      try\n      {\n        using HttpResponseMessage result = await ApiUtility.ApiClient.GetAsync(\"https://www.google.com\");\n        return result != null;\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/PCHCleaner.cs",
    "content": "﻿using System.IO;\n\nnamespace ClangPowerTools\n{\n  public class PCHCleaner\n  {\n    #region Members\n\n    private const string kPchExtension = \".clang.pch\";\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Delete all PCH files with \".clang.pch\" extension found in folder \"aPath\" from the disk\n    /// </summary>\n    /// <param name=\"aPath\">Folder path from where the PCH fils will be deleted</param>\n    public void Remove(string aFolderPath)\n    {\n      if (!Directory.Exists(aFolderPath))\n        return;\n\n      var pchPaths = Directory.GetFiles(aFolderPath, $\"*{kPchExtension}\");\n      foreach (var path in pchPaths)\n        File.Delete(path);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/PackageUtility.cs",
    "content": "﻿using System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Xml;\n\nnamespace ClangPowerTools.Helpers\n{\n  public class PackageUtility\n  {\n    public static string GetVersion()\n    {\n      var assemblyPath = Assembly.GetExecutingAssembly().Location;\n      assemblyPath = assemblyPath.Substring(0, assemblyPath.LastIndexOf('\\\\'));\n      var manifestPath = Path.Combine(assemblyPath, \"extension.vsixmanifest\");\n\n      if (!File.Exists(manifestPath))\n        return string.Empty;\n\n      var doc = new XmlDocument();\n      doc.Load(manifestPath);\n      var metaData = doc.DocumentElement.ChildNodes.Cast<XmlElement>().First(x => x.Name == \"Metadata\");\n      var identity = metaData.ChildNodes.Cast<XmlElement>().First(x => x.Name == \"Identity\");\n\n      return identity.GetAttribute(\"Version\");\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ProjectConfigurationHandler.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools\n{\n  public class ProjectConfigurationHandler\n  {\n    #region Public Methods\n\n    public static string GetPlatform(Project aProject)\n    {\n      var succes = GetActiveConfiguration(aProject, out Configuration configuration);\n      if (false == succes)\n        return string.Empty;\n\n      return configuration.PlatformName;\n    }\n\n    public static string GetConfiguration(Project aProject)\n    {\n      var succes = GetActiveConfiguration(aProject, out Configuration configuration);\n      if (false == succes)\n        return string.Empty;\n\n      return configuration.ConfigurationName;\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private static bool GetActiveConfiguration(Project aProject, out Configuration aConfiguration)\n    {\n      aConfiguration = null;\n\n      var configurationManager = aProject.ConfigurationManager;\n      if (null == configurationManager)\n        return false;\n\n      aConfiguration = configurationManager.ActiveConfiguration;\n      if (null == aConfiguration)\n        return false;\n\n      return true;\n    }\n\n    #endregion\n\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/PropertyHandler.cs",
    "content": "﻿using System;\nusing System.Reflection;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class PropertyHandler\n  {\n    /// <summary>\n    /// Method get values of specified property of an object\n    /// and the property names are available through PropertyInfo.Name property\n    /// </summary>\n    /// <typeparam name=\"T\">template</typeparam>\n    /// <param name=\"obj\">the object that contains the property you want to get</param>\n    /// <param name=\"propertyName\">the name of the property you are trying to get</param>\n    /// <returns></returns>\n    public static object Get<T>(object obj, string propertyName) => typeof(T).GetProperty(propertyName)?.GetValue(obj);\n\n    /// <summary>\n    /// Method set values of specified property of an object\n    /// </summary>\n    /// <param name=\"obj\">the object that contains the property you want to set</param>\n    /// <param name=\"propertyName\"></param>\n    /// <param name=\"value\">the name of the property you are trying to set</param>\n    public static void Set(object obj, string propertyName, object value)\n    {\n      PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName);\n      propertyInfo?.SetValue(obj, Convert.ChangeType(value, propertyInfo.PropertyType), null);\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/RegistryUtility.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.Helpers\n{\n  public class RegistryUtility\n  {\n    #region MyRegion\n\n    private readonly string registryName;\n\n    #endregion\n\n    #region Constructor\n\n    public RegistryUtility(string registryName) => this.registryName = registryName;\n\n    #endregion\n\n    #region Public Methods\n\n\n    public string ReadLocalMachineKey(string keyName)\n    {\n      try\n      {\n        using var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryName);\n        if (key == null) return null;\n        var keyValue = key.GetValue(keyName).ToString();\n        return keyValue;\n      }\n      catch (Exception)\n      {\n        return null;\n      }\n    }\n\n    public string ReadCurrentUserKey(string keyName)\n    {\n      try\n      {\n        using var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryName);\n        if (key == null) return null;\n        var keyValue = key.GetValue(keyName)?.ToString();\n        return keyValue;\n      }\n      catch (Exception)\n      {\n        return null;\n      }\n    }\n\n    public bool WriteCurrentUserKey(string keyName, string keyValue)\n    {\n      try\n      {\n        using var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(registryName);\n        key.SetValue(keyName, keyValue);\n        return true;\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n\n    public bool Exists() => Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryName) != null;\n\n    public bool DeleteCurrentUserKey(string keyName)\n    {\n      try\n      {\n        using var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryName, true);\n        if (key == null)\n          return false;\n\n        key.DeleteValue(keyName);\n        return true;\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/RunningDocTableEvents.cs",
    "content": "﻿using ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools\n{\n  public class RunningDocTableEvents : IVsRunningDocTableEvents3\n  {\n    #region Members\n\n    private RunningDocumentTable mRunningDocumentTable;\n\n    public delegate void OnBeforeSaveHandler(object sender, Document document);\n    public delegate void OnBeforeActiveDocumentChange(object sender, Document document);\n\n    public event OnBeforeSaveHandler BeforeSave;\n    public event OnBeforeActiveDocumentChange BeforeActiveDocumentChange;\n\n    #endregion\n\n    #region Constructor\n\n    public RunningDocTableEvents(Package aPackage)\n    {\n      try\n      {\n        mRunningDocumentTable = new RunningDocumentTable(aPackage);\n        mRunningDocumentTable.Advise(this);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    #endregion\n\n    #region IVsRunningDocTableEvents3 implementation\n\n    public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnAfterSave(uint docCookie)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)\n    {\n      if (fFirstShow == 0)\n        return VSConstants.S_OK;\n\n      if (null == BeforeActiveDocumentChange)\n        return VSConstants.S_OK;\n\n      var document = FindDocument(docCookie);\n      if (null == document)\n        return VSConstants.S_OK;\n\n      BeforeActiveDocumentChange(this, document);\n\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)\n    {\n      return VSConstants.S_OK;\n    }\n\n    public int OnBeforeSave(uint docCookie)\n    {\n      try\n      {\n        if (null == BeforeSave)\n          return VSConstants.S_OK;\n\n        var document = FindDocument(docCookie);\n        if (null == document)\n          return VSConstants.S_OK;\n\n        bool acceptedExtension = ScriptConstants.kExtendedAcceptedFileExtensions.Contains(Path.GetExtension(document.Name));\n        if (acceptedExtension == false)\n          return VSConstants.S_OK;\n\n        BeforeSave(this, document);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(\"Error while running clang command on save. \" + e.Message, \"Clang Power Tools\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n\n      return VSConstants.S_OK;\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private Document FindDocument(uint docCookie)\n    {\n      Document document = null;\n      try\n      {\n        document = DocumentHandler.GetActiveDocument();\n      }\n      catch (Exception)\n      {\n        CommandControllerInstance.CommandController.DisplayMessage(false, \"Cannot find active document, close all tabs and try again\");\n      }\n\n      return document;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/ScriptGenerator.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Script;\nusing ClangPowerToolsShared.Commands.Models;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class ScriptGenerator\n  {\n    #region Methods\n\n    public static string GetRunModeParamaters()\n    {\n      IBuilder<string> runModeScriptBuilder = new RunModeScriptBuilder();\n      runModeScriptBuilder.Build();\n      var runModeParameters = runModeScriptBuilder.GetResult();\n      return runModeParameters;\n    }\n\n    public static string GetGenericParamaters(int aCommandId, string vsEdition, string vsVersion, bool jsonCompilationDbActive)\n    {\n      IBuilder<string> genericScriptBuilder = new GenericScriptBuilder(vsEdition, vsVersion, aCommandId, jsonCompilationDbActive);\n      genericScriptBuilder.Build();\n      var genericParameters = genericScriptBuilder.GetResult();\n      return genericParameters;\n    }\n\n    public static string GetItemRelatedParametersCustomPaths(List<string> filePaths, CacheProjectsItemsModel cacheProjectsItemsModel)\n    {\n      if (filePaths.Count > 0 && ScriptConstants.kProjectFileExtension == (Path.GetExtension(filePaths[0])))\n      {\n        return GetProjectRelatedParameters(cacheProjectsItemsModel);\n      }\n      var tokens = new List<string>();\n      if (cacheProjectsItemsModel.ProjectsStringList != null && cacheProjectsItemsModel.ProjectsStringList.Count > 0)\n        tokens.Add($\"{ScriptConstants.kProject} {JoinPathsToStringScript(cacheProjectsItemsModel.ProjectsStringList)}\");\n      tokens.Add($\"{ScriptConstants.kFile} {JoinPathsToStringScript(filePaths)}\");\n      if(!string.IsNullOrEmpty(cacheProjectsItemsModel.Configuration) && !string.IsNullOrEmpty(cacheProjectsItemsModel.Platform))\n        tokens.Add($\"{ScriptConstants.kActiveConfiguration} '{cacheProjectsItemsModel.Configuration}|{cacheProjectsItemsModel.Platform}'\");\n      return string.Join(\" \", tokens);\n    }\n\n    public static string GetProjectRelatedParameters(CacheProjectsItemsModel cacheProjectsItemsModel)\n    {\n      var tokens = new List<string>();\n      if (cacheProjectsItemsModel.ProjectsStringList != null && cacheProjectsItemsModel.ProjectsStringList.Count > 0)\n        tokens.Add($\"{ScriptConstants.kProject} {JoinPathsToStringScript(cacheProjectsItemsModel.ProjectsStringList)}\");\n      if (!string.IsNullOrEmpty(cacheProjectsItemsModel.Configuration) && !string.IsNullOrEmpty(cacheProjectsItemsModel.Platform))\n        tokens.Add($\"{ScriptConstants.kActiveConfiguration} '{cacheProjectsItemsModel.Configuration}|{cacheProjectsItemsModel.Platform}'\");\n      return string.Join(\" \", tokens);\n    }\n\n    public static string JoinPathsToStringScript(List<string> paths)\n    {\n      StringBuilder stringBuilder = new StringBuilder(\"('\");\n      foreach (string path in paths)\n      {\n        stringBuilder.Append(path).Append(\"','\");\n      }\n      stringBuilder.Remove(stringBuilder.Length - 2, 2);\n      return stringBuilder.Append(\")\").ToString();\n    }\n\n    public static string GetItemRelatedParameters(IItem item, bool jsonCompilationDbActive = false)\n    {\n      IBuilder<string> itemRelatedScriptBuilder = new ItemRelatedScriptBuilder(item, jsonCompilationDbActive);\n      itemRelatedScriptBuilder.Build();\n      var itemRelatedParameters = itemRelatedScriptBuilder.GetResult();\n      return itemRelatedParameters;\n    }\n\n    public static string GetItemRelatedParameters(List<IItem> items, bool jsonCompilationDbActive = false)\n    {\n      IBuilder<string> itemRelatedScriptBuilder = new ItemRelatedScriptBuilder(items, jsonCompilationDbActive);\n      itemRelatedScriptBuilder.Build();\n      var itemRelatedParameters = itemRelatedScriptBuilder.GetResult();\n      return itemRelatedParameters;\n    }\n\n    #endregion\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/SettingsApi.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.LicenseValidation;\nusing ClangPowerTools.MVVM.WebApi;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools\n{\n  public class SettingsApi\n  {\n    #region Constructor\n\n    public SettingsApi()\n    {\n      ApiUtility.InitializeApiClient();\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public async Task UploadSettingsAsync()\n    {\n      if (await NetworkUtility.CheckInternetConnectionAsync() == false) return;\n\n      var settingsHandler = new SettingsHandler();\n      string json = settingsHandler.GetSettingsAsJson();\n      await PostSettingsAsync(json);\n    }\n\n    public async Task DownloadSettingsAsync()\n    {\n      if (await NetworkUtility.CheckInternetConnectionAsync() == false) return;\n\n      HttpResponseMessage httpResponseMessage = await GetSettingsAsync();\n      if (httpResponseMessage.IsSuccessStatusCode)\n      {\n        var settingsHandler = new SettingsHandler();\n        string json = await httpResponseMessage.Content.ReadAsStringAsync();\n        settingsHandler.LoadCloudSettings(json);\n      }\n    }\n\n    public async Task<bool> CloudSaveExistsAsync()\n    {\n      if (await NetworkUtility.CheckInternetConnectionAsync() == false) return false;\n\n      HttpResponseMessage httpResponseMessage = await GetSettingsAsync();\n      if (httpResponseMessage.IsSuccessStatusCode)\n      {\n        return true;\n      }\n\n      return false;\n    }\n\n    public async Task<string> GetUserProfileJsonAsync()\n    {\n      HttpResponseMessage httpResponseMessage = await GetUserProfileDetailsAsync();\n      if (!httpResponseMessage.IsSuccessStatusCode)\n        return null;\n\n      return await httpResponseMessage.Content.ReadAsStringAsync();\n    }\n\n    public async Task<string> GetLicenseDetailsJsonAsync()\n    {\n      HttpResponseMessage httpResponseMessage = await GetLicenseDetailsAsync();\n      if (!httpResponseMessage.IsSuccessStatusCode)\n        return null;\n\n      return await httpResponseMessage.Content.ReadAsStringAsync();\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private async Task<HttpResponseMessage> PostSettingsAsync(string settingsJson)\n    {\n      SetAuthenticationHeader();\n\n      using StringContent content = new StringContent(settingsJson, Encoding.UTF8, \"application/json\");\n      return await ApiUtility.ApiClient.PostAsync(WebApiUrl.settingsConfig, content);\n    }\n\n    private async Task<HttpResponseMessage> GetSettingsAsync()\n    {\n      SetAuthenticationHeader();\n\n      return await ApiUtility.ApiClient.GetAsync(WebApiUrl.settingsConfig);\n    }\n\n    private async Task<HttpResponseMessage> GetUserProfileDetailsAsync()\n    {\n      SetAuthenticationHeader();\n\n      return await ApiUtility.ApiClient.GetAsync(WebApiUrl.userProfile);\n    }\n\n    private async Task<HttpResponseMessage> GetLicenseDetailsAsync()\n    {\n      SetAuthenticationHeader();\n\n      return await ApiUtility.ApiClient.GetAsync(WebApiUrl.licenseUrl);\n    }\n\n    private static void SetAuthenticationHeader()\n    {\n      var token = new Token();\n      token.GetToken(out string jwt);\n      ApiUtility.ApiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(\"Bearer\", jwt);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/SettingsPathBuilder.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public class SettingsPathBuilder\n  {\n    #region Constants\n\n    private const string folderName = \"ClangPowerTools\";\n    private const string llvm = \"LLVM\";\n    private const string binFolder = \"bin\";\n    private const string fileExtension = \".exe\";\n\n    #endregion\n\n    #region Methods Public\n\n    public string GetPath(string aFileName) => Path.Combine(GetFolderPath(), aFileName);\n\n    public string GetLlvmPath(string version)\n    {\n      var appdDataPath = GetPath(\"\");\n      var folderName = string.Concat(llvm, version);\n      return Path.Combine(appdDataPath, llvm, folderName);\n    }\n\n    public string GetLlvmBinPath(string version)\n    {\n      var path = GetLlvmPath(version);\n      return Path.Combine(path, binFolder);\n    }\n\n    public string GetCurrentExecutableLlvmPath()\n    {\n      var llvmSetPath = SettingsProvider.LlvmSettingsModel.PreinstalledLlvmPath;\n      if (llvmSetPath == \"\")\n      {\n        return GetLlvmExecutablePath(SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion, \"bin\\\\clang-tidy\");\n      }\n      else\n      {\n        return Path.Combine(llvmSetPath, \"clang-tidy.exe\");\n      }\n    }\n\n    public string GetLlvmExecutablePath(string version, string executableName)\n    {\n      var path = GetLlvmPath(version);\n      var executable = string.Concat(executableName, fileExtension);\n      return Path.Combine(path, executable);\n    }\n\n    public string GetAssemblyLocalPath()\n    {\n      return System.Reflection.Assembly.GetExecutingAssembly().Location;\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private string GetFolderPath()\n    {\n      string folderPath = Path.Combine\n        (Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), folderName);\n\n      if (!Directory.Exists(folderPath))\n        Directory.CreateDirectory(folderPath);\n\n      return folderPath;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/SolutionInfo.cs",
    "content": "﻿using ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace ClangPowerTools.Helpers\n{\n  public static class SolutionInfo\n  {\n    #region Properties\n\n    public static bool SolutionOpen { get; set; }\n\n    public static bool OpenFolderModeActive { get; set; }\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// Returns the required solution file information.\n    /// </summary>\n    /// <param name=\"dir\">Pointer to the solution directory</param>\n    /// <param name=\"file\">Pointer to the solution file name</param>\n    /// <param name=\"ops\">Pointer to the solutions options file name</param>\n    /// <returns>If the method succeeds, it returns Microsoft.VisualStudio.VSConstants.S_OK. If it fails, it returns an error code.</returns>\n    public static int GetSolutionInfo(out string dir, out string file, out string optionFile)\n    {\n      var solution = (IVsSolution)VsServiceProvider.GetService(typeof(SVsSolution));\n      return solution.GetSolutionInfo(out dir, out file, out optionFile);\n    }\n\n    /// <summary>\n    /// Check if any VS Solution is open\n    /// </summary>\n    /// <returns>True if any VS Solution is open. False otherwise.</returns>\n    public static bool IsSolutionOpen()\n    {\n      var solution = (IVsSolution)VsServiceProvider.GetService(typeof(SVsSolution));\n      solution.GetProperty((int)__VSPROPID.VSPROPID_IsSolutionOpen, out object open);\n      SolutionOpen = (bool)open;\n      return SolutionOpen;\n    }\n\n    /// <summary>\n    /// Check if VS runs in Open Folder Mode\n    /// </summary>\n    /// <returns>True if VS runs in Open Folder Mode. False otherwise.</returns>\n    public static bool IsOpenFolderModeActive()\n    {\n      var solution = (IVsSolution)VsServiceProvider.GetService(typeof(SVsSolution));\n      solution.GetProperty((int)__VSPROPID7.VSPROPID_IsInOpenFolderMode, out object folderMode);\n\n      OpenFolderModeActive = folderMode == null ? false : (bool)folderMode;\n      return OpenFolderModeActive;\n    }\n\n    public static bool ContainsCppProject()\n    {\n      DTE2 dte = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n      Solution solution = dte.Solution;\n\n      if (solution == null)\n      {\n        return false;\n      }\n\n      return AnyCppProject(solution);\n    }\n\n    public static bool AnyCppProject(Solution solution)\n    {\n      foreach (var project in solution)\n      {\n        if (IsCppProject((Project)project))\n        {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    public static bool IsCppProject(Project project)\n    {\n      return project.Kind.Equals(ScriptConstants.kCppProjectGuid);\n    }\n\n    public static bool AreContextMenuCommandsEnabled()\n    {\n      if (IsOpenFolderModeActive())\n      {\n        return true;\n      }\n\n      ItemsCollector itemCollector = new ItemsCollector();\n      itemCollector.CollectSelectedItems();\n      List<string> selectedItems = new List<string>();\n      if (itemCollector.IsEmpty)\n        return false;\n\n      itemCollector.Items.ForEach(e => selectedItems.Add(e.GetName()));\n\n      if (selectedItems.Count == 0)\n      {\n        return false;\n      }\n\n      foreach (var item in selectedItems)\n      {\n        var fileExtension = Path.GetExtension(item).ToLower();\n        if (ScriptConstants.kAcceptedFileExtensions.Contains(fileExtension))\n        {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    public static bool AreToolbarCommandsEnabled()\n    {\n      if (IsOpenFolderModeActive())\n        return true;\n\n      ItemsCollector itemCollector = new ItemsCollector();\n      itemCollector.CollectActiveProjectItem();\n\n      if (itemCollector.IsEmpty)\n        return false;\n\n      string activeItem = itemCollector.Items[0]?.GetName().ToLower();\n      var fileExtension = Path.GetExtension(activeItem);\n      return ScriptConstants.kAcceptedFileExtensionsWithoutHeaders.Contains(fileExtension);\n    }\n\n    public static bool ActiveDocumentValidation()\n    {\n      var document = DocumentHandler.GetActiveDocument();\n      if (document == null || string.IsNullOrWhiteSpace(document.FullName))\n        return false;\n\n      var extensionDocument = Path.GetExtension(document.FullName);\n      return ScriptConstants.kExtendedAcceptedFileExtensions.Contains(extensionDocument);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/StatusBarHandler.cs",
    "content": "﻿using ClangPowerTools.Handlers;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell.Interop;\n\nnamespace ClangPowerTools\n{\n  public class StatusBarHandler\n  {\n    #region Public Methods\n\n\n    public static void Text(string aText, int aFreezeStatusBar)\n    {\n      if (!VsServiceProvider.TryGetService(typeof(SVsStatusbar), out object statusBarService) || null == statusBarService as IVsStatusbar)\n        return;\n\n      var statusBar = statusBarService as IVsStatusbar;\n      // Make sure the status bar is not frozen\n      if (VSConstants.S_OK != statusBar.IsFrozen(out int frozen))\n        return;\n\n      UIUpdater.InvokeAsync(() =>\n      {\n        if (0 != frozen)\n          statusBar.FreezeOutput(0);\n\n        // Set the status bar text\n        statusBar.SetText(aText);\n\n        // Freeze the status bar.  \n        statusBar.FreezeOutput(aFreezeStatusBar);\n\n        // Clear the status bar text.\n        if (0 == aFreezeStatusBar)\n          statusBar.Clear();\n\n      }).SafeFireAndForget();\n    }\n\n\n    public static void Animation(vsStatusAnimation aAnimation, int aEnableAnimation)\n    {\n      if (!VsServiceProvider.TryGetService(typeof(SVsStatusbar), out object statusBarService) || null == statusBarService as IVsStatusbar)\n        return;\n\n      var statusBar = statusBarService as IVsStatusbar;\n\n      // Use the standard Visual Studio icon for building.  \n      object icon = (short)Microsoft.VisualStudio.Shell.Interop.Constants.SBAI_Build;\n\n      UIUpdater.InvokeAsync(() =>\n      {\n        // Display the icon in the Animation region.  \n        statusBar.Animation(aEnableAnimation, ref icon);\n\n      }).SafeFireAndForget();\n    }\n\n\n    public static void Status(string aText, int aFreezeStatusBar, vsStatusAnimation aAnimation, int aEnableAnimation)\n    {\n      Text(aText, aFreezeStatusBar);\n      Animation(aAnimation, aEnableAnimation);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/UIUpdater.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell;\nusing System;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Handlers\n{\n  public class UIUpdater\n  {\n    #region Public Methods\n\n    public static void BeginInvoke(Action aAction)\n    {\n      aAction.BeginInvoke(aAction.EndInvoke, null);\n    }\n\n    public async static Task InvokeAsync(Action aAction)\n    {\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      aAction.Invoke();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/VsWindowController.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools.Helpers\n{\n  /// <summary>\n  /// Contains the logic of managing Visual Studio window objects type\n  /// </summary>\n  public static class VsWindowController\n  {\n    #region Members\n\n    /// <summary>\n    /// Get the previouse focused window from Visual Studio\n    /// </summary>\n    public static Window PreviousWindow { get; private set; }\n\n    #endregion\n\n\n    #region Methods\n\n    /// <summary>\n    /// Set the previouse focused window from Visual Studio\n    /// </summary>\n    /// <param name=\"previousWindow\"></param>\n    public static void SetPreviousActiveWindow(Window previousWindow) => PreviousWindow = previousWindow;\n\n    /// <summary>\n    /// Moves the focus to the current item\n    /// </summary>\n    /// <param name=\"window\">The window which will be focused</param>\n    public static void Activate(Window window)\n    {\n      if (PreviousWindow == null)\n        return;\n\n      window.Activate();\n    }\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Helpers/Vsix.cs",
    "content": "﻿using EnvDTE;\nusing Microsoft.VisualStudio.Editor;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing Microsoft.VisualStudio.Text;\nusing Microsoft.VisualStudio.Text.Editor;\nusing Microsoft.VisualStudio.TextManager.Interop;\nusing System;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public class Vsix\n  {\n    /// <summary>\n    /// Returns the currently active view if it is a IWpfTextView.\n    /// </summary>\n    public static IWpfTextView GetCurrentView()\n    {\n      // The SVsTextManager is a service through which we can get the active view.\n      var textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager));\n      IVsTextView textView;\n      textManager.GetActiveView(1, null, out textView);\n\n      // Now we have the active view as IVsTextView, but the text interfaces we need\n      // are in the IWpfTextView.\n      return VsToWpfTextView(textView);\n    }\n\n    public static bool IsDocumentDirty(Document document)\n    {\n      var textView = GetDocumentView(document);\n      var textDocument = GetTextDocument(textView);\n      return textDocument?.IsDirty == true;\n    }\n\n    public static IWpfTextView GetDocumentView(Document document)\n    {\n      var textView = GetVsTextViewFrompPath(document.FullName);\n      return VsToWpfTextView(textView);\n    }\n\n    public static IWpfTextView VsToWpfTextView(IVsTextView textView)\n    {\n      var userData = (IVsUserData)textView;\n      if (userData == null)\n        return null;\n      Guid guidWpfViewHost = DefGuidList.guidIWpfTextViewHost;\n      object host;\n      userData.GetData(ref guidWpfViewHost, out host);\n      return ((IWpfTextViewHost)host).TextView;\n    }\n\n    public static IVsTextView GetVsTextViewFrompPath(string filePath)\n    {\n      var dte2 = (EnvDTE80.DTE2)Package.GetGlobalService(typeof(SDTE));\n      var sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;\n      var serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);\n\n      IVsUIHierarchy uiHierarchy;\n      uint itemID;\n      IVsWindowFrame windowFrame;\n      if (VsShellUtilities.IsDocumentOpen(serviceProvider, filePath, Guid.Empty,\n          out uiHierarchy, out itemID, out windowFrame))\n      {\n        // Get the IVsTextView from the windowFrame.\n        return VsShellUtilities.GetTextView(windowFrame);\n      }\n      return null;\n    }\n\n    public static ITextDocument GetTextDocument(IWpfTextView view)\n    {\n      ITextDocument document = null;\n      if (view != null && view.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out document))\n        return document;\n      return null;\n    }\n\n    public static string GetDocumentParent(IWpfTextView view)\n    {\n      ITextDocument document = GetTextDocument(view);\n      if (document != null)\n      {\n        return Directory.GetParent(document.FilePath).ToString();\n      }\n      return null;\n    }\n\n    public static string GetDocumentPath(IWpfTextView view)\n    {\n      return GetTextDocument(view)?.FilePath;\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/IgnoreActions/IgnoreItem.cs",
    "content": "﻿using EnvDTE;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools.IgnoreActions\n{\n  /// <summary>\n  /// Logic for all the ignore actions types on any abject\n  /// </summary>\n  public class IgnoreItem\n  {\n    #region Members\n\n    /// <summary>\n    /// Message to display if the checked file \n    /// is on the ignore list after a clang compile/tidy command\n    /// </summary>\n    private string ignoreCompileOrTidyMessage;\n\n    /// <summary>\n    /// Message to display if the checked file \n    /// is on the ignore list after a clang-format command\n    /// </summary>\n    private string ignoreFormatMessage;\n\n    #endregion\n\n    #region Properties\n\n    /// <summary>\n    /// Message for the ignored files for clang compile/tidy\n    /// The value is null if the proper check wasn't executed before.\n    /// </summary>\n    public string IgnoreCompileOrTidyMessage\n    {\n      get\n      {\n        return ignoreCompileOrTidyMessage;\n      }\n      private set\n      {\n        ignoreCompileOrTidyMessage =\n          $\"Cannot use clang compile/tidy on ignored files.\\nTo enable clang compile/tidy remove the {value} from Clang Power Tools Settings -> Compiler -> Files/Projects to ignore.\";\n      }\n    }\n\n    /// <summary>\n    /// Message for the ignored files for clang-format\n    /// The value is null if the proper check wasn't executed before.\n    /// </summary>\n    public string IgnoreFormatMessage\n    {\n      get\n      {\n        return ignoreFormatMessage;\n      }\n      private set\n      {\n        ignoreFormatMessage =\n          $\"\\nCannot use clang-format on ignored files.\\nTo enable clang-format remove the \\\"{value}\\\" file from Clang Power Tools Settings -> Format -> Files to ignore.\";\n      }\n    }\n\n    #endregion\n\n\n    #region Methods\n\n    /// <summary>\n    /// Check if the given parameter \n    /// is on the clang compile/tidy ignore list\n    /// </summary>\n    /// <param name=\"checkedItem\">Object to be checked</param>\n    /// <returns>True if the given parameter is on the clang compile/tidy ignore list. False otherwise</returns>\n    public bool Check(IItem checkedItem, List<string> paths = null)\n    {\n      if (checkedItem is CurrentProjectItem)\n      {\n        ProjectItem projectItem = checkedItem.GetObject() as ProjectItem;\n        IgnoreCompileOrTidyMessage = $\"\\\"{projectItem.Name}\\\" file\";\n\n        return SettingsProvider.CompilerSettingsModel.FilesToIgnore.Contains(projectItem.Name);\n      }\n      else if (checkedItem is CurrentProject)\n      {\n        Project project = checkedItem.GetObject() as Project;\n        IgnoreCompileOrTidyMessage = $\"\\\"{project.Name}\\\" project\";\n\n        return SettingsProvider.CompilerSettingsModel.ProjectsToIgnore.Contains(project.Name);\n      }\n\n\n      return false;\n    }\n\n\n    /// <summary>\n    /// Check if the given parameter \n    /// is on the clang compile/tidy ignore list\n    /// </summary>\n    /// <param name=\"checkedItem\">Object to be checked</param>\n    /// <returns>True if the given parameter is on the clang-format ignore list. False otherwise</returns>\n    public bool Check(Document checkedItem)\n    {\n      var skipFilesList = SettingsProvider.FormatSettingsModel.FilesToIgnore\n        .ToLower()\n        .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);\n\n      IgnoreFormatMessage = checkedItem.Name;\n\n      return skipFilesList\n        .Contains(checkedItem.Name.ToLower());\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/CurrentDocument.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools.Items\n{\n  public class CurrentDocument : IItem\n  {\n    #region Members\n\n    private Document mDocument;\n\n    #endregion\n\n    #region Constructor\n\n    public CurrentDocument(Document aDocument) => mDocument = aDocument;\n\n    #endregion\n\n    #region IItem implementation\n\n    public string GetName() => mDocument.Name;\n\n    public object GetObject() => mDocument.Object();\n\n    public string GetPath() => mDocument.FullName;\n\n    public void Save() => mDocument.Save();\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/CurrentProject.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools\n{\n  public class CurrentProject : IItem\n  {\n    #region Members\n\n    private Project mProject;\n\n    #endregion\n\n    #region Constructor\n\n    public CurrentProject(Project aProject) => mProject = aProject;\n\n    #endregion\n\n    #region IItem implementation\n\n    public string GetName() => mProject.FullName.Substring(mProject.FullName.LastIndexOf('\\\\') + 1);\n\n    public string GetPath() => mProject.FullName;\n\n    public object GetObject() => mProject;\n\n    public void Save() => mProject.Save(mProject.FullName);\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/CurrentProjectItem.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools\n{\n  public class CurrentProjectItem : IItem\n  {\n    #region Members\n\n    private ProjectItem mProjectItem;\n\n    #endregion\n\n    #region Constructor\n\n    public CurrentProjectItem(ProjectItem aProjectItem) => mProjectItem = aProjectItem;\n\n    #endregion\n\n    #region IItem implementation\n\n    public string GetName() => mProjectItem.Name;\n\n    public string GetPath() => mProjectItem.Properties.Item(\"FullPath\").Value.ToString();\n\n    public object GetObject() => mProjectItem;\n\n    public void Save() => mProjectItem.Save(\"\");\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/CurrentSolution.cs",
    "content": "﻿using EnvDTE;\n\nnamespace ClangPowerTools\n{\n  class CurrentSolution : IItem\n  {\n    #region Members\n\n    private readonly Solution solution;\n    private readonly string saveAsPath = string.Empty;\n\n    #endregion\n\n    #region Constructor\n\n    public CurrentSolution(Solution solution) => this.solution = solution;\n\n    public CurrentSolution(Solution solution, string savePath)\n    {\n      this.solution = solution;\n      saveAsPath = savePath;\n    }\n\n    #endregion\n\n    public string GetName() => solution.FileName;\n\n    public object GetObject() => solution;\n\n    public string GetPath() => solution.FullName;\n\n    public void Save() => solution.SaveAs(saveAsPath);\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/IItem.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public interface IItem\n  {\n    string GetName();\n\n    string GetPath();\n\n    object GetObject();\n\n    void Save();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Items/ItemsCollector.cs",
    "content": "using ClangPowerTools.Helpers;\nusing ClangPowerTools.Items;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing EnvDTE;\nusing EnvDTE80;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools\n{\n  public class ItemsCollector\n  {\n    #region Members\n\n    private readonly Array selectedItems;\n    private readonly DTE2 dte2;\n    private readonly bool jsonCompilationDbActive;\n\n    #endregion\n\n    #region Constructor\n\n    public ItemsCollector(bool jsonCompilationActive = false)\n    {\n      dte2 = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n      selectedItems = dte2.ToolWindows.SolutionExplorer.SelectedItems as Array;\n      jsonCompilationDbActive = jsonCompilationActive;\n    }\n\n    #endregion\n\n    #region Properties\n\n    public List<IItem> Items { get; set; } = new List<IItem>();\n    public bool IsEmpty => Items.Count == 0;\n\n    #endregion\n\n    #region Public Methods\n\n    public void SetItem(Document document)\n    {\n      if (document == null)\n        return;\n\n      var projectName = document.ProjectItem.ContainingProject.FullName;\n      if (string.IsNullOrWhiteSpace(projectName))\n        return;\n\n      IItem item = new CurrentProjectItem(document.ProjectItem);\n      Items.Add(item);\n    }\n\n    public List<IItem> CollectActiveProjectItem(bool saveInItems = true)\n    {\n      try\n      {\n        List<IItem> items = new List<IItem>();\n        var dte = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n\n        if (dte == null)\n          return items;\n\n        Document activeDocument = null;\n        try\n        {\n          activeDocument = dte.ActiveDocument;\n        }\n        catch (Exception)\n        {\n          return items;\n        }\n\n        if (activeDocument == null || activeDocument.ProjectItem == null)\n          return items;\n\n        IItem item = null;\n        var projectName = activeDocument.ProjectItem.ContainingProject.FullName;\n\n        if (SolutionInfo.IsOpenFolderModeActive())\n        {\n          item = new CurrentDocument(activeDocument);\n        }\n        else if (string.IsNullOrWhiteSpace(projectName) == false)\n        {\n          item = new CurrentProjectItem(activeDocument.ProjectItem);\n        }\n\n        if (saveInItems)\n          Items.Add(item);\n\n        items.Add(item);\n\n        return items;\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        throw new Exception(e.Message);\n      }\n    }\n\n    /// <summary>\n    /// Get the name of the active document\n    /// </summary>\n    public List<string> GetFilesToIgnore()\n    {\n      CollectSelectedProjectItems();\n      List<string> documentsToIgnore = new List<string>();\n      Items.ForEach(e => documentsToIgnore.Add(e.GetName()));\n\n      return documentsToIgnore;\n    }\n\n    public List<string> GetProjectsToIgnore()\n    {\n      List<string> projectsToIgnore = new List<string>();\n      Array selectedItems = dte2.ToolWindows.SolutionExplorer.SelectedItems as Array;\n\n      foreach (UIHierarchyItem item in selectedItems)\n      {\n        if (item.Object is Project)\n        {\n          var project = item.Object as Project;\n          projectsToIgnore.Add(project?.Name);\n        }\n      }\n\n      return projectsToIgnore;\n    }\n\n    /// <summary>\n    /// Get selected files to encode\n    /// </summary>\n    public List<string> GetDocumentsToEncode()\n    {\n      CollectCurrentProjectItems();\n      HashSet<string> selectedFiles = new HashSet<string>();\n      Items.ForEach(i => selectedFiles.Add(i.GetPath()));\n      return selectedFiles.ToList();\n    }\n\n    public bool SolutionOrProjectIsSelected()\n    {\n\n      if (selectedItems == null || selectedItems.Length == 0)\n        return false;\n\n      foreach (UIHierarchyItem item in selectedItems)\n      {\n        if (item.Object is Solution)\n        {\n          return true;\n        }\n        else if (item.Object is Project)\n        {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    /// <summary>\n    /// Collect all selected items in the Solution explorer for commands\n    /// </summary>\n    /// \n    public void CollectCustomItemsByPath(List<string> customPath)\n    {\n      foreach (var path in customPath)\n      {\n        var item = dte2.ToolWindows.SolutionExplorer.GetItem(path);\n        AddProjectItem(item.Object as ProjectItem);\n      }\n    }\n\n    /// <summary>\n    /// Collect project items based on look in menu from find tool window\n    /// </summary>\n    public void CollectProjectItems()\n    {\n      var dte2 = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n\n      var selectedMenuItem = LookInMenuController.GetSelectedMenuItem();\n      try\n      {\n        switch (selectedMenuItem.LookInMenu)\n        {\n          case LookInMenu.EntireSolution:\n            Items.Add(new CurrentSolution(dte2.Solution));\n            break;\n          case LookInMenu.CurrentProject:\n            List<IItem> items = CollectActiveProjectItem(false);\n            var projItem = items.First().GetObject() as ProjectItem;\n            Items.Add(new CurrentProject(projItem.ContainingProject));\n            break;\n          case LookInMenu.CurrentActiveDocument:\n            CollectActiveProjectItem();\n            break;\n        }\n      }\n      catch (Exception exception)\n      {\n        CommandControllerInstance.CommandController.DisplayMessage(false, \"CPT Error: Can't collect ProjectItems from based on look in menu\");\n      }\n    }\n\n    public void CollectSelectedItems()\n    {\n      if (selectedItems == null || selectedItems.Length == 0)\n        return;\n\n      foreach (UIHierarchyItem item in selectedItems)\n      {\n        if (item.Object is Solution)\n        {\n          var solution = item.Object as Solution;\n\n          if (jsonCompilationDbActive)\n            Items.Add(new CurrentSolution(solution));\n          else\n            GetProjectsFromSolution(solution);\n        }\n        else if (item.Object is Project)\n        {\n          var project = item.Object as Project;\n          AddProject(project);\n        }\n        else if (item.Object is ProjectItem)\n        {\n          GetProjectItem(item.Object as ProjectItem);\n        }\n      }\n    }\n\n    /// <summary>\n    /// Collect all selected ProjectItems\n    /// </summary>\n    public void CollectSelectedProjectItems()\n    {\n      if (selectedItems == null || selectedItems.Length == 0)\n        return;\n\n      foreach (UIHierarchyItem item in selectedItems)\n      {\n        if (item.Object is Solution)\n        {\n          var solution = item.Object as Solution;\n          GetProjectItem(solution);\n        }\n        else if (item.Object is Project)\n        {\n          var project = item.Object as Project;\n          GetProjectItem(project);\n        }\n        else if (item.Object is ProjectItem)\n        {\n          GetProjectItem(item.Object as ProjectItem);\n        }\n      }\n    }\n\n    public void CollectCurrentProjectItems()\n    {\n      if (selectedItems == null || selectedItems.Length == 0)\n        return;\n\n      foreach (UIHierarchyItem item in selectedItems)\n      {\n        if (item.Object is Solution)\n        {\n          var solution = item.Object as Solution;\n          GetProjectItem(solution);\n        }\n        else if (item.Object is Project)\n        {\n          var project = item.Object as Project;\n          GetProjectItem(project);\n        }\n        else if (item.Object is ProjectItem)\n        {\n          Project project = (item.Object as ProjectItem).ContainingProject;\n          GetProjectItem(project);\n          return;\n        }\n      }\n    }\n\n    public void AddProjectItem(ProjectItem aItem)\n    {\n      if (aItem == null)\n        return;\n\n      var fileExtension = Path.GetExtension(aItem.Name).ToLower();\n      if (null != ScriptConstants.kAcceptedFileExtensions && false == ScriptConstants.kAcceptedFileExtensions.Contains(fileExtension))\n        return;\n\n      Items.Add(new CurrentProjectItem(aItem));\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n\n    private void GetProjectsFromSolution(Solution aSolution)\n    {\n      Items = AutomationUtil.GetAllProjects(aSolution);\n    }\n\n    private List<IItem> GetResultProjectsFromSolution(Solution aSolution)\n    {\n      return AutomationUtil.GetAllProjects(aSolution);\n    }\n\n    private void AddProject(Project aProject) => Items.Add(new CurrentProject(aProject));\n\n\n    private void GetProjectItem(ProjectItem aProjectItem)\n    {\n      // Items that contains projects\n      if (aProjectItem.ProjectItems == null)\n      {\n        if (aProjectItem.SubProject != null)\n          AddProject(aProjectItem.SubProject);\n        return;\n      }\n      // Folders or filters\n      else if (aProjectItem.ProjectItems.Count != 0)\n      {\n        foreach (ProjectItem projItem in aProjectItem.ProjectItems)\n          GetProjectItem(projItem);\n      }\n      // Files\n      else\n      {\n        AddProjectItem(aProjectItem);\n      }\n    }\n\n    private void GetProjectItem(Project aProject)\n    {\n      foreach (var item in aProject.ProjectItems)\n      {\n        var projectItem = item as ProjectItem;\n        if (projectItem == null)\n          continue;\n\n        GetProjectItem(projectItem);\n      }\n    }\n\n    private void GetProjectItem(Solution aSolution)\n    {\n      foreach (var item in AutomationUtil.GetAllProjects(aSolution))\n      {\n        var project = (item as CurrentProject).GetObject() as Project;\n        if (project == null)\n          continue;\n\n        GetProjectItem(project);\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/.clang-format",
    "content": "# Format Style Options - Created with Clang Power Tools\n---\nBasedOnStyle: WebKit\nAccessModifierOffset: -1\nBreakBeforeBraces: Attach\nColumnLimit: 140\nIndentWidth: 2\nNamespaceIndentation: All\nSpaceBeforeParens: Never\n...\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/AutoCompleteHistory/ASTMatchers.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.ViewModels;\nusing System;\nusing System.Collections.Generic;\n\nnamespace ClangPowerToolsShared.MVVM.AutoCompleteHistory\n{\n  public static class ASTMatchers\n  {\n    public static List<string> AutoCompleteMatchers { get; } = new List<string>\n    { \n      \"attr()\",\n      \"cxxBaseSpecifier()\",\n      \"cxxCtorInitializer()\",\n      \"accessSpecDecl()\",\n      \"bindingDecl()\",\n      \"blockDecl()\",\n      \"classTemplateDecl()\",\n      \"classTemplatePartialSpecializationDecl()\",\n      \"classTemplateSpecializationDecl()\",\n      \"cxxConstructorDecl()\",\n      \"cxxConversionDecl()\",\n      \"cxxDeductionGuideDecl()\",\n      \"cxxDestructorDecl()\",\n      \"cxxMethodDecl()\",\n      \"cxxRecordDecl()\",\n      \"decl()\",\n      \"declaratorDecl()\",\n      \"decompositionDecl()\",\n      \"enumConstantDecl()\",\n      \"enumDecl()\",\n      \"fieldDecl()\",\n      \"friendDecl()\",\n      \"functionDecl()\",\n      \"functionTemplateDecl()\",\n      \"indirectFieldDecl()\",\n      \"labelDecl()\",\n      \"linkageSpecDecl()\",\n      \"namedDecl()\",\n      \"namespaceAliasDecl()\",\n      \"namespaceDecl()\",\n      \"nonTypeTemplateParmDecl()\",\n      \"objcCategoryDecl()\",\n      \"objcCategoryImplDecl()\",\n      \"objcImplementationDecl()\",\n      \"objcInterfaceDecl()\",\n      \"objcIvarDecl()\",\n      \"objcMethodDecl()\",\n      \"objcPropertyDecl()\",\n      \"objcProtocolDecl()\",\n      \"parmVarDecl()\",\n      \"recordDecl()\",\n      \"staticAssertDecl()\",\n      \"tagDecl()\",\n      \"templateTemplateParmDecl()\",\n      \"templateTypeParmDecl()\",\n      \"translationUnitDecl()\",\n      \"typeAliasDecl()\",\n      \"typeAliasTemplateDecl()\",\n      \"typedefDecl()\",\n      \"typedefNameDecl()\",\n      \"unresolvedUsingTypenameDecl()\",\n      \"unresolvedUsingValueDecl()\",\n      \"usingDecl()\",\n      \"usingDirectiveDecl()\",\n      \"usingEnumDecl()\",\n      \"valueDecl()\",\n      \"varDecl()\",\n      \"lambdaCapture()\",\n      \"nestedNameSpecifierLoc()\",\n      \"nestedNameSpecifier()\",\n      \"ompDefaultClause()\",\n      \"qualType()\",\n      \"addrLabelExpr()\",\n      \"arraySubscriptExpr()\",\n      \"asmStmt()\",\n      \"atomicExpr()\",\n      \"autoreleasePoolStmt()\",\n      \"binaryConditionalOperator()\",\n      \"binaryOperator()\",\n      \"blockExpr()\",\n      \"breakStmt()\",\n      \"cStyleCastExpr()\",\n      \"callExpr()\",\n      \"caseStmt()\",\n      \"castExpr()\",\n      \"characterLiteral()\",\n      \"chooseExpr()\",\n      \"coawaitExpr()\",\n      \"compoundLiteralExpr()\",\n      \"compoundStmt()\",\n      \"conditionalOperator()\",\n      \"constantExpr()\",\n      \"continueStmt()\",\n      \"coreturnStmt()\",\n      \"coyieldExpr()\",\n      \"cudaKernelCallExpr()\",\n      \"cxxBindTemporaryExpr()\",\n      \"cxxBoolLiteral()\",\n      \"cxxCatchStmt()\",\n      \"cxxConstCastExpr()\",\n      \"cxxConstructExpr()\",\n      \"cxxDefaultArgExpr()\",\n      \"cxxDeleteExpr()\",\n      \"cxxDependentScopeMemberExpr()\",\n      \"cxxDynamicCastExpr()\",\n      \"cxxForRangeStmt()\",\n      \"cxxFunctionalCastExpr()\",\n      \"cxxMemberCallExpr()\",\n      \"cxxNewExpr()\",\n      \"cxxNoexceptExpr()\",\n      \"cxxNullPtrLiteralExpr()\",\n      \"cxxOperatorCallExpr()\",\n      \"cxxReinterpretCastExpr()\",\n      \"cxxRewrittenBinaryOperator()\",\n      \"cxxStaticCastExpr()\",\n      \"cxxStdInitializerListExpr()\",\n      \"cxxTemporaryObjectExpr()\",\n      \"cxxThisExpr()\",\n      \"cxxThrowExpr()\",\n      \"cxxTryStmt()\",\n      \"cxxUnresolvedConstructExpr()\",\n      \"declRefExpr()\",\n      \"declStmt()\",\n      \"defaultStmt()\",\n      \"dependentCoawaitExpr()\",\n      \"designatedInitExpr()\",\n      \"doStmt()\",\n      \"explicitCastExpr()\",\n      \"expr()\",\n      \"exprWithCleanups()\",\n      \"fixedPointLiteral()\",\n      \"floatLiteral()\",\n      \"forStmt()\",\n      \"genericSelectionExpr()\",\n      \"gnuNullExpr()\",\n      \"gotoStmt()\",\n      \"ifStmt()\",\n      \"imaginaryLiteral()\",\n      \"implicitCastExpr()\",\n      \"implicitValueInitExpr()\",\n      \"initListExpr()\",\n      \"integerLiteral()\",\n      \"labelStmt()\",\n      \"lambdaExpr()\",\n      \"materializeTemporaryExpr()\",\n      \"memberExpr()\",\n      \"nullStmt()\",\n      \"objcCatchStmt()\",\n      \"objcFinallyStmt()\",\n      \"objcIvarRefExpr()\",\n      \"objcMessageExpr()\",\n      \"objcStringLiteral()\",\n      \"objcThrowStmt()\",\n      \"objcTryStmt()\",\n      \"ompExecutableDirective()\",\n      \"opaqueValueExpr()\",\n      \"parenExpr()\",\n      \"parenListExpr()\",\n      \"predefinedExpr()\",\n      \"returnStmt()\",\n      \"stmt()\",\n      \"stmtExpr()\",\n      \"stringLiteral()\",\n      \"substNonTypeTemplateParmExpr()\",\n      \"switchCase()\",\n      \"switchStmt()\",\n      \"unaryExprOrTypeTraitExpr()\",\n      \"unaryOperator()\",\n      \"unresolvedLookupExpr()\",\n      \"unresolvedMemberExpr()\",\n      \"userDefinedLiteral()\",\n      \"whileStmt()\",\n      \"templateArgumentLoc()\",\n      \"templateArgument()\",\n      \"templateName()\",\n      \"elaboratedTypeLoc()\",\n      \"pointerTypeLoc()\",\n      \"qualifiedTypeLoc()\",\n      \"referenceTypeLoc()\",\n      \"templateSpecializationTypeLoc()\",\n      \"typeLoc()\",\n      \"arrayType()\",\n      \"atomicType()\",\n      \"autoType()\",\n      \"blockPointerType()\",\n      \"builtinType()\",\n      \"complexType()\",\n      \"constantArrayType()\",\n      \"decayedType()\",\n      \"decltypeType()\",\n      \"deducedTemplateSpecializationType()\",\n      \"dependentSizedArrayType()\",\n      \"elaboratedType()\",\n      \"enumType()\",\n      \"functionProtoType()\",\n      \"functionType()\",\n      \"incompleteArrayType()\",\n      \"injectedClassNameType()\",\n      \"lValueReferenceType()\",\n      \"memberPointerType()\",\n      \"objcObjectPointerType()\",\n      \"parenType()\",\n      \"pointerType()\",\n      \"rValueReferenceType()\",\n      \"recordType()\",\n      \"referenceType()\",\n      \"substTemplateTypeParmType()\",\n      \"tagType()\",\n      \"templateSpecializationType()\",\n      \"templateTypeParmType()\",\n      \"type()\",\n      \"typedefType()\",\n      \"unaryTransformType()\",\n      \"usingType()\",\n      \"variableArrayType()\",\n      \"allOf()\",\n      \"anyOf()\",\n      \"anything()\",\n      \"unless()\",\n      \"isImplicit()\",\n      \"hasAnyOperatorName()\",\n      \"hasOperatorName()\",\n      \"isAssignmentOperator()\",\n      \"isComparisonOperator()\",\n      \"isPrivate()\",\n      \"isProtected()\",\n      \"isPublic()\",\n      \"isVirtual()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"isCatchAll()\",\n      \"argumentCountIs()\",\n      \"isListInitialization()\",\n      \"requiresZeroInitialization()\",\n      \"isCopyConstructor()\",\n      \"isDefaultConstructor()\",\n      \"isDelegatingConstructor()\",\n      \"isExplicit()\",\n      \"isInheritingConstructor()\",\n      \"isMoveConstructor()\",\n      \"isExplicit()\",\n      \"isBaseInitializer()\",\n      \"isMemberInitializer()\",\n      \"isWritten()\",\n      \"isExplicit()\",\n      \"hasMemberName()\",\n      \"isArrow()\",\n      \"memberHasSameNameAsBoundNode()\",\n      \"isConst()\",\n      \"isCopyAssignmentOperator()\",\n      \"isFinal()\",\n      \"isMoveAssignmentOperator()\",\n      \"isOverride()\",\n      \"isPure()\",\n      \"isUserProvided()\",\n      \"isVirtual()\",\n      \"isVirtualAsWritten()\",\n      \"isArray()\",\n      \"hasAnyOperatorName()\",\n      \"hasAnyOverloadedOperatorName()\",\n      \"hasOperatorName()\",\n      \"hasOverloadedOperatorName()\",\n      \"isAssignmentOperator()\",\n      \"isComparisonOperator()\",\n      \"hasDefinition()\",\n      \"isDerivedFrom()\",\n      \"isDirectlyDerivedFrom()\",\n      \"isExplicitTemplateSpecialization()\",\n      \"isFinal()\",\n      \"isLambda()\",\n      \"isSameOrDerivedFrom()\",\n      \"isTemplateInstantiation()\",\n      \"hasAnyOperatorName()\",\n      \"hasOperatorName()\",\n      \"isAssignmentOperator()\",\n      \"isComparisonOperator()\",\n      \"argumentCountIs()\",\n      \"argumentCountIs()\",\n      \"usesADL()\",\n      \"hasCastKind()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"templateArgumentCountIs()\",\n      \"statementCountIs()\",\n      \"hasSize()\",\n      \"declCountIs()\",\n      \"equalsBoundNode()\",\n      \"equalsNode()\",\n      \"hasAttr()\",\n      \"isExpandedFromMacro()\",\n      \"isExpansionInFileMatching()\",\n      \"isExpansionInMainFile()\",\n      \"isExpansionInSystemHeader()\",\n      \"isImplicit()\",\n      \"isInStdNamespace()\",\n      \"isInstantiated()\",\n      \"isPrivate()\",\n      \"isProtected()\",\n      \"isPublic()\",\n      \"designatorCountIs()\",\n      \"isScoped()\",\n      \"isInstantiationDependent()\",\n      \"isTypeDependent()\",\n      \"isValueDependent()\",\n      \"nullPointerConstant()\",\n      \"hasBitWidth()\",\n      \"isBitField()\",\n      \"equals()\",\n      \"equals()\",\n      \"hasAnyOverloadedOperatorName()\",\n      \"hasDynamicExceptionSpec()\",\n      \"hasOverloadedOperatorName()\",\n      \"hasTrailingReturn()\",\n      \"isConsteval()\",\n      \"isConstexpr()\",\n      \"isDefaulted()\",\n      \"isDefinition()\",\n      \"isDeleted()\",\n      \"isExplicitTemplateSpecialization()\",\n      \"isExternC()\",\n      \"isInline()\",\n      \"isMain()\",\n      \"isNoReturn()\",\n      \"isNoThrow()\",\n      \"isStaticStorageClass()\",\n      \"isTemplateInstantiation()\",\n      \"isVariadic()\",\n      \"isWeak()\",\n      \"parameterCountIs()\",\n      \"hasDynamicExceptionSpec()\",\n      \"isNoThrow()\",\n      \"parameterCountIs()\",\n      \"isConsteval()\",\n      \"isConstexpr()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"equals()\",\n      \"capturesThis()\",\n      \"isImplicit()\",\n      \"isArrow()\",\n      \"hasAnyName()\",\n      \"hasExternalFormalLinkage()\",\n      \"hasName()\",\n      \"matchesName()\",\n      \"isAnonymous()\",\n      \"isInline()\",\n      \"isFirstPrivateKind()\",\n      \"isNoneKind()\",\n      \"isPrivateKind()\",\n      \"isSharedKind()\",\n      \"isAllowedToContainClauseKind()\",\n      \"isStandaloneDirective()\",\n      \"isDerivedFrom()\",\n      \"isDirectlyDerivedFrom()\",\n      \"isSameOrDerivedFrom()\",\n      \"argumentCountIs()\",\n      \"hasAnySelector()\",\n      \"hasKeywordSelector()\",\n      \"hasNullSelector()\",\n      \"hasSelector()\",\n      \"hasUnarySelector()\",\n      \"isClassMessage()\",\n      \"isInstanceMessage()\",\n      \"matchesSelector()\",\n      \"numSelectorArgs()\",\n      \"isClassMethod()\",\n      \"isDefinition()\",\n      \"isInstanceMethod()\",\n      \"hasDefaultArgument()\",\n      \"isAtPosition()\",\n      \"asString()\",\n      \"equalsBoundNode()\",\n      \"hasLocalQualifiers()\",\n      \"isAnyCharacter()\",\n      \"isAnyPointer()\",\n      \"isConstQualified()\",\n      \"isInteger()\",\n      \"isSignedInteger()\",\n      \"isUnsignedInteger()\",\n      \"isVolatileQualified()\",\n      \"equalsBoundNode()\",\n      \"equalsNode()\",\n      \"isExpandedFromMacro()\",\n      \"isExpansionInFileMatching()\",\n      \"isExpansionInMainFile()\",\n      \"isExpansionInSystemHeader()\",\n      \"isInTemplateInstantiation()\",\n      \"hasSize()\",\n      \"isClass()\",\n      \"isDefinition()\",\n      \"isEnum()\",\n      \"isStruct()\",\n      \"isUnion()\",\n      \"equalsIntegralValue()\",\n      \"isIntegral()\",\n      \"templateArgumentCountIs()\",\n      \"isExpandedFromMacro()\",\n      \"isExpansionInFileMatching()\",\n      \"isExpansionInMainFile()\",\n      \"isExpansionInSystemHeader()\",\n      \"booleanType()\",\n      \"equalsBoundNode()\",\n      \"equalsNode()\",\n      \"realFloatingPointType()\",\n      \"voidType()\",\n      \"ofKind()\",\n      \"hasAnyOperatorName()\",\n      \"hasOperatorName()\",\n      \"isArrow()\",\n      \"hasAutomaticStorageDuration()\",\n      \"hasGlobalStorage()\",\n      \"hasLocalStorage()\",\n      \"hasStaticStorageDuration()\",\n      \"hasThreadStorageDuration()\",\n      \"isConstexpr()\",\n      \"isConstinit()\",\n      \"isDefinition()\",\n      \"isExceptionVariable()\",\n      \"isExplicitTemplateSpecialization()\",\n      \"isExternC()\",\n      \"isInitCapture()\",\n      \"isInline()\",\n      \"isStaticLocal()\",\n      \"isStaticStorageClass()\",\n      \"isTemplateInstantiation()\",\n      \"binaryOperation()\",\n      \"eachOf()\",\n      \"findAll()\",\n      \"forEachDescendant()\",\n      \"forEach()\",\n      \"hasAncestor()\",\n      \"hasDescendant()\",\n      \"has()\",\n      \"hasParent()\",\n      \"invocation()\",\n      \"optionally()\",\n      \"traverse()\",\n      \"hasCondition()\",\n      \"hasFalseExpression()\",\n      \"hasTrueExpression()\",\n      \"hasDeclaration()\",\n      \"hasBase()\",\n      \"hasIndex()\",\n      \"hasLHS()\",\n      \"hasRHS()\",\n      \"hasElementType()\",\n      \"hasValueType()\",\n      \"hasDeducedType()\",\n      \"hasAnyUsingShadowDecl()\",\n      \"hasEitherOperand()\",\n      \"hasLHS()\",\n      \"hasOperands()\",\n      \"hasRHS()\",\n      \"forDecomposition()\",\n      \"hasAnyParameter()\",\n      \"hasParameter()\",\n      \"hasTypeLoc()\",\n      \"pointee()\",\n      \"hasTypeLoc()\",\n      \"hasType()\",\n      \"hasType()\",\n      \"forEachArgumentWithParam()\",\n      \"forEachArgumentWithParamType()\",\n      \"hasAnyArgument()\",\n      \"hasArgument()\",\n      \"hasDeclaration()\",\n      \"forEachConstructorInitializer()\",\n      \"hasAnyConstructorInitializer()\",\n      \"forField()\",\n      \"hasTypeLoc()\",\n      \"withInitializer()\",\n      \"hasObjectExpression()\",\n      \"hasBody()\",\n      \"hasInitStatement()\",\n      \"hasLoopVariable()\",\n      \"hasRangeInit()\",\n      \"hasTypeLoc()\",\n      \"onImplicitObjectArgument()\",\n      \"on()\",\n      \"thisPointerType()\",\n      \"thisPointerType()\",\n      \"forEachOverridden()\",\n      \"ofClass()\",\n      \"hasAnyPlacementArg()\",\n      \"hasArraySize()\",\n      \"hasDeclaration()\",\n      \"hasPlacementArg()\",\n      \"hasTypeLoc()\",\n      \"hasEitherOperand()\",\n      \"hasLHS()\",\n      \"hasOperands()\",\n      \"hasRHS()\",\n      \"hasUnaryOperand()\",\n      \"hasAnyBase()\",\n      \"hasDirectBase()\",\n      \"hasMethod()\",\n      \"isDerivedFrom()\",\n      \"isDirectlyDerivedFrom()\",\n      \"isSameOrDerivedFrom()\",\n      \"hasEitherOperand()\",\n      \"hasLHS()\",\n      \"hasOperands()\",\n      \"hasRHS()\",\n      \"hasTypeLoc()\",\n      \"hasAnyArgument()\",\n      \"hasArgument()\",\n      \"hasTypeLoc()\",\n      \"callee()\",\n      \"callee()\",\n      \"forEachArgumentWithParam()\",\n      \"forEachArgumentWithParamType()\",\n      \"hasAnyArgument()\",\n      \"hasArgument()\",\n      \"hasDeclaration()\",\n      \"hasCaseConstant()\",\n      \"hasSourceExpression()\",\n      \"forEachTemplateArgument()\",\n      \"hasAnyTemplateArgument()\",\n      \"hasSpecializedTemplate()\",\n      \"hasTemplateArgument()\",\n      \"hasTypeLoc()\",\n      \"hasElementType()\",\n      \"hasTypeLoc()\",\n      \"hasAnySubstatement()\",\n      \"hasDecayedType()\",\n      \"hasDeclaration()\",\n      \"hasTemplateArgumentLoc()\",\n      \"throughUsingDecl()\",\n      \"to()\",\n      \"containsDeclaration()\",\n      \"hasSingleDecl()\",\n      \"hasTypeLoc()\",\n      \"hasDeclContext()\",\n      \"hasUnderlyingType()\",\n      \"hasAnyBinding()\",\n      \"hasBinding()\",\n      \"hasBody()\",\n      \"hasCondition()\",\n      \"hasNamedTypeLoc()\",\n      \"hasQualifier()\",\n      \"namesType()\",\n      \"hasDeclaration()\",\n      \"hasDestinationType()\",\n      \"hasTypeLoc()\",\n      \"hasType()\",\n      \"hasType()\",\n      \"ignoringElidableConstructorCall()\",\n      \"ignoringImpCasts()\",\n      \"ignoringImplicit()\",\n      \"ignoringParenCasts()\",\n      \"ignoringParenImpCasts()\",\n      \"ignoringParens()\",\n      \"hasInClassInitializer()\",\n      \"hasBody()\",\n      \"hasCondition()\",\n      \"hasIncrement()\",\n      \"hasLoopInit()\",\n      \"hasType()\",\n      \"hasType()\",\n      \"forEachTemplateArgument()\",\n      \"hasAnyBody()\",\n      \"hasAnyParameter()\",\n      \"hasAnyTemplateArgument()\",\n      \"hasBody()\",\n      \"hasExplicitSpecifier()\",\n      \"hasParameter()\",\n      \"hasReturnTypeLoc()\",\n      \"hasTemplateArgument()\",\n      \"returns()\",\n      \"hasCondition()\",\n      \"hasConditionVariableStatement()\",\n      \"hasElse()\",\n      \"hasInitStatement()\",\n      \"hasThen()\",\n      \"hasImplicitDestinationType()\",\n      \"hasInit()\",\n      \"hasSyntacticForm()\",\n      \"hasDeclaration()\",\n      \"hasDeclaration()\",\n      \"capturesVar()\",\n      \"forEachLambdaCapture()\",\n      \"hasAnyCapture()\",\n      \"hasDeclaration()\",\n      \"hasObjectExpression()\",\n      \"member()\",\n      \"pointee()\",\n      \"hasUnderlyingDecl()\",\n      \"hasPrefix()\",\n      \"loc()\",\n      \"specifiesTypeLoc()\",\n      \"hasPrefix()\",\n      \"specifiesNamespace()\",\n      \"specifiesType()\",\n      \"hasAnyClause()\",\n      \"hasStructuredBlock()\",\n      \"isDerivedFrom()\",\n      \"isDirectlyDerivedFrom()\",\n      \"isSameOrDerivedFrom()\",\n      \"callee()\",\n      \"hasAnyArgument()\",\n      \"hasArgument()\",\n      \"hasReceiver()\",\n      \"hasReceiverType()\",\n      \"hasAnyParameter()\",\n      \"hasParameter()\",\n      \"hasTypeLoc()\",\n      \"hasSourceExpression()\",\n      \"hasAnyDeclaration()\",\n      \"innerType()\",\n      \"hasPointeeLoc()\",\n      \"pointee()\",\n      \"hasCanonicalType()\",\n      \"hasDeclaration()\",\n      \"ignoringParens()\",\n      \"pointsTo()\",\n      \"pointsTo()\",\n      \"references()\",\n      \"references()\",\n      \"hasUnqualifiedLoc()\",\n      \"hasDeclaration()\",\n      \"hasReferentLoc()\",\n      \"pointee()\",\n      \"hasReturnValue()\",\n      \"hasAnySubstatement()\",\n      \"alignOfExpr()\",\n      \"forCallable()\",\n      \"forFunction()\",\n      \"sizeOfExpr()\",\n      \"hasReplacementType()\",\n      \"forEachSwitchCase()\",\n      \"hasCondition()\",\n      \"hasInitStatement()\",\n      \"hasDeclaration()\",\n      \"hasTypeLoc()\",\n      \"isExpr()\",\n      \"refersToDeclaration()\",\n      \"refersToIntegralType()\",\n      \"refersToTemplate()\",\n      \"refersToType()\",\n      \"hasAnyTemplateArgumentLoc()\",\n      \"hasTemplateArgumentLoc()\",\n      \"forEachTemplateArgument()\",\n      \"hasAnyTemplateArgument()\",\n      \"hasDeclaration()\",\n      \"hasTemplateArgument()\",\n      \"hasDeclaration()\",\n      \"loc()\",\n      \"hasTypeLoc()\",\n      \"hasType()\",\n      \"hasDeclaration()\",\n      \"hasUnqualifiedDesugaredType()\",\n      \"hasArgumentOfType()\",\n      \"hasUnaryOperand()\",\n      \"hasObjectExpression()\",\n      \"hasDeclaration()\",\n      \"hasTargetDecl()\",\n      \"hasUnderlyingType()\",\n      \"throughUsingDecl()\",\n      \"hasType()\",\n      \"hasType()\",\n      \"hasInitializer()\",\n      \"hasSizeExpr()\",\n      \"hasBody()\",\n      \"hasCondition()\",\n    };\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/AutoCompleteHistory/AutoCompleteBehavior.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace ClangPowerToolsShared.MVVM.AutoCompleteHistory\n{\n  public static class AutoCompleteBehavior\n  {\n    public static TextChangedEventHandler OnListUpdate = delegate { };\n    public static TextChangedEventHandler onTextChanged = new TextChangedEventHandler(OnTextChanged);\n    public static KeyEventHandler onKeyDown = new KeyEventHandler(OnPreviewKeyDown);\n    public static List<AutoCompleteHistoryModel> AutocompleteResult = new();\n    public static string MatchText { get; set; } \n\n    /// <summary>\n    /// The collection to search for matches from.\n    /// </summary>\n    public static readonly DependencyProperty AutoCompleteItemsSource =\n        DependencyProperty.RegisterAttached\n        (\n            \"AutoCompleteItemsSource\",\n            typeof(IEnumerable<AutoCompleteHistoryModel>),\n            typeof(AutoCompleteBehavior),\n            new UIPropertyMetadata(null, OnAutoCompleteItemsSource)\n        );\n    /// <summary>\n    /// Whether or not to ignore case when searching for matches.\n    /// </summary>\n    public static readonly DependencyProperty AutoCompleteStringComparison =\n      DependencyProperty.RegisterAttached\n      (\n        \"AutoCompleteStringComparison\",\n        typeof(StringComparison),\n        typeof(AutoCompleteBehavior),\n        new UIPropertyMetadata(StringComparison.Ordinal)\n      );\n\n    /// <summary>\n    /// What string should indicate that we should start giving auto-completion suggestions.  For example: @\n    /// If this is null or empty, auto-completion suggestions will begin at the beginning of the textbox's text.\n    /// </summary>\n    public static readonly DependencyProperty AutoCompleteIndicator =\n            DependencyProperty.RegisterAttached\n            (\n                \"AutoCompleteIndicator\",\n                typeof(String),\n                typeof(AutoCompleteBehavior),\n                new UIPropertyMetadata(String.Empty)\n            );\n\n    #region Items Source\n    public static IEnumerable<AutoCompleteHistoryModel> GetAutoCompleteItemsSource(DependencyObject obj)\n    {\n      object objRtn = obj.GetValue(AutoCompleteItemsSource);\n      if (objRtn is IEnumerable<AutoCompleteHistoryModel>)\n        return (objRtn as IEnumerable<AutoCompleteHistoryModel>);\n\n      return null;\n    }\n\n    public static void SetAutoCompleteItemsSource(DependencyObject obj, IEnumerable<String> value)\n    {\n      obj.SetValue(AutoCompleteItemsSource, value);\n    }\n\n    private static void OnAutoCompleteItemsSource(object sender, DependencyPropertyChangedEventArgs e)\n    {\n      TextBox tb = sender as TextBox;\n      if (sender == null)\n        return;\n\n      //If we're being removed, remove the callbacks\n      //Remove our old handler, regardless of if we have a new one.\n      tb.TextChanged -= onTextChanged;\n      tb.PreviewKeyDown -= onKeyDown;\n      if (e.NewValue != null)\n      {\n        //New source.  Add the callbacks\n        tb.TextChanged += onTextChanged;\n        tb.PreviewKeyDown += onKeyDown;\n      }\n    }\n    #endregion\n\n    #region String Comparison\n    public static StringComparison GetAutoCompleteStringComparison(DependencyObject obj)\n    {\n      return (StringComparison)obj.GetValue(AutoCompleteStringComparison);\n    }\n\n    public static void SetAutoCompleteStringComparison(DependencyObject obj, StringComparison value)\n    {\n      obj.SetValue(AutoCompleteStringComparison, value);\n    }\n    #endregion\n\n    #region Indicator\n    public static String GetAutoCompleteIndicator(DependencyObject obj)\n    {\n      return (String)obj.GetValue(AutoCompleteIndicator);\n    }\n\n    public static void SetAutoCompleteIndicator(DependencyObject obj, String value)\n    {\n      obj.SetValue(AutoCompleteIndicator, value);\n    }\n    #endregion\n\n    /// <summary>\n    /// Used for moving the caret to the end of the suggested auto-completion text.\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    static void OnPreviewKeyDown(object sender, KeyEventArgs e)\n    {\n      if (e.Key == Key.Down)\n      {\n        ((UIElement)e.OriginalSource).MoveFocus\n          (new TraversalRequest(FocusNavigationDirection.Down));\n      }\n\n      if (e.Key != Key.Enter && e.Key != Key.Tab)\n        return;\n\n      TextBox tb = e.OriginalSource as TextBox;\n      if (tb == null)\n        return;\n\n      //If we pressed enter and if the selected text goes all the way to the end, move our caret position to the end\n      if (tb.SelectionLength > 0 && (tb.SelectionStart + tb.SelectionLength == tb.Text.Length))\n      {\n        tb.SelectionStart = tb.CaretIndex = tb.Text.Length;\n        tb.SelectionLength = 0;\n      }\n    }\n\n    /// <summary>\n    /// Search for auto-completion suggestions.\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    /// \n\n    static void OnTextChanged(object sender, TextChangedEventArgs e)\n    {\n      MatchText = String.Empty;\n      TextBox tb = e.OriginalSource as TextBox;\n      if (sender == null)\n        return;\n      IEnumerable<AutoCompleteHistoryModel> values = GetAutoCompleteItemsSource(tb);\n      //No reason to search if we don't have any values.\n      if (values == null)\n        return;\n\n      if (String.IsNullOrEmpty(tb.Text))\n      {\n        AutocompleteResult = values.ToList();\n        OnListUpdate?.Invoke(sender, e);\n      }\n      if\n      (\n          (from change in e.Changes where change.RemovedLength > 0 select change).Any() &&\n          (from change in e.Changes where change.AddedLength > 0 select change).Any() == false\n      )\n        return;\n\n      //No reason to search if there's nothing there.\n      if (String.IsNullOrEmpty(tb.Text))\n        return;\n      \n      MatchText = tb.Text;\n\n      List<string> indicators = new List<string>() { \" \", \"(\", \")\", \",\" };\n      int startIndex = 0; //Start from the beginning of the line.\n      string matchingString = tb.Text;\n      //If we have a trigger string, make sure that it has been typed before\n      //giving auto-completion suggestions.\n      string rememberIndicator = string.Empty;\n      if (indicators != null && !String.IsNullOrEmpty(indicators.First()))\n      {\n        if (tb.Text.Length > 0)\n        {\n          List<int> indicatorsIndex = new();\n          indicatorsIndex = indicators.Select(a => tb.Text.LastIndexOf(a)).ToList();\n          int maxIndicatorIndex = indicatorsIndex.Max();\n          if (maxIndicatorIndex == -1)\n          {\n            startIndex = 0;\n          }\n          startIndex = 1 + maxIndicatorIndex;\n          matchingString = tb.Text.Substring(startIndex, (tb.Text.Length - startIndex));\n        }\n      }\n\n      //If we don't have anything after the trigger string, return.\n      if (String.IsNullOrEmpty(matchingString))\n      {\n        AutocompleteResult = values.ToList();\n        OnListUpdate?.Invoke(sender, e);\n        return;\n      }\n\n      Int32 textLength = matchingString.Length;\n\n      StringComparison comparer = GetAutoCompleteStringComparison(tb);\n      //Do search and changes here.\n      AutoCompleteHistoryModel match =\n      (\n        from\n          value\n        in\n        (\n          from subvalue\n          in values\n          where subvalue != null && subvalue.Value.Length >= textLength\n          select subvalue\n        )\n        where value.Value.Substring(0, textLength).Equals(matchingString, comparer)\n        select new AutoCompleteHistoryModel\n        {\n          Value = value.Value.Substring(textLength, value.Value.Length - textLength),\n          RememberAsFavorit = value.RememberAsFavorit,\n          PinIconPath = value.PinIconPath,\n          Visibility = value.Visibility,\n          Id = value.Id\n        }/*Only select the last part of the suggestion*/\n      ).FirstOrDefault();\n\n      AutocompleteResult =\n        (\n          from\n            value\n          in\n          (\n            from subvalue\n            in values\n            where subvalue != null && subvalue.Value.Length >= textLength\n            select subvalue\n          )\n          where value.Value.Substring(0, textLength).Equals(matchingString, comparer)\n          select new AutoCompleteHistoryModel\n          {\n            Value = value.Value.Substring(textLength, value.Value.Length - textLength),\n            RememberAsFavorit = value.RememberAsFavorit,\n            PinIconPath = value.PinIconPath,\n            Visibility = value.Visibility,\n            Id = value.Id\n          }/*Only select the last part of the suggestion*/\n      ).ToList();\n\n      OnListUpdate?.Invoke(sender, e);\n\n      //Nothing.  Leave 'em alone\n      if (match is null || String.IsNullOrEmpty(match.Value))\n        return;\n\n      int matchStart = (startIndex + matchingString.Length);\n      tb.TextChanged -= onTextChanged;\n      tb.Text += match.Value;\n      tb.CaretIndex = matchStart;\n      tb.SelectionStart = matchStart;\n      tb.SelectionLength = (tb.Text.Length - startIndex);\n      tb.TextChanged += onTextChanged;\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/CollectionElementsCounter.cs",
    "content": "﻿using ClangPowerTools.Events;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools.MVVM\n{\n  /// <summary>\n  /// Count certain elements from a given collection\n  /// </summary>\n  public static class CollectionElementsCounter\n  {\n    #region Members\n\n    /// <summary>\n    /// Count the wanted collection elements\n    /// </summary>\n    private static int count = 0;\n\n    /// <summary>\n    /// Collection length\n    /// </summary>\n    private static int length = 0;\n\n    /// <summary>\n    /// Flag for counting all the collection elements \n    /// </summary>\n    private static bool full = false;\n\n    /// <summary>\n    /// Event triggered when certain conditions are validated\n    /// </summary>\n    public static event EventHandler<BoolEventArgs> StateEvent;\n\n    #endregion\n\n\n    #region Methods\n\n    /// <summary>\n    /// Count collection elements and set the values for the other members\n    /// </summary>\n    /// <param name=\"collection\">The collection under surveillance</param>\n    public static void Initialize(IEnumerable<TidyCheckModel> collection)\n    {\n      count = 0;\n      length = collection.Count();\n      foreach (var item in collection)\n      {\n        if (item.IsChecked)\n          ++count;\n      }\n      full = count == length;\n    }\n\n    /// <summary>\n    /// Increment the counter. Trigger the StateEvent if the counter riched the maximum value.\n    /// </summary>\n    public static void Add()\n    {\n      ++count;\n      if (count == length)\n      {\n        full = true;\n        StateEvent?.Invoke(null, new BoolEventArgs(true));\n      }\n    }\n\n    /// <summary>\n    /// Decrement the counter. Trigger the StateEvent if in the previous state the counter riched the maximum value.\n    /// </summary>\n    public static void Remove()\n    {\n      --count;\n      if (full)\n      {\n        full = false;\n        StateEvent?.Invoke(null, new BoolEventArgs(false));\n      }\n    }\n\n    /// <summary>\n    /// Check if the collection is empty.\n    /// </summary>\n    /// <returns>True is the collection is empty. False otherwise</returns>\n    public static bool IsEmpty() => length == 0;\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Command/RelayCommand.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.MVVM.Command\n{\n  public class RelayCommand : ICommand\n  {\n    public event EventHandler CanExecuteChanged\n    {\n      add { CommandManager.RequerySuggested += value; }\n      remove { CommandManager.RequerySuggested -= value; }\n    }\n\n    private readonly Action action;\n\n    private Func<bool> canExecute;\n    public RelayCommand(Action action, Func<bool> canExecute = null)\n    {\n      this.action = action;\n      this.canExecute = canExecute;\n    }\n    public bool CanExecute(object parameter)\n    {\n      return canExecute == null ? true : canExecute.Invoke();\n    }\n    public void Execute(object parameter)\n    {\n      action.Invoke();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Commands/FileCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Services;\nusing EnvDTE80;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace ClangPowerToolsShared.MVVM.Commands\n{\n  public static class FileCommand\n  {\n    [DllImport(\"kernel32.dll\", CharSet = CharSet.Auto)]\n    public static extern uint GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, uint cchBuffer);\n\n    public static string GetShortPath(string longPath)\n    {\n      StringBuilder shortPath = new StringBuilder(255);\n      GetShortPathName(longPath, shortPath, 255);\n      return shortPath.ToString();\n    }\n\n    public static void TidyFixDiff(FileModel filePath, bool makeDiff = true)\n    {\n      SettingsPathBuilder settingsPathBuilder = new SettingsPathBuilder();\n      var clangTidyPath = settingsPathBuilder.GetCurrentExecutableLlvmPath();\n      try\n      {\n        FileInfo file = new(filePath.FullFileName);\n        File.Copy(file.FullName, filePath.CopyFullFileName, true);\n        System.Diagnostics.Process process = new();\n        process.StartInfo.FileName = clangTidyPath;\n        process.StartInfo.CreateNoWindow = true;\n        process.StartInfo.UseShellExecute = false;\n        process.StartInfo.Arguments = $\"-fix \\\"{file.FullName}\\\"\";\n        process.Start();\n        process.WaitForExit();\n        if (makeDiff)\n          DiffFilesUsingDefaultTool(filePath.CopyFullFileName, file.FullName);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Tidy-Diff Failed - you do not have an llvm set\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    /// <summary>\n    /// Copy a file from temp to solution\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public static void CopyFileFromTempToSolution(FileModel file)\n    {\n      if (File.Exists(file.CopyFullFileName))\n      {\n        try\n        {\n          File.Copy(file.CopyFullFileName, file.FullFileName, true);\n          File.Delete(file.CopyFullFileName);\n        }\n        catch (UnauthorizedAccessException e)\n        {\n          MessageBox.Show($\"File {file.FullFileName} can't be copied, access to path is denied\", \"Warning\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n        }\n      }\n    }\n\n    /// <summary>\n    /// Copy a file from solution to temp folder\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public static void CopyFileFromSolutionToTemp(FileModel file)\n    {\n      FileInfo fileInfo = new(file.CopyFullFileName);\n      Directory.CreateDirectory(fileInfo.Directory.FullName);\n      try\n      {\n        File.Copy(file.FullFileName, file.CopyFullFileName, true);\n      }\n      catch (UnauthorizedAccessException e)\n      {\n        MessageBox.Show($\"File {file.FullFileName} can't be copied, access to path is denied\", \"Warning\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n      }\n    }\n\n    public static void Copy(string source, string destination)\n    {\n      System.Diagnostics.Process process = new();\n      process.StartInfo.FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\";\n      process.StartInfo.CreateNoWindow = true;\n      process.StartInfo.UseShellExecute = false;\n      process.StartInfo.Arguments = $\"Copy-Item -LiteralPath \" + source + \" \" + destination;\n      process.Start();\n      process.WaitForExit();\n    }\n\n    public static void CopyFilesInTempSolution(List<FileModel> files)\n    {\n      foreach (var file in files)\n      {\n        CopyFileFromSolutionToTemp(file);\n      }\n    }\n\n    public static void DiffFilesUsingDefaultTool(string file1, string file2)\n    {\n      object args = $\"\\\"{file1}\\\" \\\"{file2}\\\"\";\n      var dte = VsServiceProvider.GetService(typeof(DTE2)) as DTE2;\n      dte.Commands.Raise(TidyConstants.ToolsDiffFilesCmd, TidyConstants.ToolsDiffFilesId, ref args, ref args);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Commands/RelayCommand.cs",
    "content": "﻿using System;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.MVVM.Commands\n{\n  public class RelayCommand : ICommand\n  {\n    #region Members\n    private readonly Action action;\n    private readonly Func<bool> canExecute;\n    #endregion\n\n    public RelayCommand(Action action, Func<bool> canExecute = null)\n    {\n      this.action = action;\n      this.canExecute = canExecute;\n    }\n\n    #region Contructors\n    public event EventHandler CanExecuteChanged\n    {\n      add { CommandManager.RequerySuggested += value; }\n      remove { CommandManager.RequerySuggested -= value; }\n    }\n    #endregion\n\n\n    #region Public Methods\n    public bool CanExecute(object parameter)\n    {\n      return canExecute == null ? true : canExecute();\n    }\n\n    public void Execute(object parameter)\n    {\n      action();\n    }\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Commands/TidyDiffCommand.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Services;\nusing EnvDTE80;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Windows.Forms;\n\nnamespace ClangPowerToolsShared.MVVM.Commands\n{\n  public static class TidyDiffCommand\n  {\n    public static void TidyFixDiff(string filePath, bool makeDiff = true)\n    {\n\n      SettingsPathBuilder settingsPathBuilder = new SettingsPathBuilder();\n      var clangTidyPath = settingsPathBuilder.GetCurrentExecutableLlvmPath();\n      try\n      {\n        FileInfo file = new(filePath);\n        var copyFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"Temp\", file.Name);\n        File.Copy(file.FullName, copyFile, true);\n        System.Diagnostics.Process process = new();\n        process.StartInfo.FileName = clangTidyPath;\n        process.StartInfo.CreateNoWindow = true;\n        process.StartInfo.UseShellExecute = false;\n        process.StartInfo.Arguments = $\"-fix \\\"{file.FullName}\\\"\";\n        process.Start();\n        process.WaitForExit();\n        if (makeDiff)\n          DiffFilesUsingDefaultTool(copyFile, file.FullName);\n        //File.Delete(copyFile);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Tidy-Diff Failed - you do not have an llvm set\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n\n    }\n\n    public static void CopyFileInTemp(string filePath)\n    {\n      FileInfo file = new(filePath);\n      var copyFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"Temp\", file.Name);\n      File.Copy(file.FullName, copyFile, true);\n    }\n\n    public static void CopyFilesInTemp(List<string> filePaths)\n    {\n      foreach(var path in filePaths)\n      {\n        FileInfo file = new(path);\n        var copyFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"Temp\", file.Name);\n        File.Copy(file.FullName, copyFile, true);\n      }\n    }\n\n    public static void DiffFilesUsingDefaultTool(string file1, string file2)\n    {\n      object args = $\"\\\"{file1}\\\" \\\"{file2}\\\"\";\n      var dte = VsServiceProvider.GetService(typeof(DTE2)) as DTE2;\n      dte.Commands.Raise(TidyConstants.ToolsDiffFilesCmd, TidyConstants.ToolsDiffFilesId, ref args, ref args);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Commands/VSThemeCommand.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Constants;\nusing Microsoft.VisualStudio.Shell;\nusing System.Linq;\n\nnamespace ClangPowerToolsShared.MVVM.Commands\n{\n  public static class VSThemeCommand\n  {\n    private const string darkThemeVs2022 = \"4294638330\";\n    private const string darkThemeVs2019 = \"4294046193\";\n    private const string textColorKey = \"ToolWindowTextColorKey\";\n\n    public static VsThemes GetCurrentVsTheme()\n    {\n      var colorValues = VsColors.GetCurrentThemedColorValues();\n      var cvPair = colorValues.Where(a => a.Key.ToString() == textColorKey).FirstOrDefault();\n      if ((cvPair.Value.ToString() == darkThemeVs2022) || (cvPair.Value.ToString() == darkThemeVs2019))\n        return VsThemes.Dark;\n      return VsThemes.Light;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetDiscardFixIconEnabled()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.DiscardFixDark;\n      else\n        return IconResourceConstants.DiscardFixLight;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetTidyFixIconEnabled()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.FixDark;\n      else\n        return IconResourceConstants.FixLight;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetRefreshTidyIconEnabled()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.RefreshTidyDark;\n      else\n        return IconResourceConstants.RefreshTidyLight;\n    }\n\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetUnpinIcon()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.UnpinDark;\n      else\n        return IconResourceConstants.UnpinLight;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetPinIcon()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.PinDark;\n      else\n        return IconResourceConstants.PinLight;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetIgnoreIconEnabled()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.RemoveDark;\n      else\n        return IconResourceConstants.RemoveLight;\n    }\n\n    /// <summary>\n    /// Get corresponding icon to visual studio theme\n    /// </summary>\n    public static string GetDiffIconEnabled()\n    {\n      if (VSThemeCommand.GetCurrentVsTheme() == VsThemes.Dark)\n        return IconResourceConstants.DiffDark;\n      else\n        return IconResourceConstants.DiffLight;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/CommonSettingsFunctionality.cs",
    "content": "using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Models;\nusing Microsoft.Win32;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClangPowerTools\n{\n  public abstract class CommonSettingsFunctionality\n  {\n    #region Methods\n\n    protected string OpenFile(string fileName, string defaultExt, string filter)\n    {\n      OpenFileDialog openFileDialog = new OpenFileDialog();\n      string path = string.Empty;\n\n      openFileDialog.FileName = fileName;\n      openFileDialog.DefaultExt = defaultExt;\n      openFileDialog.Filter = filter;\n\n      bool? result = openFileDialog.ShowDialog();\n\n      if (result == true)\n      {\n        string filename = openFileDialog.FileName;\n        path = filename;\n      }\n      return path;\n    }\n\n    protected string[] OpenFiles(string fileName, string defaultExt, string filter)\n    {\n      OpenFileDialog openFileDialog = new OpenFileDialog();\n\n      openFileDialog.FileName = fileName;\n      openFileDialog.DefaultExt = defaultExt;\n      openFileDialog.Filter = filter;\n      openFileDialog.Multiselect = true;\n\n      if (openFileDialog.ShowDialog() != true)\n        return null;\n\n      return openFileDialog.FileNames;\n    }\n\n\n    /// <summary>\n    /// Browse for folder from where the files path acording to the given seach instruction will be collected \n    /// </summary>\n    /// <param name=\"searchFilePattern\">Search pattern to apply in the file search</param>\n    /// <param name=\"searchOption\">Information about how to search inside the selected folder</param>\n    /// <returns>Array of files path</returns>\n    protected string[] BrowseForFolderFiles(string searchFilePattern, SearchOption searchOption)\n    {\n      using var folderBrowseDialog = new System.Windows.Forms.FolderBrowserDialog();\n      System.Windows.Forms.DialogResult result = folderBrowseDialog.ShowDialog();\n\n      if (result != System.Windows.Forms.DialogResult.OK || string.IsNullOrWhiteSpace(folderBrowseDialog.SelectedPath))\n        return null;\n\n      return Directory.GetFiles(folderBrowseDialog.SelectedPath, searchFilePattern, searchOption);\n    }\n\n\n    /// <summary>\n    /// Browse for folder path \n    /// </summary>\n    /// <param name=\"searchFilePattern\">Search pattern to apply in the file search</param>\n    /// <param name=\"searchOption\">Information about how to search inside the selected folder</param>\n    /// <returns>Path to the selected folder</returns>\n    protected string BrowseForFolderFiles()\n    {\n      using var folderBrowseDialog = new System.Windows.Forms.FolderBrowserDialog();\n      System.Windows.Forms.DialogResult result = folderBrowseDialog.ShowDialog();\n\n      if (result != System.Windows.Forms.DialogResult.OK || string.IsNullOrWhiteSpace(folderBrowseDialog.SelectedPath))\n        return null;\n\n      return folderBrowseDialog.SelectedPath;\n    }\n\n    protected string SaveFile(string fileName, string defaultExt, string filter)\n    {\n      SaveFileDialog saveFileDialog = new SaveFileDialog();\n      string path = string.Empty;\n\n      // Set the default file extension\n      saveFileDialog.FileName = fileName;\n      saveFileDialog.DefaultExt = defaultExt;\n      saveFileDialog.Filter = filter;\n\n      //Display the dialog window\n      bool? result = saveFileDialog.ShowDialog();\n\n      if (result == true)\n      {\n        path = saveFileDialog.FileName;\n      }\n\n      return path;\n    }\n\n    protected void WriteContentToFile(string path, string content)\n    {\n      FileSystem.WriteContentToFile(path, content);\n    }\n\n    protected string OpenContentDialog(string content, bool showFilesPicker = false, bool showFolderPicker = false)\n    {\n      InputDataViewModel inputDataViewModel = new InputDataViewModel(content, showFilesPicker, showFolderPicker);\n      inputDataViewModel.ShowViewDialog();\n      string input = CreateInput(inputDataViewModel.Inputs.ToList());\n\n      return input;\n    }\n\n    private string CreateInput(List<InputDataModel> models)\n    {\n      StringBuilder sb = new StringBuilder();\n\n      foreach (var item in models)\n      {\n        if (string.IsNullOrWhiteSpace(item.InputData) == false)\n          sb.Append(item.InputData).Append(\";\");\n      }\n\n      if (sb.Length > 0)\n        sb.Length--;\n\n      return sb.ToString();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/CPPKeywords.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.MVVM.Constants\n{\n  public static class CPPKeywords\n  {\n    public static HashSet<string> keywords = new HashSet<string>()\n    {\n      \"asm\",\n      \"else\",\n      \"new\",\n      \"this\",\n      \"auto\",\n      \"enum\",\n      \"operator\",\n      \"throw\",\n      \"bool\",\n      \"explicit\",\n      \"private\",\n      \"true\",\n      \"break\",\n      \"export\",\n      \"protected\",\n      \"try\",\n      \"case\",\n      \"extern\",\n      \"public\",\n      \"typedef\",\n      \"catch\",\n      \"false\",\n      \"register\",\n      \"typeid\",\n      \"char\",\n      \"float\",\n      \"reinterpret_cast\",\n      \"typename\",\n      \"class\",\n      \"for\",\n      \"if\",\n      \"int\",\n      \"double\",\n      \"void\",\n      \"return\",\n      \"do\",\n      \"switch\",\n      \"while\",\n      \"And\",\n      \"bitor\",\n      \"not_eq\",\n      \"xor\",\n      \"and_eq\",\n      \"compl\",\n      \"or\",\n      \"xor_eq\",\n      \"bitand\",\n      \"not\",\n      \"or_eq\",\n      \"union\",\n      \"const\",\n      \"static\",\n      \"short\",\n      \"unsigned\",\n      \"const_cast\",\n      \"goto\",\n      \"signed\",\n      \"using\",\n      \"continue\",\n      \"sizeof\",\n      \"virtual\",\n      \"default\",\n      \"inline\",\n      \"delete\",\n      \"static_cast\",\n      \"volatile\",\n      \"long\",\n      \"struct\",\n      \"wchar_t\",\n      \"mutable\",\n      \"dynamic_cast\",\n      \"namespace\",\n      \"friend\",\n      \"template\"\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/ComboBoxConstants.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Converters;\nusing System;\nusing System.ComponentModel;\nusing System.Runtime.Serialization;\nusing System.Xml.Serialization;\n\nnamespace ClangPowerTools\n{\n  [Serializable]\n  [JsonConverter(typeof(StringEnumConverter))]\n  public enum ClangFormatStyle\n  {\n    [EnumMember(Value = \"file\")]\n    file = 0,\n    [EnumMember(Value = \"Chromium\")]\n    Chromium,\n    [EnumMember(Value = \"Google\")]\n    Google,\n    [EnumMember(Value = \"LLVM\")]\n    LLVM,\n    [EnumMember(Value = \"Microsoft\")]\n    Microsoft,\n    [EnumMember(Value = \"Mozilla\")]\n    Mozilla,\n    [EnumMember(Value = \"WebKit\")]\n    WebKit\n  }\n\n  [Serializable]\n  [JsonConverter(typeof(StringEnumConverter))]\n  public enum ClangFormatFallbackStyle\n  {\n    [EnumMember(Value = \"none\")]\n    none = 0,\n    [EnumMember(Value = \"Chromium\")]\n    Chromium,\n    [EnumMember(Value = \"Google\")]\n    Google,\n    [EnumMember(Value = \"LLVM\")]\n    LLVM,\n    [EnumMember(Value = \"Microsoft\")]\n    Microsoft,\n    [EnumMember(Value = \"Mozilla\")]\n    Mozilla,\n    [EnumMember(Value = \"WebKit\")]\n    WebKit\n  }\n\n  [Serializable]\n  [JsonConverter(typeof(StringEnumConverter))]\n  public enum ClangGeneralAdditionalIncludes\n  {\n    [XmlEnum(Name = \"include directories\")]\n    [EnumMember(Value = \"IncludeDirectories\")]\n    IncludeDirectories,\n\n    [XmlEnum(Name = \"system include directories\")]\n    [EnumMember(Value = \"SystemIncludeDirectories\")]\n    SystemIncludeDirectories\n  }\n\n  [Serializable]\n  [JsonConverter(typeof(StringEnumConverter))]\n  public enum ClangTidyUseChecksFrom\n  {\n    [XmlEnum(Name = \"predefined checks\")]\n    [EnumMember(Value = \"PredefinedChecks\")]\n    PredefinedChecks,\n\n    [XmlEnum(Name = \"custom checks\")]\n    [EnumMember(Value = \"CustomChecks\")]\n    CustomChecks,\n\n    [XmlEnum(Name = \".clang-tidy config file\")]\n    [EnumMember(Value = \"TidyFile\")]\n    TidyFile\n  }\n\n  [Serializable]\n  public enum ToggleValues\n  {\n    [XmlEnum(Name = \"true\")]\n    [EnumMember(Value = \"true\")]\n    True,\n    [XmlEnum(Name = \"false\")]\n    [EnumMember(Value = \"false\")]\n    False\n  }\n\n  public sealed class ComboBoxConstants\n  {\n    #region Constants\n\n    public const string kCustomChecks = \"custom checks\";\n    public const string kPredefinedChecks = \"predefined checks\";\n    public const string kTidyFile = \".clang-tidy config file\";\n\n    public const string kDefaultHeaderFilter = \".*\";\n    public const string kCorrespondingHeaderValue = \"_\";\n    public const string kCorrespondingHeaderName = \"Corresponding Header\";\n\n    public const string kNone = \"none\";\n    public const string kFile = \"file\";\n    public const string kChromium = \"Chromium\";\n    public const string kGoogle = \"Google\";\n    public const string kLLVM = \"LLVM\";\n    public const string kMozilla = \"Mozilla\";\n    public const string kWebKit = \"WebKit\";\n\n    public const string kIncludeDirectories = \"include directories\";\n    public const string kSystemIncludeDirectories = \"system include directories\";\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/EncodingConstants.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Constants\n{\n  public static class EncodingConstants\n  {\n    public const string InstallExeParameters = \"RunPowerShellCommand Extension\";\n    public const string UninstallExeParameters = \"RunPowerShellCommand Visual Studio Extension Detailed Info\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/FormatEditorConstants.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public static class FormatEditorConstants\n  {\n    public const string ExecutableName = \"ClangFormatEditor.exe\";\n    public const string ClangFormatEditorFolder = \"ClangFormatEditor\";\n    public const string UpdaterParameter = \" VisualStudio\";\n    public const string ClangFormatEditor = \"Clang Format Editor\";\n    public const string FrameworkdUrlDownload = @\"https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-desktop-5.0.2-windows-x86-installer\";\n    public const string FrameworkPath = @\"C:\\Program Files (x86)\\dotnet\\shared\\Microsoft.WindowsDesktop.App\";\n    public const string ClangFormatExe = \"clang-format.exe\";\n    public const string ClangFormatMsi = \"Clang Format Editor.msi\";\n    public const string SetupFailed = \"Clang-Format Setup Failed\";\n    public static string ClangFormatEditorPath { get; } = Path.Combine(Environment.ExpandEnvironmentVariables(\"%ProgramFiles(x86)%\"), \"Caphyon\", ClangFormatEditor);\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/IconResourceConstants.cs",
    "content": "﻿using System.IO;\n\nnamespace ClangPowerToolsShared.MVVM.Constants\n{\n  public static class IconResourceConstants\n  {\n    private static DirectoryInfo directoryPath = new DirectoryInfo(Directory.GetCurrentDirectory());\n    public static string PinDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CTP]Pinned_dark.png\";\n    public static string PinLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Pinned.png\";\n\n    public static string UnpinDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CTP]UnPinned_dark.png\";\n    public static string UnpinLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]UnPinned.png\";\n\n    public static string RefreshTidyDark { get; } =  @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Refresh_dark.png\";\n    public static string RefreshTidyLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Refresh-Tidy.png\";\n    public static string RefreshDisabled { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Refresh_disabled.png\";\n\n    public static string DiffDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Diff_dark.png\";\n    public static string DiffLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Diff2.png\";\n    public static string DiffDisabled { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Diff_disabled.png\";\n\n    public static string FixDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Fix_dark.png\";\n    public static string FixLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Fix.png\";\n    public static string FixDisabled { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Fix_disabled.png\";\n\n    public static string RemoveDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Remove_dark.png\";\n    public static string RemoveLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Remove.png\";\n    public static string RemoveDisabled { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]Remove_disabled.png\";\n\n    public static string DiscardFixDark { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]RemoveFix_dark.png\";\n    public static string DiscardFixLight { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]RemoveFix.png\";\n    public static string DiscardFixDisabled { get; } = @\"/ClangPowerTools;component/Resources/TidyToolWindow/[CPT]RemoveFix_disabled.png\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LLVMVersionsAlternate.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public static class LlvmVersionsAlternate\n  {\n    public static List<string> VersionAlternateUri { get; } = new List<string>\n    {\n      \"21.1.6\",\n      \"20.1.8\",\n      \"20.1.0\",\n      \"19.1.7\",\n      \"19.1.0\",\n      \"18.1.8\",\n      \"18.1.2\",\n      \"17.0.1\",\n      \"16.0.6\",\n      \"16.0.0\",\n      \"15.0.7\",\n      \"15.0.4\",\n      \"15.0.0\",\n      \"14.0.6\",\n      \"14.0.3\",\n      \"14.0.0\",\n      \"13.0.1\"\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LlvmConstants.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Constants\n{\n  public static class LlvmConstants\n  {\n    public const string InstallExeParameters = \"/S /D=\";\n    public const string UninstallExeParameters = \"/S\";\n    public const string Arguments = @\"/C reg delete HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\LLVM /f &\";\n    public const string ProcessFileName = \"cmd.exe\";\n    public const string ProcessVerb = \"runas\";\n    public const string ReleasesUri = @\"http://releases.llvm.org\";\n    public const string GitHubUri = @\"https://github.com/llvm/llvm-project/releases/download\";\n    public const string Llvm = \"LLVM\";\n    public const string Uninstall = \"Uninstall\";\n    public const string Os64Paramater = \"-win64.exe\";\n    public const string Os32Paramater = \"-win32.exe\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/LlvmVersions.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public static class LlvmVersions\n  {\n    public static List<string> Versions { get; } = new List<string>\n    {\n      \"21.1.6\",\n      \"20.1.8\",\n      \"20.1.0\",\n      \"19.1.7\",\n      \"19.1.0\",\n      \"18.1.8\",\n      \"18.1.2\",\n      \"17.0.1\",\n      \"16.0.6\",\n      \"16.0.0\",\n      \"15.0.7\",\n      \"15.0.4\",\n      \"15.0.0\",\n      \"14.0.6\",\n      \"14.0.3\",\n      \"14.0.0\",\n      \"13.0.1\"\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/MatchConstants.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System.Collections.Generic;\n\nnamespace ClangPowerToolsShared.MVVM.Constants\n{\n  /// <summary>\n  /// AST Matchers\n  /// </summary>\n  public static class MatchConstants\n  {\n    /// <summary>\n    /// Match a called expersion with a default argument on a position.\n    /// Replace {0} with expersion name.\n    /// Replace {1} with position of default arg\n    /// </summary>\n    public const string CalledExprDefaultArg = \"match callExpr(callee(functionDecl(hasName(\\\"{0}\\\"))), hasArgument({1}, cxxDefaultArgExpr()))\";\n\n    /// <summary>\n    /// Diagnostic mode can be re-entered with set output diag for source code exploration\n    /// </summary>\n    public const string SetOutpuDump = \"set output dump\";\n\n  }\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/PathConstants.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing System;\nusing System.IO;\n\nnamespace ClangPowerToolsShared.MVVM.Constants\n{\n  public static class PathConstants\n  {\n    public static string CacheRepositoryPath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"CacheRepository\");\n    public static string LlvmLitePath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"LLVM_Lite\");\n\n    public static string SolutionDirPath\n    {\n      get\n      {\n        var dte2 = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n        var solution = dte2.Solution.FullName;\n        return new FileInfo(solution).Directory.FullName;\n      }\n    }\n\n    private static string vcxprojPath = string.Empty;\n    public static string VcxprojPath\n    {\n      get\n      {\n        if (vcxprojPath == string.Empty)\n        {\n          ItemsCollector itemsCollector = new();\n          var items = itemsCollector.CollectActiveProjectItem();\n          if (items is not null && items[0] is not null)\n          {\n            var projectItem = items[0].GetObject() as ProjectItem;\n            vcxprojPath = projectItem.ContainingProject.FullName;\n\n          }\n        }\n        return vcxprojPath;\n      }\n    }\n\n    public static string GetPathToFindCommands\n    {\n      get\n      {\n        return Path.Combine(SolutionDirPath, \"commands_find.txt\");\n      }\n    }\n\n    public static string JsonCompilationDBPath\n    {\n      get\n      {\n        return Path.Combine(SolutionDirPath, \"compile_commands.json\");\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/PsUpdaterConstants.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.MVVM.Constants\n{\n  public static class PsUpdaterConstants\n  {\n    public const string PowerShellScriptsFolder = \"PowerShellScripts\";\n    public const string ToolingFolder = \"Tooling\";\n    public const string V1Folder = \"v1\";\n    public const string PsClangFolder = \"psClang\";\n    public const string ClangBuildScript = \"clang-build.ps1\";\n    public const string GitHubUri = @\"https://raw.githubusercontent.com/Caphyon/clang-power-tools/master/ClangPowerTools/ClangPowerToolsShared/Tooling/v1/\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/ResourceConstants.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Constants\n{\n  public static class ResourceConstants\n  {\n    public const string DeselectAllTooltipText = \"Deselect all\";\n    public const string EncodingError = \"encoding is not supported\";\n    public const string SelectAllTooltipText = \"Select all\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/ThemeConstants.cs",
    "content": "﻿namespace ClangPowerToolsShared.MVVM.Constants\n{\n  public enum VsThemes\n  {\n    Dark,\n    Light\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/TidyConstants.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public static class TidyConstants\n  {\n\n    public static string FlagsUri { get; } = @\"https://clang.llvm.org/extra/clang-tidy/checks/\";\n    // This is the guid and id for the Tools.DiffFiles command\n    public static string ToolsDiffFilesCmd { get; } = \"{5D4C0442-C0A2-4BE8-9B4D-AB1C28450942}\";\n    public static int ToolsDiffFilesId { get; } = 256;\n    public static string LongFilePrefix { get; } = @\"\\\\?\\\";\n    public static string SolutionTempGuid { get; } = Guid.NewGuid().ToString();\n    public static string TempsFolderPath { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"ClangPowerTools\", \"Temp\");\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Constants/UIElementsConstants.cs",
    "content": "﻿namespace ClangPowerToolsShared.MVVM.Constants\n{\n  public static class UIElementsConstants\n  {\n    public static string Hidden { get; } = \"Hidden\";\n    public static string Visibile { get; } = \"Visible\";\n    public static string Pin { get; } = \"Pin\";\n    public static string Unpin { get; } = \"Unpin\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/AccountController.cs",
    "content": "﻿using ClangPowerTools.MVVM.WebApi;\nusing Newtonsoft.Json;\nusing System;\nusing System.IO;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.Controllers\n{\n  public class AccountController\n  {\n    #region Public Methods\n\n    public async Task<bool> LoginAsync(UserModel userModel)\n    {\n      try\n      {\n        HttpResponseMessage userAccoutHttpRestul = await GetUserAccountHttpRestulAsync(userModel);\n\n        if (userAccoutHttpRestul.IsSuccessStatusCode)\n        {\n          TokenModel tokenModel = JsonConvert.DeserializeObject<TokenModel>(await userAccoutHttpRestul.Content.ReadAsStringAsync());\n\n          if (string.IsNullOrWhiteSpace(tokenModel.jwt))\n            return false;\n\n          SaveToken(tokenModel.jwt);\n          return true;\n        }\n        else\n        {\n          return false;\n        }\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private async Task<HttpResponseMessage> GetUserAccountHttpRestulAsync(UserModel userModel)\n    {\n      using StringContent content = new StringContent(SeralizeUserModel(userModel), Encoding.UTF8, \"application/json\");\n      return await ApiUtility.ApiClient.PostAsync(WebApiUrl.loginUrl, content);\n    }\n\n    private void SaveToken(string token)\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      string filePath = settingsPathBuilder.GetPath(\"ctpjwt\");\n      DeleteExistingToken(filePath);\n\n      using var streamWriter = new StreamWriter(filePath);\n      streamWriter.WriteLine(token);\n      File.SetAttributes(filePath, File.GetAttributes(filePath) | FileAttributes.Hidden);\n    }\n\n    private void DeleteExistingToken(string filePath)\n    {\n      if (File.Exists(filePath))\n      {\n        File.Delete(filePath);\n      }\n    }\n\n    private string SeralizeUserModel(UserModel userModel)\n    {\n      string jsonObject = JsonConvert.SerializeObject(userModel);\n      userModel.Dispose();\n      return jsonObject;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/FindController.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Views;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing Newtonsoft.Json;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\n\nnamespace ClangPowerToolsShared.MVVM.Controllers\n{\n  public class FindController : INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n    protected FindToolWindowView findToolWindowView;\n    protected FindToolWindowModel findToolWindowModel = new();\n    private Dictionary<string, string> pathCommandPairs = new();\n    private List<string> commands = new();\n    private string pathToClangQuery;\n    private string mInteractiveModeDocumentName = string.Empty;\n    private int mInteractiveModeDocumentHash = 0;\n\n    public List<MenuItem> MenuOptions\n    {\n      get\n      {\n        return LookInMenuController.MenuOptions;\n      }\n    }\n\n    public MenuItem SMenuOption\n    {\n      get\n      {\n        return LookInMenuController.MenuOptions.Last();\n      }\n    }\n\n\n    public FindToolWindowModel FindToolWindowModel\n    {\n      get { return findToolWindowModel; }\n      set\n      {\n        findToolWindowModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FindToolWindowModel\"));\n      }\n    }\n    public FindController()\n    {\n      pathToClangQuery = string.Empty;\n    }\n\n    public void LaunchCommand()\n    {\n      if (pathToClangQuery == string.Empty)\n        GetPathToClangQuery();\n\n      if (commands.Count > 0)\n        commands.Clear();\n\n      commands.Add(MatchConstants.SetOutpuDump);\n\n      switch (findToolWindowModel.CurrentViewMatcher.Id)\n      {\n        case FindCommandIds.kDefaultArgsId:\n          {\n            commands.Add(MatchConstants.CalledExprDefaultArg.Replace(\"{0}\", findToolWindowModel.DefaultArgsModel\n                        .FunctionName).Replace(\"{1}\", findToolWindowModel.DefaultArgsModel.DefaultArgsPosition.ToString()));\n            break;\n          }\n        case FindCommandIds.kCustomMatchesId:\n          {\n            if ((findToolWindowModel.CustomMatchesModel.Matchers.Length > 0 && findToolWindowModel.CustomMatchesModel.Matchers[0] == 'm'))\n            {\n              commands.Add(findToolWindowModel.CustomMatchesModel.Matchers);\n            }\n            else\n            {\n              commands.Add(\"m \" + findToolWindowModel.CustomMatchesModel.Matchers);\n            }\n            break;\n          }\n        default:\n          break;\n      }\n    }\n\n    public void RunPowershellQuery()\n    {\n      using (StreamWriter sw = File.AppendText(PathConstants.GetPathToFindCommands))\n      {\n        foreach (var command in commands)\n        {\n          sw.WriteLine(command);\n        }\n      }\n      DisplayMessageBeforeFind();\n      if (LookInMenuController.GetSelectedMenuItem().LookInMenu == LookInMenu.CurrentActiveDocument)\n      {\n        pathCommandPairs = GetCommandForPowershellInteractiveMode(pathToClangQuery);\n        CheckFileNameActiveInteractiveMode(pathCommandPairs.First().Key);\n        PowerShellWrapper.InvokeInteractiveMode(pathCommandPairs.First());\n      }\n      else\n      {\n        pathCommandPairs = GetCommandForPowershell(pathToClangQuery);\n        PowerShellWrapper.InvokePassSequentialCommands(pathCommandPairs);\n      }\n      DisplayMessageAfterFind();\n      File.Delete(PathConstants.GetPathToFindCommands);\n    }\n\n    private void DisplayMessageAfterFind()\n    {\n      CommandControllerInstance.CommandController.DisplayMessage(false, \"\\nⒾ Find all matches in Error List -> Ⓘ Messages \\nMake sure that [Build + IntelliSense] is selected\\n\");\n    }\n\n    private void DisplayMessageBeforeFind()\n    {\n      CommandControllerInstance.CommandController.DisplayMessage(false, \"\\n⌛ Please wait ...\\n\");\n\n      // 1 - verbose\n      if (SettingsProvider.CompilerSettingsModel.VerbosityLevel != \"1\")\n        CommandControllerInstance.CommandController.DisplayMessage(false, \"\\nYou can select verbose mode to see the\" +\n          \" complete output. Settings -> Compile -> Verbosity level\\n\");\n    }\n\n    protected void BeforeCommand()\n    {\n      findToolWindowModel.IsRunning = true;\n      FindToolWindowModel = findToolWindowModel;\n    }\n\n    protected void AfterCommand()\n    {\n      findToolWindowModel.IsRunning = false;\n      FindToolWindowModel = findToolWindowModel;\n    }\n\n    private void GetPathToClangQuery()\n    {\n      if (pathToClangQuery == string.Empty)\n      {\n        pathToClangQuery = PowerShellWrapper.DownloadTool(ScriptConstants.kQueryFile);\n        pathToClangQuery = Path.Combine(pathToClangQuery, ScriptConstants.kQueryFile);\n      }\n    }\n\n    private class FileCompilationDB\n    {\n      public string file { get; set; }\n    }\n\n    private Dictionary<string, string> GetCommandForPowershell(string pathToBinary)\n    {\n      string compilationDatabaseContent = string.Empty;\n      if (File.Exists(PathConstants.JsonCompilationDBPath))\n      {\n        compilationDatabaseContent = File.ReadAllText(PathConstants.JsonCompilationDBPath);\n      }\n      List<FileCompilationDB> files = JsonConvert.DeserializeObject<List<FileCompilationDB>>(compilationDatabaseContent);\n\n      Dictionary<string, string> commands = new();\n      foreach (var path in files.Select(a => a.file).ToList())\n      {\n        var command = $\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive \" +\n        $\"-command \\\" & '{pathToBinary}'  '{path}' \" +\n        $\"-p '{PathConstants.JsonCompilationDBPath}' \" +\n        $\"-f '{PathConstants.GetPathToFindCommands}' \\\"\";\n        if (!commands.ContainsKey(path))\n          commands.Add(path, command);\n      }\n      return commands;\n    }\n\n    private void CheckFileNameActiveInteractiveMode(string aFileName)\n    {\n      bool modifedFile = false;\n      if(File.Exists(aFileName))\n      {\n        int contentHash = File.ReadAllText(aFileName).GetHashCode();\n        if (contentHash != mInteractiveModeDocumentHash)\n          modifedFile = true;\n        mInteractiveModeDocumentHash = contentHash;\n      }\n\n      if (!string.IsNullOrEmpty(mInteractiveModeDocumentName) \n        && (mInteractiveModeDocumentName != aFileName || modifedFile))\n        PowerShellWrapper.EndInteractiveMode();\n      mInteractiveModeDocumentName = aFileName;\n    }\n\n    private Dictionary<string, string> GetCommandForPowershellInteractiveMode(string pathToBinary)\n    {\n      string compilationDatabaseContent = string.Empty;\n      if (File.Exists(PathConstants.JsonCompilationDBPath))\n      {\n        compilationDatabaseContent = File.ReadAllText(PathConstants.JsonCompilationDBPath);\n      }\n      List<FileCompilationDB> files = JsonConvert.DeserializeObject<List<FileCompilationDB>>(compilationDatabaseContent);\n\n      Dictionary<string, string> commands = new();\n      foreach (var path in files.Select(a => a.file).ToList())\n      {\n        var command = $\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive \" +\n        $\"-command \\\"& '{pathToBinary}'  '{path}' \" +\n        $\"-p '{PathConstants.JsonCompilationDBPath}' \\\"\";\n        if (!commands.ContainsKey(path))\n          commands.Add(path, command);\n      }\n      return commands;\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/FormatEditorController.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System;\nusing System.ComponentModel.Design;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Windows;\n\nnamespace ClangPowerTools\n{\n  public class FormatEditorController\n  {\n    #region Members\n\n    public static Process EditorProcess;\n\n    private static string vsixPath;\n\n    #endregion \n\n    #region Constructor\n\n    public FormatEditorController()\n    {\n      vsixPath = Path.GetDirectoryName(GetType().Assembly.Location);\n      CreateEditorDirectory();\n    }\n\n    #endregion\n\n    #region Methods\n\n    public void OpenEditor()\n    {\n      try\n      {\n        EditorProcess = new Process();\n        EditorProcess.StartInfo.FileName = Path.Combine(FormatEditorConstants.ClangFormatEditorPath,\n        FormatEditorConstants.ExecutableName);\n        EditorProcess.Start();\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, FormatEditorConstants.ClangFormatEditor, MessageBoxButton.OK, MessageBoxImage.Error);\n      }\n    }\n\n    //Install Clang Format Editor if this is not already installed\n    public void InstallClangFormatEditorSilent()\n    {\n      if (File.Exists(Path.Combine(FormatEditorConstants.ClangFormatEditorPath,\n        FormatEditorConstants.ExecutableName)))\n        return;\n      try\n      {\n        EditorProcess = new Process();\n        EditorProcess.StartInfo.FileName = \"msiexec.exe\";\n        EditorProcess.StartInfo.Arguments = $\" /i \\\"{Path.Combine(vsixPath, FormatEditorConstants.ClangFormatMsi)}\\\" /qn \";\n        EditorProcess.StartInfo.UseShellExecute = true;\n        EditorProcess.StartInfo.Verb = \"runas\";\n        EditorProcess.Start();\n        EditorProcess.WaitForExit();\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, FormatEditorConstants.ClangFormatEditor, MessageBoxButton.OK, MessageBoxImage.Error);\n      }\n    }\n\n    private static void CreateEditorDirectory()\n    {\n      var appDataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), FormatEditorConstants.ClangFormatEditorFolder);\n      try\n      {\n        FileSystem.CreateDirectory(appDataDirectory);\n        File.Copy(Path.Combine(vsixPath, FormatEditorConstants.ClangFormatExe),\n                  Path.Combine(appDataDirectory, FormatEditorConstants.ClangFormatExe), true);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, FormatEditorConstants.SetupFailed, MessageBoxButton.OK, MessageBoxImage.Error);\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/FreeTrialController.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System;\n\nnamespace ClangPowerTools.MVVM.Controllers\n{\n  public class FreeTrialController\n  {\n    #region Members\n\n    private readonly RegistryUtility registryUtility;\n\n    private readonly string registryName = @\"Software\\Caphyon\\Clang Power Tools\";\n    private readonly string keyName = \"DateTimeT\";\n    private readonly int trialDays = 14;\n    private readonly string expiredDate = \"9/12/2002 7:52:51 PM\";\n\n    #endregion\n\n    #region Constructor\n\n    public FreeTrialController() => registryUtility = new RegistryUtility(registryName);\n\n    #endregion\n\n    #region Public Methods\n\n    public bool Start() => registryUtility.WriteCurrentUserKey(keyName, DateTime.Now.ToString());\n\n    public bool MarkAsExpired() => registryUtility.WriteCurrentUserKey(keyName, expiredDate);\n\n    public string GetStartTime()\n    {\n      if (WasEverInTrial() == false)\n        return string.Empty;\n\n      return registryUtility.ReadCurrentUserKey(keyName);\n    }\n\n    public string GetExpirationDateAsString()\n    {\n      var freeTrialStartTimeAsString = GetStartTime();\n      if (string.IsNullOrWhiteSpace(freeTrialStartTimeAsString))\n        return string.Empty;\n\n      if (WasEverInTrial() == false)\n        return string.Empty;\n\n      var freeTrialStartTime = DateTime.Parse(freeTrialStartTimeAsString);\n      var expirationDate = freeTrialStartTime.AddDays(trialDays);\n\n      return expirationDate.ToString();\n    }\n\n    public bool IsActive()\n    {\n      var freeTrialStartTimeAsString = GetStartTime();\n\n      if (string.IsNullOrWhiteSpace(freeTrialStartTimeAsString))\n        return false;\n\n      var freeTrialStartTime = DateTime.Parse(freeTrialStartTimeAsString);\n\n      return DateTime.Now.Subtract(freeTrialStartTime).Days <= trialDays;\n    }\n\n    public bool WasEverInTrial() => registryUtility.Exists() &&\n                                    !string.IsNullOrWhiteSpace(registryUtility.ReadCurrentUserKey(keyName));\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/LicenseController.cs",
    "content": "﻿using ClangPowerTools.MVVM.LicenseValidation;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.Controllers\n{\n  public class LicenseController\n  {\n\n    #region Public Methods\n\n    public async Task<LicenseType> GetUserLicenseTypeAsync()\n    {\n      if (await new CommercialLicenseValidator().ValidateAsync())\n        return LicenseType.Commercial;\n\n      if (await new PersonalLicenseValidator().ValidateAsync())\n        return LicenseType.Personal;\n\n      if (new FreeTrialController().IsActive())\n        return LicenseType.Trial;\n\n      if (await new LocalLicenseValidator().ValidateAsync())\n        return LicenseType.SessionExpired;\n\n      return LicenseType.NoLicense;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/LlvmController.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Constants;\nusing ClangPowerTools.MVVM.Interfaces;\nusing System;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Net;\nusing System.Threading;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools.MVVM.Controllers\n{\n  public class LlvmController : IDownload, IInstall\n  {\n    #region Members\n\n    public LlvmModel llvmModel = new LlvmModel();\n    public CancellationTokenSource downloadCancellationToken = new CancellationTokenSource();\n\n    public delegate void OnOperationCanceled();\n    public event OnOperationCanceled OnOperationCanceldEvent;\n\n    private Process process;\n    private readonly SettingsPathBuilder settingsPathBuilder = new SettingsPathBuilder();\n    \n    private const string registryLlvmUninstall = @\"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\LLVM\";\n    private const string keyDisplayVersion = \"DisplayVersion\";\n    private const string registryLlvm = @\"SOFTWARE\\WOW6432Node\\LLVM\\LLVM\";\n    private const string keyInstallPath = \"\";\n\n    #endregion\n\n\n    #region Properties\n\n    public EventHandler InstallFinished { get; set; }\n    public EventHandler UninstallFinished { get; set; }\n    public CancelEventHandler SettingsWindowClosed { get; set; }\n\n    #endregion\n\n    #region Constructor\n\n    public LlvmController()\n    {\n      SettingsWindowClosed += WindowClosed;\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public string GetLlvmPathFromRegistry()\n    {\n      var registryUtility = new RegistryUtility(registryLlvm);\n      var path = registryUtility.ReadLocalMachineKey(keyInstallPath);\n\n      if (path == null) return string.Empty;\n\n      return Path.Combine(path, \"bin\");\n    }\n\n    public string GetVersionFromRegistry()\n    {\n      var registryUtility = new RegistryUtility(registryLlvmUninstall);\n      var version = registryUtility.ReadLocalMachineKey(keyDisplayVersion);\n\n      if (version == null) return string.Empty;\n\n      return version;\n    }\n\n    public void Download(string version, DownloadProgressChangedEventHandler method)\n    {\n      CreateVersionDirectory(version);\n\n      var llvmUri = new LlvmUri();\n      var executablePath = settingsPathBuilder.GetLlvmExecutablePath(version, LlvmConstants.Llvm + version);\n      var uri = string.Empty;\n\n      if (LlvmVersionsAlternate.VersionAlternateUri.Contains(version))\n      {\n        uri = llvmUri.GetGitHubUri(version);\n      }\n      else\n      {\n        uri = llvmUri.GetDefaultUri(version);\n      }\n\n      try\n      {\n        using var client = new WebClient();\n        client.DownloadProgressChanged += method;\n        client.DownloadFileCompleted += DownloadCompleted;\n        downloadCancellationToken.Token.Register(client.CancelAsync);\n        client.DownloadFileAsync(new Uri(uri), executablePath);\n      }\n      catch (Exception)\n      {\n        DownloadCanceled();\n      }\n    }\n\n    public void Install(string version)\n    {\n      var llVmVersionPath = settingsPathBuilder.GetLlvmPath(version);\n      var executablePath = settingsPathBuilder.GetLlvmExecutablePath(version, LlvmConstants.Llvm + version);\n      var startInfoArguments = string.Concat(LlvmConstants.Arguments, \" \", \"\\\"\", executablePath, \"\\\"\", \" \", LlvmConstants.InstallExeParameters, llVmVersionPath);\n\n      try\n      {\n        process = new Process();\n        process.StartInfo.FileName = LlvmConstants.ProcessFileName;\n        process.StartInfo.Arguments = startInfoArguments;\n        process.StartInfo.Verb = LlvmConstants.ProcessVerb;\n        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;\n        process.EnableRaisingEvents = true;\n        process.Exited += InstallProcessExited;\n        process.Exited += InstallFinished;\n        process.Start();\n\n      }\n      catch (Exception e)\n      {\n        DefaultState();\n        if (OnOperationCanceldEvent != null)\n          OnOperationCanceldEvent();\n        DeleteLlvmDirectory(llvmModel.Version);\n        MessageBox.Show(e.Message, \"Installation Failed\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    public void Uninstall(string version)\n    {\n      if (DoesUninstallExist(version) == false)\n      {\n        DeleteLlvmDirectory(version);\n        return;\n      }\n\n      try\n      {\n        process = new Process();\n        process.StartInfo.FileName = settingsPathBuilder.GetLlvmExecutablePath(version, LlvmConstants.Uninstall);\n        process.StartInfo.Arguments = LlvmConstants.UninstallExeParameters;\n        process.StartInfo.Verb = LlvmConstants.ProcessVerb;\n        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;\n        process.EnableRaisingEvents = true;\n        process.Exited += UninstallProcessExited;\n        process.Exited += UninstallFinished;\n        process.Start();\n      }\n      catch (Exception e)\n      {\n        InstallFinishedState();\n        if (OnOperationCanceldEvent != null)\n          OnOperationCanceldEvent();\n        MessageBox.Show(e.Message, \"Uninstall Failed\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    public bool IsVersionExeOnDisk(string version, string name)\n    {\n      var executablePath = settingsPathBuilder.GetLlvmExecutablePath(version, name);\n      return File.Exists(executablePath);\n    }\n\n    public void DownloadCompleted(object sender, AsyncCompletedEventArgs e)\n    {\n      if (downloadCancellationToken.IsCancellationRequested || llvmModel.DownloadProgress != llvmModel.MaxProgress)\n      {\n        DownloadCanceled();\n      }\n      else\n      {\n        BeginInstallation();\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void InstallFinishedState()\n    {\n      llvmModel.IsInstalled = true;\n      llvmModel.IsInstalling = false;\n    }\n\n    private void InstallingState()\n    {\n      llvmModel.IsInstalling = true;\n      llvmModel.IsDownloading = false;\n    }\n\n    private void DefaultState()\n    {\n      llvmModel.IsInstalled = false;\n      llvmModel.IsDownloading = false;\n      llvmModel.IsInstalling = false;\n    }\n\n    private void DownloadCanceled()\n    {\n      DefaultState();\n      if (OnOperationCanceldEvent != null)\n        OnOperationCanceldEvent();\n      DeleteLlvmDirectory(llvmModel.Version);\n      ResetDownloadProgressState();\n      MessageBox.Show(\"The download process has stopped.\", \"LLVM Download\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n    }\n\n    private void BeginInstallation()\n    {\n      InstallingState();\n      ResetDownloadProgressState();\n      Install(llvmModel.Version);\n    }\n\n    private void ResetDownloadProgressState()\n    {\n      llvmModel.DownloadProgress = 0;\n      downloadCancellationToken.Dispose();\n      downloadCancellationToken = new CancellationTokenSource();\n    }\n\n    private void InstallProcessExited(object sender, EventArgs e)\n    {\n      process.Close();\n      DeleteInstallerFile(llvmModel.Version);\n      InstallFinishedState();\n    }\n\n    private void UninstallProcessExited(object sender, EventArgs e)\n    {\n      process.Close();\n      DeleteLlvmDirectory(llvmModel.Version);\n      DefaultState();\n    }\n\n    private void WindowClosed(object sender, EventArgs e)\n    {\n      if (llvmModel.DownloadProgress > 0 && llvmModel.DownloadProgress != llvmModel.MaxProgress)\n      {\n        downloadCancellationToken.Cancel();\n      }\n      SettingsWindowClosed -= WindowClosed;\n    }\n\n    private void CreateVersionDirectory(string version)\n    {\n      var path = settingsPathBuilder.GetLlvmPath(version);\n      FileSystem.CreateDirectory(path);\n    }\n\n    private void DeleteLlvmDirectory(string version)\n    {\n      var path = settingsPathBuilder.GetLlvmPath(version);\n      FileSystem.DeleteDirectory(path);\n    }\n\n    private void DeleteInstallerFile(string version)\n    {\n      var exeName = string.Concat(LlvmConstants.Llvm, llvmModel.Version, \".exe\");\n      var path = Path.Combine(settingsPathBuilder.GetLlvmPath(version), exeName);\n      FileSystem.DeleteFile(path);\n    }\n\n    private bool DoesUninstallExist(string version)\n    {\n      return IsVersionExeOnDisk(version, LlvmConstants.Uninstall);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/LookInMenuController.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerToolsShared.Commands\n{\n  public static class LookInMenuController\n  {\n    private static MenuItem selectedMenuItem = new();\n\n    public static void SetSelectedOption(MenuItem menuItem)\n    {\n      selectedMenuItem = menuItem;\n    }\n\n    public static MenuItem GetSelectedMenuItem()\n    {\n      return selectedMenuItem;\n    }\n\n    public static List<MenuItem> MenuOptions\n    {\n      get\n      {\n        return new List<MenuItem>()\n        {\n          new MenuItem (\"Entire solution\", LookInMenu.EntireSolution),\n          new MenuItem (\"Current project\", LookInMenu.CurrentProject),\n          new MenuItem (\"Current active document\", LookInMenu.CurrentActiveDocument),\n        };\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Controllers/TidyToolWindowController.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels;\nusing EnvDTE80;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.MVVM.Controllers\n{\n  public class TidyToolWindowController\n  {\n    #region Properties\n\n    public ObservableCollection<FileModel> files = new ObservableCollection<FileModel>();\n    private List<FileModel> headers = new List<FileModel>();\n    public TidyToolWindowModel tidyToolWindowModel = new TidyToolWindowModel();\n\n    #endregion\n\n    #region Public Methods\n\n    /// <summary>\n    /// This method need to be run first.\n    /// In this method all values of tidy tool window will be refreshed: files list, check number. After that will be made tidy\n    /// </summary>\n    /// <param name=\"filesPath\"></param>\n    public void InitTidyToolWindow(List<string> filesPath)\n    {\n      RefreshValues();\n      CheckAll();\n      TidyFilesAsync(filesPath);\n    }\n\n    /// <summary>\n    /// Create and add new headers in files list based on file path\n    /// </summary>\n    /// <param name=\"filesPath\"></param>\n    public void AddHeadersInFilesList(List<string> filesPath)\n    {\n      //if tidy fix was made\n      List<FileModel> resultHeadersList = new List<FileModel>();\n      foreach (string file in filesPath)\n      {\n        FileInfo path = new FileInfo(file);\n        if (CheckIsHeader(file))\n        {\n          var currentHeader = headers.Where(a => a.FullFileName == path.FullName).FirstOrDefault();\n          if (currentHeader != null)\n          {\n            currentHeader.IsChecked = true;\n            UpdateCheckedNumber(currentHeader);\n\n            //Remove old header (with disabled diff icon) if already exists in files list, add the new one \n            var index = files.IndexOf(files.Where(f => f.FullFileName == currentHeader.FullFileName).FirstOrDefault());\n            if (index > -1)\n            {\n              files.RemoveAt(index);\n            }\n            //Add current header on wich was made tidy to files \n            MarkFixedFiles(new List<FileModel> { currentHeader });\n            resultHeadersList.Add(currentHeader);\n          }\n        }\n      }\n      var result = UnifyFileModelLists(files.ToList(), resultHeadersList);\n      files.Clear();\n      foreach (var currentFile in result)\n      {\n        files.Add(new FileModel(currentFile));\n      }\n      UpdateTidyToolWindowCheckBox();\n    }\n\n    /// <summary>\n    /// Refresh values, create and add new fils in files list based on file path\n    /// </summary>\n    /// <param name=\"filesPath\"></param>\n    public void AddFilesInFilesList(List<string> filesPath)\n    {\n      RefreshValues();\n      foreach (string file in filesPath)\n      {\n        FileInfo path = new FileInfo(file);\n        if (CheckIsHeader(file))\n        {\n          headers.Add(new FileModel { FileName = \". . . \" + Path.Combine(path.Directory.Name, path.Name),\n            FullFileName = path.FullName,\n            CopyFullFileName = Path.Combine(TidyConstants.TempsFolderPath,\n            TidyConstants.SolutionTempGuid, Guid.NewGuid().ToString()) + path.Extension,\n            FilesType = FileType.Header });\n        }\n        else\n        {\n          files.Add(new FileModel { FileName = \". . . \" + Path.Combine(path.Directory.Name, path.Name),\n            FullFileName = path.FullName,\n            CopyFullFileName = Path.Combine(TidyConstants.TempsFolderPath,\n            TidyConstants.SolutionTempGuid, Guid.NewGuid().ToString()) + path.Extension,\n            FilesType = FileType.SourceFile });\n        }\n      }\n      CheckAll();\n    }\n\n    private string GetExtension(string path)\n    {\n      Regex regex = new Regex(@\"([A-Z]:\\\\.+?\\.(cpp|cu|cc|cp|tlh|c|cxx|tli|h|hh|hpp|hxx))(\\W|$)\");\n      Match match = regex.Match(path);\n      return match.Value;\n    }\n\n    /// <summary>\n    /// Applies tidy fix on all selected source files or just on single file and makes diff after\n    /// </summary>\n    /// <param name=\"file\"></param>\n    /// <returns></returns>\n    public async Task FixAllFilesAsync(FileModel file = null)\n    {\n      BeforeCommand();\n      var filesPaths = new List<string>();\n      var filesPathsCopy = new List<FileModel>();\n      if (file is null)\n      {\n        //Get checked and unfixed files\n        filesPathsCopy = files.Where(f => f.IsChecked && f.IsFixed == false && f.FilesType != FileType.Header).ToList();\n        filesPaths = files.Where(f => f.IsChecked && f.FilesType != FileType.Header).Select(f => f.FullFileName).ToList();\n      }\n      else\n      {\n        if (!file.IsChecked)\n        {\n          file.IsChecked = true;\n          UpdateCheckedNumber(file);\n        }\n        filesPathsCopy = new List<FileModel> { file };\n        filesPaths = new List<string> { file.FullFileName };\n      }\n      FileCommand.CopyFilesInTempSolution(UnifyFileModelLists(filesPathsCopy, headers));\n      await CommandControllerInstance.CommandController.LaunchCommandAsync(CommandIds.kTidyFixId, CommandUILocation.ContextMenu, filesPaths);\n      MarkFixedFiles(filesPathsCopy);\n      if (file is not null)\n      {\n        DiffBetweenCopyAndCurrent(file);\n      }\n      AfterCommand();\n    }\n\n    /// <summary>\n    /// Update checked numer on check and uncheck action\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public void UpdateCheckedNumber(FileModel file)\n    {\n      if (file.IsChecked)\n      {\n        //Check \"global\" checkbox if all files are checked\n        tidyToolWindowModel.CountFilesModel.CheckFileUpdate(file);\n        tidyToolWindowModel.IsChecked = tidyToolWindowModel.CountFilesModel.TotalCheckedFiles == files.Count ? true : false;\n      }\n      else\n      {\n        //Uncheck \"global\" checkbox if no file is checked\n        tidyToolWindowModel.CountFilesModel.UnCheckFileUpdate(file);\n        tidyToolWindowModel.IsChecked = tidyToolWindowModel.CountFilesModel.TotalCheckedFiles == 0 ||\n          tidyToolWindowModel.CountFilesModel.TotalCheckedFiles != files.Count ? false : true;\n      }\n    }\n\n    /// <summary>\n    /// Update Tidy Tool Window checkbox\n    /// </summary>\n    public void UpdateTidyToolWindowCheckBox()\n    {\n      tidyToolWindowModel.IsChecked = tidyToolWindowModel.CountFilesModel.TotalCheckedFiles == files.Count ? true : false;\n      tidyToolWindowModel.IsChecked = tidyToolWindowModel.CountFilesModel.TotalCheckedFiles == 0 ||\n        tidyToolWindowModel.CountFilesModel.TotalCheckedFiles != files.Count ? false : true;\n    }\n\n\n    /// <summary>\n    /// Make a diff betweeen copy file and current file\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public void DiffBetweenCopyAndCurrent(FileModel file)\n    {\n      BeforeCommand();\n      FileCommand.DiffFilesUsingDefaultTool(FileCommand.GetShortPath(file.CopyFullFileName), FileCommand.GetShortPath(file.FullFileName));\n      AfterCommand();\n    }\n    public void CheckOrUncheckAll()\n    {\n      if (tidyToolWindowModel.IsChecked)\n      {\n        CheckAll();\n      }\n      else\n      {\n        UncheckAll();\n      }\n    }\n\n    /// <summary>\n    /// Set isRunning for every file to make icons disabled \n    /// </summary>\n    public void BeforeCommand()\n    {\n      tidyToolWindowModel.IsRunning = true;\n      foreach (var file in files)\n      {\n        file.IsRunning = true;\n      }\n    }\n\n    /// <summary>\n    /// Set isRunning for every file to make icons disabled \n    /// </summary>\n    public void AfterCommand()\n    {\n      tidyToolWindowModel.IsRunning = false;\n      foreach (var file in files)\n      {\n        file.IsRunning = false;\n      }\n    }\n\n    /// <summary>\n    /// Mark fixed files by adding a dot charcter \"•\" to the end of file name and\n    /// update total number of fixed source files and headers\n    /// </summary>\n    /// <param name=\"fixedFiles\"></param>\n    public void MarkFixedFiles(List<FileModel> fixedFiles)\n    {\n      foreach (var file in fixedFiles)\n      {\n        if (!file.IsFixed)\n        {\n          file.IsFixed = true;\n          file.FileName += \" •\";\n          tidyToolWindowModel.CountFilesModel.UpdateFixFileState(file);\n        }\n      }\n    }\n\n    /// <summary>\n    /// Replace current file on which was made tidy fix with a copy\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public void DiscardFile(FileModel file)\n    {\n      var fileChangerWatcher = new FileChangerWatcher();\n\n      var dte2 = VsServiceProvider.GetService(typeof(DTE2)) as DTE2;\n      string solutionFolderPath = SolutionInfo.IsOpenFolderModeActive() ?\n        dte2.Solution.FullName : dte2.Solution.FullName\n                                  .Substring(0, dte2.Solution.FullName.LastIndexOf('\\\\'));\n      fileChangerWatcher.Run(solutionFolderPath);\n      FileCommand.CopyFileFromTempToSolution(file);\n      MarkUnfixedFiles(file);\n    }\n\n\n    /// <summary>\n    /// Remove selected files from files list\n    /// </summary>\n    public void RemoveFiles(FileModel customFile = null)\n    {\n      BeforeCommand();\n      if (customFile is not null)\n      {\n        //Remove file from list\n        var removeFile = files.Where(f => f.IsChecked && f.FullFileName == customFile.FullFileName).SingleOrDefault();\n        if (removeFile is not null)\n        {\n          //Mark as checked, and restore to initial properties to be removed after\n          removeFile.IsChecked = false;\n          UpdateCheckedNumber(removeFile);\n          removeFile.IsChecked = true;\n          files.Remove(removeFile);\n        }\n      }\n      else\n      {\n        foreach (var file in files.ToList())\n        {\n          if (file.IsChecked)\n          {\n            //Mark as checked, and restore to initial properties to be removed after\n            file.IsChecked = false;\n            UpdateCheckedNumber(file);\n            file.IsChecked = true;\n            files.Remove(file);\n          }\n        }\n      }\n      UpdateTidyToolWindowCheckBox();\n      AfterCommand();\n    }\n\n    public async Task TidyFilesAsync(List<string> paths = null)\n    {\n      BeforeCommand();\n      if (paths is null)\n      {\n        paths = files.Where(f => f.IsChecked && f.FilesType != FileType.Header).Select(f => f.FullFileName).ToList();\n      }\n      await CommandControllerInstance.CommandController.LaunchCommandAsync(CommandIds.kTidyToolWindowId, CommandUILocation.ContextMenu, paths);\n      AfterCommand();\n    }\n\n    /// <summary>\n    /// Mark unfixed files by removing a dot charcter \"•\" to the end of file name and\n    /// update total number of unfixed source files and headers\n    /// </summary>\n    /// <param name=\"checkedFiles\"></param>\n    public void MarkUnfixedFiles(List<FileModel> checkedFiles)\n    {\n      foreach (var file in checkedFiles)\n      {\n        MarkUnfixedFiles(file);\n      }\n    }\n\n    #endregion\n\n    #region Private Method\n\n    private bool CheckIsHeader(string fullFilePath)\n    {\n      FileInfo path = new FileInfo(fullFilePath);\n      return path.FullName.Contains(\".h\") || path.FullName.Contains(\".hpp\") || path.FullName.Contains(\".hh\") || path.FullName.Contains(\".hxx\");\n    }\n\n    /// <summary>\n    /// Check all files\n    /// </summary>\n    private void CheckAll()\n    {\n      foreach (var file in files)\n      {\n        file.IsChecked = true;\n        UpdateCheckedNumber(file);\n      }\n      tidyToolWindowModel.IsChecked = true;\n      tidyToolWindowModel.CountFilesModel.UpdateTotalChecked(files);\n    }\n\n    private void UncheckAll()\n    {\n      foreach (var file in files)\n      {\n        file.IsChecked = false;\n        UpdateCheckedNumber(file);\n      }\n      tidyToolWindowModel.IsChecked = false;\n      tidyToolWindowModel.CountFilesModel.UpdateToUncheckAll();\n    }\n\n    private void MarkUnfixedFiles(FileModel file)\n    {\n      if (file.IsFixed)\n      {\n        file.IsFixed = false;\n        file.FileName = file.FileName.Remove(file.FileName.Length - 2, 2);\n        tidyToolWindowModel.CountFilesModel.UpdateFixFileState(file);\n      }\n    }\n\n    private List<FileModel> UnifyFileModelLists(List<FileModel> firstList, List<FileModel> secondList)\n    {\n      var fileUnion = new List<FileModel>();\n      foreach (var file in firstList)\n      {\n        fileUnion.Add(file);\n      }\n      foreach (var file in secondList)\n      {\n        fileUnion.Add(file);\n      }\n      return fileUnion;\n    }\n\n    /// <summary>\n    /// Refresh values after tidy from toolbar or contextMenu\n    /// </summary>\n    private void RefreshValues()\n    {\n      files.Clear();\n      headers.Clear();\n      tidyToolWindowModel.IsChecked = false;\n      tidyToolWindowModel.CountFilesModel.UpdateToUncheckAll();\n    }\n  }\n  \n  #endregion\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/FindToolWindowHandler.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerToolsShared.MVVM.Provider;\nusing ClangPowerToolsShared.MVVM.ViewModels;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Windows.Forms;\n\nnamespace ClangPowerToolsShared.MVVM\n{\n  public class FindToolWindowHandler\n  {\n    public static Action RefreshHistoryMatchersView;\n\n    private const string matchersHistoryFileName = \"matchersHistory.json\";\n    private string matcherHistoryPath = string.Empty;\n    public FindToolWindowHandler()\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      matcherHistoryPath = Path.Combine(settingsPathBuilder.GetPath(matcherHistoryPath),\n        matchersHistoryFileName);\n    }\n    public void Initialize()\n    {\n      if (File.Exists(matcherHistoryPath))\n      {\n        LoadFindToolWindowData();\n      }\n    }\n\n\n    public void SaveMatchersHistoryData()\n    {\n      SerializeHistoryData(FindToolWindowProvider.AutoCompleteHistory, matcherHistoryPath);\n    }\n\n    private void SerializeHistoryData(List<AutoCompleteHistoryViewModel> models, string path)\n    {\n      using StreamWriter file = File.CreateText(path);\n      var serializer = new JsonSerializer\n      {\n        Formatting = Formatting.Indented\n      };\n      serializer.Serialize(file, models);\n      file.Close();\n    }\n\n    private string ReadFile(string path)\n    {\n      using StreamReader sw = new StreamReader(path);\n      return sw.ReadToEnd();\n    }\n\n    public void LoadFindToolWindowData()\n    {\n      if (File.Exists(matcherHistoryPath))\n      {\n        string json = ReadFile(matcherHistoryPath);\n        if (!string.IsNullOrEmpty(json))\n          DeserializeMatchersHistory(json);\n      }\n    }\n\n    public void LoadFindToolWindowData(string path)\n    {\n      if (File.Exists(path))\n      {\n        string json = ReadFile(path);\n        DeserializeMatchersHistory(json);\n        RefreshHistoryMatchersView?.Invoke();\n      }\n    }\n\n    private void DeserializeMatchersHistory(string json)\n    {\n      try\n      {\n        var history = JsonConvert.DeserializeObject<List<AutoCompleteHistoryViewModel>>(json);\n        FindToolWindowProvider.UpdateAutoCompleteList(history);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Cannot Load Clang Power Tools Find Tool Window Data\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/IAccountValidator.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Interfaces\n{\n  interface IAccountValidator: ILicense\n  {\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/IDownload.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Net;\n\nnamespace ClangPowerTools.MVVM.Interfaces\n{\n  public interface IDownload\n  {\n    void Download(string uri, DownloadProgressChangedEventHandler method);\n\n    void DownloadCompleted(object sender, AsyncCompletedEventArgs e);\n\n    CancelEventHandler SettingsWindowClosed { get; set; }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/IInstall.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools.MVVM.Interfaces\n{\n  public interface IInstall\n  {\n    void Install(string path);\n\n    void Uninstall(string path);\n\n    EventHandler InstallFinished { get; set; }\n    EventHandler UninstallFinished { get; set; }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/ILicense.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.Interfaces\n{\n  /// <summary>\n  /// Contains license validation and token retrival main behavior\n  /// </summary>\n  public interface ILicense\n  {\n    /// <summary>\n    /// Check if the user license is active\n    /// </summary>\n    /// <returns>True if the license is active. False otherwise</returns>\n    Task<bool> ValidateAsync();\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/IView.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Interfaces\n{\n  interface IView\n  {\n    public void ResetView();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Interfaces/IViewMatche.cs",
    "content": "﻿namespace ClangPowerToolsShared.MVVM.Interfaces\n{\n  public interface IViewMatcher\n  {\n    string Name { get; }\n    int Id { get; }\n    string Details { get; }\n    string Visibility { get; }\n    void Hide();\n    void Show();\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LicenseValidation/CommercialLicenseValidator.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.LicenseValidation\n{\n  /// <summary>\n  /// Contains the logic for the commercial license verification\n  /// </summary>\n  public class CommercialLicenseValidator : PersonalLicenseValidator\n  {\n    #region ILicenseValidator Implementation\n\n    /// <summary>\n    /// Verify if the user license is active.\n    /// </summary>\n    /// <returns>True if the user license is active. False otherwise.</returns>\n    public new async Task<bool> ValidateAsync()\n    {\n      try\n      {\n        var token = new Token();\n        if (token.GetToken(out string jwt) == false)\n          return false;\n\n        KeyValuePair<bool, HttpResponseMessage> httpResponse = await CheckUserAccountAsync(jwt);\n\n        if (httpResponse.Key == false)\n          return false;\n\n        List<LicenseModel> licenses = JsonConvert.DeserializeObject < List < LicenseModel >> (await httpResponse.Value.Content.ReadAsStringAsync());\n        return licenses.Count > 0 && VerifyLicense(licenses);\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    /// <summary>\n    /// Verify if at least one of the user licenses is active. \n    /// </summary>\n    /// <param name=\"userTokenHttpResponse\">The HTTP server response for user token</param>\n    /// <returns>True if at least one of the user licenses is active. False otherwise.</returns>\n    private bool VerifyLicense(List<LicenseModel> licenses)\n    {\n      return licenses.Any(license => CheckExpirationDate(license.expires)) == false;\n    }\n\n    /// <summary>\n    /// Check if the license expired\n    /// </summary>\n    /// <param name=\"expirationDate\">The expiration date as string</param>\n    /// <returns>True if the license expired. False otherwise.</returns>\n    private bool CheckExpirationDate(string expirationDate)\n    {\n      DateTime.TryParse(expirationDate, out DateTime expirationDateTime);\n      return DateTime.Compare(DateTime.Now, expirationDateTime) > 0;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LicenseValidation/LicenseType.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Converters;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace ClangPowerTools.MVVM.LicenseValidation\n{\n  [Serializable]\n  [JsonConverter(typeof(StringEnumConverter))]\n  public enum LicenseType\n  {\n    [EnumMember(Value = \"Commercial\")]\n    Commercial,\n\n    [EnumMember(Value = \"Personal\")]\n    Personal,\n\n    [EnumMember(Value = \"Trial\")]\n    Trial,\n\n    [EnumMember(Value = \"SessionExpired\")]\n    SessionExpired,\n\n    [EnumMember(Value = \"NoLicense\")]\n    NoLicense\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LicenseValidation/LocalLicenseValidator.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.LicenseValidation\n{\n  public class LocalLicenseValidator : ILicense\n  {\n    #region ILicense Implementation\n\n    /// <summary>\n    /// Check the if the user license from the disk is active.\n    /// </summary>\n    /// <returns>True if the license is active. False otherwise</returns>\n    public Task<bool> ValidateAsync()\n    {\n      var token = new Token();\n      return Task.FromResult(token.GetToken(out _));\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LicenseValidation/PersonalLicenseValidator.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing ClangPowerTools.MVVM.WebApi;\nusing System;\nusing System.Collections.Generic;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools.MVVM.LicenseValidation\n{\n  public class PersonalLicenseValidator : ILicense\n  {\n    public async Task<bool> ValidateAsync()\n    {\n      try\n      {\n        var token = new Token();\n        if (token.GetToken(out string jwt) == false)\n          return false;\n\n        KeyValuePair<bool, HttpResponseMessage> httpResponse = await CheckUserAccountAsync(jwt);\n        return httpResponse.Key;\n      }\n      catch (Exception)\n      {\n        return false;\n      }\n    }\n\n    /// <summary>\n    /// Check if a user account is associeted to the given token\n    /// </summary>\n    /// <param name=\"token\">The user license token</param>\n    /// <returns>Pair of status code and HTTP resonse message. Status code is true if the user account is active. \n    /// Otherwise status code is false</returns>\n    protected async Task<KeyValuePair<bool, HttpResponseMessage>> CheckUserAccountAsync(string token)\n    {\n      ApiUtility.InitializeApiClient();\n\n      ApiUtility.ApiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(\"Bearer\", token);\n      HttpResponseMessage userTokenHttpResponse = await ApiUtility.ApiClient.GetAsync(WebApiUrl.licenseUrl);\n\n      return new KeyValuePair<bool, HttpResponseMessage>(userTokenHttpResponse.IsSuccessStatusCode == true, userTokenHttpResponse);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LicenseValidation/Token.cs",
    "content": "﻿using System.IO;\n\nnamespace ClangPowerTools.MVVM.LicenseValidation\n{\n  public class Token\n  {\n    #region Members\n\n    /// <summary>\n    /// License token name\n    /// </summary>\n    private readonly string fileName = \"ctpjwt\";\n\n    #endregion\n\n    #region ILicense Implementation\n\n    /// <summary>\n    /// Get the license token path\n    /// </summary>\n    /// <returns>License token path if the file exists. Empty string otherwise.</returns>\n    private string GetTokenPath()\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      string filePath = settingsPathBuilder.GetPath(fileName);\n\n      return File.Exists(filePath) == true ? filePath : string.Empty;\n    }\n\n    /// <summary>\n    /// Get the content of the license token\n    /// </summary>\n    /// <param name=\"jwt\">Content of license token</param>\n    /// <returns>True if the content of license token was succesfully extracted. False otherwise</returns>\n    public bool GetToken(out string jwt)\n    {\n      jwt = null;\n      var filePath = GetTokenPath();\n\n      if (string.IsNullOrWhiteSpace(filePath))\n        return false;\n\n      using var streamReader = new StreamReader(filePath);\n      jwt = streamReader.ReadLine();\n\n      return string.IsNullOrWhiteSpace(jwt) == false;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/LlvmUri.cs",
    "content": "﻿using ClangPowerTools.MVVM.Constants;\nusing System;\n\nnamespace ClangPowerTools.MVVM\n{\n  public class LlvmUri\n  {\n    public string GetDefaultUri(string version)\n    {\n      return string.Concat(LlvmConstants.ReleasesUri, \"/\", version, \"/\", LlvmConstants.Llvm, \"-\", version, GetOperatingSystemParamaters());\n    }\n\n    public string GetGitHubUri(string version)\n    {\n      return string.Concat(LlvmConstants.GitHubUri, \"/llvmorg-\", version, \"/\", LlvmConstants.Llvm, \"-\", version, GetOperatingSystemParamaters());\n    }\n    private string GetOperatingSystemParamaters()\n    {\n      return Environment.Is64BitOperatingSystem ? LlvmConstants.Os64Paramater : LlvmConstants.Os32Paramater;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/AccountApiModel.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Models\n{\n  public class AccountApiModel\n  {\n    #region Properties\n\n    public string firstname { get; set; } = string.Empty;\n\n    public string lastname { get; set; } = string.Empty;\n\n    public string email { get; set; } = string.Empty;\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/AccountModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.LicenseValidation;\n\nnamespace ClangPowerTools.MVVM.Models\n{\n  public class AccountModel\n  {\n    #region Properties\n\n    public string UserName { get; set; } = string.Empty;\n    public string Email { get; set; } = string.Empty;\n    public LicenseType LicenseType { get; set; } = LicenseType.NoLicense;\n    public string LicenseExpirationDate { get; set; } = \"Never\";\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/CompilerSettingsModel.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools\n{\n  public class CompilerSettingsModel : INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n    private bool powershell7 = false;\n    public string CompileFlags { get; set; } = DefaultOptions.ClangFlags;\n\n    public string FilesToIgnore { get; set; } = string.Empty;\n\n    public string ProjectsToIgnore { get; set; } = string.Empty;\n\n    public ClangGeneralAdditionalIncludes AdditionalIncludes { get; set; } = ClangGeneralAdditionalIncludes.IncludeDirectories;\n\n    public bool WarningsAsErrors { get; set; } = false;\n\n    public bool ContinueOnError { get; set; } = false;\n\n    public bool ClangAfterMSVC { get; set; } = false;\n\n    public string VerbosityLevel { get; set; } = \"0\";\n\n    public bool Powershell7 \n    { \n      get { return powershell7; } \n      set\n      {\n        if(value && string.IsNullOrEmpty(PowerShellWrapper.GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)))\n        {\n          MessageBox.Show(\"Sorry, we can't find Powershell 7 in PATH enviroment variables\",\n                              \"Clang Power Tools\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n          return;\n        }\n        powershell7 = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Powershell7\"));\n\n      }\n    }\n\n    public bool ShowErrorList { get; set; } = true;\n\n    public bool ShowOutputWindow { get; set; } = true;\n\n    public bool ShowSquiggles { get; set; } = false;\n\n    public int CpuLimit { get; set; } = 100;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/FileModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Models;\nusing ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels;\nusing System.ComponentModel;\n\nnamespace ClangPowerTools.MVVM.Models\n{\n  public class FileModel : INotifyPropertyChanged\n  {\n\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    private bool isRunning;\n    private bool isFixed;\n    private bool isChecked;\n    private string filename;\n\n    #endregion\n\n    #region Constructor\n\n    public FileModel()\n    {\n      //init private icons\n      diffIcon = new IconModel(VSThemeCommand.GetDiffIconEnabled(), UIElementsConstants.Hidden, false, \"Diff\");\n      tidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true, \"Fix\");\n\n      //init public icons\n      DiffIcon = new IconModel(VSThemeCommand.GetDiffIconEnabled(), UIElementsConstants.Hidden, false);\n      TidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true);\n    }\n\n    public FileModel(FileModel file)\n    {\n      //init private icons\n      diffIcon = new IconModel(VSThemeCommand.GetDiffIconEnabled(), UIElementsConstants.Hidden, false, \"Diff\");\n      tidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true, \"Fix\");\n\n      //init public icons\n      DiffIcon = new IconModel(VSThemeCommand.GetDiffIconEnabled(), UIElementsConstants.Hidden, false);\n      TidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true);\n\n      this.FileName = file.FileName;\n      this.FullFileName = file.FullFileName;\n      this.CopyFullFileName = file.CopyFullFileName;\n      this.DiffIcon = file.DiffIcon;\n      this.TidyFixIcon = file.TidyFixIcon;\n      this.IsFixed = file.IsFixed;\n      this.IsRunning = file.IsRunning;\n      this.IsChecked = file.IsChecked;\n      this.FilesType = file.FilesType;\n    }\n\n    #endregion\n\n    #region Public Properities\n\n    public FileType FilesType { get; set; }\n    public string FilesTypeString\n    {\n      get\n      {\n        if (FilesType == FileType.SourceFile)\n          return \"Source files\";\n        else\n          return \"Affected headers\";\n      }\n    }\n\n    public string FileName\n    {\n      get { return filename; }\n      set\n      {\n        filename = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FileName\"));\n      }\n    }\n\n    public string FullFileName { get; set; }\n    public string CopyFullFileName { get; set; }\n\n    private IconModel diffIcon;\n    public IconModel DiffIcon\n    {\n      get { return diffIcon; }\n      set\n      {\n        diffIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DiffIcon\"));\n      }\n    }\n\n    private IconModel tidyFixIcon;\n    public IconModel TidyFixIcon\n    {\n      get { return tidyFixIcon; }\n      set\n      {\n        tidyFixIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyFixIcon\"));\n      }\n    }\n\n    public bool IsFixed\n    {\n      get\n      {\n        return isFixed;\n      }\n      set\n      {\n        if (value)\n        {\n          DiffIcon.Visibility = UIElementsConstants.Visibile;\n          DiffIcon.IsEnabled = true;\n          TidyFixIcon.Visibility = UIElementsConstants.Hidden;\n          TidyFixIcon.IsEnabled = false;\n        }\n        else\n        {\n          TidyFixIcon.Visibility = UIElementsConstants.Visibile;\n          TidyFixIcon.IsEnabled = true;\n          DiffIcon.Visibility = UIElementsConstants.Hidden;\n          DiffIcon.IsEnabled = false;\n        }\n        if (isFixed == value) return;\n        isFixed = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsFixed\"));\n      }\n    }\n\n    public bool IsRunning\n    {\n      get\n      {\n        return isRunning;\n      }\n      set\n      {\n        if (value)\n        {\n          TidyFixIcon.IsEnabled = false;\n          TidyFixIcon.IconPath = IconResourceConstants.FixDisabled;\n          DiffIcon.IsEnabled = false;\n          DiffIcon.IconPath = IconResourceConstants.DiffDisabled;\n        }\n        else\n        {\n          TidyFixIcon.IsEnabled = true;\n          TidyFixIcon.IconPath = VSThemeCommand.GetTidyFixIconEnabled();\n          DiffIcon.IsEnabled = true;\n          DiffIcon.IconPath = VSThemeCommand.GetDiffIconEnabled();\n        }\n        isRunning = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsRunning\"));\n      }\n    }\n\n    public bool IsChecked\n    {\n      get { return isChecked; }\n      set\n      {\n        if (isChecked == value) { return; }\n        isChecked = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsChecked\"));\n      }\n    }\n\n    /// <summary>\n    /// Change theme just for enabled icons\n    /// </summary>\n    public void ChangeIconsTheme()\n    {\n      DiffIcon.IconPath = DiffIcon.IsEnabled == true ?\n        VSThemeCommand.GetDiffIconEnabled() : IconResourceConstants.DiffDisabled;\n      TidyFixIcon.IconPath = TidyFixIcon.IsEnabled == true ?\n        VSThemeCommand.GetTidyFixIconEnabled() : IconResourceConstants.FixDisabled;\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/FormatSettingsModel.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class FormatSettingsModel\n  {\n    public string FileExtensions { get; set; } = DefaultOptions.FileExtensions;\n\n    public string FilesToIgnore { get; set; } = DefaultOptions.IgnoreFiles;\n\n    public string AssumeFilename { get; set; } = string.Empty;\n\n    public string CustomExecutable { get; set; } = string.Empty;\n\n    public ClangFormatStyle Style { get; set; } = ClangFormatStyle.file;\n\n    public ClangFormatFallbackStyle FallbackStyle { get; set; } = ClangFormatFallbackStyle.none;\n\n    public bool FormatOnSave { get; set; } = false;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/GeneralSettingsModel.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class GeneralSettingsModel\n  {\n    public string Version { get; set; } = string.Empty;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/InputDataModel.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace ClangPowerTools.MVVM.Models\n{\n  public class InputDataModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private bool isReadOnly = false;\n    private string inputData = string.Empty;\n\n    #endregion\n\n    public InputDataModel(string input)\n    {\n      inputData = input;\n    }\n\n    #region Properties\n\n    public string InputData\n    {\n      get\n      {\n        return inputData;\n      }\n      set\n      {\n        inputData = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"InputData\"));\n      }\n    }\n\n    public bool IsReadOnly\n    {\n      get\n      {\n        return isReadOnly;\n      }\n      set\n      {\n        isReadOnly = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CanEdit\"));\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/LicenseModel.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Models\n{\n  public class LicenseModel\n  {\n    public string _id { get; set; } = \"\";\n\n    public bool active = false;\n\n    public string expires = \"\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/LlvmModel.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace ClangPowerTools\n{\n  public class LlvmModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private readonly LlvmSettingsModel llvmSettingsModel = new LlvmSettingsModel();\n    private bool isDownloading = false;\n    private bool isInstalling = false;\n    private bool isInstalled = false;\n    private bool hasPreinstalledLlvm = false;\n    private bool canExecuteCommand = true;\n    private int downloadProgress = 0;\n\n    #endregion\n\n    #region Properties\n\n    public string Version\n    {\n      get\n      {\n        return llvmSettingsModel.LlvmSelectedVersion;\n      }\n      set\n      {\n        llvmSettingsModel.LlvmSelectedVersion = value;\n      }\n    }\n\n\n    public bool IsInstalled\n    {\n      get\n      {\n        return isInstalled;\n      }\n\n      set\n      {\n        isInstalled = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsInstalled\"));\n      }\n    }\n\n    public bool IsInstalling\n    {\n      get\n      {\n        return isInstalling;\n      }\n\n      set\n      {\n        isInstalling = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsInstalling\"));\n      }\n    }\n\n    public bool IsDownloading\n    {\n      get\n      {\n        return isDownloading;\n      }\n\n      set\n      {\n        isDownloading = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsDownloading\"));\n      }\n    }\n\n    public bool CanExecuteCommand\n    {\n      get\n      {\n        return canExecuteCommand;\n      }\n\n      set\n      {\n        canExecuteCommand = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CanExecuteCommand\"));\n      }\n    }\n\n    public int DownloadProgress\n    {\n      get\n      {\n        return downloadProgress;\n      }\n\n      set\n      {\n        downloadProgress = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DownloadProgress\"));\n      }\n    }\n\n    public int MinProgress { get; set; } = 0;\n\n    public int MaxProgress { get; set; } = 100;\n\n    public string PreinstalledLlvmPath\n    {\n      get\n      {\n        return llvmSettingsModel.PreinstalledLlvmPath;\n      }\n      set\n      {\n        llvmSettingsModel.PreinstalledLlvmPath = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"PreinstalledLlvmPath\"));\n      }\n    }\n\n    public bool HasPreinstalledLlvm \n    { \n      get\n      {\n        return hasPreinstalledLlvm;\n      }\n      set\n      {\n        hasPreinstalledLlvm = value;\n      }\n    }\n\n    #endregion Properties\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/LlvmSettingsModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ClangPowerTools\n{\n  public class LlvmSettingsModel\n  {\n    public string LlvmSelectedVersion { get; set; } = string.Empty;\n\n    public string PreinstalledLlvmVersion { get; set; } = string.Empty;\n\n    public string PreinstalledLlvmPath { get; set; } = string.Empty;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/MessageModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Constants;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models\n{\n  public class MessageModel\n  {\n\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private string textMessage = string.Empty;  \n    private string visibility = UIElementsConstants.Hidden;\n\n    #endregion\n\n    #region Properities\n\n    public string Visibility \n    { \n      get { return visibility; }\n      set\n      {\n        visibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Visibility\"));\n      }\n    }\n\n    public string TextMessage \n    { get { return textMessage; }\n      set\n      {\n        textMessage = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TextMessage\"));\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/SelectedFileModel.cs",
    "content": "﻿using System.IO;\n\nnamespace ClangPowerTools.MVVM.Models\n{\n  public class SelectedFileModel\n  {\n    #region Members\n\n    private const int MAX_FILE_SIZE = 80; // KB\n\n    #endregion\n\n\n    #region Constructor\n\n    public SelectedFileModel(string path, string pathToShow)\n    {\n      if (!File.Exists(path))\n        return;\n\n      FilePath = path;\n      FileSize = new FileInfo(FilePath).Length / 1000;\n      if (FileSize == 0)\n      {\n        FileSize = 1;\n      }\n      FilePathToShow = pathToShow;\n\n      ForgroundColor = FileSize > MAX_FILE_SIZE ? \"DarkOrange\" : \"Black\";\n      FileSizeAsString = FileSize.ToString() + \" KB\";\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public string FilePath { get; private set; }\n\n    public string FilePathToShow { get; private set; }\n\n    public long FileSize { get; private set; }\n\n    public string FileSizeAsString { get; private set; }\n\n    public string ForgroundColor { get; private set; }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/TidyCheckModel.cs",
    "content": "﻿using ClangPowerTools.MVVM;\nusing System.ComponentModel;\n\nnamespace ClangPowerTools\n{\n  public class TidyCheckModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    private bool isChecked = false;\n\n    #endregion\n\n\n    #region Properties\n\n    public string Name { get; set; } = string.Empty;\n\n    public bool IsChecked\n    {\n      get\n      {\n        return isChecked;\n      }\n      set\n      {\n        // Take in consideration every change of the state if the collection is not empty\n        if (!CollectionElementsCounter.IsEmpty())\n        {\n          if (value)\n            CollectionElementsCounter.Add();\n          else\n            CollectionElementsCounter.Remove();\n        }\n\n        isChecked = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsChecked\"));\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/TidySettingsModel.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class TidySettingsModel\n  {\n    public string HeaderFilter { get; set; } = DefaultOptions.HeaderFilter;\n\n    public ClangTidyUseChecksFrom UseChecksFrom { get; set; } = ClangTidyUseChecksFrom.PredefinedChecks;\n\n    public string PredefinedChecks { get; set; } = string.Empty;\n\n    public string CustomChecks { get; set; } = string.Empty;\n\n    public string CustomExecutable { get; set; } = string.Empty;\n    public string CompilationDatabase { get; set; } = string.Empty;\n    public bool DetectClangTidyFile { get; set; } = true;\n\n    public bool FormatAfterTidy { get; set; } = false;\n    public bool TidyOnSave { get; set; } = false;\n    public bool ApplyTidyFix { get; set; } = false;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToggleModel.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.Models\n{\n  public class ToggleModel\n  {\n    #region Properties \n\n    public string Name { get; set; }\n    public ToggleValues Value { get; set; }\n\n    #endregion\n\n    #region Constructor\n\n    public ToggleModel(string name, ToggleValues value)\n    {\n      Name = name;\n      Value = value;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/TokenModel.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class TokenModel\n  {\n    public string jwt { get; set; } = \"\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/AutoCompleteHistoryModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Provider;\nusing ClangPowerToolsShared.MVVM.ViewModels;\nusing System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class AutoCompleteHistoryModel : INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    public string Id { get; set; } = Guid.NewGuid().ToString();\n\n    public string Value { get; set; } = string.Empty;\n    private string visibility = string.Empty;\n\n    private string tooltip = string.Empty;\n    public string Tooltip\n    {\n      get { return tooltip; }\n      set\n      {\n        tooltip = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Tooltip\"));\n      }\n    }\n\n    public string Visibility\n    {\n      get { return visibility; }\n      set\n      {\n        visibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Visibility\"));\n      }\n    }\n\n    private bool rememberAsFavorit = false;\n    public bool RememberAsFavorit\n    {\n      get { return rememberAsFavorit; }\n      set\n      {\n        SetIcon(value);\n        \n      }\n    }\n\n    private string pinIconPath { get; set; }\n\n    public string PinIconPath\n    {\n      get { return pinIconPath; }\n      set\n      {\n        pinIconPath = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"PinIconPath\"));\n      }\n    }\n\n    public AutoCompleteHistoryModel(bool isHistory = false)\n    {\n      UpdateVisibility(isHistory);\n    }\n\n    public bool Pin()\n    {\n      if (FindToolWindowProvider.CheckRememberFavoritIsMax(this) && !rememberAsFavorit)\n      {\n        DialogResult dialogResult = MessageBox.Show(\"You reached the limit(20 matchers) of favorite custom matchers, unpin from favorite to add new matcher\",\n                       \"Clang Power Tools\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n        return false;\n      }\n      rememberAsFavorit = !rememberAsFavorit;\n      RememberAsFavorit = rememberAsFavorit;\n      FindToolWindowProvider.UpdateFavoriteValue(this, !rememberAsFavorit);\n      FindToolWindowHandler findToolWindowHandler = new FindToolWindowHandler();\n      findToolWindowHandler.SaveMatchersHistoryData();\n      return true;\n    }\n\n    public AutoCompleteHistoryModel(AutoCompleteHistoryViewModel autoCompleteHistoryViewModel, bool isHistory = true)\n    {\n      Id = autoCompleteHistoryViewModel.Id;\n      rememberAsFavorit = autoCompleteHistoryViewModel.RememberAsFavorit;\n      RememberAsFavorit = rememberAsFavorit;\n      Value = autoCompleteHistoryViewModel.Value;\n      UpdateVisibility(isHistory);\n      rememberAsFavorit = autoCompleteHistoryViewModel.RememberAsFavorit;\n    }\n\n    private void UpdateVisibility(bool isHistory)\n    {\n      if (isHistory)\n        visibility = UIElementsConstants.Visibile;\n      else\n        visibility = UIElementsConstants.Hidden;\n      Visibility = visibility;\n    }\n\n    private void SetIcon(bool value)\n    {\n      if (value)\n      {\n        tooltip = UIElementsConstants.Unpin;\n        pinIconPath = VSThemeCommand.GetPinIcon();\n      }\n      else\n      {\n        tooltip = UIElementsConstants.Pin;\n        pinIconPath = VSThemeCommand.GetUnpinIcon();\n      }\n      Tooltip = tooltip;\n      PinIconPath = pinIconPath;\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/ComponentVisibility.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Constants;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class ComponentVisibility : INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private string visibility = string.Empty;\n\n    public ComponentVisibility()\n    {\n      visibility = UIElementsConstants.Hidden;\n    }\n\n    public string Visibility\n    {\n      get { return visibility; }\n    }\n\n    public void Hide()\n    {\n      visibility = UIElementsConstants.Hidden;\n    }\n\n    public void Show()\n    {\n      visibility = UIElementsConstants.Visibile;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/CountStateFilesModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels\n{\n  /// <summary>\n  /// This class can be used to store all data about files state\n  /// </summary>\n  public class CountFilesModel : INotifyPropertyChanged\n  {\n    #region Properies\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private int totalCheckedFixedFiles = 0;\n    private int totalCheckedFixedHeaders = 0;\n    private int totalCheckedFixedSouceFiles = 0;\n    private int totalCheckedSourceFiles = 0;\n    private int totalCheckedHeaders = 0;\n    private int totalCheckedFiles = 0;\n\n    /// <summary>\n    /// Returns number of checked fixed files at this moment\n    /// </summary>\n    public int TotalCheckedFixedFiles\n    {\n      get { return totalCheckedFixedFiles; }\n      private set\n      {\n        totalCheckedFixedFiles = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedFixedFiles\"));\n      }\n    }\n\n    /// <summary>\n    /// Returns number of checked fixed headers at this moment\n    /// </summary>\n    public int TotalCheckedFixedHeaders\n    {\n      get\n      { return totalCheckedFixedHeaders; }\n      private set\n      {\n        totalCheckedFixedHeaders = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedFixedHeaders\"));\n      }\n    }\n\n    /// <summary>\n    /// Returns number of checked fixed source files at this moment\n    /// </summary>\n    public int TotalCheckedFixedSouceFiles\n    {\n      get { return totalCheckedFixedSouceFiles; }\n      private set\n      {\n        totalCheckedFixedSouceFiles = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedFixedSouceFiles\"));\n      }\n    }\n\n    /// <summary>\n    /// Returns number of checked source files at this moment\n    /// </summary>\n    public int TotalCheckedSourceFiles\n    {\n      get { return totalCheckedSourceFiles; }\n      private set\n      {\n        totalCheckedSourceFiles = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedSourceFiles\"));\n      }\n    }\n\n    /// <summary>\n    /// Returns number of checked headers at this moment\n    /// </summary>\n    public int TotalCheckedHeaders\n    {\n      get { return totalCheckedHeaders; }\n      private set\n      {\n        totalCheckedHeaders = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedHeaders\"));\n      }\n    }\n\n    /// <summary>\n    /// Returns number of checked files at this moment\n    /// </summary>\n    public int TotalCheckedFiles\n    {\n      get { return totalCheckedFiles; }\n      private set\n      {\n        totalCheckedFiles = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TotalCheckedFiles\"));\n      }\n    }\n\n    #endregion\n\n    #region Methods \n    \n    /// <summary>\n    /// Total checked property will be updated with number of files\n    /// </summary>\n    /// <param name=\"files\"></param>\n    public void UpdateTotalChecked(ObservableCollection<FileModel> files)\n    {\n      TotalCheckedFiles = files.Count;\n    }\n\n    /// <summary>\n    /// Update properties refering on check file \n    /// </summary>\n    public void CheckFileUpdate(FileModel file)\n    {\n      if (file is not null && file.IsChecked)\n      {\n        ++TotalCheckedFiles;\n        if (file.FilesType == FileType.SourceFile)\n          ++TotalCheckedSourceFiles;\n        if (file.FilesType == FileType.Header)\n          ++TotalCheckedHeaders;\n\n        //Update values for fixed files\n        if (file.IsFixed)\n        {\n          ++TotalCheckedFixedFiles;\n          if (file.FilesType == FileType.SourceFile)\n          {\n            ++TotalCheckedFixedSouceFiles;\n          }\n          if (file.FilesType == FileType.Header)\n          {\n            ++TotalCheckedFixedHeaders;\n          }\n        }\n      }\n    }\n\n    /// <summary>\n    /// Update properties refering on uncheck file \n    /// </summary>\n    public void UnCheckFileUpdate(FileModel file)\n    {\n      if (file is not null && !file.IsChecked)\n      {\n        --TotalCheckedFiles;\n        if (file.FilesType == FileType.SourceFile)\n          --TotalCheckedSourceFiles;\n        if (file.FilesType == FileType.Header)\n          --TotalCheckedHeaders;\n\n        //Update values for fixed files\n        if (file.IsFixed)\n        {\n          --TotalCheckedFixedFiles;\n          if (file.FilesType == FileType.SourceFile)\n          {\n            --TotalCheckedFixedSouceFiles;\n          }\n          if (file.FilesType == FileType.Header)\n          {\n            --TotalCheckedFixedHeaders;\n          }\n        }\n      }\n    }\n\n    /// <summary>\n    /// Update all properties to 0\n    /// </summary>\n    public void UpdateToUncheckAll()\n    {\n      TotalCheckedFixedFiles = 0;\n      TotalCheckedFixedHeaders = 0;\n      TotalCheckedFixedSouceFiles = 0;\n      TotalCheckedSourceFiles = 0;\n      TotalCheckedHeaders = 0;\n      TotalCheckedFiles = 0;\n    }\n\n    /// <summary>\n    /// Update fixed and unfixed number for source file and headers.\n    /// Make changes of peroperties based on fact that passed file is fixed or unfixed\n    /// </summary>\n    public void UpdateFixFileState(FileModel file)\n    {\n      if (file.IsChecked)\n      {\n        if (file.IsFixed)\n        {\n          //Update just fix properties\n          ++TotalCheckedFixedFiles;\n          if (file.FilesType == FileType.SourceFile)\n          {\n            ++TotalCheckedFixedSouceFiles;\n          }\n          if (file.FilesType == FileType.Header)\n          {\n            ++TotalCheckedFixedHeaders;\n          }\n        }\n        else\n        {\n          //Update just unfixed properties\n          --TotalCheckedFixedFiles;\n          if (file.FilesType == FileType.SourceFile)\n          {\n            --TotalCheckedFixedSouceFiles;\n          }\n          if (file.FilesType == FileType.Header)\n          {\n            --TotalCheckedFixedHeaders;\n          }\n        }\n      }\n    }\n\n    #endregion\n  \n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/CustomMatchesModel.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Helpers;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class CustomMatchesModel : ComponentVisibility, IViewMatcher\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n    private string matches = string.Empty;\n\n    public CustomMatchesModel() { }\n    public string Name { get; } = \"Custom matches\";\n\n    public int Id { get; } = FindCommandIds.kCustomMatchesId;\n\n    public string Matchers\n    {\n      get { return matches; }\n      set\n      {\n        matches = value;\n        PowerShellWrapper.InteractivCommands = JoinUtility.AddMatcherKeyword(value);\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Matches\"));\n      }\n    }\n\n    public string Details { get; } = \"Ex: match functionDecl(hasName(\\\"test\\\"))  // Matches call expressions with name test\";\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/DefaultArgsModel.cs",
    "content": "﻿using ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class DefaultArgsModel : ComponentVisibility, IViewMatcher\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private string functionName = string.Empty;\n    private int defaultArgsPosition = 0;\n\n    public DefaultArgsModel() { }\n\n    public string Name { get; } = \"Function called with default argument(s)\";\n\n    public int Id { get; } = FindCommandIds.kDefaultArgsId;\n\n    public string FunctionName\n    {\n      get { return functionName; }\n      set\n      {\n        functionName = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FunctionName\"));\n      }\n    }\n\n\n    public int DefaultArgsPosition\n    {\n      get { return defaultArgsPosition; }\n      set\n      {\n        defaultArgsPosition = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DefaultArgsPosition\"));\n      }\n    }\n\n    public string Details { get; } = \"Matches invocations of a function where some of the parameters are not explicitly set (default parameters).\\n\\n\" +\n    \"For example:\\nvoid test(int p1 = 10, string p2 = \\\"a\\\") { }\\n\" +\n      \"test();               // Matched by 1 or 0 explicit arguments\\n\" +\n      \"test(20);           // Matched by 1 explicit arguments\\n\" +\n      \"test(20, \\\"Z\\\");    // Never matched \\n\";\n  }\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/FileType.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels\n{\n    public enum FileType\n    {\n      SourceFile,\n      Header\n    }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/FindControllerModel.cs",
    "content": "﻿using ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing System.Collections.Generic;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class FindControllerModel\n  {\n    protected string matcherDetails = string.Empty;\n\n    public DefaultArgsModel DefaultArgsModel { get; set; }\n    public CustomMatchesModel CustomMatchesModel { get; set; }\n    public List<IViewMatcher> ViewMatchers;\n    protected IViewMatcher currentViewMatcher;\n\n    public FindControllerModel()\n    {\n      DefaultArgsModel = new DefaultArgsModel();\n      CustomMatchesModel = new CustomMatchesModel();\n      ViewMatchers = new List<IViewMatcher>();\n\n      ViewMatchers.Add(DefaultArgsModel);\n      ViewMatchers.Add(CustomMatchesModel);\n\n      currentViewMatcher = DefaultArgsModel;\n      ShowSelectedModel(currentViewMatcher);\n    }\n\n\n    protected void HidePreviousSelectedModel()\n    {\n      currentViewMatcher.Hide();\n    }\n\n    protected void ShowSelectedModel(IViewMatcher viewMatcher)\n    {\n      currentViewMatcher = viewMatcher;\n      currentViewMatcher.Show();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/FindToolWindowModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.ToolWindowModels\n{\n  public class FindToolWindowModel : FindControllerModel, INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n    private bool isRunning = false;\n    private ComponentVisibility progressBarVisibility = new();\n    private ComponentVisibility menuVisibility = new();\n\n    public FindToolWindowModel()\n    {\n      HideProgressBar();\n      menuVisibility.Show();\n    }\n\n    public void UpdateUiToSelectedModel(IViewMatcher viewMatcher)\n    {\n      HidePreviousSelectedModel();\n      ShowSelectedModel(viewMatcher);\n      CurrentViewMatcher = currentViewMatcher;\n    }\n\n    public string ProgressBarVisibility\n    {\n      get { return progressBarVisibility.Visibility; }\n    }\n\n    public string MenuVisibility\n    {\n      get { return menuVisibility.Visibility; }\n    }\n\n    public IViewMatcher CurrentViewMatcher\n    {\n      get { return currentViewMatcher; }\n      set\n      {\n        currentViewMatcher = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CurrentViewMatcher\"));\n      }\n    }\n\n    public bool IsEnabled\n    {\n      get { return !IsRunning; }\n      set\n      {\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsEnabled\"));\n      }\n    }\n\n    public bool IsRunning\n    {\n      get\n      {\n        return isRunning;\n      }\n      set\n      {\n        if (value)\n          ShowProgressBar();\n        else\n          HideProgressBar();\n        isRunning = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsRunning\"));\n      }\n    }\n\n    private void ShowProgressBar()\n    {\n      progressBarVisibility.Show();\n      menuVisibility.Hide();\n    }\n\n    private void HideProgressBar()\n    {\n      progressBarVisibility.Hide();\n      menuVisibility.Show();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/IconModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Constants;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Text;\n\nnamespace ClangPowerToolsShared.MVVM.Models\n{\n  public class IconModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    private string iconPath;\n    private string visibility;\n    private string tooltip;\n    private bool isEnabled;\n\n    #endregion\n\n    #region Constructors\n\n    public IconModel()\n    {\n\n    }\n\n    public IconModel(string iconPath, string visibility, bool isEnabled, string tooltip = \"\")\n    {\n      this.iconPath = iconPath;\n      this.visibility = visibility;\n      this.isEnabled = isEnabled;\n      this.tooltip = tooltip;\n    }\n\n    #endregion\n\n    #region Properties\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    public string IconPath \n    { \n      get { return iconPath; }\n      set\n      {\n        iconPath = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IconPath\"));\n      }\n    }\n\n    public string Tooltip\n    {\n      get { return tooltip; }\n      set\n      {\n        tooltip = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Tooltip\"));\n      }\n    }\n\n    public string Visibility \n    {\n      get { return visibility; }\n      set\n      {\n        visibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Visibility\"));\n      }\n    }\n    public bool IsEnabled\n    { \n      get { return isEnabled; }   \n      set\n      {\n        isEnabled = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsEnabled\"));\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/ToolWindowModels/TidyToolWindowModel.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing System.ComponentModel;\n\nnamespace ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels\n{\n  public class TidyToolWindowModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    private bool isRunning;\n    private string progressBarVisibility;\n    private string buttonVisibility;\n    private bool isChecked;\n    public bool isDiscardEnabled;\n    public CountFilesModel CountFilesModel;\n\n    #endregion\n\n    #region Constructors\n\n    public TidyToolWindowModel()\n    {\n      //init private icons\n      discardFixIcon = new IconModel(IconResourceConstants.DiscardFixDisabled, UIElementsConstants.Visibile, false);\n      tidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true);\n      refreshTidyIcon = new IconModel(VSThemeCommand.GetRefreshTidyIconEnabled(), UIElementsConstants.Visibile, true);\n      removeIcon = new IconModel(VSThemeCommand.GetIgnoreIconEnabled(), UIElementsConstants.Visibile, true);\n\n      //Init\n      CountFilesModel = new CountFilesModel();\n\n      //Register events\n      CountFilesModel.PropertyChanged += UpdateIconsOnPropertyChange;\n\n      //Init public icons\n      RemoveIcon = new IconModel(VSThemeCommand.GetIgnoreIconEnabled(), UIElementsConstants.Visibile, true);\n      DiscardFixIcon = new IconModel(IconResourceConstants.DiscardFixDisabled, UIElementsConstants.Visibile, false);\n      TidyFixIcon = new IconModel(VSThemeCommand.GetTidyFixIconEnabled(), UIElementsConstants.Visibile, true);\n      RefreshTidyIcon = new IconModel(VSThemeCommand.GetRefreshTidyIconEnabled(), UIElementsConstants.Visibile, true);\n\n      //Hide progress bar\n      ProgressBarVisibility = UIElementsConstants.Hidden;\n      ButtonVisibility = UIElementsConstants.Visibile;\n    }\n\n    #endregion\n\n    #region Icons\n\n    private IconModel discardFixIcon;\n    public IconModel DiscardFixIcon\n    {\n      get\n      {\n        return discardFixIcon;\n      }\n      set\n      {\n        if (CountFilesModel.TotalCheckedFixedFiles == 0)\n        {\n          discardFixIcon.IconPath = IconResourceConstants.DiscardFixDisabled;\n          discardFixIcon.IsEnabled = false;\n        }\n        else\n        {\n          discardFixIcon.IconPath = VSThemeCommand.GetDiscardFixIconEnabled();\n          discardFixIcon.IsEnabled = true;\n        }\n        discardFixIcon.Tooltip = $\"Discard fix {CountFilesModel.TotalCheckedFixedFiles} files\";\n        discardFixIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DiscardFixIcon\"));\n      }\n    }\n\n    private IconModel tidyFixIcon;\n    public IconModel TidyFixIcon\n    {\n      get { return tidyFixIcon; }\n      set\n      {\n        if (CountFilesModel.TotalCheckedFiles == 0 ||\n          CountFilesModel.TotalCheckedSourceFiles == CountFilesModel.TotalCheckedFixedSouceFiles ||\n          CountFilesModel.TotalCheckedSourceFiles == 0)\n        {\n          tidyFixIcon.IconPath = IconResourceConstants.FixDisabled;\n          tidyFixIcon.IsEnabled = false;\n        }\n        else\n        {\n          tidyFixIcon.IconPath = VSThemeCommand.GetTidyFixIconEnabled();\n          tidyFixIcon.IsEnabled = true;\n        }\n        tidyFixIcon.Tooltip = $\"Fix {CountFilesModel.TotalCheckedSourceFiles - CountFilesModel.TotalCheckedFixedSouceFiles} source files\";\n        tidyFixIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyFixIcon\"));\n      }\n    }\n\n    private IconModel refreshTidyIcon;\n    public IconModel RefreshTidyIcon\n    {\n      get { return refreshTidyIcon; }\n      set\n      {\n        if (CountFilesModel.TotalCheckedFiles == 0 ||\n          CountFilesModel.TotalCheckedHeaders == CountFilesModel.TotalCheckedFiles)\n        {\n          refreshTidyIcon.IconPath = IconResourceConstants.RefreshDisabled;\n          refreshTidyIcon.IsEnabled = false;\n        }\n        else\n        {\n          refreshTidyIcon.IconPath = VSThemeCommand.GetRefreshTidyIconEnabled();\n          refreshTidyIcon.IsEnabled = true;\n        }\n\n        refreshTidyIcon.Tooltip = $\"Refresh tidy {CountFilesModel.TotalCheckedSourceFiles} source files\";\n        refreshTidyIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"RefreshTidyIcon\"));\n      }\n    }\n\n    private IconModel removeIcon { get; set; }\n    public IconModel RemoveIcon\n    {\n      get { return removeIcon; }\n      set\n      {\n        if (CountFilesModel.TotalCheckedFiles == 0)\n        {\n          removeIcon.IconPath = IconResourceConstants.RemoveDisabled;\n          removeIcon.IsEnabled = false;\n        }\n        else\n        {\n          removeIcon.IconPath = VSThemeCommand.GetIgnoreIconEnabled();\n          removeIcon.IsEnabled = true;\n        }\n\n        removeIcon.Tooltip = $\"Ignore {CountFilesModel.TotalCheckedFiles} files\";\n        removeIcon = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"RemoveIcon\"));\n      }\n    }\n\n    #endregion\n\n    #region Properties\n\n    public bool IsChecked\n    {\n      get { return isChecked; }\n      set\n      {\n        if (isChecked == value) { return; }\n        isChecked = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsChecked\"));\n      }\n    }\n\n    public bool IsRunning\n    {\n      get\n      {\n        return isRunning;\n      }\n\n      set\n      {\n        if (value)\n        {\n          ProgressBarVisibility = UIElementsConstants.Visibile;\n          ButtonVisibility = UIElementsConstants.Hidden;\n        }\n        else\n        {\n          ProgressBarVisibility = UIElementsConstants.Hidden;\n          ButtonVisibility = UIElementsConstants.Visibile;\n        }\n        isRunning = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"IsRunning\"));\n      }\n    }\n\n    public string ProgressBarVisibility\n    {\n      get { return progressBarVisibility; }\n      set\n      {\n        progressBarVisibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"ProgressBarVisibility\"));\n      }\n    }\n\n\n    public string ButtonVisibility\n    {\n      get { return buttonVisibility; }\n      set\n      {\n        buttonVisibility = value;\n        RefreshTidyIcon.Visibility = value;\n        TidyFixIcon.Visibility = value;\n        DiscardFixIcon.Visibility = value;\n        RemoveIcon.Visibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"ButtonVisibility\"));\n      }\n    }\n\n    #endregion\n\n    #region Methods\n\n    /// <summary>\n    /// Change theme just for enabled icons\n    /// </summary>\n    public void ChangeIconsTheme()\n    {\n      RefreshTidyIcon.IconPath = RefreshTidyIcon.IsEnabled ?\n        VSThemeCommand.GetRefreshTidyIconEnabled() : IconResourceConstants.DiffDisabled;\n      TidyFixIcon.IconPath = TidyFixIcon.IsEnabled ?\n        VSThemeCommand.GetTidyFixIconEnabled() : IconResourceConstants.FixDisabled;\n      DiscardFixIcon.IconPath = DiscardFixIcon.IsEnabled ?\n        VSThemeCommand.GetDiscardFixIconEnabled() : IconResourceConstants.FixDisabled;\n      RemoveIcon.IconPath = RemoveIcon.IsEnabled ?\n        VSThemeCommand.GetIgnoreIconEnabled() : IconResourceConstants.FixDisabled;\n    }\n\n    /// <summary>\n    /// Update icons\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"e\"></param>\n    private void UpdateIconsOnPropertyChange(object sender, System.EventArgs e)\n    {\n      TidyFixIcon = tidyFixIcon;\n      DiscardFixIcon = discardFixIcon;\n      RefreshTidyIcon = refreshTidyIcon;\n      RemoveIcon = removeIcon;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Models/UserModel.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools\n{\n  public class UserModel : IDisposable\n  {\n    #region Properties\n\n    public string email { get; set; }\n    public string password { get; set; }\n    #endregion\n\n    #region Constructor\n\n    public UserModel(string email, string password)\n    {\n      this.email = email;\n      this.password = password;\n    }\n\n    public UserModel() { }\n\n    public void Dispose()\n    {\n      email = string.Empty;\n      password = string.Empty;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/ClangFormatPathValue.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class ClangFormatPathValue\n  {\n    #region Members \n\n    private string mValue = string.Empty;\n\n    #endregion\n\n\n    #region Properties\n\n    public bool Enable { get; set; } = false;\n\n    public string Value\n    {\n      get\n      {\n        return mValue;\n      }\n      set\n      {\n        mValue = value;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/ClangTidyPathValue.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class ClangTidyPathValue\n  {\n    #region Members \n\n    private string mValue = string.Empty;\n\n    #endregion\n\n\n    #region Properties\n\n    public bool Enable { get; set; } = false;\n\n    public string Value\n    {\n      get\n      {\n        return mValue;\n      }\n      set\n      {\n        mValue = value;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/HeaderFiltersValue.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class HeaderFiltersValue\n  {\n    #region Members\n\n    private string mHeaderFilterValue;\n\n    #endregion\n\n\n    #region Constructor\n\n    public HeaderFiltersValue(string aValue)\n    {\n      mHeaderFilterValue = aValue;\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public string HeaderFilters\n    {\n      get\n      {\n        return mHeaderFilterValue;\n      }\n      set\n      {\n        mHeaderFilterValue = value;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/OldModels/ClangFormatOptions.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerTools\n{\n  [Serializable]\n  public class ClangFormatOptions\n  {\n    #region Properties \n\n\n    #region Format On Save\n\n    public bool EnableFormatOnSave { get; set; }\n\n    public string FileExtensions { get; set; }\n\n    public string SkipFiles { get; set; }\n\n    #endregion\n\n\n    #region Format Options\n\n    public string AssumeFilename { get; set; }\n\n    public ClangFormatFallbackStyle FallbackStyle { get; set; }\n\n\n    public ClangFormatStyle Style { get; set; }\n\n\n    #endregion\n\n\n    #region Clang-Format executable path\n\n    public ClangFormatPathValue ClangFormatPath { get; set; }\n\n    #endregion\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/OldModels/ClangOptions.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class ClangOptions\n  {\n    public string ProjectsToIgnore { get; set; } = string.Empty;\n\n    public string ProjectsToIgnoreCollection { get; set; } = string.Empty;\n\n    public string FilesToIgnore { get; set; } = string.Empty;\n\n    public string FilesToIgnoreCollection { get; set; } = string.Empty;\n\n    public bool Continue { get; set; } = false;\n\n    public bool TreatWarningsAsErrors { get; set; } = false;\n\n    public ClangGeneralAdditionalIncludes AdditionalIncludes { get; set; } = ClangGeneralAdditionalIncludes.IncludeDirectories;\n    public string VerbosityLevel { get; set; } = \"0\";\n\n    public bool VerboseMode { get; set; } = false;\n\n    public string ClangFlags { get; set; } = string.Empty;\n\n    public string ClangFlagsCollection { get; set; } = DefaultOptions.ClangFlags;\n\n    public bool ClangCompileAfterVsCompile { get; set; } = false;\n\n    public string Version { get; set; } = string.Empty;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/OldModels/ClangTidyOptions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  [Serializable]\n  public class ClangTidyOptions\n  {\n    #region Properties\n\n    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]\n    public List<string> TidyChecks { get; set; } = new List<string>();\n\n    public string TidyChecksCollection { get; set; }\n\n    public bool AutoTidyOnSave { get; set; }\n\n    public bool FormatAfterTidy { get; set; }\n\n    public string HeaderFilter { get; set; }\n\n    public ClangTidyUseChecksFrom TidyMode { get; set; }\n\n    public ClangTidyPathValue ClangTidyPath { get; set; }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/OldSettings/OldModels/DefaultOptions.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class DefaultOptions\n  {\n    public const string ClangFlags = \"-Wall;-fms-compatibility-version=19.10;-Wmicrosoft;-Wno-invalid-token-paste;-Wno-unknown-pragmas;-Wno-unused-value\";\n    public const string HeaderFilter = \".*\";\n    public const string FileExtensions = \".c;.cpp;.cxx;.cc;.cs;.tli;.tlh;.h;.hh;.hpp;.hxx;.inl;.ixx\";\n    public const string IgnoreFiles = \"resource.h\";\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/PreinstalledLlvm.cs",
    "content": "﻿using ClangPowerTools.MVVM.Controllers;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.IO;\n\nnamespace ClangPowerTools\n{\n  public class PreinstalledLlvm\n  {\n    #region Members\n\n    private readonly List<LlvmModel> llvms;\n    private readonly ObservableCollection<string> installedLlvms;\n\n    private readonly LlvmController llvmController = new LlvmController();\n\n    #endregion\n\n    public PreinstalledLlvm(List<LlvmModel> llvms, ObservableCollection<string> installedLlvms)\n    {\n      this.llvms = llvms;\n      this.installedLlvms = installedLlvms;\n    }\n\n    #region Methods\n\n    public void SetPreinstalledLlvm(string path = null, string version = null)\n    {\n      var llvmSettingsModel = SettingsProvider.LlvmSettingsModel;\n\n      if (path == null || version == null)\n        GetPathAndVersion(out path, out version);\n\n      if (string.IsNullOrWhiteSpace(path) || string.IsNullOrWhiteSpace(version))\n        return;\n\n      SetPathAndVersion(path, version);\n      if (llvmSettingsModel.PreinstalledLlvmVersion == string.Empty)\n        return;\n      if (!IsVersionInstalled(version))\n        installedLlvms.Add(llvmSettingsModel.PreinstalledLlvmVersion);\n    }\n\n    private bool IsVersionInstalled(string version)\n    {\n      foreach (var llvm in installedLlvms)\n      {\n        if (llvm == version)\n        {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    private void SetPathAndVersion(string path, string version)\n    {\n      var settingsProviderLlvmModel = SettingsProvider.LlvmSettingsModel;\n      if (string.IsNullOrWhiteSpace(settingsProviderLlvmModel.PreinstalledLlvmVersion) || \n        string.IsNullOrWhiteSpace(settingsProviderLlvmModel.PreinstalledLlvmPath) ||\n        (!string.IsNullOrWhiteSpace(path) && !string.IsNullOrWhiteSpace(version) && \n        version != settingsProviderLlvmModel.PreinstalledLlvmVersion))\n      {\n        settingsProviderLlvmModel.PreinstalledLlvmVersion = version;\n        settingsProviderLlvmModel.PreinstalledLlvmPath = path;\n        CommandControllerInstance.CommandController.DisplayMessage(true, $\"ℹ Added successfully LLVM path: {path}\");\n      }\n\n      if (Directory.Exists(settingsProviderLlvmModel.PreinstalledLlvmPath) == false)\n      {\n        if (settingsProviderLlvmModel.PreinstalledLlvmVersion\n          == settingsProviderLlvmModel.LlvmSelectedVersion)\n        {\n          settingsProviderLlvmModel.LlvmSelectedVersion = string.Empty;\n        }\n\n        settingsProviderLlvmModel.PreinstalledLlvmPath = string.Empty;\n        settingsProviderLlvmModel.PreinstalledLlvmVersion = string.Empty;\n\n        CommandControllerInstance.CommandController.DisplayMessage(false, $\"ℹ Remove LLVM \" +\n          $\"{settingsProviderLlvmModel.PreinstalledLlvmPath} from Clang Power Tools\");\n      }\n    }\n\n    private void GetPathAndVersion(out string path, out string version)\n    {\n      path = string.Empty;\n      version = string.Empty;\n      var llvmSettingsModel = SettingsProvider.LlvmSettingsModel;\n      if (installedLlvms.Count == 0)\n      {\n        path = llvmController.GetLlvmPathFromRegistry();\n        version = llvmController.GetVersionFromRegistry();\n        llvmSettingsModel.LlvmSelectedVersion = version;\n      }\n      if (path == string.Empty || version == string.Empty)\n      {\n        path = llvmSettingsModel.PreinstalledLlvmPath;\n        version = llvmSettingsModel.PreinstalledLlvmVersion;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Provider/FindToolWindowProvider.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing ClangPowerToolsShared.MVVM.ViewModels;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace ClangPowerToolsShared.MVVM.Provider\n{\n  public class FindToolWindowProvider\n  {\n    private static readonly FindToolWindowProvider instance = new FindToolWindowProvider();\n    private static List<AutoCompleteHistoryViewModel> autoCompleteHistory { get; set; } = new List<AutoCompleteHistoryViewModel>();\n    public static FindToolWindowProvider Instance = new FindToolWindowProvider();\n    public static List<AutoCompleteHistoryViewModel> AutoCompleteHistory { get { return autoCompleteHistory; } }\n    public const int maxHistoryCount = 100;\n    public const int maxFavoritHistoryCount = 20;\n    public const int countToDelete = 15;\n    public static void AddAutoCompleteHistory(AutoCompleteHistoryViewModel matcher)\n    {\n      if (autoCompleteHistory is null)\n        autoCompleteHistory = new();\n      autoCompleteHistory.Insert(0, matcher);\n    }\n\n    public static void RemoveFromFullList()\n    {\n      if (autoCompleteHistory.Count >= maxHistoryCount)\n      {\n        autoCompleteHistory = autoCompleteHistory.OrderBy(u => u.RememberAsFavorit ? 0 : 1).ToList();\n        autoCompleteHistory.RemoveRange(maxFavoritHistoryCount, countToDelete);\n      }\n    }\n\n    public static void UpdateFavoriteValue(AutoCompleteHistoryModel autoCompleteHistoryViewModel, bool favoriteValueChange)\n    {\n      var historyModel = autoCompleteHistory.Find(a => a.Value == autoCompleteHistoryViewModel.Value);\n      if (historyModel != null)\n      {\n        historyModel.RememberAsFavorit = autoCompleteHistoryViewModel.RememberAsFavorit;\n      }\n    }\n\n    public static bool CheckRememberFavoritIsMax(AutoCompleteHistoryModel autoCompleteHistoryViewModel)\n    {\n      var test = autoCompleteHistory.FindAll(a => a.RememberAsFavorit == true).Count >= maxFavoritHistoryCount;\n      return autoCompleteHistory.FindAll(a => a.RememberAsFavorit == true).Count >= maxFavoritHistoryCount;\n    }\n\n    public static void UpdateAutoCompleteList(List<AutoCompleteHistoryViewModel> autoCompleteHistoryViewModels)\n    {\n      if (autoCompleteHistory is null || autoCompleteHistoryViewModels is null)\n        autoCompleteHistory = new List<AutoCompleteHistoryViewModel>();\n      autoCompleteHistory = autoCompleteHistoryViewModels.OrderBy(u => u.RememberAsFavorit ? 0 : 1).ToList();\n    }\n\n    static FindToolWindowProvider() { }\n    private FindToolWindowProvider() { }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Provider/SettingsProvider.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Views;\n\nnamespace ClangPowerTools\n{\n  public class SettingsProvider\n  {\n    #region Properties \n\n    public static CompilerSettingsModel CompilerSettingsModel { get; set; } = new CompilerSettingsModel();\n    public static FormatSettingsModel FormatSettingsModel { get; set; } = new FormatSettingsModel();\n    public static TidySettingsModel TidySettingsModel { get; set; } = new TidySettingsModel();\n    public static GeneralSettingsModel GeneralSettingsModel { get; set; } = new GeneralSettingsModel();\n    public static LlvmSettingsModel LlvmSettingsModel { get; set; } = new LlvmSettingsModel();\n    public static AccountModel AccountModel { get; set; } = new AccountModel();\n    public static SettingsView SettingsView { get; set; }\n\n    public SettingsProvider Instance\n    {\n      get\n      {\n        return instance;\n      }\n    }\n\n    #endregion\n\n    #region Members\n\n    private static readonly SettingsProvider instance = new SettingsProvider();\n\n    #endregion\n\n    #region Constructor\n\n    // Explicit static constructor to tell C# compiler\n    // not to mark type as beforefieldinit\n    static SettingsProvider()\n    {\n    }\n\n    private SettingsProvider()\n    {\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/SettingsHandler.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Controllers;\nusing ClangPowerTools.MVVM.LicenseValidation;\nusing ClangPowerTools.MVVM.Models;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools\n{\n  public class SettingsHandler\n  {\n    #region Members\n    public static Action RefreshSettingsView;\n\n    private readonly string settingsPath = string.Empty;\n    private const string SettingsFileName = \"settings.json\";\n    private const string UserProfileFileName = \"userProfile.json\";\n    private const string GeneralConfigurationFileName = \"GeneralConfiguration.config\";\n    private const string FormatConfigurationFileName = \"FormatConfiguration.config\";\n    private const string TidyOptionsConfigurationFileName = \"TidyOptionsConfiguration.config\";\n    private const string TidyPredefinedChecksConfigurationFileName = \"TidyPredefinedChecksConfiguration.config\";\n    private const int MinJsonElements = 5;\n    #endregion\n\n    #region Constructor\n    public SettingsHandler()\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      settingsPath = settingsPathBuilder.GetPath(\"\");\n    }\n    #endregion\n\n    #region Public Methods \n    /// <summary>\n    /// Load settings or import old settings\n    /// </summary>\n    public void InitializeSettings()\n    {\n      if (SettingsFileExists())\n      {\n        LoadSettings();\n      }\n      else if (OldGeneralSettingsExists())\n      {\n        ImportOldSettings();\n      }\n      else\n      {\n        CreateDeaultSettings();\n      }\n    }\n\n    public async Task InitializeAccountSettingsAsync()\n    {\n      SettingsProvider.AccountModel = new AccountModel();\n      AccountModel loadedAccountModel = null;\n\n      var networkConnected = await NetworkUtility.CheckInternetConnectionAsync();\n\n      if (networkConnected)\n      {\n        loadedAccountModel = await LoadServerAccountSettingsAsync();\n      }\n      else if (!networkConnected || loadedAccountModel == null)\n      {\n        loadedAccountModel = LoadLocalAccountSettings();\n      }\n\n      if (loadedAccountModel == null)\n        return;\n\n      SettingsProvider.AccountModel = new AccountModel\n      {\n        UserName = loadedAccountModel.UserName,\n        Email = loadedAccountModel.Email,\n        LicenseType = loadedAccountModel.LicenseType,\n        LicenseExpirationDate = loadedAccountModel.LicenseExpirationDate,\n      };\n    }\n\n    /// <summary>\n    /// Save settings at a custom path\n    /// </summary>\n    /// <param name=\"path\"></param>\n    public void SaveSettings(string path)\n    {\n      List<object> models = CreateModelsList();\n      SerializeSettings(models, path);\n    }\n\n    /// <summary>\n    /// Save settings at the predefined path\n    /// </summary>\n    public void SaveSettings()\n    {\n      List<object> models = CreateModelsList();\n      string path = GetSettingsFilePath(settingsPath, SettingsFileName);\n      SerializeSettings(models, path);\n\n      string userProfilePath = GetSettingsFilePath(settingsPath, UserProfileFileName);\n      SerializeSettings(SettingsProvider.AccountModel, userProfilePath);\n    }\n\n    /// <summary>\n    /// Load settings from a custom path\n    /// </summary>\n    /// <param name=\"path\"></param>\n    public void LoadSettings(string path)\n    {\n      if (File.Exists(path))\n      {\n        string json = ReadSettingsFile(path);\n        DeserializeSettings(json);\n        RefreshSettingsView?.Invoke();\n      }\n    }\n\n    /// <summary>\n    /// Load settings from the predefined path\n    /// </summary>\n    public void LoadSettings()\n    {\n      string path = GetSettingsFilePath(settingsPath, SettingsFileName);\n      if (File.Exists(path))\n      {\n        string json = ReadSettingsFile(path);\n        DeserializeSettings(json);\n      }\n      else\n      {\n        CreateDeaultSettings();\n      }\n    }\n\n    public bool SettingsFileExists()\n    {\n      string path = GetSettingsFilePath(settingsPath, SettingsFileName);\n      return File.Exists(path);\n    }\n\n    public void ResetSettings()\n    {\n      CreateDeaultSettings();\n      RefreshSettingsView?.Invoke();\n    }\n\n    public string GetSettingsAsJson()\n    {\n      List<object> models = CreateModelsList();\n      return JsonConvert.SerializeObject(models);\n    }\n\n    public void LoadCloudSettings(string json)\n    {\n      DeserializeSettings(json);\n      SaveSettings();\n      RefreshSettingsView?.Invoke();\n    }\n\n    public async Task LicenseInfoUpdateAsync()\n    {\n      KeyValuePair<LicenseType, string> licenseInfo = await GetLicenseInfoAsync();\n\n      SettingsProvider.AccountModel.LicenseType = licenseInfo.Key;\n\n      if (licenseInfo.Key == LicenseType.Trial)\n      {\n        SettingsProvider.AccountModel.LicenseExpirationDate = GetTrialLicenseExpirationDate();\n      }\n      else\n      {\n        SettingsProvider.AccountModel.LicenseExpirationDate = !string.IsNullOrWhiteSpace(licenseInfo.Value) ?\n          DateTime.Parse(licenseInfo.Value).ToString(\"MMMM dd yyyy\") : \"Never\";\n      }\n    }\n\n    public async Task UserProfileInfoUpdateAsync()\n    {\n      var accountModel = await GetUserProfileAsync();\n\n      SettingsProvider.AccountModel.UserName = $\"{accountModel.firstname} {accountModel.lastname}\";\n      SettingsProvider.AccountModel.Email = accountModel.email;\n    }\n\n    public string GetTrialLicenseExpirationDate()\n    {\n      var expirationDate = new FreeTrialController().GetExpirationDateAsString();\n\n      return !string.IsNullOrWhiteSpace(expirationDate) ?\n        DateTime.Parse(expirationDate).ToString(\"MMMM dd yyyy\") : string.Empty;\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private void CreateDeaultSettings()\n    {\n      SettingsProvider.CompilerSettingsModel = new CompilerSettingsModel();\n      SettingsProvider.FormatSettingsModel = new FormatSettingsModel();\n      SettingsProvider.TidySettingsModel = new TidySettingsModel();\n      SettingsProvider.LlvmSettingsModel = new LlvmSettingsModel();\n\n      SetDefaultTidyPredefindedChecks();\n    }\n\n    private void SetDefaultTidyPredefindedChecks()\n    {\n      var checks = new StringBuilder();\n\n      foreach (var item in TidyChecksDefault.Checks)\n      {\n          checks.Append(item).Append(\";\");\n      }\n      checks.Length--;\n      SettingsProvider.TidySettingsModel.PredefinedChecks = checks.ToString();\n    }\n\n    private void ImportOldSettings()\n    {\n      MapOldSettings();\n      SaveSettings();\n      DeleteOldSettings();\n    }\n\n    private bool OldGeneralSettingsExists()\n    {\n      string path = GetSettingsFilePath(settingsPath, GeneralConfigurationFileName);\n      return File.Exists(path);\n    }\n\n    private void MapOldSettings()\n    {\n      ClangOptions clangOptions = LoadOldSettingsFromFile(new ClangOptions(), GeneralConfigurationFileName);\n      MapClangOptionsToSettings(clangOptions);\n\n      ClangFormatOptions clangFormatOptions = LoadOldSettingsFromFile(new ClangFormatOptions(), FormatConfigurationFileName);\n      MapClangFormatOptionsToSettings(clangFormatOptions);\n\n      ClangTidyOptions clangTidyOptions = LoadOldSettingsFromFile(new ClangTidyOptions(), TidyOptionsConfigurationFileName);\n      MapClangTidyOptionsToSettings(clangTidyOptions);\n    }\n\n    private T LoadOldSettingsFromFile<T>(T settings, string settingsFileName) where T : new()\n    {\n      string path = GetSettingsFilePath(settingsPath, settingsFileName);\n\n      if (File.Exists(path))\n      {\n        SerializeSettings(path, ref settings);\n      }\n      return settings;\n    }\n\n    private void DeleteOldSettings()\n    {\n      string[] files = Directory.GetFiles(settingsPath, \"*.config\");\n      foreach (var file in files)\n      {\n        File.Delete(file);\n      }\n    }\n\n    private List<object> CreateModelsList()\n    {\n      List<object> models = new List<object>\n      {\n        SettingsProvider.CompilerSettingsModel,\n        SettingsProvider.FormatSettingsModel,\n        SettingsProvider.TidySettingsModel,\n        SettingsProvider.GeneralSettingsModel,\n        SettingsProvider.LlvmSettingsModel,\n      };\n      return models;\n    }\n\n    private void SerializeSettings(List<object> models, string path)\n    {\n      using StreamWriter file = File.CreateText(path);\n      var serializer = new JsonSerializer\n      {\n        Formatting = Formatting.Indented\n      };\n      serializer.Serialize(file, models);\n    }\n\n    private void SerializeSettings(object models, string path)\n    {\n      // Remove the hidden attribute of the file in order to overwrite it\n      FileInfo fileInfo;\n      if (File.Exists(path))\n      {\n        fileInfo = new FileInfo(path);\n        fileInfo.Attributes &= ~FileAttributes.Hidden;\n      }\n\n      // Overwrite the file\n      using StreamWriter file = new StreamWriter(path);\n      var serializer = new JsonSerializer\n      {\n        Formatting = Formatting.Indented\n      };\n      serializer.Serialize(file, models);\n\n      // Set back the hidden attribute\n      fileInfo = new FileInfo(path);\n      fileInfo.Attributes |= FileAttributes.Hidden;\n    }\n\n    private void DeserializeSettings(string json)\n    {\n      try\n      {\n        var models = JsonConvert.DeserializeObject<List<object>>(json);\n        var compilerModel = JsonConvert.DeserializeObject<CompilerSettingsModel>(models[0].ToString());\n        var formatModel = JsonConvert.DeserializeObject<FormatSettingsModel>(models[1].ToString());\n        var tidyModel = JsonConvert.DeserializeObject<TidySettingsModel>(models[2].ToString());\n        var generalModel = JsonConvert.DeserializeObject<GeneralSettingsModel>(models[3].ToString());\n\n        LlvmSettingsModel llvmModel;\n        if (models.Count >= MinJsonElements)\n        {\n          llvmModel = JsonConvert.DeserializeObject<LlvmSettingsModel>(models[4].ToString());\n        }\n        else\n        {\n          llvmModel = new LlvmSettingsModel();\n        }\n\n        SetSettingsModels(compilerModel, formatModel, tidyModel, generalModel, llvmModel);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"Cannot Load Clang Power Tools Settings\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    private string ReadSettingsFile(string path)\n    {\n      using StreamReader sw = new StreamReader(path);\n      return sw.ReadToEnd();\n    }\n\n    private void SetSettingsModels(CompilerSettingsModel compilerModel, FormatSettingsModel formatModel,\n      TidySettingsModel tidyModel, GeneralSettingsModel generalModel, LlvmSettingsModel llvmModel)\n    {\n      SettingsProvider.CompilerSettingsModel = compilerModel;\n      SettingsProvider.FormatSettingsModel = formatModel;\n      SettingsProvider.TidySettingsModel = tidyModel;\n      SettingsProvider.GeneralSettingsModel = generalModel;\n      SettingsProvider.LlvmSettingsModel = llvmModel;\n    }\n\n    private string GetSettingsFilePath(string path, string fileName)\n    {\n      return Path.Combine(path, fileName);\n    }\n\n    private void SerializeSettings<T>(string path, ref T config) where T : new()\n    {\n      XmlSerializer serializer = new XmlSerializer();\n      config = serializer.DeserializeFromFile<T>(path);\n    }\n\n    private void MapClangOptionsToSettings(ClangOptions clangOptions)\n    {\n      var compilerSettingsModel = new CompilerSettingsModel();\n      var generalSettingsModel = new GeneralSettingsModel();\n\n      compilerSettingsModel.CompileFlags = clangOptions.ClangFlagsCollection;\n      compilerSettingsModel.FilesToIgnore = clangOptions.FilesToIgnore;\n      compilerSettingsModel.ProjectsToIgnore = clangOptions.ProjectsToIgnore;\n      compilerSettingsModel.WarningsAsErrors = clangOptions.TreatWarningsAsErrors;\n      compilerSettingsModel.ContinueOnError = clangOptions.Continue;\n      compilerSettingsModel.ClangAfterMSVC = clangOptions.ClangCompileAfterVsCompile;\n      compilerSettingsModel.VerbosityLevel = clangOptions.VerbosityLevel;\n      generalSettingsModel.Version = clangOptions.Version;\n\n      SettingsProvider.CompilerSettingsModel = compilerSettingsModel;\n      SettingsProvider.GeneralSettingsModel = generalSettingsModel;\n    }\n\n    private void MapClangFormatOptionsToSettings(ClangFormatOptions clangFormat)\n    {\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        FileExtensions = clangFormat.FileExtensions,\n        FilesToIgnore = clangFormat.SkipFiles,\n        AssumeFilename = clangFormat.AssumeFilename,\n        CustomExecutable = clangFormat.ClangFormatPath.Value,\n        Style = clangFormat.Style,\n        FallbackStyle = clangFormat.FallbackStyle,\n        FormatOnSave = clangFormat.EnableFormatOnSave\n      };\n\n      SettingsProvider.FormatSettingsModel = formatSettingsModel;\n    }\n\n    private void MapClangTidyOptionsToSettings(ClangTidyOptions clangTidy)\n    {\n      var tidySettingsModel = new TidySettingsModel\n      {\n        HeaderFilter = clangTidy.HeaderFilter,\n        CustomChecks = clangTidy.TidyChecksCollection,\n        CustomExecutable = clangTidy.ClangTidyPath.Value,\n        FormatAfterTidy = clangTidy.FormatAfterTidy,\n        TidyOnSave = clangTidy.AutoTidyOnSave\n      };\n\n      SettingsProvider.TidySettingsModel = tidySettingsModel;\n    }\n\n    /// <summary>\n    /// Load the user profile data from the local file\n    /// </summary>\n    /// <returns>The loaded user profile model</returns>\n    private AccountModel LoadLocalAccountSettings()\n    {\n      var path = GetSettingsFilePath(settingsPath, UserProfileFileName);\n      if (!File.Exists(path))\n        return null;\n\n      var json = ReadSettingsFile(path);\n      var accountModel = JsonConvert.DeserializeObject<AccountModel>(json);\n\n      return accountModel;\n    }\n\n    /// <summary>\n    /// Load the user profile data from the server\n    /// </summary>\n    /// <returns>The loaded user profile model</returns>\n    private async Task<AccountModel> LoadServerAccountSettingsAsync()\n    {\n      // User profile\n      var accountApiModel = await GetUserProfileAsync();\n\n      // License\n      KeyValuePair<LicenseType, string> licenseInfo = await GetLicenseInfoAsync();\n\n      // Create the complete Account model object\n      var accountModel = new AccountModel\n      {\n        UserName = $\"{accountApiModel.firstname} {accountApiModel.lastname}\",\n        Email = accountApiModel.email,\n        LicenseType = licenseInfo.Key,\n        LicenseExpirationDate = !string.IsNullOrWhiteSpace(licenseInfo.Value) ?\n          DateTime.Parse(licenseInfo.Value).ToString(\"MMMM dd yyyy\") : \"Never\"\n      };\n\n      return accountModel;\n    }\n\n    /// <summary>\n    /// Get the user profile information from the server\n    /// </summary>\n    /// <returns>User profile data as a model object</returns>\n    private async Task<AccountApiModel> GetUserProfileAsync()\n    {\n      var settingsApi = new SettingsApi();\n      var accountDetailsJson = await settingsApi.GetUserProfileJsonAsync();\n\n      return !string.IsNullOrWhiteSpace(accountDetailsJson) ?\n        DeserializeUserAccountDetails(accountDetailsJson) : new AccountApiModel();\n    }\n\n    /// <summary>\n    /// Get the user license type and the expiration date\n    /// </summary>\n    /// <returns>A KeyValuePair with the license type as the key and license expiration date as the value</returns>\n    private async Task<KeyValuePair<LicenseType, string>> GetLicenseInfoAsync()\n    {\n      // License type\n      LicenseType licenseType = await new LicenseController().GetUserLicenseTypeAsync();\n\n      // License expiration date\n      var settingsApi = new SettingsApi();\n      var licenseDetailsJson = await settingsApi.GetLicenseDetailsJsonAsync();\n      // check for invalid return type after license request\n      // check the length because personal license will return \"[]\" - empty json array \n      var expirationDate = !string.IsNullOrWhiteSpace(licenseDetailsJson) && licenseDetailsJson.Length > 3 ?\n        DeserializeLicenseDetails(licenseDetailsJson).expires : string.Empty;\n\n      return new KeyValuePair<LicenseType, string>(licenseType, expirationDate);\n    }\n\n\n    private AccountApiModel DeserializeUserAccountDetails(string json)\n    {\n      var accoutApiModel = JsonConvert.DeserializeObject<AccountApiModel>(json);\n      return accoutApiModel;\n    }\n\n    private LicenseModel DeserializeLicenseDetails(string json)\n    {\n      var userLicenseCollection = JsonConvert.DeserializeObject<List<LicenseModel>>(json);\n      return userLicenseCollection[0];\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/SettingsTooltips.cs",
    "content": "﻿namespace ClangPowerTools.MVVM\n{\n  public class SettingsTooltips\n  {\n    #region Compile\n    public string CompileFlags { get; } = \"Flags given to clang++ when compiling project, alongside project - specific defines. If empty the default flags will be loaded.\";\n    public string FilesToIgnoreCompile { get; } = \"Array of file(s) to ignore, from the matched ones. If empty, all already matched files are compiled.\";\n    public string ProjectsToIgnore { get; } = \"Array of project(s) to ignore, from the matched ones. If empty, all already matched projects are compiled.\";\n    public string AdditionalIncludes { get; } = \"Specify how clang interprets project additional include directories: as regular includes(-I) or system includes (-isystem ).\";\n    public string WarningsAsErrors { get; } = \"Treats all compiler warnings as errors. For a new project, it may be best to use in all compilations; resolving all warnings will ensure the fewest possible hard to find code defects.\";\n    public string ContinueOnError { get; } = \"Switch to continue project compilation even when errors occur.\";\n    public string ClangAfterMSVC { get; } = \"Automatically run Clang compile on the current source file, after successful MSVC compilation.\";\n    public string VerboseLevel { get; } = \"Select verbosity level displayed in output. Verbosity Level order: 0-minimal, 1-detailed, 2-complete\";\n    public string ShowErrorList { get; } = \"Always show Error List if Clang compile/tidy finishes with errors.\";\n    public string ShowOutputWindow { get; } = \"Always show Output window after Clang compile/tidy or when any Clang Power Tools information message occurs.\";\n    public string ShowSquiggles { get; } = \"Show squiggles for every suggestion generated by Clang.\";\n    public string CpuLimit { get; } = \"Limit the number of cores for compile, tidy, tidy-fix and optimize includes\";\n\n    #endregion\n\n    #region Tidy\n\n    public string HeaderFilter { get; } = \"Regular expression matching the names of the headers to output diagnostics from. Diagnostics from the source file are always displayed.\" +\n      \"This option overrides the 'HeaderFilterRegex' option in .clang-tidy file, if any.\\n\" +\n      \"\\\"Corresponding Header\\\" : output diagnostics/fix only the corresponding header (same filename) for each source file analyzed.\";\n\n    public string UseChecksFrom { get; } = \"Tidy checks: switch between explicitly specified checks (predefined or custom) and using checks from .clang-tidy configuration files.\\n\" +\n      \"Other options are always loaded from .clang-tidy files.\";\n\n    public string PredefinedChecks { get; } = \"A list of clang-tidy static analyzer and diagnostics checks from LLVM.\";\n    public string CustomChecks { get; } = \"Specify clang-tidy checks to run using the standard tidy syntax. You can use wildcards to match multiple checks, combine them, etc (Eg. \\\"modernize-*, readability-*\\\").\";\n    public string CustomExecutableTidy { get; } = \"Specify a custom path for \\\"clang-tidy.exe\\\" file to run instead of the built-in one (v8.0).\";\n    public string CompilationDatabase{ get; } = \"Specify a custom \\\"compile_commands.json\\\" file path to use as a source of compilation flags instead of the flags generated by extension.\";\n    public string DetectClangTidyFile { get; } = \"Automatically detect the \\\".clang-tidy\\\" file and set the \\\"Use checks from\\\" option to \\\"TidyFile\\\" if the file exists. Otherwise, set the \\\"Use checks from\\\" option to \\\"PredefinedChecks\\\".\";\n    public string FormatAfterTidy { get; } = \"Automatically run clang-format after clang-tidy finished.\";\n    public string TidyOnSave { get; } = \"Automatically run clang-tidy when saving the current source file.\";\n    public string ApplyTidyFix { get; } = \"Replace Tidy with Tidy-Fix, in context menu and toolbar\";\n    public string TidyFileConfig { get; } = \"Export tidy options into a \\\".clang-tidy\\\" config file.\";\n\n    #endregion\n\n    #region Format\n\n    public string FileExtensions { get; } = \"When formatting on save, clang-format will be applied only to files with these extensions.\";\n    public string FilesToIgnoreFormat { get; } = \"When formatting on save, clang-format will not be applied on these files.\";\n    public string AssumeFilename { get; } = \"When reading from stdin, clang-format assumes this filename to look for a style config file (with -style=file) and to determine the language.\";\n    public string CustomExecutableFormat { get; } = \"Specify a custom path for \\\"clang-format.exe\\\" file to run instead of the built-in one.\";\n\n    public string Style { get; } = \"Coding style, currently supports: LLVM, Google, Chromium, Mozilla, WebKit.\\nUse -style=file to load \" +\n      \"style configuration from .clang-format file located in one of the parent directories of the \" +\n      \"source file(or current directory for stdin).\\nUse -style=\\\"{key: value, ...}\\\" to set specific parameters, \" +\n      \"e.g.: -style=\\\"{BasedOnStyle: llvm, IndentWidth: 8}\\\".\";\n\n    public string FallbackStyle { get; } = \"The name of the predefined style used as a fallback in case clang-format is invoked with -style=file, \" +\n      \"but can not find the .clang-format file to use.\\nUse -fallback-style=none to skip formatting.\";\n\n    public string FormatOnSave { get; } = \"Enable running clang-format when modified files are saved. Will only format if Style is found (ignores Fallback Style).\";\n\n    public string FormatEditor { get; } = \"Create a .clang-format file from scratch or configure a predefined one. Detect the best matching format style for your code.\";\n\n    public string PowerShellScripts { get; } = \"Manually update the PowerShell scripts used for running Clang commands.\";\n    public string AliasPowerShellScripts { get; } = \"Manually add cpt alias in Windows PowerShell used for running Clang commands.\";\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/TextManipulation.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Documents;\nusing System.Windows.Media;\n\nnamespace ClangPowerTools\n{\n  /// <summary>\n  /// Class for text manipulation operations\n  /// </summary>\n  public class TextManipulation\n  {\n    public static void HighlightKeywords(TextPointer startPointer, TextPointer endPointer, HashSet<string> keywords, Brush foreground)\n    {\n        if (startPointer == null) throw new ArgumentNullException(nameof(startPointer));\n        if (endPointer == null) throw new ArgumentNullException(nameof(endPointer));\n\n        TextRange text = new TextRange(startPointer, endPointer);\n        TextPointer position = text.Start.GetInsertionPosition(LogicalDirection.Forward);\n        while (position != null)\n        {\n          string textInRun = position.GetTextInRun(LogicalDirection.Forward);\n\n          if (string.IsNullOrWhiteSpace(textInRun))\n          {\n            position = position.GetNextContextPosition(LogicalDirection.Forward);\n            continue;\n          }\n\n          ChangeTextColor(keywords, foreground, text, position, textInRun);\n          position = position.GetNextContextPosition(LogicalDirection.Forward);\n        }\n    }\n\n    public static void ReplaceAllTextInFlowDocument(FlowDocument document, string text)\n    {\n      TextRange textRange = new TextRange(document.ContentStart, document.ContentEnd);\n      textRange.Text = text;\n    }\n\n    private static void ChangeTextColor(HashSet<string> keywords, Brush foreground, TextRange text, TextPointer position, string textInRun)\n    {\n      foreach (var keyword in keywords)\n      {\n        int index = textInRun.IndexOf(keyword);\n        if (index != -1 && CheckForSpaceAfterKeyword(textInRun, keyword, index))\n        {\n          TextRange selection = CreateSelection(position, keyword.Length, index);\n          selection.ApplyPropertyValue(TextElement.ForegroundProperty, foreground);\n        }\n      }\n    }\n\n    private static bool CheckForSpaceAfterKeyword(string text, string keyword, int index)\n    {\n      int keywordLength = keyword.Length;\n\n      if (index + keywordLength > text.Length - 1) return false;\n\n      var characterToCheck = text[index + keywordLength];\n      if (characterToCheck == ' ' || characterToCheck == '/') return true;\n\n      return false;\n    }\n\n    private static TextRange CreateSelection(TextPointer position, int keywordLength, int index)\n    {\n      TextPointer selectionStart = position.GetPositionAtOffset(index, LogicalDirection.Forward);\n      TextPointer selectionEnd = selectionStart.GetPositionAtOffset(keywordLength, LogicalDirection.Forward);\n      TextRange selection = new TextRange(selectionStart, selectionEnd);\n      return selection;\n    }\n  }\n}\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/TidyChecks.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools {\n  public class TidyChecks {\n    // You can use tidy checks automation, search in dir root Tidy_Checks_Automation\n    public List<TidyCheckModel> Checks { get; set; } = new() {\n      new TidyCheckModel { Name = \"abseil-cleanup-ctad\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-addition\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-comparison\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-conversion-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-division\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-factory-float\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-factory-scale\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-subtraction\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-duration-unnecessary-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-faster-strsplit-delimiter\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-no-internal-dependencies\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-no-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-redundant-strcat-calls\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-str-cat-append\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-string-find-startswith\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-string-find-str-contains\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-time-comparison\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-time-subtraction\", IsChecked = false },\n      new TidyCheckModel { Name = \"abseil-upgrade-duration-conversions\", IsChecked = false },\n      new TidyCheckModel { Name = \"altera-id-dependent-backward-branch\", IsChecked = false },\n      new TidyCheckModel { Name = \"altera-kernel-name-restriction\", IsChecked = false },\n      new TidyCheckModel { Name = \"altera-single-work-item-barrier\", IsChecked = false },\n      new TidyCheckModel { Name = \"altera-struct-pack-align\", IsChecked = false },\n      new TidyCheckModel { Name = \"altera-unroll-loops\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-accept\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-accept4\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-creat\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-dup\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-epoll-create\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-epoll-create1\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-fopen\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-inotify-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-inotify-init1\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-memfd-create\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-open\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-pipe\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-pipe2\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-cloexec-socket\", IsChecked = false },\n      new TidyCheckModel { Name = \"android-comparison-in-temp-failure-retry\", IsChecked = false },\n      new TidyCheckModel { Name = \"boost-use-ranges\", IsChecked = false },\n      new TidyCheckModel { Name = \"boost-use-to-string\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-argument-comment\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-assert-side-effect\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-assignment-in-if-condition\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-bad-signal-to-kill-thread\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-bitwise-pointer-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-bool-pointer-implicit-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-branch-clone\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-capturing-this-in-member-variable\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-casting-through-void\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-chained-comparison\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-command-processor\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-compare-pointer-to-member-virtual-function\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-copy-constructor-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-copy-constructor-mutates-argument\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-crtp-constructor-accessibility\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-dangling-handle\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-default-operator-new-on-overaligned-type\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-derived-method-shadowing-base-method\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-dynamic-static-initializers\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-easily-swappable-parameters\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-empty-catch\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-exception-copy-constructor-throws\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-exception-escape\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-float-loop-counter\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-fold-init-type\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-forward-declaration-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-forwarding-reference-overload\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-implicit-widening-of-multiplication-result\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-inaccurate-erase\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-inc-dec-in-conditions\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-incorrect-enable-if\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-incorrect-enable-shared-from-this\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-incorrect-roundings\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-infinite-loop\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-integer-division\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-invalid-enum-default-initialization\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-lambda-function-name\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-macro-parentheses\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-macro-repeated-side-effects\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-misleading-setter-of-reference\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-misplaced-operator-in-strlen-in-alloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-misplaced-pointer-arithmetic-in-alloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-misplaced-widening-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-move-forwarding-reference\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-multi-level-implicit-pointer-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-multiple-new-in-one-expression\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-multiple-statement-macro\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-narrowing-conversions\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-no-escape\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-nondeterministic-pointer-iteration-order\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-non-zero-enum-to-bool-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-not-null-terminated-result\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-optional-value-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-parent-virtual-call\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-pointer-arithmetic-on-polymorphic-object\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-posix-return\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-random-generator-seed\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-raw-memory-call-on-non-trivial-type\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-redundant-branch-condition\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-reserved-identifier\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-return-const-ref-from-parameter\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-shared-ptr-array-mismatch\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-signal-handler\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-signed-char-misuse\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-sizeof-container\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-sizeof-expression\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-spuriously-wake-up-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-standalone-empty\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-std-namespace-modification\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-string-constructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-string-integer-assignment\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-string-literal-with-embedded-nul\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-stringview-nullptr\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-enum-usage\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-include\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-memory-comparison\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-memset-usage\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-missing-comma\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-realloc-usage\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-semicolon\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-string-compare\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-suspicious-stringview-data-usage\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-swapped-arguments\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-switch-missing-default-case\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-tagged-union-member-count\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-terminating-continue\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-throwing-static-initialization\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-throw-keyword-missing\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-too-small-loop-variable\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unchecked-optional-access\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unchecked-string-to-number-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-undefined-memory-manipulation\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-undelegated-constructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unhandled-exception-at-new\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unhandled-self-assignment\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unintended-char-ostream-output\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unique-ptr-array-mismatch\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unsafe-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unused-local-non-trivial-variable\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unused-raii\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-unused-return-value\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-use-after-move\", IsChecked = false },\n      new TidyCheckModel { Name = \"bugprone-virtual-near-miss\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-arr39-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-con36-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-con54-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-ctr56-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl03-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl16-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl37-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl50-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl51-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl54-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl58-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-dcl59-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-env33-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err09-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err33-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err34-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err52-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err58-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err60-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-err61-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-exp42-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-fio38-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-flp30-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-flp37-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-int09-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-mem57-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc24-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc30-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc32-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc33-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc50-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc51-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-msc54-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-oop11-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-oop54-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-oop57-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-oop58-cpp\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-pos44-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-pos47-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-sig30-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"cert-str34-c\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.BitwiseShift\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.CallAndMessage\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.DivideZero\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.NonNullParamChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.NullDereference\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.StackAddressEscape\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.UndefinedBinaryOperatorResult\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.ArraySubscript\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.Assign\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.Branch\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.CapturedBlockVariable\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.NewArraySize\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.uninitialized.UndefReturn\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-core.VLASize\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.ArrayDelete\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.InnerPointer\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.Move\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.NewDelete\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.NewDeleteLeaks\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.PlacementNew\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.SelfAssignment\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-cplusplus.StringChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-deadcode.DeadStores\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-fuchsia.HandleChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-nullability.NullableDereferenced\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-nullability.NullablePassedToNonnull\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-nullability.NullableReturnedFromNonnull\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-nullability.NullPassedToNonnull\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-nullability.NullReturnedFromNonnull\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.core.EnumCastOutOfRange\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.cplusplus.UninitializedObject\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.cplusplus.VirtualCall\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.mpi.MPI-Checker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.performance.GCDAntipattern\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.performance.Padding\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.portability.UnixAPI\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-optin.taint.TaintedAlloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.API\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.AtSync\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.AutoreleaseWrite\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.ClassRelease\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.Dealloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.IncompatibleMethodTypes\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.Loops\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.MissingSuperCall\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.NilArg\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.NonNilReturnValue\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.NSAutoreleasePool\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.NSError\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.ObjCGenerics\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.RetainCount\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.SelfInit\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.SuperDealloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.UnusedIvars\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.cocoa.VariadicMethodTypes\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.coreFoundation.CFError\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.coreFoundation.CFNumber\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.coreFoundation.CFRetainRelease\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.coreFoundation.containers.OutOfBounds\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.coreFoundation.containers.PointerSizedValues\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.NumberObjectConversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.ObjCProperty\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-osx.SecKeychainAPI\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.cert.env.InvalidPtr\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.FloatLoopCounter\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.bcmp\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.bcopy\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.bzero\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.decodeValueOfObjCType\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.getpw\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.gets\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.mkstemp\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.mktemp\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.rand\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.strcpy\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.UncheckedReturn\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.insecureAPI.vfork\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.PutenvStackArray\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-security.SetgidSetuidOrder\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.API\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.BlockInCriticalSection\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.cstring.BadSizeArg\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.cstring.NullArg\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.Errno\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.Malloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.MallocSizeof\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.MismatchedDeallocator\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.StdCLibraryFunctions\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.Stream\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-unix.Vfork\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-webkit.NoUncountedMemberChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-webkit.RefCntblBaseVirtualDtor\", IsChecked = false },\n      new TidyCheckModel { Name = \"clang-analyzer-webkit.UncountedLambdaCapturesChecker\", IsChecked = false },\n      new TidyCheckModel { Name = \"concurrency-mt-unsafe\", IsChecked = false },\n      new TidyCheckModel { Name = \"concurrency-thread-canceltype-asynchronous\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-capturing-lambda-coroutines\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-c-arrays\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-const-or-ref-data-members\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-do-while\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-goto\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-magic-numbers\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-non-const-global-variables\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-avoid-reference-coroutine-parameters\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-c-copy-assignment-signature\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-explicit-virtual-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-init-variables\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-interfaces-global-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-macro-to-enum\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-macro-usage\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-misleading-capture-default-by-value\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-missing-std-forward\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-narrowing-conversions\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-noexcept-destructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-noexcept-move-operations\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-noexcept-swap\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-no-malloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-non-private-member-variables-in-classes\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-no-suspend-with-lock\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-owning-memory\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-prefer-member-initializer\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-bounds-array-to-pointer-decay\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-bounds-avoid-unchecked-container-access\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-bounds-constant-array-index\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-bounds-pointer-arithmetic\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-const-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-cstyle-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-member-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-reinterpret-cast\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-static-cast-downcast\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-union-access\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-pro-type-vararg\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-rvalue-reference-param-not-moved\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-slicing\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-special-member-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-use-default-member-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-use-enum-class\", IsChecked = false },\n      new TidyCheckModel { Name = \"cppcoreguidelines-virtual-class-destructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"darwin-avoid-spinlock\", IsChecked = false },\n      new TidyCheckModel { Name = \"darwin-dispatch-once-nonstatic\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-default-arguments-calls\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-default-arguments-declarations\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-header-anon-namespaces\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-multiple-inheritance\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-overloaded-operator\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-statically-constructed-objects\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-temporary-objects\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-trailing-return\", IsChecked = false },\n      new TidyCheckModel { Name = \"fuchsia-virtual-inheritance\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-build-explicit-make-pair\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-build-namespaces\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-build-using-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-default-arguments\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-explicit-constructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-global-names-in-headers\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-objc-avoid-nsobject-new\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-objc-avoid-throwing-exception\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-objc-function-naming\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-objc-global-variable-declaration\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-avoid-underscore-in-googletest-name\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-braces-around-statements\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-casting\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-function-size\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-namespace-comments\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-readability-todo\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-runtime-float\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-runtime-int\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-runtime-operator\", IsChecked = false },\n      new TidyCheckModel { Name = \"google-upgrade-googletest-case\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-avoid-c-arrays\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-avoid-goto\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-braces-around-statements\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-deprecated-headers\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-exception-baseclass\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-explicit-conversions\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-function-size\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-ignored-remove-result\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-invalid-access-moved\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-member-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-move-const-arg\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-multiway-paths-covered\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-named-parameter\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-new-delete-operators\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-no-array-decay\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-no-assembler\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-noexcept-move\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-no-malloc\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-signed-bitwise\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-special-member-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-static-assert\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-undelegated-constructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-uppercase-literal-suffix\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-auto\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-emplace\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-equals-default\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-equals-delete\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-noexcept\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-nullptr\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-use-override\", IsChecked = false },\n      new TidyCheckModel { Name = \"hicpp-vararg\", IsChecked = false },\n      new TidyCheckModel { Name = \"linuxkernel-must-check-errs\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-else-after-return\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-header-guard\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-include-order\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvmlibc-callee-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvmlibc-implementation-in-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvmlibc-inline-function-decl\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvmlibc-restrict-system-libc-headers\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-namespace-comment\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-prefer-isa-or-dyn-cast-in-conditionals\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-prefer-register-over-unsigned\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-prefer-static-over-anonymous-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-qualified-auto\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-twine-local\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-use-new-mlir-op-builder\", IsChecked = false },\n      new TidyCheckModel { Name = \"llvm-use-ranges\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-confusable-identifiers\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-const-correctness\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-coroutine-hostile-raii\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-definitions-in-headers\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-header-include-cycle\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-include-cleaner\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-misleading-bidirectional\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-misleading-identifier\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-misplaced-const\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-new-delete-overloads\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-non-copyable-objects\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-non-private-member-variables-in-classes\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-no-recursion\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-override-with-different-visibility\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-predictable-rand\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-redundant-expression\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-static-assert\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-throw-by-value-catch-by-reference\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-unconventional-assign-operator\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-uniqueptr-reset-release\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-unused-alias-decls\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-unused-parameters\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-unused-using-decls\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-use-anonymous-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"misc-use-internal-linkage\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-avoid-bind\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-avoid-c-arrays\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-avoid-setjmp-longjmp\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-avoid-variadic-functions\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-concat-nested-namespaces\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-deprecated-headers\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-deprecated-ios-base-aliases\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-loop-convert\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-macro-to-enum\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-make-shared\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-make-unique\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-min-max-use-initializer-list\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-pass-by-value\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-raw-string-literal\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-redundant-void-arg\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-replace-auto-ptr\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-replace-disallow-copy-and-assign-macro\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-replace-random-shuffle\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-return-braced-init-list\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-shrink-to-fit\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-type-traits\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-unary-static-assert\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-auto\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-bool-literals\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-constraints\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-default-member-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-designated-initializers\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-emplace\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-equals-default\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-equals-delete\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-integer-sign-comparison\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-nodiscard\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-noexcept\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-nullptr\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-override\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-ranges\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-scoped-lock\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-starts-ends-with\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-std-format\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-std-numbers\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-std-print\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-trailing-return-type\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-transparent-functors\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-uncaught-exceptions\", IsChecked = false },\n      new TidyCheckModel { Name = \"modernize-use-using\", IsChecked = false },\n      new TidyCheckModel { Name = \"mpi-buffer-deref\", IsChecked = false },\n      new TidyCheckModel { Name = \"mpi-type-mismatch\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-assert-equals\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-avoid-nserror-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-dealloc-in-category\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-forbidden-subclassing\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-missing-hash\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-nsdate-formatter\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-nsinvocation-argument-lifetime\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-property-declaration\", IsChecked = false },\n      new TidyCheckModel { Name = \"objc-super-self\", IsChecked = false },\n      new TidyCheckModel { Name = \"openmp-exception-escape\", IsChecked = false },\n      new TidyCheckModel { Name = \"openmp-use-default-none\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-avoid-endl\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-enum-size\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-faster-string-find\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-for-range-copy\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-implicit-conversion-in-loop\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-inefficient-algorithm\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-inefficient-string-concatenation\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-inefficient-vector-operation\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-move-const-arg\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-move-constructor-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-no-automatic-move\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-noexcept-destructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-noexcept-move-constructor\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-noexcept-swap\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-no-int-to-ptr\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-trivially-destructible\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-type-promotion-in-math-fn\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-unnecessary-copy-initialization\", IsChecked = false },\n      new TidyCheckModel { Name = \"performance-unnecessary-value-param\", IsChecked = false },\n      new TidyCheckModel { Name = \"portability-avoid-pragma-once\", IsChecked = false },\n      new TidyCheckModel { Name = \"portability-restrict-system-includes\", IsChecked = false },\n      new TidyCheckModel { Name = \"portability-simd-intrinsics\", IsChecked = false },\n      new TidyCheckModel { Name = \"portability-std-allocator-const\", IsChecked = false },\n      new TidyCheckModel { Name = \"portability-template-virtual-member-function\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-ambiguous-smartptr-reset-call\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-avoid-const-params-in-decls\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-avoid-nested-conditional-operator\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-avoid-return-with-void-value\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-avoid-unconditional-preprocessor-if\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-braces-around-statements\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-const-return-type\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-container-contains\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-container-data-pointer\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-container-size-empty\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-convert-member-functions-to-static\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-delete-null-pointer\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-duplicate-include\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-else-after-return\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-enum-initial-value\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-function-cognitive-complexity\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-function-size\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-identifier-length\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-identifier-naming\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-implicit-bool-conversion\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-inconsistent-declaration-parameter-name\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-isolate-declaration\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-magic-numbers\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-make-member-function-const\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-math-missing-parentheses\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-misleading-indentation\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-misplaced-array-index\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-named-parameter\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-non-const-parameter\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-operators-representation\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-qualified-auto\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-access-specifiers\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-casting\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-control-flow\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-declaration\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-function-ptr-dereference\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-inline-specifier\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-member-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-parentheses\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-preprocessor\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-smartptr-get\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-string-cstr\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-string-init\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-redundant-typename\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-reference-to-constructed-temporary\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-simplify-boolean-expr\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-simplify-subscript-expr\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-static-accessed-through-instance\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-static-definition-in-anonymous-namespace\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-string-compare\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-suspicious-call-argument\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-uniqueptr-delete-release\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-uppercase-literal-suffix\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-use-anyofallof\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-use-concise-preprocessor-directives\", IsChecked = false },\n      new TidyCheckModel { Name = \"readability-use-std-min-max\", IsChecked = false },\n      new TidyCheckModel { Name = \"zircon-temporary-objects\", IsChecked = false },\n\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/TidyChecksDefault.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public static class TidyChecksDefault\n  {\n    public static HashSet<string> Checks { get; } = new()\n    {\n      \"clang-analyzer-apiModeling.StdCLibraryFunctions\",\n      \"clang-analyzer-apiModeling.TrustNonnull\",\n      \"clang-analyzer-apiModeling.google.GTest\",\n      \"clang-analyzer-apiModeling.llvm.CastValue\",\n      \"clang-analyzer-apiModeling.llvm.ReturnValue\",\n      \"clang-analyzer-core.CallAndMessage\",\n      \"clang-analyzer-core.CallAndMessageModeling\",\n      \"clang-analyzer-core.DivideZero\",\n      \"clang-analyzer-core.DynamicTypePropagation\",\n      \"clang-analyzer-core.NonNullParamChecker\",\n      \"clang-analyzer-core.NonnilStringConstants\",\n      \"clang-analyzer-core.NullDereference\",\n      \"clang-analyzer-core.StackAddrEscapeBase\",\n      \"clang-analyzer-core.StackAddressEscape\",\n      \"clang-analyzer-core.UndefinedBinaryOperatorResult\",\n      \"clang-analyzer-core.VLASize\",\n      \"clang-analyzer-core.builtin.BuiltinFunctions\",\n      \"clang-analyzer-core.builtin.NoReturnFunctions\",\n      \"clang-analyzer-core.uninitialized.ArraySubscript\",\n      \"clang-analyzer-core.uninitialized.Assign\",\n      \"clang-analyzer-core.uninitialized.Branch\",\n      \"clang-analyzer-core.uninitialized.CapturedBlockVariable\",\n      \"clang-analyzer-core.uninitialized.UndefReturn\",\n      \"clang-analyzer-cplusplus.InnerPointer\",\n      \"clang-analyzer-cplusplus.Move\",\n      \"clang-analyzer-cplusplus.NewDelete\",\n      \"clang-analyzer-cplusplus.NewDeleteLeaks\",\n      \"clang-analyzer-cplusplus.PlacementNew\",\n      \"clang-analyzer-cplusplus.PureVirtualCall\",\n      \"clang-analyzer-cplusplus.SelfAssignment\",\n      \"clang-analyzer-cplusplus.SmartPtrModeling\",\n      \"clang-analyzer-cplusplus.VirtualCallModeling\",\n      \"clang-analyzer-deadcode.DeadStores\",\n      \"clang-analyzer-fuchsia.HandleChecker\",\n      \"clang-analyzer-nullability.NullPassedToNonnull\",\n      \"clang-analyzer-nullability.NullReturnedFromNonnull\",\n      \"clang-analyzer-nullability.NullabilityBase\",\n      \"clang-analyzer-nullability.NullableDereferenced\",\n      \"clang-analyzer-nullability.NullablePassedToNonnull\",\n      \"clang-analyzer-nullability.NullableReturnedFromNonnull\",\n      \"clang-analyzer-optin.cplusplus.UninitializedObject\",\n      \"clang-analyzer-optin.cplusplus.VirtualCall\",\n      \"clang-analyzer-optin.mpi.MPI-Checker\",\n      \"clang-analyzer-optin.osx.OSObjectCStyleCast\",\n      \"clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker\",\n      \"clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker\",\n      \"clang-analyzer-optin.performance.GCDAntipattern\",\n      \"clang-analyzer-optin.performance.Padding\",\n      \"clang-analyzer-optin.portability.UnixAPI\",\n      \"clang-analyzer-osx.API\",\n      \"clang-analyzer-osx.MIG\",\n      \"clang-analyzer-osx.NSOrCFErrorDerefChecker\",\n      \"clang-analyzer-osx.NumberObjectConversion\",\n      \"clang-analyzer-osx.OSObjectRetainCount\",\n      \"clang-analyzer-osx.ObjCProperty\",\n      \"clang-analyzer-osx.SecKeychainAPI\",\n      \"clang-analyzer-osx.cocoa.AtSync\",\n      \"clang-analyzer-osx.cocoa.AutoreleaseWrite\",\n      \"clang-analyzer-osx.cocoa.ClassRelease\",\n      \"clang-analyzer-osx.cocoa.Dealloc\",\n      \"clang-analyzer-osx.cocoa.IncompatibleMethodTypes\",\n      \"clang-analyzer-osx.cocoa.Loops\",\n      \"clang-analyzer-osx.cocoa.MissingSuperCall\",\n      \"clang-analyzer-osx.cocoa.NSAutoreleasePool\",\n      \"clang-analyzer-osx.cocoa.NSError\",\n      \"clang-analyzer-osx.cocoa.NilArg\",\n      \"clang-analyzer-osx.cocoa.NonNilReturnValue\",\n      \"clang-analyzer-osx.cocoa.ObjCGenerics\",\n      \"clang-analyzer-osx.cocoa.RetainCount\",\n      \"clang-analyzer-osx.cocoa.RetainCountBase\",\n      \"clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak\",\n      \"clang-analyzer-osx.cocoa.SelfInit\",\n      \"clang-analyzer-osx.cocoa.SuperDealloc\",\n      \"clang-analyzer-osx.cocoa.UnusedIvars\",\n      \"clang-analyzer-osx.cocoa.VariadicMethodTypes\",\n      \"clang-analyzer-osx.coreFoundation.CFError\",\n      \"clang-analyzer-osx.coreFoundation.CFNumber\",\n      \"clang-analyzer-osx.coreFoundation.CFRetainRelease\",\n      \"clang-analyzer-osx.coreFoundation.containers.OutOfBounds\",\n      \"clang-analyzer-osx.coreFoundation.containers.PointerSizedValues\",\n      \"clang-analyzer-security.FloatLoopCounter\",\n      \"clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling\",\n      \"clang-analyzer-security.insecureAPI.SecuritySyntaxChecker\",\n      \"clang-analyzer-security.insecureAPI.UncheckedReturn\",\n      \"clang-analyzer-security.insecureAPI.bcmp\",\n      \"clang-analyzer-security.insecureAPI.bcopy\",\n      \"clang-analyzer-security.insecureAPI.bzero\",\n      \"clang-analyzer-security.insecureAPI.decodeValueOfObjCType\",\n      \"clang-analyzer-security.insecureAPI.getpw\",\n      \"clang-analyzer-security.insecureAPI.gets\",\n      \"clang-analyzer-security.insecureAPI.mkstemp\",\n      \"clang-analyzer-security.insecureAPI.mktemp\",\n      \"clang-analyzer-security.insecureAPI.rand\",\n      \"clang-analyzer-security.insecureAPI.strcpy\",\n      \"clang-analyzer-security.insecureAPI.vfork\",\n      \"clang-analyzer-unix.API\",\n      \"clang-analyzer-unix.DynamicMemoryModeling\",\n      \"clang-analyzer-unix.Malloc\",\n      \"clang-analyzer-unix.MallocSizeof\",\n      \"clang-analyzer-unix.MismatchedDeallocator\",\n      \"clang-analyzer-unix.Vfork\",\n      \"clang-analyzer-unix.cstring.BadSizeArg\",\n      \"clang-analyzer-unix.cstring.CStringModeling\",\n      \"clang-analyzer-unix.cstring.NullArg\",\n      \"clang-analyzer-valist.CopyToSelf\",\n      \"clang-analyzer-valist.Uninitialized\",\n      \"clang-analyzer-valist.Unterminated\",\n      \"clang-analyzer-valist.ValistBase\",\n      \"clang-analyzer-webkit.NoUncountedMemberChecker\",\n      \"clang-analyzer-webkit.RefCntblBaseVirtualDtor\",\n      \"clang-analyzer-webkit.UncountedLambdaCapturesChecker\"\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/AboutSettingsViewModel.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.MVVM.Command;\nusing ClangPowerTools.MVVM.Models;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Windows.Input;\n\nnamespace ClangPowerToolsShared.MVVM.ViewModels\n{\n  public class AboutSettingsViewModel : CommonSettingsFunctionality\n  {\n    #region Members\n    private readonly SettingsHandler settingsHandler = new SettingsHandler();\n\n    private ICommand exportSettingsCommand;\n    private ICommand importSettingsCommand;\n    private ICommand resetSettingsCommand;\n\n    private GeneralSettingsModel generalModel;\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    #endregion\n\n\n    #region Constructor\n\n    public AboutSettingsViewModel()\n    {\n      generalModel = SettingsProvider.GeneralSettingsModel;\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public GeneralSettingsModel GeneralSettingsModel\n    {\n      get\n      {\n        return generalModel;\n      }\n      set\n      {\n        generalModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"GeneralSettingsModel\"));\n      }\n    }\n\n    public string DisplayMessage\n    {\n      get { return displayMessage; }\n      set\n      {\n        displayMessage = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DisplayMessage\"));\n      }\n    }\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    private string displayMessage;\n\n    #endregion\n\n    public ICommand ExportSettingsCommand\n    {\n      get => exportSettingsCommand ??= new RelayCommand(() => ExportSettings(), () => CanExecute);\n    }\n\n    public ICommand ImportSettingssCommand\n    {\n      get => importSettingsCommand ??= new RelayCommand(() => ImportSettings(), () => CanExecute);\n    }\n\n    public ICommand ResetSettingsCommand\n    {\n      get => resetSettingsCommand ??= new RelayCommand(() => ResetSettings(), () => CanExecute);\n    }\n\n    private void ExportSettings()\n    {\n      string path = SaveFile(\"settings\", \".json\", \"Settings files (.json)|*.json\");\n      if (string.IsNullOrEmpty(path) == false)\n      {\n        settingsHandler.SaveSettings(path);\n        MessageBox.Show(\"Settings exported.\", \"Clang Power Tools\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Information);\n      }\n    }\n\n    private void ImportSettings()\n    {\n      string path = OpenFile(\"settings\", \".json\", \"Settings files (.json)|*.json\");\n      if (string.IsNullOrEmpty(path) == false)\n      {\n        settingsHandler.LoadSettings(path);\n        MessageBox.Show(\"Settings imported.\", \"Clang Power Tools\",\n                MessageBoxButtons.OK, MessageBoxIcon.Information);\n      }\n    }\n\n    private void ResetSettings()\n    {\n      settingsHandler.ResetSettings();\n      MessageBox.Show(\"Settings were reset to their default values.\", \"Clang Power Tools\",\n                MessageBoxButtons.OK, MessageBoxIcon.Information);\n    }\n  }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/AutoCompleteHistoryViewModel.cs",
    "content": "﻿using System;\n\nnamespace ClangPowerToolsShared.MVVM.ViewModels\n{\n  public class AutoCompleteHistoryViewModel\n  {\n    public string Id { get; set; } = string.Empty;\n    public string Value { get; set; } = string.Empty;\n    public bool RememberAsFavorit { get; set; } = false;\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/CompilerSettingsViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM;\nusing ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.Services;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Windows.Forms;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class CompilerSettingsViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private CompilerSettingsModel compilerModel;\n    private readonly PowerShellService powerShellService;\n\n    private ICommand compileFlagsAddDataCommand;\n    private ICommand filesToIgnoreAddDataCommand;\n    private ICommand projectsToIgnoreAddDataCommand;\n    private ICommand powerShellUpdateScriptsCommand;\n    private ICommand addCptAliasCommand;\n\n    #endregion\n\n    #region Constructor\n\n    public CompilerSettingsViewModel()\n    {\n      compilerModel = SettingsProvider.CompilerSettingsModel;\n      powerShellService = new PowerShellService();\n    }\n\n    #endregion\n\n    #region Properties\n    public CompilerSettingsModel CompilerModel\n    {\n      get\n      {\n        return compilerModel;\n      }\n      set\n      {\n        compilerModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CompilerModel\"));\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    public IEnumerable<ClangGeneralAdditionalIncludes> AdditionalIncludesItems\n    {\n      get\n      {\n        return Enum.GetValues(typeof(ClangGeneralAdditionalIncludes)).Cast<ClangGeneralAdditionalIncludes>();\n      }\n    }\n\n    public List<string> VerbosityLevelItems\n    {\n      get\n      {\n        return new List<string>() { \"0\", \"1\", \"2\" };\n      }\n    }\n\n\n    public SettingsTooltips Tooltip { get; } = new SettingsTooltips();\n\n    #endregion\n\n    #region Commands\n    public ICommand CompileFlagsAddDataCommand\n    {\n      get => compileFlagsAddDataCommand ?? (compileFlagsAddDataCommand = new RelayCommand(() => UpdateCompileFlags(), () => CanExecute));\n    }\n\n    public ICommand FilesToIgnoreAddDataCommand\n    {\n      get => filesToIgnoreAddDataCommand ?? (filesToIgnoreAddDataCommand = new RelayCommand(() => UpdateFilesToIgnore(), () => CanExecute));\n    }\n\n    public ICommand ProjectsToIgnoreAddDataCommand\n    {\n      get => projectsToIgnoreAddDataCommand ?? (projectsToIgnoreAddDataCommand = new RelayCommand(() => UpdateProjectsToIgnore(), () => CanExecute));\n    }\n\n    public ICommand PowerShellUpdateScriptsCommand\n    {\n      get => powerShellUpdateScriptsCommand ?? (powerShellUpdateScriptsCommand = new RelayCommand(() => UpdateScripts(), () => CanExecute));\n    }\n\n    public ICommand AddCptAliasCommand\n    {\n      get => addCptAliasCommand ?? (addCptAliasCommand = new RelayCommand(() => AddCptAlias(), () => CanExecute));\n    }\n    #endregion\n\n    #region Methods\n    private void UpdateCompileFlags()\n    {\n      compilerModel.CompileFlags = OpenContentDialog(compilerModel.CompileFlags);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CompilerModel\"));\n    }\n\n    private void UpdateFilesToIgnore()\n    {\n      compilerModel.FilesToIgnore = OpenContentDialog(compilerModel.FilesToIgnore, true, true);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CompilerModel\"));\n    }\n\n    private void UpdateProjectsToIgnore()\n    {\n      compilerModel.ProjectsToIgnore = OpenContentDialog(compilerModel.ProjectsToIgnore);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CompilerModel\"));\n    }\n\n    private void AddCptAlias()\n    {\n      string ScriptWindowsPowerShell =\n        \"if ((Test-Path -Path $profile -PathType Leaf) -eq $false) { New-Item -Path $profile -ItemType \\\"file\\\" -Force};\" +\n        $\"Add-Content $profile ' Set-Alias -Name cpt -Value ''{PowerShellWrapper.GetClangBuildScriptPath()}'' ' \";\n      if(PowerShellWrapper.Invoke(ScriptWindowsPowerShell, true))\n      {\n        MessageBox.Show(\"Cpt alias for Clang Power Tools script was added in your Powershell profile\",\n                                              \"Clang Power Tools\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n      }\n      else \n      {\n        MessageBox.Show(\"Sorry, we can't find Powershell 7 in PATH enviroment variables\",\n                                      \"Clang Power Tools\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    private void UpdateScripts()\n    {\n      DialogResult dialogResult = MessageBox.Show(\"Do you want to update the PowerShell scripts?\",\n                                                  \"Clang Power Tools\", MessageBoxButtons.YesNo, MessageBoxIcon.Information);\n      if (dialogResult == DialogResult.Yes)\n      {\n        powerShellService.UpdateScriptsAsync().SafeFireAndForget();\n      }\n    }\n    #endregion;\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/DetectedStyleInfoViewModel.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.ComponentModel;\n\nnamespace ClangPowerTools\n{\n  public class DetectedStyleInfoViewModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    #endregion\n\n\n    #region Constructor\n\n    public DetectedStyleInfoViewModel(string styleInfo)\n    {\n      var styleInfoArray = styleInfo.Split('\\n');\n      foreach (var item in styleInfoArray)\n        FlagsCollection.Add(item);\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public string DetectedOptions { get; set; }\n\n    public ObservableCollection<string> FlagsCollection { get; set; } = new ObservableCollection<string>();\n\n\n    #endregion\n\n    #region Private Methods\n\n    private void OnPropertyChanged(string propertyName)\n    {\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/EncodingErrorViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Constants;\nusing ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Properties;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  class EncodingErrorViewModel : INotifyPropertyChanged\n  {\n    #region Public Properties\n    public ICommand CloseCommand { get; set; }\n    public ICommand ConvertCommand { get; set; }\n    public ICommand SearchCommand { get; set; }\n    public Action CloseAction { get; set; }\n    public ObservableCollection<FileModel> FilesNotEncodedInUTF8 { get; set; } = new ObservableCollection<FileModel>();\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    public string SearchText\n    {\n      get { return searchText; }\n      set\n      {\n        searchText = value;\n\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"SearchText\"));\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FilteredFilesNotEncodedInUTF8\"));\n      }\n    }\n\n    public bool CheckAllItems\n    {\n      get { return checkAllItems; }\n      set\n      {\n        if (checkAllItems == value) { return; }\n        checkAllItems = value;\n        SelectAllTooltipText = value ? ResourceConstants.DeselectAllTooltipText : ResourceConstants.SelectAllTooltipText;\n        foreach (var file in FilesNotEncodedInUTF8)\n        {\n          file.IsChecked = value;\n        }\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CheckAllItems\"));\n      }\n    }\n\n    public string SelectAllTooltipText\n    {\n      get { return selectAllTooltipText; }\n      set\n      {\n        if (selectAllTooltipText == value) { return; }\n        selectAllTooltipText = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"SelectAllTooltipText\"));\n      }\n    }\n    public IEnumerable<FileModel> FilteredFilesNotEncodedInUTF8\n    {\n      get\n      {\n        if (SearchText == null)\n        {\n          return FilesNotEncodedInUTF8;\n        }\n\n        return FilesNotEncodedInUTF8.Where(x => x.FileName.ToUpper().Contains(SearchText.ToUpper()));\n      }\n    }\n\n    #endregion\n\n    #region Private Properties\n\n    private string searchText;\n\n    private readonly List<string> fileNames = new List<string>();\n\n    private string selectAllTooltipText = ResourceConstants.DeselectAllTooltipText;\n\n    private bool checkAllItems = true;\n    #endregion\n\n    #region Constructor\n\n    public EncodingErrorViewModel(List<string> selectedDocuments)\n    {\n      fileNames = selectedDocuments;\n      CloseCommand = new RelayCommand(CloseCommandExecute);\n      ConvertCommand = new RelayCommand(ConvertCommandExecute);\n      SearchCommand = new RelayCommand(SearchCommandExecute);\n    }\n\n    #endregion\n\n    #region Public Methods\n    public void LoadData()\n    {\n      foreach (var file in fileNames)\n      {\n        var encodingFile = GetEncoding(file);\n        if (encodingFile.EncodingName != Encoding.UTF8.EncodingName && !file.EndsWith(\".vcxproj\") && !file.EndsWith(\".sln\"))\n        {\n          FilesNotEncodedInUTF8.Add(new FileModel { FileName = file, IsChecked = true });\n        }\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n    private void SearchCommandExecute()\n    {\n      if (false == string.IsNullOrWhiteSpace(SearchText))\n      {\n        SearchText = string.Empty;\n      }\n    }\n\n    private void CloseCommandExecute()\n    {\n      CloseAction?.Invoke();\n    }\n\n    private void ConvertCommandExecute()\n    {\n      var checkedFiles = FilesNotEncodedInUTF8.Where(f => f.IsChecked);\n      if (!checkedFiles.Any())\n      {\n        return;\n      }\n      foreach (var file in checkedFiles)\n      {\n          ConvertFileToUTF8(file.FileName);\n      }\n      CloseCommandExecute();\n    }\n\n    private void ConvertFileToUTF8(string file)\n    {\n      StreamReader streamReader = new StreamReader(file);\n      string fileContent = streamReader.ReadToEnd();\n      streamReader.Close();\n      File.WriteAllText(file, fileContent, Encoding.UTF8);\n    }\n\n    private Encoding GetEncoding(string fileName)\n    {\n      using (var reader = new StreamReader(fileName, Encoding.Default, true))\n      {\n        if (reader.Peek() >= 0)\n        {\n          reader.Read();\n        }\n        return reader.CurrentEncoding;\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FeedbackViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing System.Diagnostics;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class FeedbackViewModel\n  {\n\n    #region Members\n\n    private ICommand githubCommand;\n    private ICommand websiteCommand;\n\n    #endregion\n\n    #region Properties\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Commands\n\n    public ICommand GithubCommand\n    {\n      get => githubCommand ??= new RelayCommand(() => OpenGitHubFeedback(), () => CanExecute);\n    }\n\n    public ICommand WebsiteCommand\n    {\n      get => websiteCommand ??= new RelayCommand(() => OpenWebsiteFeedback(), () => CanExecute);\n    }\n\n    #endregion\n\n    #region Methods\n\n    private void OpenGitHubFeedback()\n    {\n      Process.Start(new ProcessStartInfo(\"https://github.com/Caphyon/clang-power-tools/issues/new\"));\n    }\n\n    private void OpenWebsiteFeedback()\n    {\n      Process.Start(new ProcessStartInfo(\"https://clangpowertools.com/contact.html\"));\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FindToolWindowViewModel.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Views;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.AutoCompleteHistory;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Controllers;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing ClangPowerToolsShared.MVVM.Provider;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Controls;\n\nnamespace ClangPowerToolsShared.MVVM.ViewModels\n{\n\n  public class FindToolWindowViewModel : FindController\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n    private ObservableCollection<AutoCompleteHistoryModel> astMatchersList = new();\n\n    private List<AutoCompleteHistoryModel> astMatchersSearchOptions = new();\n    public List<IViewMatcher> ViewMatchers\n    {\n      get { return FindToolWindowModel.ViewMatchers; }\n    }\n\n    //search in ast consts\n    public List<AutoCompleteHistoryModel> ASTMatchersSearchOptions\n    {\n      get { return astMatchersSearchOptions; }\n      set\n      {\n        astMatchersSearchOptions = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"ASTMatchersSearchOptions\"));\n      }\n    }\n\n    //display list\n    public ObservableCollection<AutoCompleteHistoryModel> ASTMatchersList\n    {\n      get { return astMatchersList; }\n      set\n      {\n        astMatchersList = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"ASTMatchersList\"));\n      }\n    }\n\n    public FindToolWindowViewModel(FindToolWindowView findToolWindowView)\n    {\n      AutoCompleteBehavior.OnListUpdate += OnListChange;\n      astMatchersList = new ObservableCollection<AutoCompleteHistoryModel>(GetASTMatchersWithHistory());\n      astMatchersSearchOptions = new List<AutoCompleteHistoryModel>(GetASTMatchersWithHistory());\n      FindToolWindowModel = findToolWindowModel;\n      this.findToolWindowView = findToolWindowView;\n    }\n\n    public void AddPinOnRightPlace(AutoCompleteHistoryModel autoCompleteHistoryModel)\n    {\n      int itemIndex = astMatchersList.IndexOf(autoCompleteHistoryModel);\n      if (autoCompleteHistoryModel.RememberAsFavorit)\n      {\n        if (itemIndex != -1 && astMatchersList.Count >= itemIndex)\n        {\n          astMatchersList.Remove(autoCompleteHistoryModel);\n          astMatchersList.Insert(0, autoCompleteHistoryModel);\n        }\n      }\n      else\n      {\n        int lastFindIndex = astMatchersList.ToList().FindLastIndex(a =>\n        a.RememberAsFavorit == true && a.Id != autoCompleteHistoryModel.Id);\n        if (itemIndex != -1 && lastFindIndex != -1 && astMatchersList.Count >=\n          itemIndex && astMatchersList.Count >= lastFindIndex && itemIndex - lastFindIndex != 1)\n          Swap(astMatchersList, lastFindIndex, itemIndex);\n      }\n    }\n\n    public void OnListChange(object sender, TextChangedEventArgs e)\n    {\n      var tempMatchersList = astMatchersList.Where(a => a.Visibility == UIElementsConstants.Visibile).ToList();\n      astMatchersList.Clear();\n      foreach (var item in AutoCompleteBehavior.AutocompleteResult)\n      {\n        var tempItem = tempMatchersList.Where(a => item.Id == a.Id).FirstOrDefault();\n        if (tempItem != null)\n        {\n          tempItem.Value = item.Value;\n          if (tempItem.RememberAsFavorit && tempItem.Visibility == UIElementsConstants.Visibile)\n            astMatchersList.Insert(0, tempItem);\n          else\n            astMatchersList.Add(tempItem);\n        }\n        else\n        {\n          if (item.RememberAsFavorit && item.Visibility == UIElementsConstants.Visibile)\n            astMatchersList.Insert(0, item);\n          else\n            astMatchersList.Add(item);\n        }\n      }\n      ASTMatchersList = astMatchersList;\n    }\n\n    public void OpenToolWindow() { }\n\n    public void RunQuery()\n    {\n      if (!RunController.StopCommandActivated)\n      {\n        SelectCommandToRun(findToolWindowModel.CurrentViewMatcher);\n        RunPowershellQuery();\n      }\n      AfterCommand();\n    }\n\n    public void SelectCommandToRun(IViewMatcher viewMatcher)\n    {\n      findToolWindowModel.UpdateUiToSelectedModel(viewMatcher);\n      FindToolWindowModel = findToolWindowModel;\n    }\n\n    public void RunCommandFromView()\n    {\n      BeforeCommand();\n\n      LaunchCommand();\n      //add in history\n      AddMatcherInHistory();\n      CommandControllerInstance.CommandController.LaunchCommandAsync(CommandIds.kClangFindRun, CommandUILocation.ContextMenu);\n    }\n\n    private List<AutoCompleteHistoryModel> GetASTMatchersWithHistory()\n    {\n      List<AutoCompleteHistoryModel> astResult = ASTMatchers.AutoCompleteMatchers.Select(a => new AutoCompleteHistoryModel()\n      { RememberAsFavorit = false, Value = a }).ToList();\n\n      if (FindToolWindowProvider.AutoCompleteHistory is null)\n        return astResult;\n      List<AutoCompleteHistoryModel> jsonResult = FindToolWindowProvider.AutoCompleteHistory\n        .Select(a => new AutoCompleteHistoryModel(a)).OrderBy(u => u.RememberAsFavorit ? 0 : 1).ToList();\n      return jsonResult.Concat(astResult).ToList();\n    }\n\n    private void Swap<T>(IList<T> list, int indexA, int indexB)\n    {\n      T tmp = list[indexA];\n      list[indexA] = list[indexB];\n      list[indexB] = tmp;\n    }\n\n    private void AddMatcherInHistory()\n    {\n      if (findToolWindowModel.CurrentViewMatcher.Id == 2)\n      {\n        var matcher = findToolWindowModel.CurrentViewMatcher as CustomMatchesModel;\n        if (ASTMatchersSearchOptions.Find(a => a.Value == matcher.Matchers) is null)\n        {\n          AutoCompleteHistoryViewModel autoCompleteHistoryViewModel = new AutoCompleteHistoryViewModel\n          { Id = Guid.NewGuid().ToString(), RememberAsFavorit = false, Value = matcher.Matchers };\n\n          int indexSearchOptions = astMatchersSearchOptions.ToList().FindLastIndex(a => a.RememberAsFavorit == true);\n\n          //add matchers in existing displayed list\n          if (indexSearchOptions > 0)\n          {\n            astMatchersSearchOptions.Insert(indexSearchOptions + 1, new AutoCompleteHistoryModel(true)\n            {\n              RememberAsFavorit = false,\n              Value = matcher.Matchers,\n              Id = autoCompleteHistoryViewModel.Id\n            });\n          }\n          else\n          {\n            astMatchersSearchOptions.Insert(0, new AutoCompleteHistoryModel(true)\n            {\n              RememberAsFavorit = false,\n              Value = matcher.Matchers,\n              Id = autoCompleteHistoryViewModel.Id\n            });\n          }\n\n          int indexMatchersList = astMatchersList.ToList().FindLastIndex(a => a.RememberAsFavorit == true);\n          if (indexMatchersList > 0)\n          {\n            astMatchersList.Insert(indexMatchersList + 1, new AutoCompleteHistoryModel(autoCompleteHistoryViewModel, true));\n          }\n          else\n          {\n            astMatchersList.Insert(0, new AutoCompleteHistoryModel(autoCompleteHistoryViewModel, true));\n          }\n\n          //save matchers displayed list\n          ASTMatchersList = astMatchersList;\n          ASTMatchersSearchOptions = astMatchersSearchOptions;\n\n          //save matchers on json history file\n          FindToolWindowProvider.AddAutoCompleteHistory(autoCompleteHistoryViewModel);\n          FindToolWindowHandler findToolWindowHandler = new FindToolWindowHandler();\n          findToolWindowHandler.SaveMatchersHistoryData();\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FolderExplorerViewModel.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.MVVM.Command;\nusing ClangPowerTools.MVVM.Views;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Windows.Forms;\nusing System.Windows.Input;\n\nnamespace ClangPowerToolsShared.MVVM.ViewModels\n{\n  public class FolderExplorerViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n    public event PropertyChangedEventHandler PropertyChanged;\n    private FolderExplorerView folderExplorerView;\n    private string pathFolder = string.Empty;\n    private PreinstalledLlvm preinstalledLlvm;\n    private readonly List<LlvmModel> llvms;\n    private ObservableCollection<string> installedLlvms;\n\n    private ICommand findFolderPathCommand;\n    private ICommand downloadLLVMCommand;\n    #endregion\n    public FolderExplorerViewModel(FolderExplorerView folderExplorerView, List<LlvmModel> llvms, ObservableCollection<string> installedLlvms)\n    {\n      this.llvms = llvms;\n      this.installedLlvms = installedLlvms;\n      this.folderExplorerView = folderExplorerView;\n    }\n\n    #region Properties\n\n    public string PathFolder\n    {\n      get => pathFolder;\n      set\n      {\n        pathFolder = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"PathFolder\"));\n      }\n    }\n\n    public bool CanExecute => true;\n    #endregion\n\n    #region Commands\n\n    public ICommand FindFolderPathCommand\n    {\n      get => findFolderPathCommand ?? (findFolderPathCommand = new RelayCommand(() => GetFolderPath(), () => CanExecute));\n    }\n    public ICommand SetLLVMCommand\n    {\n      get => downloadLLVMCommand ?? (downloadLLVMCommand = new RelayCommand(() => SetLLVM(), () => CanExecute));\n    }\n\n    public string VersionUsed\n    {\n      get\n      {\n        return SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion;\n      }\n\n      set\n      {\n        SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"VersionUsed\"));\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public void SetLLVM()\n    {\n      if (string.IsNullOrWhiteSpace(PathFolder))\n      {\n        MessageBox.Show(\"LLVM version can't be detected\", \"Clang Power Tools\",\n           MessageBoxButtons.OK, MessageBoxIcon.Warning);\n        return;\n      }\n      var clangPath = Path.Combine(PathFolder, \"clang.exe\");\n      if (!File.Exists(clangPath))\n      {\n        clangPath = Path.Combine(PathFolder, \"bin\", \"clang.exe\");\n\n        if (!File.Exists(clangPath))\n        {\n          MessageBox.Show(\"LLVM version can't be detected\", \"Clang Power Tools\",\n            MessageBoxButtons.OK, MessageBoxIcon.Warning);\n          return;\n        }\n        pathFolder = Path.Combine(PathFolder, \"bin\");\n      }\n\n      var versionInfo = FileVersionInfo.GetVersionInfo(clangPath);\n      string version = versionInfo.FileVersion.Split()[0];\n\n      preinstalledLlvm = new PreinstalledLlvm(llvms, installedLlvms);\n      preinstalledLlvm.SetPreinstalledLlvm(PathFolder, version);\n      VersionUsed = version;\n      folderExplorerView.Close();\n    }\n\n    public void GetFolderPath()\n    {\n\n      var llvmBinDirectoryPath = BrowseForFolderFiles();\n      PathFolder = llvmBinDirectoryPath;\n      if (string.IsNullOrWhiteSpace(llvmBinDirectoryPath))\n        return;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/FormatSettingsViewModel.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM;\nusing ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Views;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class FormatSettingsViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private FormatSettingsModel formatModel;\n    private ICommand fileExtensionsAddDataCommand;\n    private ICommand filesToIgnoreAddDataCommand;\n    private ICommand assumeFilenameAddDataCommand;\n    private ICommand customExecutableBrowseCommand;\n    private ICommand openClangFormatEditorCommand;\n    #endregion\n\n    #region Constructor\n\n    public FormatSettingsViewModel()\n    {\n      formatModel = SettingsProvider.FormatSettingsModel;\n    }\n\n    #endregion\n\n    #region Properties\n    public FormatSettingsModel FormatModel\n    {\n      get\n      {\n        return formatModel;\n      }\n      set\n      {\n        formatModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FormatModel\"));\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    public IEnumerable<ClangFormatStyle> StyleItems\n    {\n      get\n      {\n        return Enum.GetValues(typeof(ClangFormatStyle)).Cast<ClangFormatStyle>();\n      }\n    }\n\n    public IEnumerable<ClangFormatFallbackStyle> FallBackStyleItems\n    {\n      get\n      {\n        return Enum.GetValues(typeof(ClangFormatFallbackStyle)).Cast<ClangFormatFallbackStyle>();\n      }\n    }\n\n    public SettingsTooltips Tooltip { get; } = new SettingsTooltips();\n\n    #endregion\n\n    #region Commands\n\n    public ICommand FileExtensionsAddDataCommand\n    {\n      get => fileExtensionsAddDataCommand ??= new RelayCommand(() => UpdateFileExtensions(), () => CanExecute);\n    }\n\n    public ICommand FilesToIgnoreAddDataCommand\n    {\n      get => filesToIgnoreAddDataCommand ??= new RelayCommand(() => UpdateFilesToIgnore(), () => CanExecute);\n    }\n\n    public ICommand AssumeFilenameAddDataCommand\n    {\n      get => assumeFilenameAddDataCommand ??= new RelayCommand(() => UpdateAssumeFilename(), () => CanExecute);\n    }\n\n    public ICommand CustomExecutableBrowseCommand\n    {\n      get => customExecutableBrowseCommand ??= new RelayCommand(() => UpdateCustomExecutable(), () => CanExecute);\n    }\n\n    public ICommand OpenClangFormatEditorCommand\n    {\n      get => openClangFormatEditorCommand ??= new RelayCommand(() => OpenClangFormatEditor(), () => CanExecute);\n    }\n\n    #endregion\n\n    #region Methods\n\n    private void OpenClangFormatEditor()\n    {\n      if (FormatEditorUtility.FrameworkInstalled())\n      {\n        SettingsProvider.SettingsView.Close();\n        var formatEditorController = new FormatEditorController();\n        formatEditorController.InstallClangFormatEditorSilent();\n        formatEditorController.OpenEditor();\n      }\n      else\n      {\n        var formatEditorWarning = new FormatEditorWarning();\n        formatEditorWarning.ShowDialog();\n      }\n    }\n\n    private void UpdateFileExtensions()\n    {\n      formatModel.FileExtensions = OpenContentDialog(formatModel.FileExtensions);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FormatModel\"));\n    }\n\n    private void UpdateFilesToIgnore()\n    {\n      formatModel.FilesToIgnore = OpenContentDialog(formatModel.FilesToIgnore, true, true);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FormatModel\"));\n    }\n\n    private void UpdateAssumeFilename()\n    {\n      formatModel.AssumeFilename = OpenContentDialog(formatModel.AssumeFilename);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FormatModel\"));\n    }\n\n    private void UpdateCustomExecutable()\n    {\n      formatModel.CustomExecutable = OpenFile(string.Empty, \".exe\", \"Executable files|*.exe\");\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"FormatModel\"));\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputDataViewModel.cs",
    "content": "using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Views;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class InputDataViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private string inputToAdd;\n    private InputDataView inputDataView;\n    private ICommand addCommand;\n    private bool showFilePicker;\n    private ICommand pickFilesCommand;\n    private bool showFolderPicker;\n    private ICommand pickFolderCommand;\n\n    #endregion\n\n\n    #region Constructor\n\n    public InputDataViewModel(string content, bool showFilesPicker = false, bool showFolderPicker = false)\n    {\n      CreateInputsCollection(content);\n      ShowFilesPicker = showFilesPicker;\n      ShowFolderPicker = showFolderPicker;\n    }\n\n    public InputDataViewModel() { }\n\n    #endregion\n\n\n    #region Properties\n\n    public string InputToAdd\n    {\n      get\n      {\n        return inputToAdd;\n      }\n      set\n      {\n        inputToAdd = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(InputToAdd)));\n      }\n    }\n\n    public ObservableCollection<InputDataModel> Inputs { get; set; } = new ObservableCollection<InputDataModel>();\n\n    public bool ShowFilesPicker\n    {\n      get\n      {\n        return showFilePicker;\n      }\n      set\n      {\n        showFilePicker = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ShowFilesPicker)));\n      }\n    }\n\n    public bool ShowFolderPicker\n    {\n      get\n      {\n        return showFolderPicker;\n      }\n      set\n      {\n        showFolderPicker = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ShowFolderPicker)));\n      }\n    }\n\n    public ICommand AddCommand\n    {\n      get => addCommand ??= new RelayCommand(AddInput, () => CanExecute);\n    }\n\n    public bool CanExecute\n    {\n      get => true;\n    }\n\n    public ICommand PickFilesCommand\n    {\n      get => pickFilesCommand ??= new RelayCommand(PickFile, () => CanPickFilesExecute);\n    }\n\n    public bool CanPickFilesExecute\n    {\n      get => ShowFilesPicker;\n    }\n\n    public ICommand PickFolderCommand\n    {\n      get => pickFolderCommand ??= new RelayCommand(PickFolder, () => CanPickFolderExecute);\n    }\n\n    public bool CanPickFolderExecute\n    {\n      get => ShowFolderPicker;\n    }\n\n    #endregion\n\n\n    #region Methods\n\n    public void ShowViewDialog()\n    {\n      inputDataView = new InputDataView(this);\n      inputDataView.ShowDialog();\n    }\n\n    private void PickFile()\n    {\n      var filesToAdd = OpenFiles(string.Empty, \"*.h;*.cpp\", \"Header and Source files|*.h;*.cpp|Header files|*.h|Source files|*.cpp\");\n      if (filesToAdd == null)\n        return; // no file selected\n      foreach (var file in filesToAdd)\n      {\n        InputToAdd = file;\n        AddInput(); // automatically add selected file\n      }\n    }\n\n    private void PickFolder()\n    {\n      InputToAdd = BrowseForFolderFiles();\n      AddInput(); // automatically add selected folder\n    }\n\n    public void DeleteInput(int index)\n    {\n      if (index < 0 || index >= Inputs.Count)\n        return;\n\n      Inputs.RemoveAt(index);\n    }\n\n    private void AddInput()\n    {\n      if (string.IsNullOrWhiteSpace(inputToAdd))\n        return;\n\n      if (IsDuplicate(inputToAdd))\n      { \n        MessageBox.Show($\"Ignored to add duplicate: {InputToAdd}\", \"Warning\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n        InputToAdd = string.Empty;\n        return;\n      }\n\n      if(!File.Exists(inputToAdd) && !Directory.Exists(inputToAdd))\n      {\n        MessageBox.Show($\"The file or folder does not exist: {InputToAdd}\", \"Warning\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n        return;\n      }\n\n      if(File.Exists(inputToAdd))\n      {\n        DirectoryInfo filePath = new DirectoryInfo(inputToAdd);\n        inputToAdd = filePath.Name;\n      }\n\n      AddNewElement(inputToAdd);\n      InputToAdd = string.Empty;\n    }\n\n    private bool IsDuplicate(string element) => Inputs.FirstOrDefault(model => model.InputData == element) != null;\n\n    private void CreateInputsCollection(string content)\n    {\n      if (string.IsNullOrWhiteSpace(content))\n        return;\n\n      var splitContent = content.Split(';').ToList();\n      foreach (var splitItem in splitContent)\n        AddNewElement(splitItem);\n    }\n\n    private void AddNewElement(string newElement)\n    {\n      var model = new InputDataModel(newElement);\n      Inputs.Add(model);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/InputMultipleDataViewModel.cs",
    "content": "﻿namespace ClangPowerTools\n{\n  public class InputMultipleDataViewModel\n  {\n    #region Properties\n\n    public string Input { get; set; }\n\n    #endregion\n\n    #region Constructor \n\n    public InputMultipleDataViewModel(string input)\n    {\n      Input = input;\n    }\n\n    // Empty constructor for XAML intelisense\n    public InputMultipleDataViewModel()\n    {\n\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/LicenseViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Controllers;\nusing ClangPowerTools.MVVM.LicenseValidation;\nusing ClangPowerTools.MVVM.Views;\nusing System.Diagnostics;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class LicenseViewModel\n  {\n    #region Members\n\n    private ICommand commercialLicenseCommand;\n    private ICommand personalLicenseCommand;\n    private ICommand trialLicenseCommand;\n    private ICommand signInCommand;\n\n    private readonly LicenseView licenseView;\n\n    #endregion\n\n    #region Constructor\n\n    public LicenseViewModel() { }\n\n    public LicenseViewModel(LicenseView view)\n    {\n      licenseView = view;\n    }\n\n    #endregion\n\n    #region Properties\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Commands\n\n    public ICommand CommercialLicense\n    {\n      get => commercialLicenseCommand ?? (commercialLicenseCommand = new RelayCommand(() => CommercialLicenceExecute(), () => CanExecute));\n    }\n\n    public ICommand PersonalLicense\n    {\n      get => personalLicenseCommand ?? (personalLicenseCommand = new RelayCommand(() => PersonalLicenceExecute(), () => CanExecute));\n    }\n\n    public ICommand TrialLicense\n    {\n      get => trialLicenseCommand ?? (trialLicenseCommand = new RelayCommand(() => TrialLicenceExecute(), () => CanExecute));\n    }\n\n    public ICommand SignIn\n    {\n      get => signInCommand ?? (signInCommand = new RelayCommand(() => PersonalLicenceExecute(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region Methods\n\n    public void CommercialLicenceExecute()\n    {\n      Process.Start(new ProcessStartInfo(\"https://clangpowertools.com/download.html#pricing\"));\n      ShowLoginView();\n    }\n\n    public void PersonalLicenceExecute()\n    {\n      ShowLoginView();\n    }\n\n    public void TrialLicenceExecute()\n    {\n      var freeTrialController = new FreeTrialController();\n      freeTrialController.Start();\n\n      SettingsProvider.AccountModel.LicenseType = LicenseType.Trial;\n      SettingsProvider.AccountModel.LicenseExpirationDate = new SettingsHandler().GetTrialLicenseExpirationDate();\n\n      licenseView.Close();\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    public void ShowLoginView()\n    {\n      licenseView.Close();\n      LoginView loginView = new LoginView();\n      loginView.ShowDialog();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/LlvmSettingsViewModel.cs",
    "content": "﻿using ClangPowerTools.Handlers;\nusing ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Controllers;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.Views;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Net;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class LlvmSettingsViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    public CancelEventHandler WindowClosed;\n\n    private readonly LlvmController llvmController = new LlvmController();\n    private List<LlvmModel> llvms = new List<LlvmModel>();\n    private PreinstalledLlvm preinstalledLlvm;\n    private const string uninstall = \"Uninstall\";\n    private ICommand browseForLlvmCommand;\n\n    private LlvmSettingsView view;\n\n\n    #endregion\n\n    #region Constructor\n\n    public LlvmSettingsViewModel(LlvmSettingsView view)\n    {\n      this.view = view;\n      llvmController.InstallFinished = InstallFinished;\n      llvmController.UninstallFinished = UninstallFinished;\n      llvmController.OnOperationCanceldEvent += OperationCanceled;\n      WindowClosed += llvmController.SettingsWindowClosed;\n      IntitializeView();\n    }\n\n    #endregion\n\n    #region Properties\n    public List<LlvmModel> Llvms\n    {\n      get\n      {\n        return llvms;\n      }\n\n      set\n      {\n        llvms = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Llvms\"));\n      }\n    }\n\n    public ObservableCollection<string> InstalledLlvms { get; set; } = new ObservableCollection<string>();\n\n    public string VersionUsed\n    {\n      get\n      {\n        return SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion;\n      }\n\n      set\n      {\n        SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"VersionUsed\"));\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n\n    #region Commands\n\n    public ICommand BrowseForLLVMCommand\n    {\n      get => browseForLlvmCommand ??= new RelayCommand(() => BrowseForLLVM(), () => CanExecute);\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n    public void DownloadCommand(int elementIndex)\n    {\n      DisableButtons(elementIndex);\n      llvmController.llvmModel = llvms[elementIndex];\n      llvmController.llvmModel.IsDownloading = true;\n      llvmController.Download(llvmController.llvmModel.Version, DownloadProgressChanged);\n    }\n\n    public void CancelCommand()\n    {\n      ResetButtonsState();\n      llvmController.llvmModel.DownloadProgress = 0;\n      llvmController.llvmModel.IsDownloading = false;\n      llvmController.downloadCancellationToken.Cancel();\n    }\n\n    public void UninstallCommand(int elementIndex)\n    {\n      DisableButtons(elementIndex);\n      llvmController.llvmModel = llvms[elementIndex];\n      llvmController.Uninstall(llvmController.llvmModel.Version);\n    }\n\n    public void BrowseForLLVM()\n    {\n      FolderExplorerView folderExplorerview = new FolderExplorerView(Llvms, InstalledLlvms);\n      folderExplorerview.ShowDialog();\n      VersionUsed = SettingsProvider.LlvmSettingsModel.LlvmSelectedVersion;\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void InstallFinished(object sender, EventArgs e)\n    {\n      ResetButtonsState();\n      VersionUsed = llvmController.llvmModel.Version;\n      UIUpdater.InvokeAsync(InsertVersionToInstalledLlvms).SafeFireAndForget();\n    }\n\n    private void UninstallFinished(object sender, EventArgs e)\n    {\n      ResetVersionUsedIfRequired();\n      ResetButtonsState();\n      UIUpdater.InvokeAsync(new Action(() =>\n      {\n        InstalledLlvms.Remove(llvmController.llvmModel.Version);\n        if (InstalledLlvms.Count > 0 && InstalledLlvms.Contains(VersionUsed) == false)\n        {\n          VersionUsed = InstalledLlvms[0];\n        }\n      })).SafeFireAndForget();\n    }\n\n    private void OperationCanceled()\n    {\n      ResetButtonsState();\n    }\n\n    private void IntitializeView()\n    {\n      foreach (var version in LlvmVersions.Versions)\n      {\n        var llvmModel = new LlvmModel()\n        {\n          Version = version,\n          IsInstalled = llvmController.IsVersionExeOnDisk(version, uninstall),\n        };\n\n        if (llvmModel.IsInstalled)\n        {\n          InstalledLlvms.Add(llvmModel.Version);\n        }\n\n        llvms.Add(llvmModel);\n      }\n\n      preinstalledLlvm = new PreinstalledLlvm(Llvms, InstalledLlvms);\n      preinstalledLlvm.SetPreinstalledLlvm();\n\n      SetSelectedVersionIfEmpty();\n      ResetVersionUsedIfRequired();\n    }\n\n    private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)\n    {\n      llvmController.llvmModel.DownloadProgress = e.ProgressPercentage;\n    }\n\n    private void SetSelectedVersionIfEmpty()\n    {\n      if (string.IsNullOrWhiteSpace(VersionUsed))\n      {\n        if (InstalledLlvms.Count > 0)\n          VersionUsed = InstalledLlvms[0];\n      }\n    }\n\n    private void ResetVersionUsedIfRequired()\n    {\n      if (InstalledLlvms.Count == 0)\n      {\n        VersionUsed = string.Empty;\n      }\n    }\n\n    private void InsertVersionToInstalledLlvms()\n    {\n      for (int i = 0; i < InstalledLlvms.Count; i++)\n      {\n        if (string.CompareOrdinal(llvmController.llvmModel.Version, InstalledLlvms[i]) > 0)\n        {\n          InstalledLlvms.Insert(i, llvmController.llvmModel.Version);\n          return;\n        }\n      }\n      InstalledLlvms.Add(llvmController.llvmModel.Version);\n    }\n\n    private void DisableButtons(int elementIndex)\n    {\n      for (int i = 0; i < llvms.Count; i++)\n      {\n        if (i != elementIndex) llvms[i].CanExecuteCommand = false;\n      }\n    }\n\n    private void ResetButtonsState()\n    {\n      foreach (var item in llvms)\n        item.CanExecuteCommand = true;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/LoginViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Controllers;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.MVVM.WebApi;\nusing System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\nusing System.Diagnostics;\nusing System.Windows;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools\n{\n  public class LoginViewModel : INotifyPropertyChanged, IDataErrorInfo\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private readonly AccountController accountController = new AccountController();\n    private UserModel userModel = new UserModel();\n    private LoginView loginView;\n\n    private ICommand forgotPasswordCommand;\n    private ICommand signUpCommand;\n    private ICommand logInCommand;\n\n    // Validation messages\n    private readonly string invalidEmail = \"The email that you have entered is not valid.\";\n    private readonly string invalidEmailOrPassword = \"The email or password that you have entered is not valid.\";\n\n    // Login button colors\n    private readonly string colorBackgroundEnabled = \"#FFBF31\";\n    private readonly string colorForegroundEnabled = \"#000000\";\n    private readonly string colorBackgroundDisabled = \"#BBB6C4\";\n    private readonly string colorForegroundDisabled = \"#707079\";\n\n    #endregion\n\n    #region Properties\n\n    public string Email\n    {\n      get { return userModel.email; }\n      set\n      {\n        userModel.email = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Email\"));\n      }\n    }\n\n    public string Password\n    {\n      get { return userModel.password; }\n      set\n      {\n        userModel.password = value;\n      }\n    }\n\n    public bool IsInputValid { get; set; } = false;\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Constructor\n\n    public LoginViewModel() { }\n\n    public LoginViewModel(LoginView view)\n    {\n      loginView = view;\n    }\n\n    #endregion\n\n    #region Commands\n\n    public ICommand ForgotPassword\n    {\n      get => forgotPasswordCommand ?? (forgotPasswordCommand = new RelayCommand(() => ForgotPasswordAction(), () => CanExecute));\n    }\n\n    public ICommand SignUp\n    {\n      get => signUpCommand ?? (signUpCommand = new RelayCommand(() => SignUpAction(), () => CanExecute));\n    }\n\n    public ICommand LogIn\n    {\n      get => logInCommand ?? (logInCommand = new RelayCommand(() => SignInActionAsync().SafeFireAndForget(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region IDataErrorInfo Interface\n\n    public string Error => null;\n\n    public string this[string name]\n    {\n      get\n      {\n        string result = null;\n\n        switch (name)\n        {\n          case \"Email\":\n            IsInputValid = IsEmailAddressValid(out string errorMessage);\n            result = errorMessage;\n            OnEmailValidation();\n            break;\n        }\n        return result;\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public void ForgotPasswordAction()\n    {\n      Process.Start(new ProcessStartInfo(WebApiUrl.forgotPasswordUrl));\n    }\n\n    public void SignUpAction()\n    {\n      Process.Start(new ProcessStartInfo(WebApiUrl.signUpUrl));\n    }\n\n    public async Task SignInActionAsync()\n    {\n      if (string.IsNullOrWhiteSpace(Email) || IsInputValid == false)\n      {\n        loginView.InvalidUserTextBlock.Text = invalidEmailOrPassword;\n        loginView.InvalidUserTextBlock.Visibility = Visibility.Visible;\n        return;\n      }\n\n      SetLoginButtonState(false, colorBackgroundDisabled, colorForegroundDisabled);\n\n      UserModel userModel = new UserModel(Email, Password);\n      loginView.InvalidUserTextBlock.Text = invalidEmailOrPassword;\n      loginView.InvalidUserTextBlock.Visibility = Visibility.Hidden;\n\n      bool isAccountActive = await accountController.LoginAsync(userModel);\n      if (isAccountActive)\n      {\n        loginView.Close();\n\n        FreeTrialController freeTrialController = new FreeTrialController();\n        freeTrialController.MarkAsExpired();\n\n        SettingsHandler settingsHandler = new SettingsHandler();\n        await settingsHandler.LicenseInfoUpdateAsync();\n        await settingsHandler.UserProfileInfoUpdateAsync();\n      }\n      else\n      {\n        SetLoginButtonState(true, colorBackgroundEnabled, colorForegroundEnabled);\n        loginView.InvalidUserTextBlock.Text = invalidEmailOrPassword;\n        loginView.InvalidUserTextBlock.Visibility = Visibility.Visible;\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private bool IsEmailAddressValid(out string errorMessage)\n    {\n      errorMessage = null;\n      var validEmailAddress = new EmailAddressAttribute().IsValid(Email);\n\n      if (validEmailAddress == false)\n      {\n        errorMessage = \"Email address is required\";\n        return false;\n      }\n\n      return true;\n    }\n\n    private void SetLoginButtonState(bool isEnabled, string background, string foreground)\n    {\n      Color colorBackground = (Color)ColorConverter.ConvertFromString(background);\n      Color colorForeground = (Color)ColorConverter.ConvertFromString(foreground);\n\n      loginView.LoginButton.IsEnabled = isEnabled;\n      loginView.LoginButton.Background = new SolidColorBrush(colorBackground);\n      loginView.LoginButton.Foreground = new SolidColorBrush(colorForeground);\n    }\n\n    private void OnEmailValidation()\n    {\n      if (IsInputValid)\n      {\n        loginView.InvalidUserTextBlock.Visibility = Visibility.Hidden;\n      }\n      else\n      {\n        loginView.InvalidUserTextBlock.Text = invalidEmail;\n        loginView.InvalidUserTextBlock.Visibility = Visibility.Visible;\n      }\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/ReleaseNotesViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Views;\nusing System.Diagnostics;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class ReleaseNotesViewModel\n  {\n    #region Members\n\n    private ICommand upgradeCommand;\n    private ICommand openBlogCommand;\n    private readonly ReleaseNotesView releaseNotesView;\n\n    #endregion\n\n    #region Constructor\n\n    public ReleaseNotesViewModel(ReleaseNotesView release)\n    {\n      releaseNotesView = release;\n    }\n\n    #endregion\n\n    #region Properties\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Commands\n\n    public ICommand LogIn\n    {\n      get => upgradeCommand ?? (upgradeCommand = new RelayCommand(() => LogInAction(), () => CanExecute));\n    }\n\n    public ICommand OpenBlog\n    {\n      get => openBlogCommand ?? (openBlogCommand = new RelayCommand(() => OpenBlogAction(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private void LogInAction()\n    {\n      releaseNotesView.Close();\n      LoginView loginView = new LoginView();\n      loginView.ShowDialog();\n    }\n\n    private void OpenBlogAction()\n    {\n      Process.Start(new ProcessStartInfo(\"https://clangpowertools.com/blog/future-of-clang-power-tools.html\"));\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/SettingsViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Views;\nusing ClangPowerTools.Views;\nusing System;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class SettingsViewModel\n  {\n    #region Members\n\n    private ICommand upgradeCommand;\n\n    private readonly SettingsHandler settingsHandler = new();\n    private readonly SettingsView settingsView;\n\n    private const int PERSONAL_LICENSE_HEIGTH = 575;\n    private const int NO_ACCOUNT_HEIGTH = 640;\n\n    #endregion\n\n    #region Constructors\n\n    public SettingsViewModel(SettingsView settingsView, bool showFooter)\n    {\n      this.settingsView = settingsView;\n      settingsView.Closed += OnClosed;\n      ShowFooter = showFooter;\n      Heigth = ShowFooter ? PERSONAL_LICENSE_HEIGTH : NO_ACCOUNT_HEIGTH;\n    }\n\n    #endregion\n\n    #region Properties\n\n    public bool ShowFooter { get; private set; }\n\n    public int Heigth { get; set; }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public void OnClosed(object sender, EventArgs e)\n    {\n      settingsHandler.SaveSettings();\n      settingsView.Closed -= OnClosed;\n      SettingsHandler.RefreshSettingsView = null;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/TidyChecksViewModel.cs",
    "content": "﻿using ClangPowerTools.Events;\nusing ClangPowerTools.MVVM;\nusing ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.Views;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Windows;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class TidyChecksViewModel : INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private string checkSearch = string.Empty;\n    private TidySettingsModel tidyModel;\n    private TidyChecksView tidyChecksView;\n    private TidyCheckModel selectedCheck = new();\n    private List<TidyCheckModel> tidyChecksList = new();\n    private ICommand resetSearchCommand;\n\n    #endregion\n\n    #region Constructor\n\n    public TidyChecksViewModel(TidyChecksView view)\n    {\n      tidyModel = SettingsProvider.TidySettingsModel;\n\n      tidyChecksView = view;\n      tidyChecksView.Closed += OnClosed;\n\n      // Click event is used because the Check value is changed many time from the code\n      // In this way we don't need to make more checks to see from where the Check event was triggered \n      tidyChecksView.EnableDisableAll.Click += (object sender, RoutedEventArgs e) =>\n      {\n        // Check event is triggered before Click event. \n        // IsChecked property will already have the new value when the Click event will happend \n        EnableDisableAllChecks(tidyChecksView.EnableDisableAll.IsChecked == true ? true : false);\n      };\n\n      tidyChecksView.EnableDisableDefaults.Click += (object sender, RoutedEventArgs e) =>\n      {\n        // Check event is triggered before Click event. \n        // IsChecked property will already have the new value when the Click event will happend \n        SetDefaultsToggle(tidyChecksView.EnableDisableDefaults.IsChecked == true ? true : false);\n      };\n\n      InitializeChecks();\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public TidyChecksView TidyChecksView\n    {\n      get\n      {\n        return tidyChecksView;\n      }\n      set\n      {\n        InitializeChecks();\n        tidyChecksView = value;\n      }\n    }\n\n    public List<TidyCheckModel> TidyChecksList\n    {\n      get\n      {\n        List<TidyCheckModel> checks = string.IsNullOrEmpty(checkSearch) ? tidyChecksList :\n          tidyChecksList.Where(e => e.Name.Contains(checkSearch, StringComparison.OrdinalIgnoreCase)).ToList();\n\n        // Always keep the current list of checks under surveillance\n        CollectionElementsCounter.Initialize(checks);\n        CollectionElementsCounter.StateEvent += SetStateForEnableDisableAllButton;\n\n        SetInitialStateEnableAllToggle(checks);\n\n        return checks;\n      }\n    }\n\n    public string CheckSearch\n    {\n      get\n      {\n        return checkSearch;\n      }\n      set\n      {\n        checkSearch = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"CheckSearch\"));\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyChecksList\"));\n      }\n    }\n\n    public TidyCheckModel SelectedCheck\n    {\n      get\n      {\n        return selectedCheck;\n      }\n      set\n      {\n        selectedCheck = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"SelectedCheck\"));\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n\n    #region Commands\n\n    public ICommand ResetSearchCommand\n    {\n      get => resetSearchCommand ??= new RelayCommand(() => ResetSearchField(), () => CanExecute);\n    }\n\n    #endregion\n\n\n    #region Methods\n\n    public void MultipleStateChange(bool checkValue)\n    {\n      if (tidyChecksView.TidyChecksListBox.SelectedItems.Count <= 1)\n        return;\n\n      foreach (object item in tidyChecksView.TidyChecksListBox.SelectedItems)\n      {\n        TidyCheckModel model = (TidyCheckModel)item;\n        if (model.IsChecked != checkValue)\n        {\n          model.IsChecked = checkValue;\n        }\n      }\n    }\n\n    public void DeactivateDefaultsToggle()\n    {\n      if (tidyChecksView.EnableDisableDefaults.IsChecked.Value)\n      {\n        tidyChecksView.EnableDisableDefaults.IsChecked = false;\n      }\n    }\n\n    public void OpenBrowser(string tidyCheckName)\n    {\n      string uri = CreateFlagUri(tidyCheckName);\n      Process.Start(uri);\n    }\n\n    private string CreateFlagUri(string tidyCheckName)\n    {\n      StringBuilder sb = new();\n      string checkName = string.Empty;\n      if (tidyCheckName.Contains(\"clang-analyzer-\"))\n      {\n        checkName = tidyCheckName.Replace(\"clang-analyzer-\", \"clang-analyzer/\");\n      }\n      else if (tidyCheckName.IndexOf('-') != -1)\n      {\n        var listTidyCheckName = tidyCheckName.ToCharArray();\n        listTidyCheckName[tidyCheckName.IndexOf('-')] = '/';\n        checkName = new string(listTidyCheckName);\n      }\n      sb.Append(TidyConstants.FlagsUri).Append(checkName).Append(\".html\");\n      return sb.ToString();\n    }\n\n    private void LoadChecks()\n    {\n      string input = SettingsProvider.TidySettingsModel.PredefinedChecks;\n\n      if (string.IsNullOrWhiteSpace(input))\n      {\n        return;\n      }\n\n      input = Regex.Replace(input, @\"\\s+\", \"\");\n      input = input.Remove(input.Length - 1, 1);\n      List<string> checkNames = input.Split(';').ToList();\n\n      foreach (string check in checkNames)\n      {\n        foreach (TidyCheckModel tidyModel in tidyChecksList)\n        {\n          if (string.Equals(check, tidyModel.Name, StringComparison.OrdinalIgnoreCase))\n          {\n            tidyModel.IsChecked = true;\n          }\n        }\n      }\n    }\n\n    private void InitializeChecks()\n    {\n      tidyChecksList = new TidyChecks().Checks;\n      LoadChecks();\n      SetInitialStateEnableAllToggle(tidyChecksList);\n      SetInitialStateDefaultsToggle();\n    }\n\n    private void SetDefaultsToggle(bool value)\n    {\n      if (value)\n      {\n        SetDefaultChecks();\n        tidyChecksView.EnableDisableDefaults.IsChecked = true;\n      }\n      else\n      {\n        EnableDisableAllChecks(false);\n        tidyChecksView.EnableDisableDefaults.IsChecked = false;\n      }\n    }\n\n    private void SetInitialStateDefaultsToggle()\n    {\n      int count = tidyChecksList.Where(e => e.IsChecked).Count();\n      if (count == 0 || count != TidyChecksDefault.Checks.Count)\n      {\n        tidyChecksView.EnableDisableDefaults.IsChecked = false;\n        return;\n      }\n\n      foreach (TidyCheckModel check in tidyChecksList)\n      {\n        if (check.IsChecked == false && TidyChecksDefault.Checks.Contains(check.Name))\n        {\n          tidyChecksView.EnableDisableDefaults.IsChecked = false;\n          return;\n        }\n      }\n\n      tidyChecksView.EnableDisableDefaults.IsChecked = true;\n    }\n\n\n    /// <summary>\n    /// Enable or disable all the tidy checks from the current tidy checks list \n    /// </summary>\n    /// <param name=\"value\">True to enable all tidy checks. False to disable all tidy checks</param>\n    private void EnableDisableAllChecks(bool value)\n    {\n      // get all checks from current view considering the search filter\n      var checks = string.IsNullOrEmpty(checkSearch) ? tidyChecksList :\n          tidyChecksList.Where(e => e.Name.Contains(checkSearch, StringComparison.OrdinalIgnoreCase)).ToList();\n\n      // set just the current collection of checks\n      for (int i = 0; i < checks.Count; ++i)\n        checks[i].IsChecked = value;\n    }\n\n    /// <summary>\n    /// Set the state for Enable/Disable All toggle button\n    /// </summary>\n    /// <param name=\"checks\">Tidy checks collection</param>\n    private void SetInitialStateEnableAllToggle(IEnumerable<TidyCheckModel> checks)\n    {\n      // to avoid enter in the second condition the first one must be split in two if statements\n      // uncheck the Enable All toggle button if the retured list of checks has 0 elements\n      if (checks.Count() == 0)\n      {\n        if (tidyChecksView.EnableDisableAll.IsChecked == true)\n          tidyChecksView.EnableDisableAll.IsChecked = false;\n      }\n\n      // check the Enable All toggle button if all the checks from the current view are enabled\n      else if (tidyChecksView.EnableDisableAll.IsChecked == false && !checks.Any(c => c.IsChecked == false))\n      {\n        tidyChecksView.EnableDisableAll.IsChecked = true;\n      }\n\n      // uncheck the Enable All toggle button if any check from the list is disabled\n      else if (tidyChecksView.EnableDisableAll.IsChecked == true && checks.Any(c => c.IsChecked == false))\n      {\n        tidyChecksView.EnableDisableAll.IsChecked = false;\n      }\n    }\n\n    /// <summary>\n    /// Set the state for Enable/Disable All toggle button\n    /// </summary>\n    /// <param name=\"sender\">Value is NULL. Event is triggered from a static object which has no this value.</param>\n    /// <param name=\"e\">Contains the state of the toggle button</param>\n    private void SetStateForEnableDisableAllButton(object sender, BoolEventArgs e)\n    {\n      tidyChecksView.EnableDisableAll.IsChecked = e.Value;\n    }\n\n    private void OnClosed(object sender, EventArgs e)\n    {\n      tidyModel.PredefinedChecks = GetSelectedChecks();\n      tidyChecksView.Closed -= OnClosed;\n\n      CollectionElementsCounter.StateEvent -= SetStateForEnableDisableAllButton;\n    }\n\n    private string GetSelectedChecks()\n    {\n      StringBuilder checks = new();\n\n      foreach (TidyCheckModel item in tidyChecksList)\n      {\n        if (item.IsChecked)\n        {\n          checks.Append(item.Name).Append(\";\");\n        }\n      }\n\n      return checks.ToString();\n    }\n\n    private void ResetSearchField()\n    {\n      CheckSearch = string.Empty;\n    }\n\n    private void SetDefaultChecks()\n    {\n      foreach (TidyCheckModel check in tidyChecksList)\n      {\n        check.IsChecked = TidyChecksDefault.Checks.Contains(check.Name);\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/TidySettingsViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM;\nusing ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.Views;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Forms;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class TidySettingsViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    private TidySettingsModel tidyModel;\n    private string headerFilter = string.Empty;\n    private string displayWarning = string.Empty;\n    private ICommand headerFilterAddDataCommand;\n    private ICommand customExecutableBrowseCommand;\n    private ICommand compilationDatabaseBrowseCommand;\n    private ICommand predefinedChecksSelectCommand;\n    private ICommand customChecksAddDataCommand;\n    private ICommand exportTidyConfigCommand;\n\n    #endregion\n\n    #region Constructor\n\n    public TidySettingsViewModel()\n    {\n      tidyModel = SettingsProvider.TidySettingsModel;\n      HeaderFilters = new List<string>() { tidyModel.HeaderFilter, ComboBoxConstants.kCorrespondingHeaderName };\n      headerFilter = tidyModel.HeaderFilter;\n      UpdateWarningVisibility();\n    }\n\n    #endregion\n\n    #region Properties\n    public TidySettingsModel TidyModel\n    {\n      get\n      {\n        UpdateWarningVisibility();\n        return tidyModel;\n      }\n      set\n      {\n        tidyModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n      }\n    }\n\n    public string DisplayWarning\n    {\n      get { return displayWarning; }\n      set\n      {\n        displayWarning = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"DisplayWarning\"));\n      }\n    }\n\n    public List<string> HeaderFilters { get; set; }\n\n    public string HeaderFilter\n    {\n      get\n      {\n        return headerFilter;\n      }\n      set\n      {\n        headerFilter = value;\n        if (headerFilter == ComboBoxConstants.kCorrespondingHeaderName)\n        {\n          tidyModel.HeaderFilter = ComboBoxConstants.kCorrespondingHeaderValue;\n        }\n        else\n        {\n          tidyModel.HeaderFilter = value;\n        }\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    public IEnumerable<ClangTidyUseChecksFrom> UseChecksFromItems\n    {\n      get\n      {\n        return Enum.GetValues(typeof(ClangTidyUseChecksFrom)).Cast<ClangTidyUseChecksFrom>();\n      }\n    }\n\n    public SettingsTooltips Tooltip { get; } = new SettingsTooltips();\n\n    #endregion\n\n\n    #region Commands\n    public ICommand HeaderFilterAddDataCommand\n    {\n      get => headerFilterAddDataCommand ?? (headerFilterAddDataCommand = new RelayCommand(() => UpdateHeaderFilter(), () => CanExecute));\n    }\n\n    public ICommand CustomExecutableBrowseCommand\n    {\n      get => customExecutableBrowseCommand ?? (customExecutableBrowseCommand = new RelayCommand(() => UpdateCustomExecutable(), () => CanExecute));\n    }\n\n    public ICommand CompilationDatabaseBrowseCommand\n    {\n      get => compilationDatabaseBrowseCommand ?? (compilationDatabaseBrowseCommand = new RelayCommand(() => UpdateCompilationDatabase(), () => CanExecute));\n    }\n\n    public ICommand PredefinedChecksSelectCommand\n    {\n      get => predefinedChecksSelectCommand ?? (predefinedChecksSelectCommand = new RelayCommand(() => UpdatePredefinedChecks(), () => CanExecute));\n    }\n\n    public ICommand CustomChecksAddDataCommand\n    {\n      get => customChecksAddDataCommand ?? (customChecksAddDataCommand = new RelayCommand(() => UpdateCustomChecks(), () => CanExecute));\n    }\n\n    public ICommand ExportTidyConfigCommand\n    {\n      get => exportTidyConfigCommand ?? (exportTidyConfigCommand = new RelayCommand(() => ExportTidyConfig(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region Methods\n\n    private void UpdateWarningVisibility()\n    {\n      var tidySettings = SettingsProvider.TidySettingsModel;\n      if (tidySettings.ApplyTidyFix)\n        displayWarning = UIElementsConstants.Visibile;\n      else\n        displayWarning = UIElementsConstants.Hidden;\n      DisplayWarning = displayWarning;\n    }\n\n    private void UpdateHeaderFilter()\n    {\n      tidyModel.HeaderFilter = OpenContentDialog(tidyModel.HeaderFilter);\n      HeaderFilter = tidyModel.HeaderFilter;\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"HeaderFilter\"));\n    }\n\n    private void UpdateCustomChecks()\n    {\n      tidyModel.CustomChecks = OpenContentDialog(tidyModel.CustomChecks);\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n    }\n\n    private void UpdateCustomExecutable()\n    {\n      tidyModel.CustomExecutable = OpenFile(string.Empty, \".exe\", \"Executable files|*.exe\");\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n    }\n\n    private void UpdateCompilationDatabase()\n    {\n      string path = OpenFile(string.Empty, \".json\", \"Compilation database (*.json)|*.json\");\n      if (string.IsNullOrEmpty(path) == false)\n      {\n        tidyModel.CompilationDatabase = path;\n      }\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n    }\n\n    private void UpdatePredefinedChecks()\n    {\n      OpenChecksWindow();\n      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyModel\"));\n    }\n\n    private void ExportTidyConfig()\n    {\n      var tidyConfigFile = new TidyConfigFile();\n      string fileName = \".clang-tidy\";\n      string defaultExt = \".clang-tidy\";\n      string filter = \"Configuration files (.clang-tidy)|*.clang-tidy\";\n\n      string path = SaveFile(fileName, defaultExt, filter);\n      if (string.IsNullOrEmpty(path) == false)\n      {\n        WriteContentToFile(path, tidyConfigFile.CreateOutput().ToString());\n        MessageBox.Show(\".clang-tidy file exported at the selected location.\", \"Information\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n      }\n    }\n\n    private void OpenChecksWindow()\n    {\n      var tidyChecksView = new TidyChecksView();\n      tidyChecksView.ShowDialog();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/TidyToolWindowViewModel.cs",
    "content": "﻿using ClangPowerTools;\nusing ClangPowerTools.MVVM.Command;\nusing ClangPowerTools.MVVM.Models;\nusing ClangPowerTools.Views;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing ClangPowerToolsShared.MVVM.Controllers;\nusing ClangPowerToolsShared.MVVM.Models;\nusing ClangPowerToolsShared.MVVM.Models.TidyToolWindowModels;\nusing Microsoft.VisualStudio.PlatformUI;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Data;\nusing System.Windows.Input;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerToolsShared.MVVM.ViewModels\n{\n  public class TidyToolWindowViewModel : CommonSettingsFunctionality, INotifyPropertyChanged\n  {\n    #region Members\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    private TidyToolWindowView tidyToolWindowView;\n    private MessageModel messageModel;\n    private string listVisibility = UIElementsConstants.Visibile;\n    private TidyToolWindowController TidyController;\n    //To not refresh files value every time (with the same files), and to not refresh check box value\n    bool wasMadeTidyOnFiles = false;\n\n    private ICommand tidyAllCommand;\n    private ICommand fixAllCommand;\n    private ICommand discardAllCommand;\n    private ICommand removeAllCommand;\n\n    public ObservableCollection<FileModel> Files\n    {\n      get { return TidyController.files; }\n      set\n      {\n        TidyController.files = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"Files\"));\n      }\n    }\n\n    #endregion\n\n    #region Properties\n\n    public TidyToolWindowModel TidyToolWindowModel\n    {\n      get { return TidyController.tidyToolWindowModel; }\n      set\n      {\n        TidyController.tidyToolWindowModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TidyToolWindowModel\"));\n      }\n    }\n\n    public MessageModel MessageModel\n    {\n      get { return messageModel; }\n      set\n      {\n        messageModel = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"MessageModel\"));\n      }\n    }\n\n    public string ListVisibility\n    {\n      get { return listVisibility; }\n      set\n      {\n        listVisibility = value;\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"ListVisibility\"));\n      }\n    }\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #endregion\n\n    #region Commands\n\n    public ICommand TidyAllCommand\n    {\n      get => tidyAllCommand ?? (tidyAllCommand = new RelayCommand(() => TidyAllFilesAsync().SafeFireAndForget(), () => CanExecute));\n    }\n\n    public ICommand FixAllCommand\n    {\n      get => fixAllCommand ?? (fixAllCommand = new RelayCommand(() => FixAllFilesAsync().SafeFireAndForget(), () => CanExecute));\n    }\n\n    public ICommand DiscardAllCommand\n    {\n      get => discardAllCommand ?? (discardAllCommand = new RelayCommand(() => DiscardAllFiles(), () => CanExecute));\n    }\n\n    public ICommand RemoveAllCommand\n    {\n      get => removeAllCommand ?? (removeAllCommand = new RelayCommand(() => RemoveAllFiles(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region Constructos\n\n    public TidyToolWindowViewModel(TidyToolWindowView tidyToolWindowView)\n    {\n      VSColorTheme.ThemeChanged += ThemeChangeEvent;\n      this.tidyToolWindowView = tidyToolWindowView;\n      //init\n      TidyController = new TidyToolWindowController();\n      messageModel = new MessageModel();\n\n      TidyController.tidyToolWindowModel.ButtonVisibility = UIElementsConstants.Visibile;\n      TidyController.tidyToolWindowModel.ProgressBarVisibility = UIElementsConstants.Hidden;\n\n      //Create groups\n      CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(Files);\n      PropertyGroupDescription groupDescription = new PropertyGroupDescription(\"FilesType\");\n\n      view.GroupDescriptions.Add(groupDescription);\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public void OpenTidyToolWindow(List<string> filesPath)\n    {\n      RefreshOnWindowUpdate();\n      TidyController.InitTidyToolWindow(filesPath);\n      wasMadeTidyOnFiles = true;\n    }\n\n    public void UpdateViewModel(List<string> filesPath)\n    {\n      //if tidy fix was made add headers\n      if (!wasMadeTidyOnFiles)\n      {\n        TidyController.AddHeadersInFilesList(filesPath);\n      }\n\n      if (Files.Count == 0)\n      {\n        TidyController.AddFilesInFilesList(filesPath);\n      }\n      if (!Directory.Exists(TidyConstants.TempsFolderPath))\n        Directory.CreateDirectory(TidyConstants.TempsFolderPath);\n    }\n\n    private async Task TidyAllFilesAsync(List<string> paths = null)\n    {\n      wasMadeTidyOnFiles = true;\n      TidyController.TidyFilesAsync(paths);\n    }\n\n\n    public void CheckOrUncheckAll()\n    {\n      TidyController.CheckOrUncheckAll();\n    }\n\n    public async Task FixAllFilesAsync(FileModel file = null)\n    {\n      TidyController.FixAllFilesAsync(file);\n      wasMadeTidyOnFiles = false;\n    }\n\n    /// <summary>\n    /// Update checked numer on check and uncheck action\n    /// </summary>\n    /// <param name=\"file\"></param>\n    public void UpdateCheckedNumber(FileModel file)\n    {\n      TidyController.UpdateCheckedNumber(file);\n      TidyToolWindowModel = TidyController.tidyToolWindowModel;\n    }\n\n    public void DiffFile(FileModel file)\n    {\n      TidyController.DiffBetweenCopyAndCurrent(file);\n    }\n\n    #endregion\n\n    #region Private Method\n\n    private void RemoveAllFiles()\n    {\n      TidyController.BeforeCommand();\n      TidyController.RemoveFiles();\n      //Display a message if no file is in list\n      if (Files.Count == 0)\n      {\n        listVisibility = UIElementsConstants.Hidden;\n        ListVisibility = ListVisibility;\n        messageModel.Visibility = UIElementsConstants.Visibile;\n        messageModel.TextMessage = \"Files on which you run Tidy will be shown here\";\n        MessageModel = messageModel;\n      }\n      TidyController.AfterCommand();\n    }\n\n    private void DiscardAllFiles()\n    {\n      if (TidyToolWindowModel.CountFilesModel.TotalCheckedFixedFiles != 0)\n      {\n        TidyController.BeforeCommand();\n        var checkedFiles = TidyController.files.Where(f => f.IsChecked).ToList();\n        foreach (var file in checkedFiles)\n        {\n          if (file.IsChecked)\n          {\n            TidyController.DiscardFile(file);\n            //If is a header remove from file list\n            if (file.FilesType == FileType.Header)\n            {\n              TidyController.RemoveFiles(file);\n            }\n          }\n        }\n        TidyController.AfterCommand();\n      }\n    }\n\n    public void ThemeChangeEvent(ThemeChangedEventArgs e)\n    {\n      TidyController.tidyToolWindowModel.ChangeIconsTheme();\n      foreach (var file in TidyController.files)\n      {\n        file.ChangeIconsTheme();\n      }\n    }\n\n    /// <summary>\n    /// Make list visible after tidy from toolbar or contextMenu\n    /// </summary>\n    private void RefreshOnWindowUpdate()\n    {\n      listVisibility = UIElementsConstants.Visibile;\n      messageModel.Visibility = UIElementsConstants.Hidden;\n      ListVisibility = listVisibility;\n      MessageModel = messageModel;\n    }\n\n    #endregion\n  }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/ToggleMultipleDataViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools\n{\n  public class ToggleMultipleDataViewModel\n  {\n    public List<ToggleModel> Input { get; set; } = new List<ToggleModel>();\n\n    #region Properties\n\n    public IEnumerable<ToggleValues> BooleanComboboxValues\n    {\n      get\n      {\n        return Enum.GetValues(typeof(ToggleValues)).Cast<ToggleValues>();\n      }\n    }\n\n    #endregion\n\n\n    #region Constructor\n\n    public ToggleMultipleDataViewModel(List<ToggleModel> input)\n    {\n      Input = input;\n    }\n\n    // Empty constructor for \n    public ToggleMultipleDataViewModel()\n    {\n\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/ViewModels/TrialExpiredViewModel.cs",
    "content": "﻿using ClangPowerTools.MVVM.Commands;\nusing ClangPowerTools.MVVM.Views;\nusing System.Diagnostics;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools\n{\n  public class TrialExpiredViewModel\n  {\n    #region Members\n\n    private ICommand commercialLicenseCommand;\n    private ICommand personalLicenseCommand;\n    private ICommand signInCommand;\n\n    private readonly TrialExpiredView trialExpiredView;\n\n    #endregion\n\n    #region Properties\n\n    public bool CanExecute\n    {\n      get\n      {\n        return true;\n      }\n    }\n\n    #region Constructor\n\n    public TrialExpiredViewModel() { }\n\n    public TrialExpiredViewModel(TrialExpiredView view)\n    {\n      trialExpiredView = view;\n    }\n\n    #endregion\n\n    #endregion\n\n    #region Commands\n\n    public ICommand CommercialLicense\n    {\n      get => commercialLicenseCommand ?? (commercialLicenseCommand = new RelayCommand(() => CommercialLicenceExecute(), () => CanExecute));\n    }\n\n    public ICommand PersonalLicense\n    {\n      get => personalLicenseCommand ?? (personalLicenseCommand = new RelayCommand(() => PersonalLicenceExecute(), () => CanExecute));\n    }\n\n    public ICommand SignIn\n    {\n      get => signInCommand ?? (signInCommand = new RelayCommand(() => PersonalLicenceExecute(), () => CanExecute));\n    }\n\n    #endregion\n\n    #region Methods\n\n    public void CommercialLicenceExecute()\n    {\n      Process.Start(new ProcessStartInfo(\"https://clangpowertools.com/download.html#pricing\"));\n      ShowLoginView();\n    }\n\n    public void PersonalLicenceExecute()\n    {\n      ShowLoginView();\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    public void ShowLoginView()\n    {\n      trialExpiredView.Close();\n      LoginView loginView = new LoginView();\n      loginView.ShowDialog();\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/AboutSettingsView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.AboutSettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"460\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n      <BooleanToVisibilityConverter x:Key=\"BoolToVis\" />\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"80\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"140\" />\n      <ColumnDefinition Width=\"auto\" />\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n\n    <Grid Grid.Row=\"1\" Grid.Column=\"1\" VerticalAlignment=\"Center\">\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"70\"/>\n        <RowDefinition Height=\"auto\"/>\n      </Grid.RowDefinitions>\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"auto\"/>\n      </Grid.ColumnDefinitions>\n\n      <Rectangle\n        Grid.Row=\"0\"\n        Grid.Column=\"0\"\n        Width=\"65\"\n        Height=\"65\"\n        HorizontalAlignment=\"Center\">\n        <Rectangle.Fill>\n          <ImageBrush ImageSource=\"{StaticResource AccountAvatarIcon}\" />\n        </Rectangle.Fill>\n      </Rectangle>\n      \n      <StackPanel\n        Grid.Row=\"1\"\n        Grid.Column=\"0\"\n        Margin=\"20,30,0,0\"\n        HorizontalAlignment=\"Left\"\n  >\n        <TextBlock\n          Grid.Row=\"1\"\n          Grid.Column=\"0\"\n          VerticalAlignment=\"Center\"\n          FontFamily=\"SegoeUI\"\n          FontSize=\"15\"\n          FontWeight=\"SemiBold\"\n          Text=\"Version number\" />\n\n        <TextBlock\n          Grid.Row=\"1\"\n          Grid.Column=\"1\"\n          Margin=\"0,10,0,0\"\n          HorizontalAlignment=\"Left\"\n          VerticalAlignment=\"Top\"\n          FontFamily=\"SegoeUI\"\n          FontSize=\"15\"\n          Foreground=\"#333333\"\n          Text=\"{Binding GeneralSettingsModel.Version}\" />\n      </StackPanel>\n    </Grid>\n\n    <Grid Grid.Row=\"1\" \n          Grid.Column=\"2\" \n          VerticalAlignment=\"Center\" \n          HorizontalAlignment=\"Center\" \n          Margin=\"0,50,0,0\">\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"50\" />\n        <RowDefinition Height=\"70\" />\n        <RowDefinition Height=\"30\" />\n        <RowDefinition Height=\"50\" />\n        <RowDefinition Height=\"50\" />\n        <RowDefinition Height=\"50\" />\n        <RowDefinition Height=\"*\" />\n      </Grid.RowDefinitions>\n\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"5\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n\n      <!--  Local Settings  -->\n      <Image\n        Grid.Row=\"0\"\n        Grid.Column=\"0\"\n        Width=\"48\"\n        Height=\"48\"\n        Source=\"/ClangPowerTools;component/Resources/StorageIcon.png\" />\n\n      <TextBlock\n        Grid.Row=\"1\"\n        Grid.Column=\"0\"\n        HorizontalAlignment=\"Center\"\n        FontSize=\"20\"\n        Text=\"Local Settings\"\n        TextAlignment=\"Center\" />\n      \n        <!--  Export Settings  -->\n        <Button\n          Grid.Row=\"2\"\n          Grid.Column=\"0\"\n          Width=\"158\"\n          Height=\"35\"\n          Command=\"{Binding ExportSettingsCommand}\"\n          Content=\"Export\"\n          FontSize=\"14\"\n          Foreground=\"White\"\n          Style=\"{StaticResource SettingsButton}\" />\n\n\n        <!--Import Settings-->  \n        <Button\n          Grid.Row=\"3\"\n          Grid.Column=\"0\"\n          Width=\"158\"\n          Height=\"35\"\n          Command=\"{Binding ImportSettingssCommand}\"\n          Content=\"Import\"\n          FontSize=\"14\"\n          Foreground=\"White\"\n          Style=\"{StaticResource SettingsButton}\" />\n\n\n        <!--Reset Settings-->  \n        <Button\n          Grid.Row=\"4\"\n          Grid.Column=\"0\"\n          Width=\"158\"\n          Height=\"35\"\n          Command=\"{Binding ResetSettingsCommand}\"\n          Content=\"Reset\"\n          FontSize=\"14\"\n          Foreground=\"White\"\n          Style=\"{StaticResource SettingsButton}\" />\n    </Grid>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/AboutSettingsView.xaml.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.ViewModels;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for AboutSettingsView.xaml\n  /// </summary>\n  public partial class AboutSettingsView : UserControl\n  {\n    public AboutSettingsView()\n    {\n      InitializeComponent();\n      DataContext = new AboutSettingsViewModel();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/CMakeBetaWarning.xaml",
    "content": "﻿<Window \n  x:Class=\"ClangPowerTools.MVVM.Views.CMakeBetaWarning\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views\" xmlns:components=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  mc:Ignorable=\"d\" \n  Title=\"Warning\"\n  Width=\"650\"\n  Height=\"450\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  WindowStyle=\"ThreeDBorderWindow\">\n\n  <!--  Static resources  -->\n  <Window.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </Window.Resources>\n\n  <Grid>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"50\" />\n    </Grid.RowDefinitions>\n\n    <components:MessageBanner\n      Grid.Row=\"0\"\n      Banner=\"/ClangPowerTools;component/Resources/BannerWarning.png\"\n      Icon=\"/ClangPowerTools;component/Resources/WarningIcon.png\"\n      Type=\"CMake Beta support\" />\n\n    <StackPanel Grid.Row=\"1\" Margin=\"20\">\n      <TextBlock\n        Margin=\"0,5\"\n        FontSize=\"14\"\n        Text=\"CMake support is in early access and is considered a BETA feature.\"\n        TextWrapping=\"Wrap\" />\n\n      <TextBlock\n        Margin=\"0,5\"\n        FontSize=\"14\"\n        Text=\"Using this feature may result in some changes to your &quot;vcxproj&quot;. We highly recommend using version control software to ensure you have everything backed-up before using Clang Build and Tidy on your project.\"\n        TextWrapping=\"Wrap\" />      \n      \n      <TextBlock\n        Margin=\"0,30\"\n        FontSize=\"14\"\n        Text=\"For any issues or suggestions, see the Feedback tab in Clang Power Tools Settings.\"\n        TextWrapping=\"Wrap\" />\n\n      <CheckBox \n        Margin=\"0 10 0 0\" \n        Content=\"Don't show this again.\" \n        Checked=\"CheckBox_Checked\" \n        Unchecked=\"CheckBox_Unchecked\" />\n    </StackPanel>\n\n    <Button\n      Grid.Row=\"2\"\n      Width=\"100\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Click=\"ContinueButton_Click\"\n      Content=\"Continue\"\n      FontSize=\"14\"\n      Foreground=\"White\"\n      Style=\"{StaticResource SettingsButton}\" />\n\n  </Grid>\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/CMakeBetaWarning.xaml.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for CMakeBetaWarning.xaml\n  /// </summary>\n  public partial class CMakeBetaWarning : Window\n  {\n    private readonly string registryName = @\"Software\\Caphyon\\Clang Power Tools\";\n    private readonly string keyName = \"CMakeBetaWarning\";\n\n    public CMakeBetaWarning()\n    {\n      InitializeComponent();\n    }\n\n    private void ContinueButton_Click(object sender, RoutedEventArgs e)\n    {\n      this.Close();\n    }\n\n    private void CheckBox_Checked(object sender, RoutedEventArgs e)\n    {\n      var registryUtility = new RegistryUtility(registryName);\n      registryUtility.WriteCurrentUserKey(keyName, \"DoNotShow\");\n    }\n\n    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)\n    {\n      var registryUtility = new RegistryUtility(registryName);\n      registryUtility.DeleteCurrentUserKey(keyName);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/CompilerSettingsView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.CompilerSettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  xmlns:views=\"clr-namespace:ClangPowerTools.MVVM.Views\"\n  d:DesignHeight=\"490\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <!--  Main grid  -->\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"20\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"auto\" />\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n\n    <!--  Compile flags  -->\n    <WrapPanel Grid.Row=\"1\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CompileFlags}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Compile flags\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding CompilerModel.CompileFlags}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding CompileFlagsAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Files to ignore  -->\n    <WrapPanel Grid.Row=\"2\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FilesToIgnoreCompile}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Files to ignore\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding CompilerModel.FilesToIgnore}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding FilesToIgnoreAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Projects to ignore  -->\n    <WrapPanel Grid.Row=\"3\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ProjectsToIgnore}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Projects to ignore\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding CompilerModel.ProjectsToIgnore}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding ProjectsToIgnoreAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Additional includes  -->\n    <WrapPanel Grid.Row=\"4\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.AdditionalIncludes}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Additional include as\" />\n\n      <ComboBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        ItemsSource=\"{Binding AdditionalIncludesItems}\"\n        SelectedItem=\"{Binding CompilerModel.AdditionalIncludes}\" />\n    </WrapPanel>\n\n    <Grid Grid.Row=\"6\" Grid.Column=\"1\">\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"auto\" />\n        <RowDefinition Height=\"*\" />\n      </Grid.RowDefinitions>\n\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"auto\" />\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"auto\" />\n        <ColumnDefinition Width=\"70\" />\n      </Grid.ColumnDefinitions>\n\n      <!--  Warning as errors  -->\n      <WrapPanel Grid.Row=\"0\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.WarningsAsErrors}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Warnings as errors\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.WarningsAsErrors}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  Continue on error  -->\n      <WrapPanel Grid.Row=\"1\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ContinueOnError}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Continue on error\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.ContinueOnError}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n\n      <!--  Clang after MSCV compile  -->\n      <WrapPanel Grid.Row=\"2\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ClangAfterMSVC}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Clang after MSVC\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.ClangAfterMSVC}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  Show Error List  -->\n      <WrapPanel Grid.Row=\"3\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ShowErrorList}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Show Error List\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.ShowErrorList}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  Show Output Window List  -->\n      <WrapPanel Grid.Row=\"4\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ShowOutputWindow}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Show Output Window\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.ShowOutputWindow}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  Show Squiggles  -->\n      <WrapPanel Grid.Row=\"5\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.ShowSquiggles}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Show squiggles (BETA)\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.ShowSquiggles}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  Verbose mode  -->\n      <WrapPanel Grid.Row=\"6\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.VerboseLevel}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Verbosity Level\" />\n\n        <ComboBox\n        Width=\"70\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        ItemsSource=\"{Binding VerbosityLevelItems}\"\n        SelectedItem=\"{Binding CompilerModel.VerbosityLevel}\" />\n      </WrapPanel>\n\n      <!--  Update PowerShell  -->\n      <WrapPanel Grid.Row=\"7\" Grid.Column=\"0\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.PowerShellScripts}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"PowerShell scripts\" />\n\n        <Button\n        Width=\"80\"\n        Height=\"30\"\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding PowerShellUpdateScriptsCommand}\"\n        Content=\"Update\"\n        FontSize=\"14\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\" />\n      </WrapPanel>\n\n      <!--  Add cpt alias  -->\n      <WrapPanel Grid.Row=\"0\" Grid.Column=\"2\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.AliasPowerShellScripts}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Cpt alias in PowerShell\" />\n\n        <Button\n        Width=\"80\"\n        Height=\"30\"\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding AddCptAliasCommand}\"\n        Content=\"Add\"\n        FontSize=\"14\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\" />\n      </WrapPanel>\n\n      <!--  Support for powershell 7  -->\n      <WrapPanel Grid.Row=\"1\" Grid.Column=\"2\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.AliasPowerShellScripts}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n        \n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Powershell 7\" />\n\n        <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding CompilerModel.Powershell7, Mode = TwoWay}\"\n        Tag=\"On\" />\n      </WrapPanel>\n\n      <!--  CPU Limit  -->\n      <WrapPanel Grid.Row=\"2\" Grid.Column=\"2\">\n        <WrapPanel.ToolTip>\n          <ToolTip>\n            <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CpuLimit}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n        </WrapPanel.ToolTip>\n\n        <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"CPU Limit\" />\n\n        <DockPanel VerticalAlignment=\"Center\">\n          <TextBox \n            Background=\"Transparent\"\n            BorderThickness=\"0\"\n            Text=\"{Binding ElementName=slColorB, Path=Value}\"\n            DockPanel.Dock=\"Right\"\n            TextAlignment=\"Center\"\n            Width=\"30\" />\n          <Slider Maximum=\"100\" \n                  Minimum=\"20\"\n                  Width=\"70\"\n                  TickPlacement=\"BottomRight\" \n                  TickFrequency=\"5\" \n                  IsSnapToTickEnabled=\"True\"\n                  Value=\"{Binding CompilerModel.CpuLimit, Mode = TwoWay}\"\n                  Name=\"slColorB\" >\n          </Slider>\n        </DockPanel>\n        <TextBlock\n          Width=\"15\"\n          VerticalAlignment=\"Center\"\n          FontFamily=\"SegoeUI\"\n          FontSize=\"16\"\n          Text=\"%\" />\n      </WrapPanel>\n    </Grid>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/CompilerSettingsView.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for CompilerSettingsView.xaml\n  /// </summary>\n  public partial class CompilerSettingsView : UserControl, IView\n  {\n    public CompilerSettingsView()\n    {\n      InitializeComponent();\n      DataContext = new CompilerSettingsViewModel();\n      SettingsHandler.RefreshSettingsView += ResetView;\n    }\n\n    public void ResetView()\n    {\n      DataContext = new CompilerSettingsViewModel();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/BuyNowFooter.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.MVVM.Views.Components.BuyNowFooter\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"../Styles/YellowButtonStyle.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <Grid x:Name=\"UpgradeFooter\" Background=\"#272E58\">\n    <Grid.Style>\n      <Style TargetType=\"Grid\">\n        <Setter Property=\"Visibility\" Value=\"Visible\" />\n        <Style.Triggers>\n          <DataTrigger Binding=\"{Binding ShowFooter}\" Value=\"True\">\n            <Setter Property=\"Visibility\" Value=\"Collapsed\" />\n          </DataTrigger>\n        </Style.Triggers>\n      </Style>\n    </Grid.Style>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"20\" />\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"20\" />\n    </Grid.ColumnDefinitions>\n\n    <StackPanel\n      Grid.Row=\"0\"\n      Grid.Column=\"1\"\n      HorizontalAlignment=\"Left\">\n\n      <TextBlock\n        Grid.Row=\"0\"\n        Grid.Column=\"1\"\n        Margin=\"0,5,0,0\"\n        HorizontalAlignment=\"Left\"\n        FontSize=\"15\"\n        Foreground=\"White\"\n        Text=\"Want to share your settings configuration?\" />\n\n      <TextBlock\n        Grid.Row=\"0\"\n        Grid.Column=\"1\"\n        Margin=\"0,5,0,0\"\n        HorizontalAlignment=\"Left\"\n        FontSize=\"12\"\n        Foreground=\"White\"\n        Text=\"Create a free Clang Power Tools account to share your Cloud Settings with your team.\"\n        TextWrapping=\"Wrap\" />\n\n      <TextBlock\n        Grid.Row=\"0\"\n        Grid.Column=\"1\"\n        Margin=\"0,0,0,5\"\n        HorizontalAlignment=\"Left\"\n        FontSize=\"12\"\n        Foreground=\"White\"\n        TextWrapping=\"Wrap\">\n        <Hyperlink Command=\"{Binding LogIn}\">\n          Log in to your account\n        </Hyperlink>\n      </TextBlock>\n\n\n    </StackPanel>\n\n  </Grid>\n\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/BuyNowFooter.xaml.cs",
    "content": "﻿using System.Windows.Controls;\n\nnamespace ClangPowerTools.MVVM.Views.Components\n{\n  /// <summary>\n  /// Interaction logic for BuyNowFooter.xaml\n  /// </summary>\n  public partial class BuyNowFooter : UserControl\n  {\n    public BuyNowFooter()\n    {\n      InitializeComponent();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.MVVM.Views.Components.InputList\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  xmlns:conv=\"clr-namespace:ClangPowerTools.Convertors\"\n  Name=\"_InputList\"\n  d:DesignHeight=\"450\"\n  d:DesignWidth=\"800\"\n  mc:Ignorable=\"d\">\n\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n        <ResourceDictionary>\n          <Style TargetType=\"{x:Type ListView}\">\n            <Setter Property=\"FontFamily\" Value=\"Segoe UI\" />\n            <Setter Property=\"FontWeight\" Value=\"Normal\" />\n            <Setter Property=\"FontSize\" Value=\"13\" />\n          </Style>\n          <conv:BooleanToGridLengthConverter x:Key=\"BooleanToGridLengthConverter\"/>\n        </ResourceDictionary>\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <!--  Main grid  -->\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"15\" />\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"15\" />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"10\" />\n    </Grid.RowDefinitions>\n\n    <!--  Input field  -->\n    <Grid Grid.Row=\"0\" Grid.Column=\"1\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"{Binding CanPickFilesExecute, Converter={StaticResource BooleanToGridLengthConverter}}\" />\n        <ColumnDefinition Width=\"{Binding CanPickFolderExecute, Converter={StaticResource BooleanToGridLengthConverter}}\" />\n        <ColumnDefinition Width=\"Auto\" />\n      </Grid.ColumnDefinitions>\n\n      <TextBox\n        x:Name=\"InputTextbox\"\n        Grid.Column=\"0\"\n        Height=\"30\"\n        Margin=\"0,0,5,0\"\n        VerticalContentAlignment=\"Center\"\n        FontSize=\"13\"\n        Text=\"{Binding InputToAdd, ElementName=_InputList, UpdateSourceTrigger=PropertyChanged}\">\n        <TextBox.InputBindings>\n          <KeyBinding Key=\"Return\" Command=\"{Binding AddCommand, ElementName=_InputList}\" />\n        </TextBox.InputBindings>\n        <TextBox.Style>\n          <Style xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" TargetType=\"TextBox\">\n            <Style.Resources>\n              <VisualBrush\n                x:Key=\"CueBannerBrush\"\n                AlignmentX=\"Left\"\n                AlignmentY=\"Center\"\n                Stretch=\"None\">\n                <VisualBrush.Visual>\n                  <TextBlock Foreground=\"Gray\" Text=\"Type here\" />\n                </VisualBrush.Visual>\n              </VisualBrush>\n            </Style.Resources>\n            <Style.Triggers>\n\n              <Trigger Property=\"Text\" Value=\"{x:Static sys:String.Empty}\">\n                <Setter Property=\"Background\" Value=\"{StaticResource CueBannerBrush}\" />\n              </Trigger>\n              <Trigger Property=\"Text\" Value=\"{x:Null}\">\n                <Setter Property=\"Background\" Value=\"{StaticResource CueBannerBrush}\" />\n              </Trigger>\n              <Trigger Property=\"IsKeyboardFocused\" Value=\"True\">\n                <Setter Property=\"Background\" Value=\"White\" />\n              </Trigger>\n            </Style.Triggers>\n          </Style>\n        </TextBox.Style>\n      </TextBox>\n\n    <Button\n        x:Name=\"PickFilesButton\"\n        Grid.Column=\"1\"\n        HorizontalAlignment=\"Right\"\n        Visibility=\"Visible\"\n        Command=\"{Binding PickFilesCommand, ElementName=_InputList}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image \n            Source=\"{StaticResource BrowseFileImage}\"\n            Width=\"16\" \n            Height=\"16\" />\n        </Button.Content>\n    </Button>\n    <Button\n        x:Name=\"PickFolderButton\"\n        Grid.Column=\"2\"\n        HorizontalAlignment=\"Right\"\n        Visibility=\"Visible\"\n        Command=\"{Binding PickFolderCommand, ElementName=_InputList}\"\n        Style=\"{StaticResource SettingsButton}\">\n                <Button.Content>\n                    <Image Source=\"{StaticResource BrowseImage}\" />\n                </Button.Content>\n            </Button>\n            <Button\n        x:Name=\"InputButton\"\n        Grid.Column=\"3\"\n        HorizontalAlignment=\"Right\"\n        Command=\"{Binding AddCommand, ElementName=_InputList}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </Grid>\n\n    <!--  Inputs  -->\n    <ListView\n      x:Name=\"CollectionItems\"\n      Grid.Row=\"2\"\n      Grid.Column=\"1\"\n      Grid.ColumnSpan=\"3\"\n      Margin=\"0,5,0,0\"\n      Background=\"White\"\n      ItemsSource=\"{Binding Collection, ElementName=_InputList, Mode=TwoWay}\"\n      ScrollViewer.CanContentScroll=\"True\"\n      ScrollViewer.VerticalScrollBarVisibility=\"Visible\"\n      SelectionMode=\"Single\">\n\n      <ListView.ItemContainerStyle>\n        <Style TargetType=\"ListViewItem\">\n          <Setter Property=\"Background\" Value=\"Transparent\" />\n          <Setter Property=\"BorderBrush\" Value=\"WhiteSmoke\" />\n          <Setter Property=\"BorderThickness\" Value=\"1\" />\n          <Setter Property=\"Focusable\" Value=\"True\" />\n          <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        </Style>\n      </ListView.ItemContainerStyle>\n\n      <ListView.ItemTemplate>\n        <DataTemplate>\n          <Grid>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition Width=\"*\" />\n              <ColumnDefinition Width=\"Auto\" />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"38\" />\n            </Grid.RowDefinitions>\n            <TextBox\n              x:Name=\"InputField\"\n              Grid.Column=\"0\"\n              VerticalAlignment=\"Center\"\n              BorderThickness=\"0\"\n              IsReadOnly=\"{Binding IsReadOnly, Mode=TwoWay}\"\n              Text=\"{Binding InputData, Mode=TwoWay}\" />\n            <Button\n              Name=\"DeleteButton\"\n              Grid.Column=\"1\"\n              Width=\"20\"\n              Height=\"20\"\n              Margin=\"10,0,10,0\"\n              HorizontalAlignment=\"Right\"\n              BorderThickness=\"0\"\n              Click=\"DeleteButton_Click\">\n              <Button.Style>\n                <Style TargetType=\"{x:Type Button}\">\n                  <Setter Property=\"Background\" Value=\"{StaticResource RemoveImage}\" />\n                  <Setter Property=\"Template\">\n                    <Setter.Value>\n                      <ControlTemplate TargetType=\"Button\">\n                        <Grid Background=\"{TemplateBinding Background}\">\n                          <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\n                        </Grid>\n                      </ControlTemplate>\n                    </Setter.Value>\n                  </Setter>\n                  <Style.Triggers>\n                    <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                      <Setter Property=\"Background\" Value=\"{StaticResource RemoverHoverImage}\" />\n                    </Trigger>\n                  </Style.Triggers>\n                </Style>\n              </Button.Style>\n            </Button>\n          </Grid>\n        </DataTemplate>\n      </ListView.ItemTemplate>\n    </ListView>\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/InputList.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing System.Collections.ObjectModel;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.MVVM.Views.Components\n{\n  /// <summary>\n  /// Interaction logic for InputList.xaml\n  /// </summary>\n  public partial class InputList : UserControl\n  {\n    #region Constructor\n\n    public InputList()\n    {\n      InitializeComponent();\n    }\n\n    #endregion\n\n\n    #region Properties\n\n    public string InputToAdd\n    {\n      get { return (string)GetValue(InputToAddProperty); }\n      set { SetValue(InputToAddProperty, value); }\n    }\n\n    public static readonly DependencyProperty InputToAddProperty =\n      DependencyProperty.Register(\"InputToAdd\", typeof(string), typeof(InputList), new PropertyMetadata(null));\n\n\n    public ICommand AddCommand\n    {\n      get { return (ICommand)GetValue(AddCommandProperty); }\n      set { SetValue(AddCommandProperty, value); }\n    }\n\n    public static readonly DependencyProperty AddCommandProperty =\n      DependencyProperty.Register(\"AddCommand\", typeof(ICommand), typeof(InputList), new PropertyMetadata(null));\n\n    public ICommand PickFilesCommand\n    {\n      get { return (ICommand)GetValue(PickFilesCommandProperty); }\n      set { SetValue(PickFilesCommandProperty, value); }\n    }\n\n    public static readonly DependencyProperty PickFilesCommandProperty =\n      DependencyProperty.Register(\"PickFilesCommand\", typeof(ICommand), typeof(InputList), new PropertyMetadata(null));\n\n    public ICommand PickFolderCommand\n    {\n      get { return (ICommand)GetValue(PickFolderCommandProperty); }\n      set { SetValue(PickFolderCommandProperty, value); }\n    }\n\n    public static readonly DependencyProperty PickFolderCommandProperty =\n      DependencyProperty.Register(\"PickFolderCommand\", typeof(ICommand), typeof(InputList), new PropertyMetadata(null));\n\n    public ObservableCollection<InputDataModel> Collection\n    {\n      get { return (ObservableCollection<InputDataModel>)GetValue(CollectionProperty); }\n      set { SetValue(CollectionProperty, value); }\n    }\n\n    public static readonly DependencyProperty CollectionProperty =\n      DependencyProperty.Register(\"Collection\", typeof(ObservableCollection<InputDataModel>), typeof(InputList), null);\n\n    #endregion\n\n\n    //#region Routed Events\n\n    //public static readonly RoutedEvent DeleteButtonClickEvent = EventManager.RegisterRoutedEvent(\n    //  \"DeleteButtonClick\", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(InputList));\n\n    //public event RoutedEventHandler DeleteButtonClick\n    //{\n    //  add { AddHandler(DeleteButtonClickEvent, value); }\n    //  remove { RemoveHandler(DeleteButtonClickEvent, value); }\n    //}\n\n    //private void DeleteButton_Click(object sender, RoutedEventArgs e)\n    //{\n    //  var newEventArgs = new RoutedEventArgs(DeleteButtonClickEvent);\n    //  RaiseEvent(newEventArgs);\n    //}\n\n    //#endregion\n\n    #region Methods\n\n    private void DeleteButton_Click(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = GetElementIndex(sender as FrameworkElement);\n      ((InputDataViewModel)DataContext).DeleteInput(elementIndex);\n    }\n\n    private int GetElementIndex(FrameworkElement frameworkElement)\n    {\n      var element = frameworkElement.DataContext;\n      return CollectionItems.Items.IndexOf(element);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/MessageBanner.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.MVVM.Views.Components.MessageBanner\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Name=\"_MessageBanner\"\n  d:DesignHeight=\"200\"\n  d:DesignWidth=\"800\"\n  mc:Ignorable=\"d\">\n  <Grid VerticalAlignment=\"Top\">\n    <Image Source=\"{Binding Banner, ElementName=_MessageBanner}\" />\n    <Image\n      Width=\"36\"\n      Height=\"36\"\n      Margin=\"23,21\"\n      HorizontalAlignment=\"Left\"\n      VerticalAlignment=\"Top\"\n      Source=\"{Binding Icon, ElementName=_MessageBanner}\" />\n    <Label\n      Margin=\"75,20,284,26.333\"\n      Content=\"{Binding Type, ElementName=_MessageBanner}\"\n      FontSize=\"21\"\n      Foreground=\"White\" />\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/MessageBanner.xaml.cs",
    "content": "﻿using System.Windows;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.MVVM.Views.Components\n{\n  /// <summary>\n  /// Interaction logic for MessageBanner.xaml\n  /// </summary>\n  public partial class MessageBanner : UserControl\n  {\n    public MessageBanner()\n    {\n      InitializeComponent();\n    }\n\n    public string Banner\n    {\n      get { return (string)GetValue(BannerProperty); }\n      set { SetValue(BannerProperty, value); }\n    }\n\n    public static readonly DependencyProperty BannerProperty =\n      DependencyProperty.Register(\"Banner\", typeof(string), typeof(MessageBanner), new PropertyMetadata(null));\n\n\n    public string Icon\n    {\n      get { return (string)GetValue(IconProperty); }\n      set { SetValue(IconProperty, value); }\n    }\n\n    public static readonly DependencyProperty IconProperty =\n      DependencyProperty.Register(\"Icon\", typeof(string), typeof(MessageBanner), new PropertyMetadata(null));\n\n\n    public string Type\n    {\n      get { return (string)GetValue(TypeProperty); }\n      set { SetValue(TypeProperty, value); }\n    }\n\n    public static readonly DependencyProperty TypeProperty =\n      DependencyProperty.Register(\"Type\", typeof(string), typeof(MessageBanner), new PropertyMetadata(null));\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/ThreePieceButton.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.MVVM.Views.Components.ThreePieceButton\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Name=\"_LicenseTypeButton\"\n  mc:Ignorable=\"d\">\n\n  <Button\n    Name=\"FreeLicenseButton\"\n    HorizontalAlignment=\"Center\"\n    BorderThickness=\"0\"\n    Command=\"{Binding ButtonCommand, ElementName=_LicenseTypeButton}\">\n\n    <Button.Content>\n      <Grid Width=\"{Binding WidthValue, ElementName=_LicenseTypeButton}\" Height=\"{Binding HeightValue, ElementName=_LicenseTypeButton}\">\n        <Grid.Background>\n          <SolidColorBrush Opacity=\"{Binding OpacityValue, ElementName=_LicenseTypeButton}\" Color=\"{Binding BackgroundValue, ElementName=_LicenseTypeButton}\" />\n        </Grid.Background>\n\n        <Grid.RowDefinitions>\n          <RowDefinition Height=\"Auto\" />\n          <RowDefinition Height=\"Auto\" />\n          <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n\n        <Image\n          Grid.Row=\"0\"\n          Width=\"{Binding ImageWidthValue, ElementName=_LicenseTypeButton}\"\n          Height=\"{Binding ImageHeightValue, ElementName=_LicenseTypeButton}\"\n          Margin=\"0,22,0,0\"\n          HorizontalAlignment=\"Center\"\n          Source=\"{Binding Image, ElementName=_LicenseTypeButton}\" />\n\n        <TextBlock\n          Grid.Row=\"1\"\n          Margin=\"0,18,0,0\"\n          HorizontalAlignment=\"Center\"\n          FontSize=\"{Binding TitleFontSize, ElementName=_LicenseTypeButton}\"\n          Foreground=\"{Binding TitleForeground, ElementName=_LicenseTypeButton}\"\n          Text=\"{Binding Title, ElementName=_LicenseTypeButton}\" />\n\n        <TextBlock\n          Grid.Row=\"2\"\n          Margin=\"0,9,0,0\"\n          HorizontalAlignment=\"Center\"\n          FontSize=\"{Binding DescriptionFontSize, ElementName=_LicenseTypeButton}\"\n          Foreground=\"{Binding DescriptionForeground, ElementName=_LicenseTypeButton}\"\n          Text=\"{Binding Description, ElementName=_LicenseTypeButton}\" />\n\n      </Grid>\n    </Button.Content>\n\n    <Button.Template>\n      <ControlTemplate TargetType=\"{x:Type Button}\">\n        <Border>\n          <Grid>\n            <ContentPresenter />\n            <Grid\n              x:Name=\"StatusPanel\"\n              Background=\"White\"\n              Opacity=\"0\" />\n          </Grid>\n        </Border>\n        <ControlTemplate.Triggers>\n          <Trigger Property=\"IsMouseOver\" Value=\"true\">\n            <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.1\" />\n          </Trigger>\n          <Trigger Property=\"IsPressed\" Value=\"true\">\n            <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.3\" />\n          </Trigger>\n        </ControlTemplate.Triggers>\n      </ControlTemplate>\n    </Button.Template>\n\n  </Button>\n\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/ThreePieceButton.xaml.cs",
    "content": "﻿using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.MVVM.Views.Components\n{\n  /// <summary>\n  /// Interaction logic for ThreePieceButton.xaml\n  /// </summary>\n  public partial class ThreePieceButton : UserControl\n  {\n    public ThreePieceButton()\n    {\n      InitializeComponent();\n    }\n\n    #region Component\n\n    public string BackgroundValue\n    {\n      get { return (string)GetValue(BackgroundValueProperty); }\n      set { SetValue(BackgroundValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty BackgroundValueProperty =\n      DependencyProperty.Register(\"BackgroundValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string OpacityValue\n    {\n      get { return (string)GetValue(OpacityValueProperty); }\n      set { SetValue(OpacityValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty OpacityValueProperty =\n      DependencyProperty.Register(\"OpacityValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string WidthValue\n    {\n      get { return (string)GetValue(WidthValueProperty); }\n      set { SetValue(WidthValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty WidthValueProperty =\n      DependencyProperty.Register(\"WidthValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string HeightValue\n    {\n      get { return (string)GetValue(HeightValueProperty); }\n      set { SetValue(HeightValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty HeightValueProperty =\n      DependencyProperty.Register(\"HeightValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n    #endregion\n\n\n    #region ImageComponent\n\n    public string Image\n    {\n      get { return (string)GetValue(ImageProperty); }\n      set { SetValue(ImageProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageProperty =\n      DependencyProperty.Register(\"Image\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string ImageWidthValue\n    {\n      get { return (string)GetValue(ImageWidthValueProperty); }\n      set { SetValue(ImageWidthValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageWidthValueProperty =\n      DependencyProperty.Register(\"ImageWidthValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string ImageHeightValue\n    {\n      get { return (string)GetValue(ImageHeightValueProperty); }\n      set { SetValue(ImageHeightValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageHeightValueProperty =\n      DependencyProperty.Register(\"ImageHeightValue\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    #endregion\n\n\n    #region TitleComponent\n\n\n    public string Title\n    {\n      get { return (string)GetValue(TitleProperty); }\n      set { SetValue(TitleProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleProperty =\n      DependencyProperty.Register(\"Title\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string TitleFontSize\n    {\n      get { return (string)GetValue(TitleFontSizeProperty); }\n      set { SetValue(TitleFontSizeProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleFontSizeProperty =\n      DependencyProperty.Register(\"TitleFontSize\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string TitleForeground\n    {\n      get { return (string)GetValue(TitleForegroundProperty); }\n      set { SetValue(TitleForegroundProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleForegroundProperty =\n      DependencyProperty.Register(\"TitleForeground\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    #endregion\n\n\n    #region DescriptionComponent\n\n    public string Description\n    {\n      get { return (string)GetValue(DescriptionProperty); }\n      set { SetValue(DescriptionProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionProperty =\n      DependencyProperty.Register(\"Description\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string DescriptionFontSize\n    {\n      get { return (string)GetValue(DescriptionFontSizeProperty); }\n      set { SetValue(DescriptionFontSizeProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionFontSizeProperty =\n      DependencyProperty.Register(\"DescriptionFontSize\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n\n    public string DescriptionForeground\n    {\n      get { return (string)GetValue(DescriptionForegroundProperty); }\n      set { SetValue(DescriptionForegroundProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionForegroundProperty =\n      DependencyProperty.Register(\"DescriptionForeground\", typeof(string), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n    #endregion\n\n\n    #region Commands\n\n    public ICommand ButtonCommand\n    {\n      get { return (ICommand)GetValue(ButtonCommandProperty); }\n      set { SetValue(ButtonCommandProperty, value); }\n    }\n\n    public static readonly DependencyProperty ButtonCommandProperty =\n      DependencyProperty.Register(\"ButtonCommand\", typeof(ICommand), typeof(ThreePieceButton), new PropertyMetadata(null));\n\n    #endregion\n\n\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/ThreePieceComponent.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.MVVM.Views.Components.ThreePieceComponent\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Name=\"_ThreePieceComponent\"\n  mc:Ignorable=\"d\">\n\n  <Grid Width=\"{Binding WidthValue, ElementName=_ThreePieceComponent}\" Height=\"{Binding HeightValue, ElementName=_ThreePieceComponent}\">\n    <Grid.Background>\n      <SolidColorBrush Opacity=\"{Binding OpacityValue, ElementName=_ThreePieceComponent}\" Color=\"{Binding BackgroundValue, ElementName=_ThreePieceComponent}\" />\n    </Grid.Background>\n\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n    </Grid.RowDefinitions>\n\n    <Image\n      Grid.Row=\"0\"\n      Width=\"{Binding ImageWidthValue, ElementName=_ThreePieceComponent}\"\n      Height=\"{Binding ImageHeightValue, ElementName=_ThreePieceComponent}\"\n      Margin=\"0,0,0,25\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Source=\"{Binding Image, ElementName=_ThreePieceComponent}\" />\n\n    <TextBlock\n      Grid.Row=\"1\"\n      Margin=\"0,0,0,8\"\n      HorizontalAlignment=\"Center\"\n      FontSize=\"{Binding TitleFontSize, ElementName=_ThreePieceComponent}\"\n      Foreground=\"{Binding TitleForeground, ElementName=_ThreePieceComponent}\"\n      Text=\"{Binding Title, ElementName=_ThreePieceComponent}\"\n      TextAlignment=\"Center\"\n      TextWrapping=\"Wrap\" />\n\n    <TextBlock\n      Grid.Row=\"2\"\n      HorizontalAlignment=\"Center\"\n      FontSize=\"{Binding DescriptionFontSize, ElementName=_ThreePieceComponent}\"\n      Foreground=\"{Binding DescriptionForeground, ElementName=_ThreePieceComponent}\"\n      Text=\"{Binding Description, ElementName=_ThreePieceComponent}\"\n      TextAlignment=\"Center\"\n      TextWrapping=\"Wrap\" />\n\n  </Grid>\n\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Components/ThreePieceComponent.xaml.cs",
    "content": "﻿using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.MVVM.Views.Components\n{\n  /// <summary>\n  /// Interaction logic for ThreePieceComponent.xaml\n  /// </summary>\n  public partial class ThreePieceComponent : UserControl\n  {\n    public ThreePieceComponent()\n    {\n      InitializeComponent();\n    }\n\n    #region Component\n\n    public string BackgroundValue\n    {\n      get { return (string)GetValue(BackgroundValueProperty); }\n      set { SetValue(BackgroundValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty BackgroundValueProperty =\n      DependencyProperty.Register(\"BackgroundValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string OpacityValue\n    {\n      get { return (string)GetValue(OpacityValueProperty); }\n      set { SetValue(OpacityValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty OpacityValueProperty =\n      DependencyProperty.Register(\"OpacityValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string WidthValue\n    {\n      get { return (string)GetValue(WidthValueProperty); }\n      set { SetValue(WidthValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty WidthValueProperty =\n      DependencyProperty.Register(\"WidthValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string HeightValue\n    {\n      get { return (string)GetValue(HeightValueProperty); }\n      set { SetValue(HeightValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty HeightValueProperty =\n      DependencyProperty.Register(\"HeightValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n    #endregion\n\n\n    #region ImageComponent\n\n    public string Image\n    {\n      get { return (string)GetValue(ImageProperty); }\n      set { SetValue(ImageProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageProperty =\n      DependencyProperty.Register(\"Image\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string ImageWidthValue\n    {\n      get { return (string)GetValue(ImageWidthValueProperty); }\n      set { SetValue(ImageWidthValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageWidthValueProperty =\n      DependencyProperty.Register(\"ImageWidthValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string ImageHeightValue\n    {\n      get { return (string)GetValue(ImageHeightValueProperty); }\n      set { SetValue(ImageHeightValueProperty, value); }\n    }\n\n    public static readonly DependencyProperty ImageHeightValueProperty =\n      DependencyProperty.Register(\"ImageHeightValue\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    #endregion\n\n\n    #region TitleComponent\n\n\n    public string Title\n    {\n      get { return (string)GetValue(TitleProperty); }\n      set { SetValue(TitleProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleProperty =\n      DependencyProperty.Register(\"Title\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string TitleFontSize\n    {\n      get { return (string)GetValue(TitleFontSizeProperty); }\n      set { SetValue(TitleFontSizeProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleFontSizeProperty =\n      DependencyProperty.Register(\"TitleFontSize\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string TitleForeground\n    {\n      get { return (string)GetValue(TitleForegroundProperty); }\n      set { SetValue(TitleForegroundProperty, value); }\n    }\n\n    public static readonly DependencyProperty TitleForegroundProperty =\n      DependencyProperty.Register(\"TitleForeground\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    #endregion\n\n\n    #region DescriptionComponent\n\n    public string Description\n    {\n      get { return (string)GetValue(DescriptionProperty); }\n      set { SetValue(DescriptionProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionProperty =\n      DependencyProperty.Register(\"Description\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string DescriptionFontSize\n    {\n      get { return (string)GetValue(DescriptionFontSizeProperty); }\n      set { SetValue(DescriptionFontSizeProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionFontSizeProperty =\n      DependencyProperty.Register(\"DescriptionFontSize\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n\n    public string DescriptionForeground\n    {\n      get { return (string)GetValue(DescriptionForegroundProperty); }\n      set { SetValue(DescriptionForegroundProperty, value); }\n    }\n\n    public static readonly DependencyProperty DescriptionForegroundProperty =\n      DependencyProperty.Register(\"DescriptionForeground\", typeof(string), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n    #endregion\n\n\n    #region Commands\n\n    public ICommand ButtonCommand\n    {\n      get { return (ICommand)GetValue(ButtonCommandProperty); }\n      set { SetValue(ButtonCommandProperty, value); }\n    }\n\n    public static readonly DependencyProperty ButtonCommandProperty =\n      DependencyProperty.Register(\"ButtonCommand\", typeof(ICommand), typeof(ThreePieceComponent), new PropertyMetadata(null));\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/DialogWindow.cs",
    "content": "namespace ClangPowerTools.MVVM.Views\n{\n  public class DialogWindow : Microsoft.VisualStudio.PlatformUI.DialogWindow\n  {\n    public DialogWindow()\n      : this(string.Empty)\n    {\n    }\n\n    public DialogWindow(string helpTopic)\n      : base(helpTopic)\n    {\n      KeyUp += new System.Windows.Input.KeyEventHandler(DialogWindow_KeyUp);\n    }\n\n    private void DialogWindow_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)\n    {\n      if (e.Key == System.Windows.Input.Key.Escape)\n      {\n        DialogResult = false;\n        Close();\n      }\n    }\n\n    protected override void InvokeDialogHelp()\n    {\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/EncodingErrorView.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.MVVM.Views.EncodingErrorView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:components=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Clang Power Tools\"\n  Width=\"650\"\n  Height=\"450\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  mc:Ignorable=\"d\">\n  <Window.Resources>\n\n    <Style x:Key=\"NoChromeButton\" TargetType=\"{x:Type Button}\">\n      <Setter Property=\"Background\" Value=\"Transparent\" />\n      <Setter Property=\"BorderThickness\" Value=\"1\" />\n      <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}\" />\n      <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n      <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n      <Setter Property=\"Padding\" Value=\"1\" />\n      <Setter Property=\"ToolTip\" Value=\"Clear search\" />\n      <Setter Property=\"Template\">\n        <Setter.Value>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border BorderThickness=\"1\">\n              <Grid\n                x:Name=\"Chrome\"\n                Background=\"{TemplateBinding Background}\"\n                SnapsToDevicePixels=\"true\">\n                <ContentPresenter\n                  Margin=\"{TemplateBinding Padding}\"\n                  HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                  VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                  RecognizesAccessKey=\"True\"\n                  SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\n              </Grid>\n            </Border>\n            <ControlTemplate.Triggers>\n              <Trigger Property=\"IsEnabled\" Value=\"false\">\n                <Setter Property=\"Foreground\" Value=\"#ADADAD\" />\n                <Setter TargetName=\"Chrome\" Property=\"Opacity\" Value=\"0.5\" />\n              </Trigger>\n            </ControlTemplate.Triggers>\n          </ControlTemplate>\n        </Setter.Value>\n      </Setter>\n      <Style.Triggers>\n        <DataTrigger Binding=\"{Binding Text.Length, ElementName=SearchTextBox}\" Value=\"0\">\n          <DataTrigger.Setters>\n            <Setter Property=\"ToolTip\" Value=\"Search\" />\n          </DataTrigger.Setters>\n        </DataTrigger>\n      </Style.Triggers>\n    </Style>\n  </Window.Resources>\n  <StackPanel>\n    <components:MessageBanner\n      Banner=\"/ClangPowerTools;component/Resources/BannersError.png\"\n      Icon=\"/ClangPowerTools;component/Resources/ErrorIcon.png\"\n      Type=\"Error\" />\n\n    <StackPanel Margin=\"17\" Orientation=\"Vertical\">\n      <TextBlock\n        Margin=\"0,0,0,15\"\n        FontSize=\"13\"\n        Text=\"Unsupported encoding, byte order mark detected. To fix this issue, you need to convert the files below to UTF-8. Convert selected files?\"\n        TextWrapping=\"WrapWithOverflow\" />\n      <Border\n        Height=\"auto\"\n        BorderBrush=\"Black\"\n        BorderThickness=\"0.5\">\n        <StackPanel>\n          <Grid>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition Width=\"3*\" />\n              <ColumnDefinition Width=\"2*\" />\n            </Grid.ColumnDefinitions>\n\n            <CheckBox\n              Grid.Column=\"0\"\n              Margin=\"2,0\"\n              VerticalAlignment=\"Center\"\n              IsChecked=\"{Binding CheckAllItems}\"\n              ToolTip=\"{Binding SelectAllTooltipText}\" />\n            <TextBox\n              x:Name=\"SearchTextBox\"\n              Grid.Column=\"1\"\n              Margin=\"2\"\n              Padding=\"0,0,30,0\"\n              HorizontalAlignment=\"Stretch\"\n              VerticalAlignment=\"Stretch\"\n              VerticalContentAlignment=\"Center\"\n              Panel.ZIndex=\"0\"\n              BorderBrush=\"LightGray\"\n              BorderThickness=\"1\"\n              Text=\"{Binding SearchText, UpdateSourceTrigger=PropertyChanged}\">\n              <TextBox.Style>\n                <Style xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" TargetType=\"TextBox\">\n                  <Style.Resources>\n\n                    <VisualBrush\n                      x:Key=\"GrayHelperTextBrush\"\n                      AlignmentX=\"Left\"\n                      AlignmentY=\"Center\"\n                      Stretch=\"None\">\n                      <VisualBrush.Visual>\n                        <Label\n                          Name=\"SearchLabel\"\n                          Content=\"Quick Search\"\n                          Foreground=\"Gray\" />\n                      </VisualBrush.Visual>\n                    </VisualBrush>\n\n                    <VisualBrush\n                      x:Key=\"BlackHelperTextBrush\"\n                      AlignmentX=\"Left\"\n                      AlignmentY=\"Center\"\n                      Stretch=\"None\">\n                      <VisualBrush.Visual>\n                        <Label\n                          Name=\"SearchBlackLabel\"\n                          Content=\"Quick Search\"\n                          Foreground=\"Black\" />\n                      </VisualBrush.Visual>\n                    </VisualBrush>\n\n                  </Style.Resources>\n                  <Style.Triggers>\n\n                    <Trigger Property=\"IsKeyboardFocused\" Value=\"True\">\n                      <Setter Property=\"Background\" Value=\"White\" />\n                    </Trigger>\n\n                    <MultiTrigger>\n                      <MultiTrigger.Conditions>\n                        <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                        <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                        <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                        <Condition Property=\"IsFocused\" Value=\"False\" />\n                      </MultiTrigger.Conditions>\n                      <MultiTrigger.Setters>\n                        <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n                      </MultiTrigger.Setters>\n                    </MultiTrigger>\n\n                    <MultiTrigger>\n                      <MultiTrigger.Conditions>\n                        <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                        <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                        <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                        <Condition Property=\"IsFocused\" Value=\"False\" />\n                      </MultiTrigger.Conditions>\n                      <MultiTrigger.Setters>\n                        <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n                      </MultiTrigger.Setters>\n                    </MultiTrigger>\n\n                    <MultiTrigger>\n                      <MultiTrigger.Conditions>\n                        <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                        <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                        <Condition Property=\"IsFocused\" Value=\"False\" />\n                      </MultiTrigger.Conditions>\n                      <MultiTrigger.Setters>\n                        <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n                      </MultiTrigger.Setters>\n                    </MultiTrigger>\n\n                    <MultiTrigger>\n                      <MultiTrigger.Conditions>\n                        <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                        <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                        <Condition Property=\"IsFocused\" Value=\"False\" />\n                      </MultiTrigger.Conditions>\n                      <MultiTrigger.Setters>\n                        <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n                      </MultiTrigger.Setters>\n                    </MultiTrigger>\n\n                  </Style.Triggers>\n                </Style>\n              </TextBox.Style>\n            </TextBox>\n\n            <Button\n              Grid.Column=\"1\"\n              Width=\"17\"\n              Height=\"17\"\n              Margin=\"3\"\n              HorizontalAlignment=\"Right\"\n              VerticalAlignment=\"Center\"\n              Panel.ZIndex=\"1\"\n              BorderThickness=\"1\"\n              Command=\"{Binding SearchCommand}\"\n              Style=\"{DynamicResource NoChromeButton}\">\n\n              <Button.Template>\n                <ControlTemplate TargetType=\"{x:Type Button}\">\n                  <Border>\n                    <Grid>\n                      <ContentPresenter />\n                      <Grid\n                        x:Name=\"StatusPanel\"\n                        Background=\"Black\"\n                        Opacity=\"0\" />\n                    </Grid>\n                  </Border>\n                  <ControlTemplate.Triggers>\n                    <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                      <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.1\" />\n                    </Trigger>\n                    <Trigger Property=\"IsPressed\" Value=\"true\">\n                      <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.3\" />\n                    </Trigger>\n                  </ControlTemplate.Triggers>\n                </ControlTemplate>\n              </Button.Template>\n\n              <Button.Content>\n                <Rectangle Width=\"16\" Height=\"16\">\n                  <Rectangle.Style>\n                    <Style TargetType=\"{x:Type Rectangle}\">\n                      <Setter Property=\"Fill\">\n                        <Setter.Value>\n                          <ImageBrush ImageSource=\"pack://application:,,,/ClangPowerTools;component/Resources/CleanSearchIcon.png\" />\n                        </Setter.Value>\n                      </Setter>\n                      <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding Text.Length, ElementName=SearchTextBox}\" Value=\"0\">\n                          <DataTrigger.Setters>\n                            <Setter Property=\"Fill\">\n                              <Setter.Value>\n                                <ImageBrush ImageSource=\"pack://application:,,,/ClangPowerTools;component/Resources/SearchIcon.png\" />\n                              </Setter.Value>\n                            </Setter>\n                          </DataTrigger.Setters>\n                        </DataTrigger>\n                      </Style.Triggers>\n                    </Style>\n                  </Rectangle.Style>\n                </Rectangle>\n              </Button.Content>\n            </Button>\n          </Grid>\n          <ListBox\n            Height=\"150\"\n            BorderBrush=\"Black\"\n            BorderThickness=\"0.5\"\n            ItemsSource=\"{Binding FilteredFilesNotEncodedInUTF8, Mode=OneWay}\"\n            ScrollViewer.VerticalScrollBarVisibility=\"Auto\">\n            <ListBox.Resources>\n              <Style TargetType=\"{x:Type ListBoxItem}\">\n                <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\n                <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n                <Setter Property=\"Template\">\n                  <Setter.Value>\n                    <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\n                      <CheckBox\n                        Margin=\"0,3\"\n                        Content=\"{Binding FileName}\"\n                        FontSize=\"13\"\n                        IsChecked=\"{Binding IsChecked}\"\n                        IsThreeState=\"False\" />\n                    </ControlTemplate>\n                  </Setter.Value>\n                </Setter>\n              </Style>\n            </ListBox.Resources>\n          </ListBox>\n        </StackPanel>\n      </Border>\n\n\n      <StackPanel\n        Margin=\"0,15,0,0\"\n        HorizontalAlignment=\"Right\"\n        VerticalAlignment=\"Bottom\"\n        Orientation=\"Horizontal\">\n        <Button\n          x:Name=\"ConvertButton\"\n          Width=\"98\"\n          Height=\"26\"\n          Margin=\"0,0,10,0\"\n          BorderThickness=\"1\"\n          Command=\"{Binding ConvertCommand}\"\n          CommandParameter=\"{Binding ElementName=window}\"\n          Content=\"Convert\"\n          FontSize=\"12\"\n          IsDefault=\"True\"\n          IsEnabled=\"{Binding IsConvertButtonEnabled}\" />\n        <Button\n          Width=\"98\"\n          Height=\"26\"\n          BorderThickness=\"1\"\n          Command=\"{Binding CloseCommand}\"\n          Content=\"Close\"\n          FontSize=\"12\" />\n      </StackPanel>\n    </StackPanel>\n  </StackPanel>\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/EncodingErrorView.xaml.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for EncodingErrorView.xaml\n  /// </summary>\n  public partial class EncodingErrorView : Window\n  {\n    public EncodingErrorView(List<string> selectedFiles)\n    {\n      InitializeComponent();\n\n      var encodingConverter = new EncodingErrorViewModel(selectedFiles);\n      encodingConverter.LoadData();\n      encodingConverter.CloseAction = () => Close();\n      DataContext = encodingConverter;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FeedbackView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.FeedbackView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"460\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n      <BooleanToVisibilityConverter x:Key=\"BoolToVis\" />\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"150\" />\n      <RowDefinition Height=\"80\" />\n      <RowDefinition Height=\"30\" />\n      <RowDefinition Height=\"40\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"140\" />\n      <ColumnDefinition Width=\"240\" />\n      <ColumnDefinition Width=\"60\" />\n      <ColumnDefinition Width=\"140\" />\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n\n    <!--  Website feedback  -->\n    <Rectangle\n      Grid.Row=\"1\"\n      Grid.Column=\"1\"\n      Width=\"66\"\n      Height=\"66\"\n      HorizontalAlignment=\"Center\">\n      <Rectangle.Fill>\n        <ImageBrush ImageSource=\"{StaticResource AccountAvatarIcon}\" />\n      </Rectangle.Fill>\n    </Rectangle>\n\n    <TextBlock\n      Grid.Row=\"2\"\n      Grid.Column=\"1\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"15\"\n      FontWeight=\"SemiBold\"\n      Text=\"Share your ideas and issues at:\" />\n\n    <TextBlock \n        Grid.Column=\"1\"\n        Grid.Row=\"3\"\n        Margin=\"0,12,0,0\"\n        VerticalAlignment=\"Center\"\n        HorizontalAlignment=\"Center\">\n          <Hyperlink Foreground=\"#b81268\"\n                     FontSize=\"15\"\n                     RequestNavigate=\"Hyperlink_SupportGmail\"\n                     NavigateUri=\"https://clangpowertools.com/contact.html\">\n              <TextBlock Text=\"support@clangpowertools.com\" TextDecorations=\"Underline\" FontWeight=\"SemiBold\" />\n          </Hyperlink>\n      </TextBlock>\n\n\n    <!--  GitHub feedback  -->\n    <Rectangle\n      Grid.Row=\"1\"\n      Grid.Column=\"3\"\n      Width=\"64\"\n      Height=\"64\"\n      HorizontalAlignment=\"Center\">\n      <Rectangle.Fill>\n        <ImageBrush ImageSource=\"{StaticResource GitHubIcon}\" />\n      </Rectangle.Fill>\n    </Rectangle>\n\n    <TextBlock\n      Grid.Row=\"2\"\n      Grid.Column=\"3\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"15\"\n      FontWeight=\"SemiBold\"\n      Text=\"GitHub\" />\n\n    <Button\n      Grid.Row=\"3\"\n      Grid.Column=\"3\"\n      Width=\"140\"\n      Height=\"30\"\n      HorizontalAlignment=\"Center\"\n      Command=\"{Binding GithubCommand}\"\n      Content=\"Send Feedback\"\n      FontSize=\"14\"\n      Foreground=\"White\"\n      Style=\"{StaticResource SettingsButton}\" />\n\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FeedbackView.xaml.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for FeedbackView.xaml\n  /// </summary>\n  public partial class FeedbackView : UserControl\n  {\n    public FeedbackView()\n    {\n      InitializeComponent();\n      DataContext = new FeedbackViewModel();\n    }\n\n    private void Hyperlink_SupportGmail(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)\n    {\n      Process.Start(new ProcessStartInfo(\"mailto:support@clangpowertools.com\"));\n      e.Handled = true;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FindToolWindowView.xaml",
    "content": "﻿<UserControl x:Class=\"ClangPowerTools.Views.FindToolWindowView\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:local=\"clr-namespace:ClangPowerTools\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:views=\"clr-namespace:ClangPowerTools.MVVM.Views\"\n             xmlns:behaviors=\"clr-namespace:ClangPowerToolsShared.MVVM.AutoCompleteHistory\"\n             xmlns:vsfx=\"clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.15.0\"\n             d:DesignHeight=\"700\"\n             d:DesignWidth=\"350\"\n             mc:Ignorable=\"d\">\n  \n  <UserControl.Resources>\n    <Style x:Key=\"myHeaderStyle\"\n           TargetType=\"{x:Type GridViewColumnHeader}\">\n      <Setter Property=\"Visibility\"\n              Value=\"Collapsed\" />\n    </Style>\n    <Style TargetType=\"{x:Type Button}\">\n      <Setter Property=\"Background\"\n              Value=\"Transparent\" />\n      <Setter Property=\"Template\">\n        <Setter.Value>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border Background=\"{TemplateBinding Background}\"\n                    BorderThickness=\"1\">\n              <ContentPresenter HorizontalAlignment=\"Center\"\n                                VerticalAlignment=\"Center\" />\n            </Border>\n          </ControlTemplate>\n        </Setter.Value>\n      </Setter>\n      <Style.Triggers>\n        <Trigger Property=\"IsMouseOver\"\n                 Value=\"True\">\n          <Setter Property=\"Background\"\n                  Value=\"{DynamicResource {x:Static vsfx:VsBrushes.ToolWindowTabMouseOverBackgroundBeginKey}}\" />\n          <Setter Property=\"BorderBrush\"\n                  Value=\"{DynamicResource {x:Static vsfx:VsBrushes.ToolWindowTabMouseOverBorderKey}}\" />\n        </Trigger>\n      </Style.Triggers>\n    </Style>\n  </UserControl.Resources>\n\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"10\" />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"30\" />\n      <RowDefinition Height=\"50\" />\n      <RowDefinition Height=\"110\" />\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"10\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"10\" />\n    </Grid.RowDefinitions>\n\n    <Grid Grid.Column=\"1\" Grid.Row=\"1\" >\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"140\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"25\" />\n      </Grid.RowDefinitions>\n      <TextBlock \n        Grid.Column=\"1\"\n        Grid.Row=\"0\"\n        VerticalAlignment=\"Center\"\n        HorizontalAlignment=\"Right\"\n        Visibility=\"{Binding FindToolWindowModel.MenuVisibility}\">\n          <Hyperlink Foreground=\"#4096ff\"\n                     FontSize=\"13\"\n                     RequestNavigate=\"Hyperlink_Feedback\"\n                     NavigateUri=\"https://clangpowertools.com/contact.html\">\n              <TextBlock Text=\"Propose a matcher\" />\n          </Hyperlink>\n      </TextBlock>\n\n      <ComboBox\n        x:Name=\"menu\"\n        Grid.Column=\"0\"\n        Grid.Row=\"0\"\n        Visibility=\"{Binding FindToolWindowModel.MenuVisibility}\"\n        DisplayMemberPath=\"Name\"\n        HorizontalAlignment=\"Left\"\n        HorizontalContentAlignment=\"Left\"\n        VerticalContentAlignment=\"Center\"\n        Loaded=\"ComboBox_Loaded\"\n        SelectionChanged=\"ComboBox_SelectionChanged\"\n        Height=\"20\"\n        Width=\"140\" />\n    </Grid>\n    \n    <ListView x:Name=\"FilesList\"\n                Grid.Row=\"2\"\n                Grid.Column=\"1\"\n                Background=\"Transparent\"\n                SelectionMode=\"Single\"\n                BorderBrush=\"{DynamicResource {x:Static vsfx:VsBrushes.AccentDarkKey}}\"\n                ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\n                Visibility=\"Visible\"\n                PreviewMouseLeftButtonUp=\"Matcher_Click\"\n                ItemsSource=\"{Binding ViewMatchers}\">\n        <ListView.ItemTemplate>\n          <DataTemplate>\n            <Grid>\n              <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"5\" />\n                <ColumnDefinition Width=\"*\" />\n                <ColumnDefinition Width=\"auto\" />\n              </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"30\" />\n            </Grid.RowDefinitions>\n            <TextBlock Grid.Column=\"1\"\n                         HorizontalAlignment=\"Left\"\n                         VerticalAlignment=\"Center\"\n                         Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\"\n                         Text=\"{Binding Name}\" />\n            </Grid>\n          </DataTemplate>\n        </ListView.ItemTemplate>\n      </ListView>\n\n\n    <Grid Grid.Row=\"3\" Grid.Column=\"1\" Visibility=\"{Binding FindToolWindowModel.CustomMatchesModel.Visibility}\" >\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"110\" />\n        <ColumnDefinition Width=\"5\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"100\" />\n        <RowDefinition Height=\"*\" />\n      </Grid.RowDefinitions>\n      <Label \n        Grid.Row=\"0\"\n        Grid.Column=\"0\"\n        Visibility=\"{Binding FindToolWindowModel.CustomMatchesModel.Visibility}\"\n        Content=\"Custom Matchers:\"\n        Height=\"28\"\n        HorizontalAlignment=\"Left\"\n        Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\" />\n      <TextBox Grid.Row=\"0\"\n               Grid.Column=\"2\"\n               Name=\"Matches\"\n               Visibility=\"{Binding FindToolWindowModel.CustomMatchesModel.Visibility}\" \n               Height=\"50\"\n               Background=\"WhiteSmoke\"\n               KeyDown=\"OnKeyDownHandler\"\n               TextWrapping=\"Wrap\"\n               Text=\"{Binding  UpdateSourceTrigger=PropertyChanged, Path=FindToolWindowModel.CustomMatchesModel.Matchers}\"\n               behaviors:AutoCompleteBehavior.AutoCompleteItemsSource=\"{Binding ASTMatchersSearchOptions}\"\n               behaviors:AutoCompleteBehavior.AutoCompleteStringComparison=\"CurrentCulture\"\n               Opacity=\"0.8\">\n      </TextBox>\n\n      <ListView x:Name=\"AstMatchers\"\n                Grid.Row=\"1\"\n                Grid.Column=\"2\"\n                Background=\"Transparent\"\n                HorizontalContentAlignment=\"Stretch\"\n                SelectionMode=\"Single\"\n                BorderBrush=\"{DynamicResource {x:Static vsfx:VsBrushes.AccentDarkKey}}\"\n                ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\n                Visibility=\"Visible\"\n                Focusable=\"True\"\n                SelectionChanged=\"OnListViewSelectionChanged\"\n                ItemsSource=\"{Binding ASTMatchersList}\">\n        <ListView.ItemTemplate>\n          <DataTemplate>\n            <Grid>\n              <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"5\" />\n                <ColumnDefinition Width=\"*\" />\n                <ColumnDefinition Width=\"auto\" />\n              </Grid.ColumnDefinitions>\n              <Grid.RowDefinitions>\n                <RowDefinition Height=\"25\" />\n              </Grid.RowDefinitions>\n              <TextBlock Grid.Column=\"1\"\n                         HorizontalAlignment=\"Left\"\n                         VerticalAlignment=\"Center\"\n                         Text=\"{Binding Value}\"\n                         Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.ButtonTextKey}}\"/>\n              \n              <Button\n                    Grid.Column=\"2\"\n                    Grid.Row=\"0\"\n                    Width=\"30\"\n                    Height=\"30\"\n                    HorizontalAlignment=\"Right\"\n                    Click=\"Pin_click\"\n                    ToolTip=\"{Binding Tooltip}\"\n                    Visibility=\"{Binding Visibility}\">\n                <Image\n                     Source=\"{Binding PinIconPath}\"\n                     VerticalAlignment=\"Center\"\n                     Width=\"16\"\n                     Height=\"16\" />\n              </Button>\n            </Grid>\n          </DataTemplate>\n        </ListView.ItemTemplate>\n      </ListView>\n    </Grid>\n\n    <Grid Grid.Row=\"3\" Grid.Column=\"1\" Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\" >\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"110\" />\n        <ColumnDefinition Width=\"5\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"50\" />\n        <RowDefinition Height=\"50\" />\n      </Grid.RowDefinitions>\n      <Label \n        Grid.Row=\"0\"\n        Grid.Column=\"0\"\n        Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\"\n        Content=\"Called function:\"\n        Height=\"28\"\n        HorizontalAlignment=\"Left\"\n        Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\" />\n      <TextBox Grid.Row=\"0\"\n               Grid.Column=\"2\"\n               Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\" \n               Height=\"18\"\n               Text=\"{Binding FindToolWindowModel.DefaultArgsModel.FunctionName}\"\n               Name=\"BaseTextBox\"\n               Opacity=\"0.8\"/>\n      <Label Grid.Row=\"1\"\n             Grid.Column=\"0\"\n             Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\"\n             Content=\"Explicit arguments:\"\n             Height=\"28\"\n             HorizontalAlignment=\"Left\"\n             Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\" />\n\n      <TextBox Grid.Row=\"1\"\n               Grid.Column=\"2\"\n               Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\"\n               Height=\"18\"\n               Width=\"60\"\n               HorizontalAlignment=\"Left\"\n               Text=\"{Binding FindToolWindowModel.DefaultArgsModel.DefaultArgsPosition}\"\n               Opacity=\"0.8\"/>\n      <Label Grid.Row=\"1\"\n             Grid.Column=\"2\"\n             Visibility=\"{Binding FindToolWindowModel.DefaultArgsModel.Visibility}\"\n             Content=\"or less\"\n             Height=\"28\"\n             Margin=\"60,10,10,10\"\n             HorizontalAlignment=\"Left\"\n             Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\" />\n    </Grid>\n\n    <Border\n      Grid.Row=\"5\"\n      Grid.Column=\"1\"\n      BorderBrush=\"{DynamicResource {x:Static vsfx:VsBrushes.AccentDarkKey}}\"\n      BorderThickness=\"1\">\n        <Button\n        x:Name=\"MatchDefaultArgs\"\n        Click=\"MatchDefaultArgs_click\"\n        Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.ButtonTextKey}}\"\n        IsHitTestVisible=\"True\"\n        Height=\"35\"\n        Width=\"1000\"\n        Content=\"Find\"\n        IsEnabled=\"{Binding FindToolWindowModel.IsEnabled}\"\n        VerticalAlignment=\"Bottom\"\n        HorizontalAlignment=\"Center\"/>\n    </Border>\n\n    <ProgressBar Name=\"pbStatus\"\n                 Grid.Row=\"1\"\n                 Grid.Column=\"1\"\n                 Height=\"13\"\n                 Background=\"Transparent\"\n                 BorderBrush=\"#6d8ca3\"\n                 Foreground=\"#296cba\"\n                 IsIndeterminate=\"True\"\n                 Maximum=\"100\"\n                 Minimum=\"0\"\n                 VerticalAlignment=\"Top\"\n                 Visibility=\"{Binding FindToolWindowModel.ProgressBarVisibility}\" />\n  </Grid>\n</UserControl>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FindToolWindowView.xaml.cs",
    "content": "﻿using ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM;\nusing ClangPowerToolsShared.MVVM.AutoCompleteHistory;\nusing ClangPowerToolsShared.MVVM.Interfaces;\nusing ClangPowerToolsShared.MVVM.Models.ToolWindowModels;\nusing ClangPowerToolsShared.MVVM.ViewModels;\nusing System.Diagnostics;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\nusing Process = System.Diagnostics.Process;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for CompilerSettingsView.xaml\n  /// </summary>\n  public partial class FindToolWindowView : UserControl\n  {\n    private FindToolWindowViewModel findToolWindowViewModel;\n\n    public FindToolWindowView()\n    {\n      var findToolWindowHandler = new FindToolWindowHandler();\n      findToolWindowHandler.LoadFindToolWindowData();\n      findToolWindowViewModel = new FindToolWindowViewModel(this);\n      DataContext = findToolWindowViewModel;\n      InitializeComponent();\n    }\n\n    public void OpenFindToolWindow() { }\n\n    public void RunQuery()\n    {\n      findToolWindowViewModel.RunQuery();\n    }\n\n    private void MatchDefaultArgs_click(object sender, RoutedEventArgs e)\n    {\n      findToolWindowViewModel.RunCommandFromView();\n    }\n\n    private void Hyperlink_Feedback(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)\n    {\n      Process.Start(new ProcessStartInfo(\"https://clangpowertools.com/contact.html\"));\n      e.Handled = true;\n    }\n\n    private void ComboBox_Loaded(object sender, RoutedEventArgs e)\n    {\n      var combo = sender as ComboBox;\n      combo.ItemsSource = LookInMenuController.MenuOptions;\n      combo.SelectedIndex = 0;\n    }\n\n    private void OnKeyDownHandler(object sender, KeyEventArgs e)\n    {\n      if (e.Key == Key.Enter)\n      {\n        if (!string.IsNullOrEmpty(Matches.Text))\n          findToolWindowViewModel.RunCommandFromView();\n      }\n    }\n\n    private void Pin_click(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = sender as FrameworkElement;\n      var element = elementIndex.DataContext as AutoCompleteHistoryModel;\n      if (element != null)\n      {\n        if (element.Pin())\n          findToolWindowViewModel.AddPinOnRightPlace(element);\n      }\n    }\n\n    private void OnListViewSelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n      ListView listView = e.Source as ListView;\n      if (listView.ItemContainerGenerator?.ContainerFromItem(listView.SelectedItem)\n              is FrameworkElement container)\n      {\n\n        Matches.TextChanged -= AutoCompleteBehavior.onTextChanged;\n        var item = container?.DataContext as AutoCompleteHistoryModel;\n        Matches.Text = AutoCompleteBehavior.MatchText + item?.Value;\n        if (AutoCompleteBehavior.MatchText is null)\n          AutoCompleteBehavior.MatchText = string.Empty;\n        Matches.CaretIndex = AutoCompleteBehavior.MatchText.Length;\n        Matches.SelectionStart = AutoCompleteBehavior.MatchText.Length;\n        Matches.SelectionLength = item.Value.Length;\n        Matches.TextChanged += AutoCompleteBehavior.onTextChanged;\n      }\n    }\n\n    private void ComboBox_SelectionChanged(object sender, RoutedEventArgs e)\n    {\n      if (menu.SelectedItem != null)\n      {\n        var item = menu.SelectedItem as ClangPowerToolsShared.Commands.MenuItem;\n        LookInMenuController.SetSelectedOption(item);\n        PowerShellWrapper.EndInteractiveMode();\n      }\n    }\n\n    private void Matcher_Click(object sender, RoutedEventArgs e)\n    {\n      var item = (sender as ListView).SelectedItem as IViewMatcher;\n      if (item != null)\n      {\n        findToolWindowViewModel.SelectCommandToRun(item);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FolderExplorerView.xaml",
    "content": "﻿<Window\n    x:Class=\"ClangPowerTools.MVVM.Views.FolderExplorerView\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n    xmlns:local=\"clr-namespace:ClangPowerTools\"\n    Title=\"Browse For Folder\"\n    Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n    mc:Ignorable=\"d\" Height=\"200\" Width=\"600\"\n    WindowStartupLocation=\"CenterScreen\"\n    ResizeMode=\"NoResize\" \n    >\n\n    <!--  Static resources  -->\n    <Window.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Window.Resources>\n\n    <Grid>\n        <Grid.Background>\n            <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n        </Grid.Background>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"55\" />\n            <RowDefinition Height=\"36\" />\n            <RowDefinition Height=\"74\"/>\n            <RowDefinition Height=\"*\"/>\n        </Grid.RowDefinitions>\n\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"5\" />\n            <ColumnDefinition Width=\"85\"/>\n            <ColumnDefinition Width=\"400\"/>\n            <ColumnDefinition Width=\"95\" />\n            <ColumnDefinition Width=\"10\"/>\n        </Grid.ColumnDefinitions>\n        \n        <Button \n            Grid.Column=\"3\"\n            Grid.Row=\"1\"\n            HorizontalAlignment=\"Center\" \n            VerticalAlignment=\"Center\" \n            Width=\"80\" \n            Height=\"30\"\n            Command=\"{Binding FindFolderPathCommand}\"                \n            Style=\"{StaticResource SettingsButton}\">\n            <Button.Content>\n                <Image Source=\"{StaticResource BrowseImage}\" />\n            </Button.Content>\n        </Button>\n        <Label \n            Grid.Row=\"1\" \n            Grid.Column=\"1\"\n            Content=\"LLVM Path\"\n            FontSize=\"16\"\n            HorizontalAlignment=\"Left\" \n            VerticalAlignment=\"Center\"/>\n        <TextBox \n            Grid.Row=\"1\"\n            Grid.Column=\"2\" \n            VerticalContentAlignment=\"Center\"\n            FontFamily=\"SegoeUI\"\n            FontSize=\"15\"\n            Text=\"{Binding PathFolder}\"/>\n        <Button \n            Grid.Column=\"2\"\n            Grid.Row=\"2\"\n            Content=\"Ok\" \n            HorizontalAlignment=\"Center\" \n            VerticalAlignment=\"Center\" \n            Width=\"80\" \n            Command=\"{Binding SetLLVMCommand}\" \n            Height=\"30\"\n            Style=\"{StaticResource SettingsButton}\"\n            FontSize=\"14\"\n            Foreground=\"White\" />\n        <Label\n            Grid.Column=\"2\"\n            FontSize=\"18\"\n            Content=\"Browse for LLVM \" \n            HorizontalAlignment=\"Center\" \n            VerticalAlignment=\"Center\" \n            Height=\"30\" \n            Width=\"150\"/>\n    </Grid>\n</Window>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FolderExplorerView.xaml.cs",
    "content": "﻿using ClangPowerToolsShared.MVVM.ViewModels;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for InputList.xaml\n  /// </summary>\n  public partial class FolderExplorerView : Window\n  {\n    #region Constructor\n\n    public FolderExplorerView(List<LlvmModel> llvms, ObservableCollection<string> installedLlvms)\n    {\n      InitializeComponent();\n      DataContext = new FolderExplorerViewModel(this, llvms, installedLlvms);\n      Owner = SettingsProvider.SettingsView;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FormatEditorWarning.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.MVVM.Views.FormatEditorWarning\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:components=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Warning\"\n  Width=\"650\"\n  Height=\"450\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  WindowStyle=\"ThreeDBorderWindow\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <Window.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </Window.Resources>\n\n  <Grid>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"50\" />\n    </Grid.RowDefinitions>\n\n    <components:MessageBanner\n      Grid.Row=\"0\"\n      Banner=\"/ClangPowerTools;component/Resources/BannerWarning.png\"\n      Icon=\"/ClangPowerTools;component/Resources/WarningIcon.png\"\n      Type=\"Format Editor Warning\" />\n\n    <StackPanel Grid.Row=\"1\" Margin=\"20\">\n      <TextBlock\n        Margin=\"0,5\"\n        FontSize=\"14\"\n        Text=\".NET 5.0 Desktop Runtime not detected!\"\n        TextWrapping=\"Wrap\" />\n\n      <TextBlock\n        Margin=\"0,5\"\n        FontSize=\"14\"\n        Text=\"To use the Clang Format Editor you need to install .NET 5.0 Desktop Runtime (v5.0.0 or newer).\"\n        TextWrapping=\"Wrap\" />\n\n      <TextBlock\n        Margin=\"0,30\"\n        FontSize=\"14\"\n        Text=\"Download .NET 5.0 Desktop Runtime?\"\n        TextWrapping=\"Wrap\" />\n\n    </StackPanel>\n\n    <Button\n      Grid.Row=\"2\"\n      Width=\"100\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Click=\"DownloadButton\"\n      Content=\"Download\"\n      FontSize=\"14\"\n      Foreground=\"White\"\n      Style=\"{StaticResource SettingsButton}\" />\n\n  </Grid>\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FormatEditorWarning.xaml.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for FormatEditorView.xaml\n  /// </summary>\n  public partial class FormatEditorWarning : Window\n  {\n    public FormatEditorWarning()\n    {\n      InitializeComponent();\n    }\n\n    private void DownloadButton(object sender, RoutedEventArgs e)\n    {\n      FormatEditorUtility.OpenBrowser();\n      Close();\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FormatSettingsView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.FormatSettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"420\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"20\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"auto\" />\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n\n    <!--  File Extensions  -->\n    <WrapPanel Grid.Row=\"1\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FileExtensions}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"File extensions\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding FormatModel.FileExtensions}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding FileExtensionsAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n\n    <!--  Files to ignore  -->\n    <WrapPanel Grid.Row=\"2\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FilesToIgnoreFormat}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Files to ignore\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding FormatModel.FilesToIgnore}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding FilesToIgnoreAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Assume filename  -->\n    <WrapPanel Grid.Row=\"3\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.AssumeFilename}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Assume filename\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding FormatModel.AssumeFilename}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding AssumeFilenameAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Custom executable file  -->\n    <WrapPanel Grid.Row=\"4\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CustomExecutableFormat}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Custom executable\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding FormatModel.CustomExecutable}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding CustomExecutableBrowseCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource BrowseImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Style  -->\n    <WrapPanel Grid.Row=\"5\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.Style}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Style\" />\n\n      <ComboBox\n        x:Name=\"StyleComboBox\"\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        ItemsSource=\"{Binding StyleItems}\"\n        SelectedItem=\"{Binding FormatModel.Style}\"\n        SelectionChanged=\"ComboBox_SelectionChanged\" />\n    </WrapPanel>\n\n\n    <!--  Fallback style  -->\n    <WrapPanel Grid.Row=\"6\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FallbackStyle}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Fallback style\" />\n\n      <ComboBox\n        x:Name=\"FallbackStyleComboBox\"\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        ItemsSource=\"{Binding FallBackStyleItems}\"\n        SelectedItem=\"{Binding FormatModel.FallbackStyle}\"\n        Style=\"{StaticResource SettingsComboBox}\" />\n    </WrapPanel>\n\n    <!--  Format on Save  -->\n    <WrapPanel Grid.Row=\"7\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FormatOnSave}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Format on save\" />\n\n      <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding FormatModel.FormatOnSave}\"\n        Tag=\"On\" />\n    </WrapPanel>\n\n    <!--  Open Clang Format Editor  -->\n    <WrapPanel Grid.Row=\"8\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FormatEditor}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Clang-Format Editor\" />\n\n      <Button\n        Width=\"80\"\n        Height=\"30\"\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding OpenClangFormatEditorCommand}\"\n        Content=\"Open\"\n        FontSize=\"14\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\" />\n    </WrapPanel>\n\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/FormatSettingsView.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for FormatSettingsView.xaml\n  /// </summary>\n  public partial class FormatSettingsView : UserControl, IView\n  {\n    public FormatSettingsView()\n    {\n      InitializeComponent();\n      DataContext = new FormatSettingsViewModel();\n      SettingsHandler.RefreshSettingsView += ResetView;\n    }\n\n    public void ResetView()\n    {\n      DataContext = new FormatSettingsViewModel();\n    }\n\n    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n      FallbackStyleComboBox.IsEnabled = StyleComboBox.SelectedItem.ToString() == ComboBoxConstants.kFile;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/InputDataView.xaml",
    "content": "<Window\n  x:Class=\"ClangPowerTools.Views.InputDataView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:components=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Clang Flags\"\n  Width=\"525\"\n  Height=\"400\"\n  Background=\"WhiteSmoke\"\n  Icon=\"/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ShowInTaskbar=\"False\"\n  WindowStartupLocation=\"CenterScreen\"\n  WindowStyle=\"ToolWindow\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <Window.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n        <ResourceDictionary>\n          <Style TargetType=\"{x:Type ListView}\">\n            <Setter Property=\"FontFamily\" Value=\"Segoe UI\" />\n            <Setter Property=\"FontWeight\" Value=\"SemiBold\" />\n            <Setter Property=\"FontSize\" Value=\"13\" />\n          </Style>\n\n          <BitmapImage x:Key=\"AddInputImage\" UriSource=\"/ClangPowerTools;component/Resources/AddInput.png\" />\n          <ImageBrush x:Key=\"RemoveImage\" ImageSource=\"/ClangPowerTools;component/Resources/RemoveInputIdle.png\" />\n          <ImageBrush x:Key=\"RemoverHoverImage\" ImageSource=\"/ClangPowerTools;component/Resources/RemoveInputHover.png\" />\n        </ResourceDictionary>\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </Window.Resources>\n\n  <components:InputList\n    x:Name=\"InputList\"\n    AddCommand=\"{Binding AddCommand}\"\n    Collection=\"{Binding Inputs, Mode=TwoWay}\"\n    InputToAdd=\"{Binding InputToAdd, Mode=TwoWay}\" \n    PickFilesCommand=\"{Binding PickFilesCommand}\"\n    PickFolderCommand=\"{Binding PickFolderCommand}\"/>\n\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/InputDataView.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for InputDataView.xaml\n  /// </summary>\n  public partial class InputDataView : Window\n  {\n    private readonly InputDataViewModel inputDataViewModel = new InputDataViewModel();\n\n    public InputDataView(InputDataViewModel inputDataViewModel)\n    {\n      InitializeComponent();\n      this.inputDataViewModel = inputDataViewModel;\n      DataContext = inputDataViewModel;\n      Owner = SettingsProvider.SettingsView;\n    }\n\n    //private void DeleteButton(object sender, RoutedEventArgs e)\n    //{\n    //  var elementIndex = GetElementIndex(sender as FrameworkElement);\n    //  inputDataViewModel.DeleteInput(elementIndex);\n    //}\n\n    //private int GetElementIndex(FrameworkElement frameworkElement)\n    //{\n    //  var element = InputList.CollectionItems.DataContext;\n    //  return InputList.CollectionItems.Items.IndexOf(element);\n    //}\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LicenseView.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.MVVM.Views.LicenseView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:controls=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Welcome\"\n  Width=\"844\"\n  Height=\"470\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <Window.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </Window.Resources>\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/LoginBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n    </Grid.RowDefinitions>\n\n    <TextBlock\n      Grid.Row=\"0\"\n      Margin=\"0,50,0,0\"\n      HorizontalAlignment=\"Center\"\n      FontSize=\"24\"\n      Foreground=\"#E2E2E8\"\n      Text=\"Get started with Clang Power Tools\" />\n\n    <Grid Grid.Row=\"1\" Margin=\"0,61,0,0\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n\n      <controls:ThreePieceButton\n        Title=\"Personal Use\"\n        Grid.Column=\"0\"\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        BackgroundValue=\"#C383E0\"\n        ButtonCommand=\"{Binding PersonalLicense}\"\n        Description=\"Free for hobby and EDU projects\"\n        DescriptionFontSize=\"14\"\n        DescriptionForeground=\"White\"\n        HeightValue=\"152\"\n        Image=\"/ClangPowerTools;component/Resources/iconPersonal.png\"\n        ImageHeightValue=\"53\"\n        ImageWidthValue=\"53\"\n        OpacityValue=\"0.15\"\n        TitleFontSize=\"18\"\n        TitleForeground=\"#C6C6D5\"\n        WidthValue=\"240\" />\n\n      <controls:ThreePieceButton\n        Title=\"Commercial Team License\"\n        Grid.Column=\"1\"\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        BackgroundValue=\"#C383E0\"\n        ButtonCommand=\"{Binding CommercialLicense}\"\n        Description=\"From $39/team/month\"\n        DescriptionFontSize=\"14\"\n        DescriptionForeground=\"White\"\n        HeightValue=\"172\"\n        Image=\"/ClangPowerTools;component/Resources/iconCommercial.png\"\n        ImageHeightValue=\"63\"\n        ImageWidthValue=\"63\"\n        OpacityValue=\"0.30\"\n        TitleFontSize=\"18\"\n        TitleForeground=\"#C6C6D5\"\n        WidthValue=\"260\" />\n\n      <controls:ThreePieceButton\n        Title=\"14-day Free Trial\"\n        Grid.Column=\"2\"\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        BackgroundValue=\"#C383E0\"\n        ButtonCommand=\"{Binding TrialLicense}\"\n        Description=\"No account required\"\n        DescriptionFontSize=\"14\"\n        DescriptionForeground=\"White\"\n        HeightValue=\"152\"\n        Image=\"/ClangPowerTools;component/Resources/iconFreeTrial.png\"\n        ImageHeightValue=\"53\"\n        ImageWidthValue=\"53\"\n        OpacityValue=\"0.10\"\n        TitleFontSize=\"18\"\n        TitleForeground=\"#C6C6D5\"\n        WidthValue=\"240\" />\n\n    </Grid>\n\n    <TextBlock\n      Grid.Row=\"2\"\n      Grid.Column=\"1\"\n      Width=\"170\"\n      Height=\"19\"\n      Margin=\"0,86,0,0\"\n      HorizontalAlignment=\"center\"\n      Background=\"Transparent\"\n      Cursor=\"Hand\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"14\"\n      Foreground=\"#E2E2E8\">\n      <Hyperlink Command=\"{Binding SignIn}\" Style=\"{StaticResource HyperlinkStyle}\">\n        Already registered? Sign In\n      </Hyperlink>\n    </TextBlock>\n\n  </Grid>\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LicenseView.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for License.xaml\n  /// </summary>\n  public partial class LicenseView : Window\n  {\n    public LicenseView()\n    {\n      InitializeComponent();\n      DataContext = new LicenseViewModel(this);\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LlvmSettingsView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.LlvmSettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"420\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  User control static resources  -->\n  <UserControl.Resources>\n\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n\n        <ResourceDictionary>\n          <Style TargetType=\"{x:Type Label}\">\n            <Setter Property=\"FontFamily\" Value=\"Segoe UI\" />\n            <Setter Property=\"FontWeight\" Value=\"SemiBold\" />\n            <Setter Property=\"FontSize\" Value=\"15\" />\n          </Style>\n\n          <Style TargetType=\"{x:Type ListView}\">\n            <Setter Property=\"FontFamily\" Value=\"Segoe UI\" />\n            <Setter Property=\"FontWeight\" Value=\"SemiBold\" />\n            <Setter Property=\"FontSize\" Value=\"15\" />\n          </Style>\n          <Style x:Key=\"ProgressBarStyle\" TargetType=\"ProgressBar\">\n            <Setter Property=\"Width\" Value=\"475\" />\n            <Setter Property=\"Height\" Value=\"6\" />\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\n            <Setter Property=\"Background\" Value=\"#BCBAC1\" />\n            <Setter Property=\"Foreground\" Value=\"#852012\" />\n            <Setter Property=\"Margin\" Value=\"0,0,15,0\" />\n          </Style>\n\n          <Style x:Key=\"HyperlinkStyle\" TargetType=\"Hyperlink\">\n            <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n            <Setter Property=\"Foreground\" Value=\"#852012\" />\n            <Setter Property=\"TextBlock.TextDecorations\" Value=\"{x:Null}\" />\n            <Style.Triggers>\n              <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                <Setter Property=\"Foreground\" Value=\"#FFBF8880\" />\n                <Setter Property=\"TextBlock.TextDecorations\" Value=\"Underline\" />\n              </Trigger>\n              <DataTrigger Binding=\"{Binding CanExecuteCommand}\" Value=\"False\">\n                <Setter Property=\"Foreground\" Value=\"#BCBAC1\" />\n              </DataTrigger>\n            </Style.Triggers>\n          </Style>\n        </ResourceDictionary>\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"10\" />\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"10\" />\n    </Grid.RowDefinitions>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"10\" />\n    </Grid.ColumnDefinitions>\n\n\n    <!--  Versions  -->\n    <ListView\n      x:Name=\"VersionsList\"\n      Grid.Row=\"1\"\n      Grid.Column=\"1\"\n      Background=\"White\"\n      Focusable=\"True\"\n      ItemsSource=\"{Binding Llvms}\"\n      ScrollViewer.CanContentScroll=\"True\"\n      SelectionMode=\"Single\">\n\n      <ListView.ItemContainerStyle>\n        <Style TargetType=\"ListViewItem\">\n          <Setter Property=\"Background\" Value=\"Transparent\" />\n          <Setter Property=\"BorderBrush\" Value=\"WhiteSmoke\" />\n          <Setter Property=\"BorderThickness\" Value=\"1\" />\n          <Setter Property=\"Focusable\" Value=\"False\" />\n        </Style>\n      </ListView.ItemContainerStyle>\n\n      <ListView.ItemTemplate>\n        <DataTemplate>\n          <Grid>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition Width=\"10\" />\n              <ColumnDefinition Width=\"90\" />\n              <ColumnDefinition Width=\"*\" />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"38\" />\n            </Grid.RowDefinitions>\n\n            <!--  Version name and action  -->\n            <TextBlock\n              Grid.Column=\"1\"\n              VerticalAlignment=\"Center\"\n              Text=\"{Binding Version, StringFormat='LLVM {0}'}\" />\n            <!--  Download button  -->\n            <Button\n              Grid.Column=\"2\"\n              Width=\"80\"\n              Height=\"20\"\n              Margin=\"490,0,0,0\"\n              Click=\"DownloadButton\"\n              Content=\"Download\"\n              FontSize=\"13\"\n              IsEnabled=\"{Binding CanExecuteCommand}\">\n              <Button.Style>\n                <Style TargetType=\"Button\">\n                  <Setter Property=\"Focusable\" Value=\"False\" />\n                  <Setter Property=\"Visibility\" Value=\"Visible\" />\n                  <Setter Property=\"IsEnabled\" Value=\"True\" />\n                  <Setter Property=\"Template\">\n                    <Setter.Value>\n                      <ControlTemplate TargetType=\"Button\">\n                        <TextBlock>\n                          <Hyperlink Style=\"{StaticResource HyperlinkStyle}\">\n                            <Run Text=\"{TemplateBinding Content}\" />\n                          </Hyperlink>\n                        </TextBlock>\n                      </ControlTemplate>\n                    </Setter.Value>\n                  </Setter>\n                  <Style.Triggers>\n                    <MultiDataTrigger>\n                      <MultiDataTrigger.Conditions>\n                        <Condition Binding=\"{Binding IsDownloading}\" Value=\"True\" />\n                        <Condition Binding=\"{Binding IsInstalled}\" Value=\"False\" />\n                      </MultiDataTrigger.Conditions>\n                      <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                    </MultiDataTrigger>\n                    <DataTrigger Binding=\"{Binding IsInstalling}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                    </DataTrigger>\n                    <DataTrigger Binding=\"{Binding HasPreinstalledLlvm}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                    </DataTrigger>\n                    <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                    </DataTrigger>\n                    <DataTrigger Binding=\"{Binding CanExecuteCommand}\" Value=\"False\">\n                      <Setter Property=\"IsEnabled\" Value=\"False\" />\n                    </DataTrigger>\n                  </Style.Triggers>\n                </Style>\n              </Button.Style>\n            </Button>\n\n            <!--  Already installed LLVM  -->\n            <TextBlock\n              Grid.Column=\"2\"\n              Height=\"20\"\n              HorizontalAlignment=\"Right\"\n              FontSize=\"13\"\n              Text=\"{Binding PreinstalledLlvmPath}\">\n              <TextBlock.Style>\n                <Style TargetType=\"TextBlock\">\n                  <Setter Property=\"Foreground\" Value=\"#BCBAC1\" />\n                  <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                  <Style.Triggers>\n                    <DataTrigger Binding=\"{Binding HasPreinstalledLlvm}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Visible\" />\n                    </DataTrigger>\n                  </Style.Triggers>\n                </Style>\n\n              </TextBlock.Style>\n            </TextBlock>\n\n            <!--  Uninstall button  -->\n            <Button\n              Grid.Column=\"2\"\n              Width=\"80\"\n              Height=\"20\"\n              Margin=\"490,0,0,0\"\n              VerticalAlignment=\"Center\"\n              Click=\"UninstallButton\"\n              Content=\"Uninstall\"\n              FontSize=\"13\"\n              IsEnabled=\"{Binding CanExecuteCommand}\">\n              <Button.Style>\n                <Style TargetType=\"Button\">\n                  <Setter Property=\"Focusable\" Value=\"False\" />\n                  <Setter Property=\"Template\">\n                    <Setter.Value>\n                      <ControlTemplate TargetType=\"Button\">\n                        <TextBlock>\n                          <Hyperlink Style=\"{StaticResource HyperlinkStyle}\">\n                            <Run Text=\"{TemplateBinding Content}\" />\n                          </Hyperlink>\n                        </TextBlock>\n                      </ControlTemplate>\n                    </Setter.Value>\n                  </Setter>\n                  <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                  <Style.Triggers>\n                    <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Visible\" />\n                    </DataTrigger>\n                    <DataTrigger Binding=\"{Binding CanExecuteCommand}\" Value=\"False\">\n                      <Setter Property=\"IsEnabled\" Value=\"False\" />\n                    </DataTrigger>\n                  </Style.Triggers>\n                </Style>\n              </Button.Style>\n            </Button>\n\n            <!--  Installing  -->\n            <StackPanel Grid.Column=\"2\" Orientation=\"Horizontal\">\n              <StackPanel.Style>\n                <Style TargetType=\"StackPanel\">\n                  <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                  <Style.Triggers>\n                    <DataTrigger Binding=\"{Binding IsInstalling}\" Value=\"True\">\n                      <Setter Property=\"Visibility\" Value=\"Visible\" />\n                    </DataTrigger>\n                  </Style.Triggers>\n                </Style>\n              </StackPanel.Style>\n              <ProgressBar IsIndeterminate=\"True\" Style=\"{StaticResource ProgressBarStyle}\" />\n              <TextBlock\n                Grid.Column=\"3\"\n                Width=\"80\"\n                Height=\"20\"\n                VerticalAlignment=\"Center\"\n                FontSize=\"13\"\n                Text=\"Installing\" />\n            </StackPanel>\n\n            <!--  Download in progress  -->\n            <StackPanel Grid.Column=\"2\" Orientation=\"Horizontal\">\n              <StackPanel.Style>\n                <Style TargetType=\"StackPanel\">\n                  <Setter Property=\"Visibility\" Value=\"Hidden\" />\n                  <Style.Triggers>\n                    <MultiDataTrigger>\n                      <MultiDataTrigger.Conditions>\n                        <Condition Binding=\"{Binding IsDownloading}\" Value=\"True\" />\n                        <Condition Binding=\"{Binding IsInstalling}\" Value=\"False\" />\n                        <Condition Binding=\"{Binding IsInstalled}\" Value=\"False\" />\n                      </MultiDataTrigger.Conditions>\n                      <Setter Property=\"Visibility\" Value=\"Visible\" />\n                    </MultiDataTrigger>\n                  </Style.Triggers>\n                </Style>\n              </StackPanel.Style>\n              <ProgressBar\n                Maximum=\"{Binding MaxProgress}\"\n                Minimum=\"{Binding MinProgress}\"\n                Style=\"{StaticResource ProgressBarStyle}\"\n                Value=\"{Binding DownloadProgress}\" />\n              <Button\n                Width=\"80\"\n                Height=\"20\"\n                VerticalAlignment=\"Center\"\n                Click=\"CancelButton\"\n                Content=\"Stop\"\n                FontSize=\"13\"\n                Foreground=\"#852012\">\n                <Button.Style>\n                  <Style TargetType=\"Button\">\n                    <Setter Property=\"Focusable\" Value=\"False\" />\n                    <Setter Property=\"Template\">\n                      <Setter.Value>\n                        <ControlTemplate TargetType=\"Button\">\n                          <TextBlock>\n                            <Hyperlink Style=\"{StaticResource HyperlinkStyle}\">\n                              <Run Text=\"{TemplateBinding Content}\" />\n                            </Hyperlink>\n                          </TextBlock>\n                        </ControlTemplate>\n                      </Setter.Value>\n                    </Setter>\n                  </Style>\n                </Button.Style>\n              </Button>\n            </StackPanel>\n          </Grid>\n        </DataTemplate>\n      </ListView.ItemTemplate>\n    </ListView>\n\n    <!--  Use LLVM  -->\n    <StackPanel\n      Grid.Row=\"2\"\n      Grid.Column=\"1\"\n      Margin=\"0,5,0,5\"\n      Orientation=\"Horizontal\">\n      <Label\n        Width=\"80\"\n        Height=\"30\"\n        Content=\"Use LLVM\" />\n      <ComboBox\n        Width=\"150\"\n        Height=\"30\"\n        ItemsSource=\"{Binding InstalledLlvms}\"\n        SelectedItem=\"{Binding VersionUsed}\" />\n      <Button\n        Width=\"120\"\n        Margin=\"365,0,0,0\"\n        Command=\"{Binding BrowseForLLVMCommand}\"\n        Content=\"Add LLVM\"\n        FontFamily=\"Segoe UI\"\n        FontSize=\"15\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\"\n        ToolTip=\"Select the custom path to the LLVM  &quot;bin&quot; directory. The LLVM version is automatically detected and it will be displayed in the list above.\" />\n\n    </StackPanel>\n\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LlvmSettingsView.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing System.Windows;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for LlvmSettingsView.xaml\n  /// </summary>\n  public partial class LlvmSettingsView : UserControl, IView\n  {\n    private LlvmSettingsViewModel llvmSettingsViewModel;\n\n    public LlvmSettingsView()\n    {\n      llvmSettingsViewModel = new LlvmSettingsViewModel(this);\n      DataContext = llvmSettingsViewModel;\n      InitializeComponent();\n      this.Loaded += LlvmSettingsViewLoaded;\n      SettingsHandler.RefreshSettingsView += ResetView;\n    }\n\n    public void ResetView()\n    {\n      llvmSettingsViewModel = new LlvmSettingsViewModel(this);\n      DataContext = llvmSettingsViewModel;\n    }\n\n    private void DownloadButton(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = GetElementIndex(sender as FrameworkElement);\n      llvmSettingsViewModel.DownloadCommand(elementIndex);\n    }\n\n    private void CancelButton(object sender, RoutedEventArgs e)\n    {\n      llvmSettingsViewModel.CancelCommand();\n    }\n\n    private void UninstallButton(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = GetElementIndex(sender as FrameworkElement);\n      llvmSettingsViewModel.UninstallCommand(elementIndex);\n    }\n\n    private int GetElementIndex(FrameworkElement frameworkElement)\n    {\n      var element = frameworkElement.DataContext;\n      return VersionsList.Items.IndexOf(element);\n    }\n\n    private void LlvmSettingsViewLoaded(object sender, RoutedEventArgs e)\n    {\n      Window window = Window.GetWindow(this);\n      window.Closing += llvmSettingsViewModel.WindowClosed;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LoginView.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.MVVM.Views.LoginView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Account\"\n  Width=\"824\"\n  Height=\"485\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  mc:Ignorable=\"d\">\n\n  <Grid>\n\n    <Grid.Resources>\n      <Style TargetType=\"{x:Type Hyperlink}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"Foreground\" Value=\"#E2E2E8\" />\n        <Setter Property=\"TextBlock.TextDecorations\" Value=\"{x:Null}\" />\n        <Style.Triggers>\n          <Trigger Property=\"IsMouseOver\" Value=\"True\">\n            <Setter Property=\"Foreground\" Value=\"White\" />\n          </Trigger>\n        </Style.Triggers>\n      </Style>\n    </Grid.Resources>\n\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/LoginBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <TextBlock\n      Grid.Row=\"0\"\n      Width=\"388\"\n      Height=\"27\"\n      Margin=\"0,86,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"20\"\n      Foreground=\"#E2E2E8\"\n      Text=\"Login to use Clang Power Tools\"\n      TextAlignment=\"Center\" />\n\n    <TextBlock\n      Grid.Row=\"1\"\n      Width=\"430\"\n      Height=\"40\"\n      Margin=\"0,30,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Background=\"White\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"16\"\n      Foreground=\"#E2E2E8\"\n      TextAlignment=\"Center\" />\n\n    <TextBox\n      Name=\"EmailTextBox\"\n      Grid.Row=\"1\"\n      Width=\"430\"\n      Height=\"40\"\n      Margin=\"0,30,0,0\"\n      Padding=\"5,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      VerticalContentAlignment=\"Center\"\n      Panel.ZIndex=\"0\"\n      BorderBrush=\"LightGray\"\n      BorderThickness=\"1\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"16\"\n      Text=\"{Binding Email, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}\">\n\n      <TextBox.Style>\n        <Style xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" TargetType=\"TextBox\">\n          <Style.Resources>\n\n            <VisualBrush\n              x:Key=\"GrayHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchLabel\"\n                  Content=\"Email\"\n                  FontFamily=\"SegoeUI\"\n                  FontSize=\"16\"\n                  Foreground=\"LightSlateGray\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n            <VisualBrush\n              x:Key=\"BlackHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchBlackLabel\"\n                  Content=\"Email\"\n                  FontFamily=\"SegoeUI\"\n                  FontSize=\"16\"\n                  Foreground=\"DarkSlateGray\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n          </Style.Resources>\n          <Style.Triggers>\n\n            <Trigger Property=\"IsKeyboardFocused\" Value=\"True\">\n              <Setter Property=\"Background\" Value=\"White\" />\n            </Trigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n          </Style.Triggers>\n        </Style>\n      </TextBox.Style>\n    </TextBox>\n\n    <TextBlock\n      Grid.Row=\"2\"\n      Width=\"430\"\n      Height=\"40\"\n      Margin=\"0,30,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Background=\"White\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"16\"\n      Foreground=\"#E2E2E8\"\n      TextAlignment=\"Center\" />\n\n    <PasswordBox\n      Name=\"PasswordTextBox\"\n      Grid.Row=\"2\"\n      Width=\"430\"\n      Height=\"40\"\n      Margin=\"0,30,0,0\"\n      Padding=\"5,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      VerticalContentAlignment=\"Center\"\n      Panel.ZIndex=\"0\"\n      BorderBrush=\"LightGray\"\n      BorderThickness=\"1\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"16\"\n      PasswordChanged=\"OnPasswordChanged\"\n      Tag=\"False\">\n\n      <PasswordBox.Style>\n        <Style xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" TargetType=\"PasswordBox\">\n          <Style.Resources>\n            <VisualBrush\n              x:Key=\"GrayHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchLabel\"\n                  Content=\"Password\"\n                  FontFamily=\"SegoeUI\"\n                  FontSize=\"16\"\n                  Foreground=\"LightSlateGray\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n            <VisualBrush\n              x:Key=\"BlackHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchBlackLabel\"\n                  Content=\"Password\"\n                  FontFamily=\"SegoeUI\"\n                  FontSize=\"16\"\n                  Foreground=\"DarkSlateGray\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n          </Style.Resources>\n          <Style.Triggers>\n\n            <Trigger Property=\"IsKeyboardFocused\" Value=\"True\">\n              <Setter Property=\"Background\" Value=\"White\" />\n            </Trigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Tag\" Value=\"False\" />\n                <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Tag\" Value=\"False\" />\n                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n          </Style.Triggers>\n        </Style>\n      </PasswordBox.Style>\n    </PasswordBox>\n\n    <TextBlock\n      Name=\"InvalidUserTextBlock\"\n      Grid.Row=\"3\"\n      Width=\"800\"\n      Height=\"27\"\n      Margin=\"0,10,0,76\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"14\"\n      Foreground=\"Red\"\n      TextAlignment=\"Center\"\n      TextWrapping=\"Wrap\"\n      Visibility=\"Hidden\" />\n\n    <Button\n      x:Name=\"LoginButton\"\n      Grid.Row=\"3\"\n      Width=\"178\"\n      Height=\"45\"\n      Margin=\"0,30,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      HorizontalContentAlignment=\"Center\"\n      VerticalContentAlignment=\"Center\"\n      Background=\"#FFBF31\"\n      Command=\"{Binding LogIn}\"\n      Content=\"LOG IN\"\n      Cursor=\"Hand\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"16\"\n      FontWeight=\"Bold\">\n\n      <Button.Resources>\n        <Style x:Key=\"ButtonFocusVisual\">\n          <Setter Property=\"Control.Template\">\n            <Setter.Value>\n              <ControlTemplate>\n                <Rectangle\n                  Margin=\"2\"\n                  SnapsToDevicePixels=\"true\"\n                  Stroke=\"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}\"\n                  StrokeDashArray=\"1 2\"\n                  StrokeThickness=\"1\" />\n              </ControlTemplate>\n            </Setter.Value>\n          </Setter>\n        </Style>\n      </Button.Resources>\n\n      <Button.Style>\n        <Style TargetType=\"Button\">\n          <Setter Property=\"FocusVisualStyle\" Value=\"{StaticResource ButtonFocusVisual}\" />\n          <Setter Property=\"Background\" Value=\"#FFBF31\" />\n          <Setter Property=\"Foreground\" Value=\"Black\" />\n          <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n          <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n          <Setter Property=\"Padding\" Value=\"10,5\" />\n          <Setter Property=\"FontSize\" Value=\"16\" />\n          <Setter Property=\"FontFamily\" Value=\"SegoeUI\" />\n          <Setter Property=\"FontWeight\" Value=\"Bold\" />\n          <Setter Property=\"Padding\" Value=\"0,1,0,1\" />\n          <Setter Property=\"Width\" Value=\"178\" />\n          <Setter Property=\"Height\" Value=\"45\" />\n          <Setter Property=\"Margin\" Value=\"0,26,0,0\" />\n          <Setter Property=\"Template\">\n            <Setter.Value>\n              <ControlTemplate TargetType=\"{x:Type Button}\">\n                <Grid>\n                  <Border\n                    x:Name=\"Border\"\n                    Background=\"{TemplateBinding Background}\"\n                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                    BorderThickness=\"{TemplateBinding BorderThickness}\" />\n\n                  <ContentPresenter\n                    Margin=\"{TemplateBinding Padding}\"\n                    HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                    VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                    RecognizesAccessKey=\"True\" />\n                </Grid>\n                <ControlTemplate.Triggers>\n                  <MultiDataTrigger>\n                    <MultiDataTrigger.Conditions>\n                      <Condition Binding=\"{Binding IsMouseOver, RelativeSource={RelativeSource Self}}\" Value=\"true\" />\n                      <Condition Binding=\"{Binding IsPressed, RelativeSource={RelativeSource Self}}\" Value=\"true\" />\n                    </MultiDataTrigger.Conditions>\n                    <Setter Property=\"Background\" Value=\"#db730a\" />\n                    <Setter Property=\"Margin\" Value=\"2,1\" />\n                  </MultiDataTrigger>\n                  <MultiDataTrigger>\n                    <MultiDataTrigger.Conditions>\n                      <Condition Binding=\"{Binding IsMouseOver, RelativeSource={RelativeSource Self}}\" Value=\"true\" />\n                      <Condition Binding=\"{Binding IsPressed, RelativeSource={RelativeSource Self}}\" Value=\"false\" />\n                    </MultiDataTrigger.Conditions>\n                    <Setter Property=\"BorderThickness\" Value=\"0\" />\n                    <Setter Property=\"Background\" Value=\"#f6993c\" />\n                  </MultiDataTrigger>\n                </ControlTemplate.Triggers>\n              </ControlTemplate>\n            </Setter.Value>\n          </Setter>\n        </Style>\n      </Button.Style>\n\n    </Button>\n\n    <TextBlock\n      Grid.Row=\"4\"\n      Width=\"108\"\n      Height=\"19\"\n      Margin=\"0,10,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      Background=\"Transparent\"\n      Cursor=\"Hand\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"14\"\n      Foreground=\"#E2E2E8\">\n      <Hyperlink Command=\"{Binding ForgotPassword}\">\n        Forgot Password?\n      </Hyperlink>\n    </TextBlock>\n\n    <TextBlock\n      Grid.Row=\"5\"\n      Width=\"185\"\n      Height=\"19\"\n      Margin=\"17,19,0,5\"\n      HorizontalAlignment=\"Left\"\n      VerticalAlignment=\"Center\"\n      Background=\"Transparent\"\n      Cursor=\"Hand\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"14\"\n      Foreground=\"#E2E2E8\">\n      <Hyperlink Command=\"{Binding SignUp}\">\n        Sign up for Clang Power Tools\n      </Hyperlink>\n    </TextBlock>\n\n  </Grid>\n\n</Window>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/LoginView.xaml.cs",
    "content": "﻿using System.Windows;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for UserControl1.xaml\n  /// </summary>\n  public partial class LoginView : Window\n  {\n    #region Members\n\n    private readonly LoginViewModel loginViewModel;\n\n    #endregion\n\n    #region Methods\n\n    public LoginView()\n    {\n      InitializeComponent();\n      loginViewModel = new LoginViewModel(this);\n      DataContext = loginViewModel;\n      ApiUtility.InitializeApiClient();\n    }\n\n    private void OnPasswordChanged(object sender, RoutedEventArgs e)\n    {\n      PasswordTextBox.Tag = string.IsNullOrWhiteSpace(PasswordTextBox.Password) ? \"False\" : \"True\";\n\n      if (DataContext != null)\n      {\n        loginViewModel.Password = ((PasswordBox)sender).Password;\n      }\n    }\n    \n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/ReleaseNotesView.xaml",
    "content": "﻿<Window x:Class=\"ClangPowerTools.MVVM.Views.ReleaseNotesView\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:controls=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:local=\"clr-namespace:ClangPowerTools\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        Title=\"Release Notes\"\n        Width=\"550\"\n        Height=\"710\"\n        Icon=\"/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n        ResizeMode=\"NoResize\"\n        WindowStartupLocation=\"CenterScreen\"\n        mc:Ignorable=\"d\">\n\n  <StackPanel>\n\n    <StackPanel.Resources>\n      <Style TargetType=\"{x:Type Hyperlink}\">\n        <Setter Property=\"FocusVisualStyle\"\n                Value=\"{x:Null}\" />\n        <Setter Property=\"Foreground\"\n                Value=\"#FFFAA8B4\" />\n        <Setter Property=\"TextBlock.TextDecorations\"\n                Value=\"{x:Null}\" />\n        <Style.Triggers>\n          <Trigger Property=\"IsMouseOver\"\n                   Value=\"True\">\n            <Setter Property=\"Foreground\"\n                    Value=\"#FFFAD4DB\" />\n          </Trigger>\n        </Style.Triggers>\n      </Style>\n    </StackPanel.Resources>\n\n    <Grid>\n\n      <Grid.Background>\n        <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/ReleaseNotesBackground.png\" />\n      </Grid.Background>\n\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"Auto\" />\n        <RowDefinition Height=\"Auto\" />\n        <RowDefinition Height=\"Auto\" />\n        <RowDefinition Height=\"Auto\" />\n        <RowDefinition Height=\"25\" />\n      </Grid.RowDefinitions>\n\n      <Grid.ColumnDefinitions>\n\n        <ColumnDefinition Width=\"35\" />\n        <ColumnDefinition />\n        <ColumnDefinition Width=\"35\" />\n\n      </Grid.ColumnDefinitions>\n\n      <Image\n             Grid.Column=\"1\"\n             Width=\"70\"\n             Height=\"75\"\n             HorizontalAlignment=\"Left\"\n             VerticalAlignment=\"Center\"\n             Source=\"/ClangPowerTools;component/Resources/CPTLogo.png\" Margin=\"202,0,0,0\" />\n\n      <TextBlock Grid.Row=\"1\"\n                 Grid.Column=\"1\"\n                 HorizontalAlignment=\"Center\"\n                 FontSize=\"32\"\n                 Text=\"Clang Power Tools\" />\n\n      <TextBlock Grid.Row=\"2\"\n                 Grid.Column=\"1\"\n                 HorizontalAlignment=\"Center\"\n                 FontSize=\"15\"\n                 Foreground=\"#3A3B40\"\n                 Text=\"version 2025.11.0\" />\n\n      <ListView Grid.Row=\"3\"\n                Grid.Column=\"1\"\n                Height=\"420\"\n                Margin=\"0,20,0,0\"\n                Background=\"Transparent\"\n                Focusable=\"False\"\n                ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\">\n\n        <ListView.ItemContainerStyle>\n          <Style TargetType=\"{x:Type ListViewItem}\">\n            <Setter Property=\"Background\"\n                    Value=\"Transparent\" />\n            <Setter Property=\"Template\">\n              <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ListViewItem}\">\n                  <ContentPresenter />\n                </ControlTemplate>\n              </Setter.Value>\n            </Setter>\n          </Style>\n        </ListView.ItemContainerStyle>\n\n        <!--What's new-->\n        <TextBox Margin=\"5,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"22\"\n                 IsReadOnly=\"True\"\n                 Text=\"What's New\" />\n\n        <TextBox Margin=\"15,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"16\"\n                 IsReadOnly=\"True\"\n                 Text=\"• Add LLVM 21.1.6\"\n                 TextWrapping=\"Wrap\" />\n\n        <TextBox Margin=\"15,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"16\"\n                 IsReadOnly=\"True\"\n                 Text=\"• Update clang-format.exe to v21.1.6\"\n                 TextWrapping=\"Wrap\" />\n\n        <TextBox Margin=\"15,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"16\"\n                 IsReadOnly=\"True\"\n                 Text=\"• New Clang-Tidy checks to improve code quality and static analysis coverage\"\n                 TextWrapping=\"Wrap\" />\n\n\n        <!--Bug Fixes-->\n        <TextBox Margin=\"5,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"22\"\n                 IsReadOnly=\"True\"\n                 Text=\"Bug Fixes\" />\n\n        <TextBox Margin=\"15,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"16\"\n                 IsReadOnly=\"True\"\n                 Text=\"• Clang compilation failure in Visual Studio 2026 caused by an empty -vs-ver argument being\"\n                 TextWrapping=\"Wrap\" />\n\n        <!--<TextBox Margin=\"15,20,0,0\"\n                 HorizontalAlignment=\"Left\"\n                 Background=\"Transparent\"\n                 BorderThickness=\"0\"\n                 FontSize=\"16\"\n                 IsReadOnly=\"True\"\n                 Text=\"• Invalid regex error encountered while exporting the compilation database.\"\n                 TextWrapping=\"Wrap\" />-->\n\n      </ListView>\n    </Grid>\n  </StackPanel>\n\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/ReleaseNotesView.xaml.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for ReleaseNotesView.xaml\n  /// </summary>\n  public partial class ReleaseNotesView : Window\n  {\n    public static bool WasShown { get; set; } = true;\n\n    public ReleaseNotesView(bool wasShown)\n    {\n      WasShown = wasShown;\n      InitializeComponent();\n      DataContext = new ReleaseNotesViewModel(this);\n    }\n\n    private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)\n    {\n      Process.Start(new ProcessStartInfo(\"https://releases.llvm.org/14.0.0/tools/clang/docs/ReleaseNotes.html#windows-support\"));\n      e.Handled = true;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/SearchBoxView.xaml",
    "content": "﻿<a:UserControl\n  x:Class=\"ClangPowerTools.Views.SearchBoxView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:a=\"http://schemas.microsoft.com/xps/2005/06\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"450\"\n  d:DesignWidth=\"800\"\n  mc:Ignorable=\"d\">\n\n  <UserControl.Resources>\n    <Style x:Key=\"NoChromeButton\" TargetType=\"{x:Type Button}\">\n      <Setter Property=\"Background\" Value=\"Transparent\" />\n      <Setter Property=\"BorderThickness\" Value=\"1\" />\n      <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}\" />\n      <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n      <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n      <Setter Property=\"Padding\" Value=\"1\" />\n      <Setter Property=\"ToolTip\" Value=\"Clear search\" />\n      <Setter Property=\"Template\">\n        <Setter.Value>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border BorderThickness=\"1\">\n              <Grid\n                x:Name=\"Chrome\"\n                Background=\"{TemplateBinding Background}\"\n                SnapsToDevicePixels=\"true\">\n                <ContentPresenter\n                  Margin=\"{TemplateBinding Padding}\"\n                  HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                  VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\n                  RecognizesAccessKey=\"True\"\n                  SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\n              </Grid>\n            </Border>\n            <ControlTemplate.Triggers>\n              <Trigger Property=\"IsEnabled\" Value=\"false\">\n                <Setter Property=\"Foreground\" Value=\"#ADADAD\" />\n                <Setter TargetName=\"Chrome\" Property=\"Opacity\" Value=\"0.5\" />\n              </Trigger>\n            </ControlTemplate.Triggers>\n          </ControlTemplate>\n        </Setter.Value>\n      </Setter>\n      <Style.Triggers>\n        <DataTrigger Binding=\"{Binding Text.Length, ElementName=SearchTextBox}\" Value=\"0\">\n          <DataTrigger.Setters>\n            <Setter Property=\"ToolTip\" Value=\"Search\" />\n          </DataTrigger.Setters>\n        </DataTrigger>\n      </Style.Triggers>\n    </Style>\n  </UserControl.Resources>\n\n  <Grid\n    Height=\"24\"\n    VerticalAlignment=\"Center\"\n    Background=\"White\">\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"Auto\" />\n    </Grid.ColumnDefinitions>\n\n    <TextBox\n      Name=\"SearchTextBox\"\n      Grid.Column=\"0\"\n      Padding=\"0,0,30,0\"\n      VerticalAlignment=\"Stretch\"\n      VerticalContentAlignment=\"Center\"\n      Panel.ZIndex=\"0\"\n      BorderBrush=\"LightGray\"\n      BorderThickness=\"1\"\n      Text=\"{Binding CheckSearch, UpdateSourceTrigger=PropertyChanged, Delay=300}\"\n      ToolTip=\"Type words to search for\">\n      <!--  GotMouseCapture=\"SearchBox_GotMouseCapture\"  -->\n\n      <TextBox.Style>\n        <Style xmlns:sys=\"clr-namespace:System;assembly=mscorlib\" TargetType=\"TextBox\">\n          <Style.Resources>\n\n            <VisualBrush\n              x:Key=\"GrayHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchLabel\"\n                  Content=\"Quick Search\"\n                  Foreground=\"Gray\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n            <VisualBrush\n              x:Key=\"BlackHelperTextBrush\"\n              AlignmentX=\"Left\"\n              AlignmentY=\"Center\"\n              Stretch=\"None\">\n              <VisualBrush.Visual>\n                <Label\n                  Name=\"SearchBlackLabel\"\n                  Content=\"Quick Search\"\n                  Foreground=\"Black\" />\n              </VisualBrush.Visual>\n            </VisualBrush>\n\n          </Style.Resources>\n          <Style.Triggers>\n\n            <Trigger Property=\"IsKeyboardFocused\" Value=\"True\">\n              <Setter Property=\"Background\" Value=\"White\" />\n            </Trigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"False\" />\n                <Condition Property=\"IsMouseCaptured\" Value=\"False\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource GrayHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Null}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"Text\" Value=\"{x:Static sys:String.Empty}\" />\n                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                <Condition Property=\"IsFocused\" Value=\"False\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter Property=\"Background\" Value=\"{StaticResource BlackHelperTextBrush}\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n          </Style.Triggers>\n        </Style>\n      </TextBox.Style>\n    </TextBox>\n\n    <Button\n      Grid.Column=\"0\"\n      Width=\"25\"\n      Height=\"25\"\n      HorizontalAlignment=\"Right\"\n      VerticalAlignment=\"Center\"\n      Panel.ZIndex=\"1\"\n      BorderThickness=\"1\"\n      Command=\"{Binding ResetSearchCommand}\"\n      Style=\"{DynamicResource NoChromeButton}\">\n\n      <Button.Template>\n        <ControlTemplate TargetType=\"{x:Type Button}\">\n          <Border>\n            <Grid>\n              <ContentPresenter />\n              <Grid\n                x:Name=\"StatusPanel\"\n                Background=\"Black\"\n                Opacity=\"0\" />\n            </Grid>\n          </Border>\n          <ControlTemplate.Triggers>\n            <Trigger Property=\"IsMouseOver\" Value=\"true\">\n              <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.1\" />\n            </Trigger>\n            <Trigger Property=\"IsPressed\" Value=\"true\">\n              <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.3\" />\n            </Trigger>\n          </ControlTemplate.Triggers>\n        </ControlTemplate>\n      </Button.Template>\n\n      <Button.Content>\n        <Rectangle Width=\"19\" Height=\"19\">\n          <Rectangle.Style>\n            <Style TargetType=\"{x:Type Rectangle}\">\n              <Setter Property=\"Fill\">\n                <Setter.Value>\n                  <ImageBrush ImageSource=\"pack://application:,,,/ClangPowerTools;component/Resources/CleanSearchIcon.png\" />\n                </Setter.Value>\n              </Setter>\n              <Style.Triggers>\n                <DataTrigger Binding=\"{Binding Text.Length, ElementName=SearchTextBox}\" Value=\"0\">\n                  <DataTrigger.Setters>\n                    <Setter Property=\"Fill\">\n                      <Setter.Value>\n                        <ImageBrush ImageSource=\"pack://application:,,,/ClangPowerTools;component/Resources/SearchIcon.png\" />\n                      </Setter.Value>\n                    </Setter>\n                  </DataTrigger.Setters>\n                </DataTrigger>\n              </Style.Triggers>\n            </Style>\n          </Rectangle.Style>\n        </Rectangle>\n      </Button.Content>\n    </Button>\n  </Grid>\n\n</a:UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/SearchBoxView.xaml.cs",
    "content": "﻿using System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for SearchBoxView.xaml\n  /// </summary>\n  public partial class SearchBoxView : UserControl\n  {\n    #region Cosntructor\n\n    /// <summary>\n    /// Default constructor\n    /// </summary>\n    public SearchBoxView()\n    {\n      InitializeComponent();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/SettingsView.xaml",
    "content": "﻿<views:DialogWindow\n  x:Class=\"ClangPowerTools.Views.SettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:controls=\"clr-namespace:ClangPowerTools.MVVM.Views.Components\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.Views\"\n  xmlns:views=\"clr-namespace:ClangPowerTools.MVVM.Views\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Settings\"\n  Width=\"760\"\n  Height=\"{Binding Heigth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  ShowInTaskbar=\"False\"\n  WindowStartupLocation=\"CenterScreen\"\n  WindowStyle=\"ThreeDBorderWindow\"\n  mc:Ignorable=\"d\">\n\n  <views:DialogWindow.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </views:DialogWindow.Resources>\n\n  <Grid>\n    <Grid.Resources>\n      <Style TargetType=\"{x:Type Hyperlink}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"Foreground\" Value=\"#FFFAA8B4\" />\n        <Setter Property=\"TextBlock.TextDecorations\" Value=\"{x:Null}\" />\n        <Style.Triggers>\n          <Trigger Property=\"IsMouseOver\" Value=\"True\">\n            <Setter Property=\"Foreground\" Value=\"#FFFAD4DB\" />\n          </Trigger>\n        </Style.Triggers>\n      </Style>\n    </Grid.Resources>\n\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"*\" />\n      <RowDefinition Height=\"Auto\" />\n    </Grid.RowDefinitions>\n\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n\n    <TabControl Grid.Row=\"0\">\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"16\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/CompileIcon.png\" />\n            <TextBlock Width=\"65\" Text=\"Compiler\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:CompilerSettingsView />\n        </Grid>\n      </TabItem>\n\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"16\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/TidyIcon.png\" />\n            <TextBlock Width=\"65\" Text=\"Tidy\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:TidySettingsView />\n        </Grid>\n      </TabItem>\n\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"16\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/ClangFormatIcon.png\" />\n            <TextBlock Width=\"65\" Text=\"Format\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:FormatSettingsView />\n        </Grid>\n      </TabItem>\n\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"16\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/SettingsLLVM.png\" />\n            <TextBlock Width=\"65\" Text=\"LLVM\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:LlvmSettingsView />\n        </Grid>\n      </TabItem>\n\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"15\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/AccountIcon.png\" />\n            <TextBlock Width=\"65\" Text=\"About\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:AboutSettingsView />\n        </Grid>\n      </TabItem>\n\n      <TabItem Padding=\"8\" FontSize=\"15\">\n        <TabItem.Header>\n          <StackPanel Orientation=\"Horizontal\">\n            <Image\n              Width=\"35\"\n              Height=\"15\"\n              Margin=\"3\"\n              Source=\"/ClangPowerTools;component/Resources/FeedbackIcon.png\" />\n            <TextBlock Width=\"65\" Text=\"Feedback\" />\n          </StackPanel>\n        </TabItem.Header>\n        <Grid>\n          <local:FeedbackView />\n        </Grid>\n      </TabItem>\n    </TabControl>\n  </Grid>\n\n</views:DialogWindow>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/SettingsView.xaml.cs",
    "content": "﻿using ClangPowerTools.Commands.BackgroundTidy;\nusing ClangPowerTools.MVVM.Views;\nusing System.Windows;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for SettingsView.xaml\n  /// </summary>\n  public partial class SettingsView : DialogWindow\n  {\n    public SettingsView(bool showFooter)\n    {\n      var settingsHandler = new SettingsHandler();\n      settingsHandler.LoadSettings();\n\n      InitializeComponent();\n      DataContext = new SettingsViewModel(this, showFooter);\n\n      SettingsProvider.SettingsView = this;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/AppResources.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.AppResources\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Styles\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <ResourceDictionary.MergedDictionaries>\n\n    <ResourceDictionary Source=\"ToggleStyle.xaml\" />\n    <ResourceDictionary Source=\"SettingsButtonStyle.xaml\" />\n    <ResourceDictionary Source=\"SettingsComboBoxStyle.xaml\" />\n    <ResourceDictionary Source=\"YellowButtonStyle.xaml\" />\n    <ResourceDictionary Source=\"HyperlinkStyle.xaml\" />\n    <ResourceDictionary Source=\"ImageResources.xaml\" />\n\n  </ResourceDictionary.MergedDictionaries>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/HyperlinkStyle.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.HyperlinkStyle\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Styles\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <Style x:Key=\"HyperlinkStyle\" TargetType=\"Hyperlink\">\n    <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n    <Setter Property=\"Foreground\" Value=\"#E2E2E8\" />\n    <Setter Property=\"TextBlock.TextDecorations\" Value=\"{x:Null}\" />\n    <Style.Triggers>\n      <Trigger Property=\"IsMouseOver\" Value=\"True\">\n        <Setter Property=\"Foreground\" Value=\"White\" />\n      </Trigger>\n    </Style.Triggers>\n  </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/ImageResources.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.ImageResources\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <BitmapImage x:Key=\"AddInputImage\" UriSource=\"/ClangPowerTools;component/Resources/AddInput.png\" />\n  <BitmapImage x:Key=\"BrowseImage\" UriSource=\"/ClangPowerTools;component/Resources/Browse.png\" />\n  <BitmapImage x:Key=\"BrowseFileImage\" UriSource=\"/ClangPowerTools;component/Resources/DetectOnFileIcon.png\" />\n  <BitmapImage x:Key=\"AccountAvatarIcon\" UriSource=\"/ClangPowerTools;component/Resources/AccountAvatarIcon.png\" />\n  <BitmapImage x:Key=\"GitHubIcon\" UriSource=\"/ClangPowerTools;component/Resources/GitHubMark.png\" />\n  <BitmapImage x:Key=\"LogoutIcon\" UriSource=\"/ClangPowerTools;component/Resources/LogoutIcon.png\" />\n  <BitmapImage x:Key=\"DetectOnFileIcon\" UriSource=\"/ClangPowerTools;component/Resources/DetectOnFileIcon.png\" />\n  <ImageBrush x:Key=\"RemoveImage\" ImageSource=\"/ClangPowerTools;component/Resources/RemoveInputIdle.png\" />\n  <ImageBrush x:Key=\"RemoverHoverImage\" ImageSource=\"/ClangPowerTools;component/Resources/RemoveInputHover.png\" />\n\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/SettingsButtonStyle.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.SettingsButtonStyle\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <ResourceDictionary.MergedDictionaries>\n    <ResourceDictionary Source=\"ImageResources.xaml\" />\n  </ResourceDictionary.MergedDictionaries>\n\n  <Style x:Key=\"SettingsButton\" TargetType=\"{x:Type Button}\">\n    <Setter Property=\"Background\" Value=\"#9E005A\" />\n    <Setter Property=\"Height\" Value=\"30\" />\n    <Setter Property=\"Width\" Value=\"50\" />\n    <Setter Property=\"Template\">\n      <Setter.Value>\n        <ControlTemplate TargetType=\"Button\">\n          <Grid Background=\"{TemplateBinding Background}\">\n            <!--<Image x:Name=\"ButtonImageContent\" />-->\n            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\n          </Grid>\n          <!--<ControlTemplate.Triggers>\n\n            <Trigger Property=\"Tag\" Value=\"add\">\n              <Setter TargetName=\"ButtonImageContent\" Property=\"Source\" Value=\"/ClangPowerTools;component/Resources/AddInput.png\" />\n            </Trigger>\n\n            <Trigger Property=\"Tag\" Value=\"browse\">\n              <Setter TargetName=\"ButtonImageContent\" Property=\"Source\" Value=\"/ClangPowerTools;component/Resources/AddInput.png\" />\n            </Trigger>\n\n            <MultiDataTrigger>\n              <MultiDataTrigger.Conditions>\n                <Condition Binding=\"{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}\" Value=\"browse\" />\n                <Condition Binding=\"{Binding Text.Length, ElementName=InputTextbox}\" Value=\"0\" />\n              </MultiDataTrigger.Conditions>\n              <Setter TargetName=\"ButtonImageContent\" Property=\"Source\" Value=\"/ClangPowerTools;component/Resources/Browse.png\" />\n            </MultiDataTrigger>\n          </ControlTemplate.Triggers>-->\n        </ControlTemplate>\n      </Setter.Value>\n    </Setter>\n\n    <Style.Triggers>\n      <Trigger Property=\"IsMouseOver\" Value=\"True\">\n        <Setter Property=\"Background\" Value=\"#c70071\" />\n      </Trigger>\n      <Trigger Property=\"IsEnabled\" Value=\"False\">\n        <Setter Property=\"Background\" Value=\"#A0A0A0\" />\n      </Trigger>\n    </Style.Triggers>\n  </Style>\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/SettingsComboBoxStyle.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.SettingsComboBoxStyle\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Styles\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <Style x:Key=\"SettingsComboBox\" TargetType=\"ComboBox\">\n    <Style.Triggers>\n      <Trigger Property=\"IsEnabled\" Value=\"False\">\n        <Setter Property=\"Background\" Value=\"#A0A0A0\" />\n        <Setter Property=\"Foreground\" Value=\"#A0A0A0\" />\n      </Trigger>\n    </Style.Triggers>\n  </Style>\n</ResourceDictionary>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/ToggleStyle.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.ToggleStyle\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Styles\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <Style TargetType=\"ToggleButton\">\n    <Setter Property=\"Template\">\n      <Setter.Value>\n        <ControlTemplate TargetType=\"ToggleButton\">\n          <Viewbox HorizontalAlignment=\"Left\">\n\n            <Grid HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\">\n\n              <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"Auto\" />\n                <ColumnDefinition Width=\"Auto\" />\n              </Grid.ColumnDefinitions>\n\n              <Rectangle\n                x:Name=\"BackgroundToggleSwitch\"\n                Grid.Column=\"0\"\n                Width=\"40\"\n                Height=\"20\"\n                HorizontalAlignment=\"center\"\n                VerticalAlignment=\"center\"\n                Fill=\"#A0A0A0\"\n                RadiusX=\"10\"\n                RadiusY=\"10\" />\n\n              <Ellipse\n                x:Name=\"DotToggleSwitch\"\n                Grid.Column=\"0\"\n                Width=\"13\"\n                Height=\"13\"\n                HorizontalAlignment=\"Center\"\n                VerticalAlignment=\"Center\"\n                Fill=\"White\" />\n\n              <TextBlock\n                Name=\"StateToggleSwitch\"\n                Grid.Column=\"1\"\n                Margin=\"5,0,0,0\"\n                VerticalAlignment=\"Center\"\n                FontFamily=\"SegoeUI\"\n                FontSize=\"16\"\n                Text=\"Off\" />\n\n              <ContentPresenter />\n\n            </Grid>\n          </Viewbox>\n\n          <ControlTemplate.Triggers>\n\n            <!--  On/Off Switch  -->\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"false\" />\n                <Condition Property=\"Tag\" Value=\"On\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#A0A0A0\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"-20,0,0,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Off\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"false\" />\n                <Condition Property=\"Tag\" Value=\"Off\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#A0A0A0\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"-20,0,0,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Off\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"true\" />\n                <Condition Property=\"Tag\" Value=\"On\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#9E005A\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"0,0,-20,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"On\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"true\" />\n                <Condition Property=\"Tag\" Value=\"Off\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#9E005A\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"0,0,-20,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"On\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n\n            <!--  Enable All/Disable All Switch  -->\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"false\" />\n                <Condition Property=\"Tag\" Value=\"Enable\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#A0A0A0\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"-20,0,0,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Enable All\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"false\" />\n                <Condition Property=\"Tag\" Value=\"Disable\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#A0A0A0\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"-20,0,0,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Enable All\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"true\" />\n                <Condition Property=\"Tag\" Value=\"Enable\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#9E005A\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"0,0,-20,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Disable All\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"true\" />\n                <Condition Property=\"Tag\" Value=\"Disable\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#9E005A\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"0,0,-20,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Disable All\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <!--  Enable defaults Switch  -->\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"false\" />\n                <Condition Property=\"Tag\" Value=\"Defaults\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#A0A0A0\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"-20,0,0,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Defaults\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n            <MultiTrigger>\n              <MultiTrigger.Conditions>\n                <Condition Property=\"IsChecked\" Value=\"true\" />\n                <Condition Property=\"Tag\" Value=\"Defaults\" />\n              </MultiTrigger.Conditions>\n              <MultiTrigger.Setters>\n                <Setter TargetName=\"BackgroundToggleSwitch\" Property=\"Fill\" Value=\"#9E005A\" />\n                <Setter TargetName=\"DotToggleSwitch\" Property=\"Margin\" Value=\"0,0,-20,0\" />\n                <Setter TargetName=\"StateToggleSwitch\" Property=\"Text\" Value=\"Defaults\" />\n              </MultiTrigger.Setters>\n            </MultiTrigger>\n\n          </ControlTemplate.Triggers>\n        </ControlTemplate>\n      </Setter.Value>\n    </Setter>\n  </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/Styles/YellowButtonStyle.xaml",
    "content": "﻿<ResourceDictionary\n  x:Class=\"ClangPowerTools.MVVM.Views.Styles.YellowButtonStyle\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools.MVVM.Views.Styles\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\">\n\n  <Style x:Key=\"YellowButtonBackgroundStyle\" TargetType=\"Button\">\n    <Setter Property=\"Background\" Value=\"#FFBF31\" />\n    <Setter Property=\"Foreground\" Value=\"Black\" />\n    <Style.Triggers>\n      <Trigger Property=\"IsMouseOver\" Value=\"True\">\n        <Setter Property=\"Background\" Value=\"#FFD780\" />\n      </Trigger>\n    </Style.Triggers>\n  </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidyChecksView.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.Views.TidyChecksView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  xmlns:searchBox=\"clr-namespace:ClangPowerTools.Views\"\n  Title=\"Tidy Checks\"\n  Width=\"690\"\n  Height=\"626\"\n  Background=\"WhiteSmoke\"\n  ResizeMode=\"NoResize\"\n  ShowActivated=\"True\"\n  ShowInTaskbar=\"False\"\n  WindowStartupLocation=\"CenterScreen\"\n  WindowStyle=\"ToolWindow\"\n  mc:Ignorable=\"d\">\n\n  <Window.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </Window.Resources>\n\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"30\" />\n      <RowDefinition Height=\"30\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <!--  Select all -->\n    <ToggleButton\n      x:Name=\"EnableDisableAll\"\n      Grid.Row=\"0\"\n      Width=\"120\"\n      Height=\"20\"\n      Margin=\"0,0,7,0\"\n      HorizontalAlignment=\"right\"\n      VerticalAlignment=\"Center\"\n      Tag=\"Enable\" />\n\n    <!--  Select defaults -->\n    <ToggleButton\n      x:Name=\"EnableDisableDefaults\"\n      Grid.Row=\"1\"\n      Width=\"120\"\n      Height=\"20\"\n      Margin=\"0,0,7,0\"\n      HorizontalAlignment=\"right\"\n      VerticalAlignment=\"Center\" \n      Tag=\"Defaults\" />\n\n    <!--  Search  -->\n    <searchBox:SearchBoxView\n      Grid.Row=\"0\"\n      Width=\"250\"\n      Height=\"30\"\n      Margin=\"5,0,0,0\"\n      HorizontalAlignment=\"left\" />\n\n    <!--  Checks list  -->\n    <ListBox\n      x:Name=\"TidyChecksListBox\"\n      Grid.Row=\"2\"\n      Grid.Column=\"0\"\n      ItemsSource=\"{Binding TidyChecksList}\"\n      ScrollViewer.CanContentScroll=\"True\"\n      ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\n      SelectedItem=\"{Binding SelectedCheck}\"\n      SelectionMode=\"Extended\">\n      <ListBox.ItemTemplate>\n        <DataTemplate>\n          <Grid>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition Width=\"472\" />\n              <ColumnDefinition Width=\"auto\" />\n              <ColumnDefinition Width=\"10\" />\n              <ColumnDefinition Width=\"auto\" />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"25\" />\n            </Grid.RowDefinitions>\n\n            <TextBlock\n              Grid.Row=\"1\"\n              Grid.Column=\"0\"\n              FontSize=\"14\"\n              Text=\"{Binding Name}\"\n              TextWrapping=\"Wrap\">\n            </TextBlock>\n\n            <Button \n              Margin=\"0,2,0,0\" \n              Grid.Row=\"1\" \n              Grid.Column=\"1\" \n              Content=\"Description\" \n              Cursor=\"Hand\" \n              Click=\"OpenDescription\">\n              <Button.Template>\n                <ControlTemplate TargetType=\"Button\">\n                  <TextBlock TextDecorations=\"Underline\">\n                    <ContentPresenter />\n                  </TextBlock>\n                </ControlTemplate>\n              </Button.Template>\n              <Button.Style>\n                <Style TargetType=\"Button\">\n                  <Setter Property=\"Foreground\" Value=\"#852012\" />\n                  <Style.Triggers>\n                    <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                      <Setter Property=\"Foreground\" Value=\"#FFBF8880\" />\n                    </Trigger>\n                  </Style.Triggers>\n                </Style>\n              </Button.Style>\n            </Button>\n\n            <ToggleButton\n              Grid.Row=\"1\"\n              Grid.Column=\"3\"\n              Width=\"80\"\n              Height=\"20\"\n              Checked=\"ToggleButton_Checked\"\n              IsChecked=\"{Binding IsChecked, Mode=TwoWay}\"\n              Tag=\"On\"\n              Unchecked=\"ToggleButton_Unchecked\" />\n\n          </Grid>\n        </DataTemplate>\n      </ListBox.ItemTemplate>\n    </ListBox>\n\n  </Grid>\n\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidyChecksView.xaml.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for TidyChecksView.xaml\n  /// </summary>\n  public partial class TidyChecksView : Window\n  {\n    private readonly TidyChecksViewModel viewModel;\n\n    public TidyChecksView()\n    {\n      InitializeComponent();\n\n      viewModel = new TidyChecksViewModel(this);\n      DataContext = viewModel;\n      Owner = SettingsProvider.SettingsView;\n    }\n\n    private void ToggleButton_Checked(object sender, RoutedEventArgs e)\n    {\n      viewModel.MultipleStateChange(true);\n      viewModel.DeactivateDefaultsToggle();\n    }\n\n    private void ToggleButton_Unchecked(object sender, RoutedEventArgs e)\n    {\n      viewModel.MultipleStateChange(false);\n      viewModel.DeactivateDefaultsToggle();\n    }\n\n    private void OpenDescription(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = GetElementIndex(sender as FrameworkElement);\n      var tidyCheckModel = viewModel.TidyChecksList.ElementAt(elementIndex);\n      viewModel.OpenBrowser(tidyCheckModel.Name);\n    }\n\n    private int GetElementIndex(FrameworkElement frameworkElement)\n    {\n      var element = frameworkElement.DataContext;\n      return TidyChecksListBox.Items.IndexOf(element);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidySettingsView.xaml",
    "content": "﻿<UserControl\n  x:Class=\"ClangPowerTools.Views.TidySettingsView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  d:DesignHeight=\"440\"\n  d:DesignWidth=\"770\"\n  mc:Ignorable=\"d\">\n\n  <!--  Static resources  -->\n  <UserControl.Resources>\n    <ResourceDictionary>\n      <ResourceDictionary.MergedDictionaries>\n        <ResourceDictionary Source=\"/ClangPowerTools;component/MVVM/Views/Styles/AppResources.xaml\" />\n      </ResourceDictionary.MergedDictionaries>\n    </ResourceDictionary>\n  </UserControl.Resources>\n\n  <Grid>\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/SettingsBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"20\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"auto\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"auto\" />\n      <ColumnDefinition Width=\"*\" />\n    </Grid.ColumnDefinitions>\n\n    <!--  Use checks from  -->\n    <WrapPanel Grid.Row=\"1\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.UseChecksFrom}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Use checks from\" />\n\n      <ComboBox\n        x:Name=\"UseCheckFromComboBox\"\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        ItemsSource=\"{Binding UseChecksFromItems}\"\n        SelectedItem=\"{Binding TidyModel.UseChecksFrom}\"\n        SelectionChanged=\"ComboBox_SelectionChanged\" />\n    </WrapPanel>\n\n    <!--  Predefined Checks  -->\n    <WrapPanel Grid.Row=\"2\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.PredefinedChecks}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Predefined Checks\" />\n\n      <Button\n        x:Name=\"SelectPredefinedChecksButton\"\n        Width=\"80\"\n        Height=\"30\"\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding PredefinedChecksSelectCommand}\"\n        Content=\"Select\"\n        FontSize=\"14\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\" />\n    </WrapPanel>\n\n    <!--  Custom checks  -->\n    <WrapPanel Grid.Row=\"3\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CustomChecks}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Custom Checks\" />\n\n      <TextBox\n        x:Name=\"CustomChecksText\"\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding TidyModel.CustomChecks}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding CustomChecksAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Header Filter  -->\n    <WrapPanel Grid.Row=\"4\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.HeaderFilter}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Header filter\" />\n\n      <ComboBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        IsEditable=\"True\"\n        ItemsSource=\"{Binding HeaderFilters}\"\n        Text=\"{Binding HeaderFilter}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding HeaderFilterAddDataCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource AddInputImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Custom executable file  -->\n    <WrapPanel Grid.Row=\"5\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CustomExecutableTidy}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Custom executable\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding TidyModel.CustomExecutable}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding CustomExecutableBrowseCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image Source=\"{StaticResource BrowseImage}\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Path to compile database (-p) -->\n    <WrapPanel Grid.Row=\"6\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.CompilationDatabase}\"\n            TextWrapping=\"Wrap\" />\n          </ToolTip>\n       </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Compilation database\" />\n\n      <TextBox\n        Width=\"450\"\n        Height=\"30\"\n        Margin=\"0,0,20,0\"\n        VerticalContentAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"15\"\n        Text=\"{Binding TidyModel.CompilationDatabase}\" />\n\n      <Button\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding CompilationDatabaseBrowseCommand}\"\n        Style=\"{StaticResource SettingsButton}\">\n        <Button.Content>\n          <Image \n            Source=\"{StaticResource BrowseFileImage}\"\n            Width=\"16\" \n            Height=\"16\" />\n        </Button.Content>\n      </Button>\n    </WrapPanel>\n\n    <!--  Auto Detect .clang-tidy file  -->\n    <WrapPanel Grid.Row=\"7\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.DetectClangTidyFile}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Detect .clang-tidy file\" />\n\n      <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding TidyModel.DetectClangTidyFile}\"\n        Tag=\"On\" />\n    </WrapPanel>\n\n    <!--  Format after tidy  -->\n    <WrapPanel Grid.Row=\"8\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.FormatAfterTidy}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Format after Tidy\" />\n\n      <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding TidyModel.FormatAfterTidy}\"\n        Tag=\"On\" />\n    </WrapPanel>\n\n    <!--  Tidy on save  -->\n    <WrapPanel Grid.Row=\"9\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.TidyOnSave}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Tidy on save\" />\n\n      <ToggleButton\n        HorizontalAlignment=\"Left\"\n        VerticalAlignment=\"Center\"\n        IsChecked=\"{Binding TidyModel.TidyOnSave}\"\n        Tag=\"On\" />\n    </WrapPanel>\n\n    <!--  Apply Tidy-Fix  -->\n    <WrapPanel Grid.Row=\"10\"\n               Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock MaxWidth=\"400\"\n                     Text=\"{Binding Tooltip.ApplyTidyFix}\"\n                     TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock Width=\"180\"\n                 Padding=\"10\"\n                 VerticalAlignment=\"Center\"\n                 FontFamily=\"SegoeUI\"\n                 FontSize=\"16\"\n                 Text=\"1-step Tidy-Fix\" />\n\n      <ToggleButton HorizontalAlignment=\"Left\"\n                    VerticalAlignment=\"Center\"\n                    IsChecked=\"{Binding TidyModel.ApplyTidyFix}\"\n                    Tag=\"On\" />\n\n      <TextBlock Width=\"385\"\n                 Padding=\"10\"\n                 VerticalAlignment=\"Center\"\n                 FontFamily=\"SegoeUI\"\n                 FontSize=\"14\"\n                 Foreground=\"#bf710b\"\n                 TextAlignment=\"Left\"\n                 Visibility=\"{Binding DisplayWarning}\"\n                 Text=\"Applies fixes directly. Recommended for Git repositories.\" />\n    </WrapPanel>\n    \n    <!--  Export tidy config  -->\n    <WrapPanel Grid.Row=\"11\" Grid.Column=\"1\">\n      <WrapPanel.ToolTip>\n        <ToolTip>\n          <TextBlock\n            MaxWidth=\"400\"\n            Text=\"{Binding Tooltip.TidyFileConfig}\"\n            TextWrapping=\"Wrap\" />\n        </ToolTip>\n      </WrapPanel.ToolTip>\n\n      <TextBlock\n        Width=\"180\"\n        Padding=\"10\"\n        VerticalAlignment=\"Center\"\n        FontFamily=\"SegoeUI\"\n        FontSize=\"16\"\n        Text=\"Tidy file config\" />\n\n      <Button\n        Width=\"80\"\n        Height=\"30\"\n        HorizontalAlignment=\"Left\"\n        Command=\"{Binding ExportTidyConfigCommand}\"\n        Content=\"Export\"\n        FontSize=\"14\"\n        Foreground=\"White\"\n        Style=\"{StaticResource SettingsButton}\" />\n    </WrapPanel>\n\n  </Grid>\n</UserControl>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidySettingsView.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Interfaces;\nusing System.Windows.Controls;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for TidySettingsView.xaml\n  /// </summary>\n  public partial class TidySettingsView : UserControl, IView\n  {\n    public TidySettingsView()\n    {\n      InitializeComponent();\n      DataContext = new TidySettingsViewModel();\n      SettingsHandler.RefreshSettingsView += ResetView;\n    }\n\n    public void ResetView()\n    {\n      DataContext = new TidySettingsViewModel();\n    }\n\n    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)\n    {\n      SelectPredefinedChecksButton.IsEnabled =\n        UseCheckFromComboBox.SelectedItem.ToString() == ClangTidyUseChecksFrom.PredefinedChecks.ToString();\n\n      CustomChecksText.IsReadOnly =\n      !(UseCheckFromComboBox.SelectedItem.ToString() == ClangTidyUseChecksFrom.CustomChecks.ToString());\n\n      CustomChecksText.IsEnabled = !CustomChecksText.IsReadOnly;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidyToolWindowView.xaml",
    "content": "﻿<UserControl x:Class=\"ClangPowerTools.Views.TidyToolWindowView\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:local=\"clr-namespace:ClangPowerTools\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             xmlns:views=\"clr-namespace:ClangPowerTools.MVVM.Views\"\n             xmlns:vsfx=\"clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.15.0\"\n             d:DesignHeight=\"700\"\n             d:DesignWidth=\"350\"\n             mc:Ignorable=\"d\">\n\n  <UserControl.Resources>\n    <Style x:Key=\"myHeaderStyle\"\n           TargetType=\"{x:Type GridViewColumnHeader}\">\n      <Setter Property=\"Visibility\"\n              Value=\"Collapsed\" />\n    </Style>\n    <Style TargetType=\"{x:Type Button}\">\n      <Setter Property=\"Background\"\n              Value=\"Transparent\" />\n      <Setter Property=\"Template\">\n        <Setter.Value>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border Background=\"{TemplateBinding Background}\"\n                    BorderThickness=\"1\">\n              <ContentPresenter HorizontalAlignment=\"Center\"\n                                VerticalAlignment=\"Center\" />\n            </Border>\n          </ControlTemplate>\n        </Setter.Value>\n      </Setter>\n      <Style.Triggers>\n        <Trigger Property=\"IsMouseOver\"\n                 Value=\"True\">\n          <Setter Property=\"Background\"\n                  Value=\"{DynamicResource {x:Static vsfx:VsBrushes.ToolWindowTabMouseOverBackgroundBeginKey}}\" />\n          <Setter Property=\"BorderBrush\"\n                  Value=\"{DynamicResource {x:Static vsfx:VsBrushes.ToolWindowTabMouseOverBorderKey}}\" />\n        </Trigger>\n      </Style.Triggers>\n    </Style>\n  </UserControl.Resources>\n\n  <Grid>\n\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10\" />\n      <ColumnDefinition Width=\"*\" />\n      <ColumnDefinition Width=\"10\" />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"10\" />\n      <RowDefinition Height=\"40\" />\n      <RowDefinition Height=\"15\" />\n      <RowDefinition Height=\"*\" />\n    </Grid.RowDefinitions>\n\n\n    <Grid Grid.Row=\"1\"\n          Grid.Column=\"1\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"9\" />\n        <ColumnDefinition Width=\"30\" />\n        <ColumnDefinition Width=\"40\" />\n        <ColumnDefinition Width=\"40\" />\n        <ColumnDefinition Width=\"40\" />\n        <ColumnDefinition Width=\"40\" />\n        <ColumnDefinition />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"2.5\" />\n        <RowDefinition Height=\"35\" />\n        <RowDefinition Height=\"2.5\" />\n      </Grid.RowDefinitions>\n\n      <CheckBox Grid.Row=\"1\"\n                Grid.Column=\"1\"\n                Width=\"20\"\n                Height=\"20\"\n                VerticalAlignment=\"Center\"\n                HorizontalAlignment=\"Left\"\n                Click=\"CheckAll\"\n                IsChecked=\"{Binding TidyToolWindowModel.IsChecked, Mode=TwoWay}\"\n                Visibility=\"{Binding TidyToolWindowModel.ButtonVisibility}\" />\n      <Button Grid.Row=\"1\"\n              Grid.Column=\"2\"\n              Width=\"30\"\n              Height=\"30\"\n              HorizontalAlignment=\"Left\"\n              ToolTip=\"{Binding TidyToolWindowModel.RefreshTidyIcon.Tooltip}\"\n              IsEnabled=\"{Binding TidyToolWindowModel.RefreshTidyIcon.IsEnabled}\"\n              Command=\"{Binding TidyAllCommand}\"\n              Visibility=\"{Binding TidyToolWindowModel.RefreshTidyIcon.Visibility}\">\n        <Image Source=\"{Binding TidyToolWindowModel.RefreshTidyIcon.IconPath}\"\n               VerticalAlignment=\"Center\"\n               Width=\"16\"\n               Height=\"16\" />\n      </Button>\n\n      <Button Grid.Row=\"1\"\n              Grid.Column=\"3\"\n              Width=\"30\"\n              Height=\"30\"\n              HorizontalAlignment=\"Left\"\n              ToolTip=\"{Binding TidyToolWindowModel.TidyFixIcon.Tooltip}\"\n              IsEnabled=\"{Binding TidyToolWindowModel.TidyFixIcon.IsEnabled}\"\n              Visibility=\"{Binding TidyToolWindowModel.TidyFixIcon.Visibility}\"\n              Command=\"{Binding FixAllCommand}\">\n        <Image Source=\"{Binding TidyToolWindowModel.TidyFixIcon.IconPath}\"\n               VerticalAlignment=\"Center\"\n               Width=\"16\"\n               Height=\"16\" />\n      </Button>\n      <Button Grid.Row=\"1\"\n              Grid.Column=\"4\"\n              Width=\"30\"\n              Height=\"30\"\n              HorizontalAlignment=\"Left\"\n              ToolTip=\"{Binding TidyToolWindowModel.DiscardFixIcon.Tooltip}\"\n              IsEnabled=\"{Binding TidyToolWindowModel.DiscardFixIcon.IsEnabled}\"\n              Visibility=\"{Binding TidyToolWindowModel.DiscardFixIcon.Visibility}\"\n              Command=\"{Binding DiscardAllCommand}\">\n        <Image Source=\"{Binding TidyToolWindowModel.DiscardFixIcon.IconPath}\"\n               VerticalAlignment=\"Center\"\n               Width=\"16\"\n               Height=\"16\" />\n      </Button>\n      <Button Grid.Row=\"1\"\n              Grid.Column=\"5\"\n              Width=\"30\"\n              Height=\"30\"\n              HorizontalAlignment=\"Left\"\n              ToolTip=\"{Binding TidyToolWindowModel.RemoveIcon.Tooltip}\"\n              IsEnabled=\"{Binding TidyToolWindowModel.RemoveIcon.IsEnabled}\"\n              Command=\"{Binding RemoveAllCommand}\"\n              Visibility=\"{Binding TidyToolWindowModel.RemoveIcon.Visibility}\">\n        <Image Source=\"{Binding TidyToolWindowModel.RemoveIcon.IconPath}\"\n               VerticalAlignment=\"Center\"\n               Width=\"16\"\n               Height=\"16\" />\n      </Button>\n    </Grid>\n\n    <Grid Grid.Row=\"1\"\n          Grid.Column=\"1\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"7\" />\n        <ColumnDefinition Width=\"20\" />\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"2.5\" />\n        <RowDefinition Height=\"15\" />\n        <RowDefinition Height=\"5\" />\n      </Grid.RowDefinitions>\n    </Grid>\n\n    <ProgressBar Name=\"pbStatus\"\n                 Grid.Row=\"1\"\n                 Grid.Column=\"1\"\n                 Height=\"13\"\n                 Background=\"Transparent\"\n                 BorderBrush=\"#6d8ca3\"\n                 Foreground=\"#296cba\"\n                 IsIndeterminate=\"True\"\n                 Maximum=\"100\"\n                 Minimum=\"0\"\n                 Visibility=\"{Binding TidyToolWindowModel.ProgressBarVisibility}\" />\n\n    <Separator Background=\"{DynamicResource {x:Static vsfx:VsBrushes.PanelSeparatorKey}}\"\n               VerticalAlignment=\"Center\"\n               Grid.Row=\"2\"\n               Grid.ColumnSpan=\"3\"></Separator>\n\n    <ListView x:Name=\"FilesList\"\n              Grid.Row=\"4\"\n              Grid.Column=\"1\"\n              Background=\"Transparent\"\n              SelectionMode=\"Single\"\n              BorderBrush=\"Transparent\"\n              HorizontalContentAlignment=\"Stretch\"\n              ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\n              Visibility=\"{Binding ListVisibility}\"\n              ItemsSource=\"{Binding Files}\">\n      <ListView.ItemTemplate>\n        <DataTemplate>\n          <Grid>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition Width=\"20\" />\n              <ColumnDefinition Width=\"*\" />\n              <ColumnDefinition Width=\"auto\" />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"30\" />\n            </Grid.RowDefinitions>\n            <CheckBox Grid.Column=\"0\"\n                      Width=\"20\"\n                      Height=\"20\"\n                      VerticalAlignment=\"Center\"\n                      Click=\"CheckBox_Click\"\n                      IsChecked=\"{Binding IsChecked, Mode=TwoWay}\" />\n            <TextBlock Grid.Column=\"1\"\n                       HorizontalAlignment=\"Left\"\n                       VerticalAlignment=\"Center\"\n                       ToolTip=\"{Binding FullFileName}\"\n                       Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\"\n                       Text=\"{Binding FileName}\" />\n            <Button Grid.Column=\"2\"\n                    Width=\"30\"\n                    Height=\"30\"\n                    IsEnabled=\"{Binding DiffIcon.IsEnabled}\"\n                    HorizontalAlignment=\"Right\"\n                    Click=\"DiffButton\"\n                    ToolTip=\"Diff\"\n                    Visibility=\"{Binding DiffIcon.Visibility}\">\n              <Image Source=\"{Binding DiffIcon.IconPath}\"\n                     VerticalAlignment=\"Center\"\n                     Width=\"16\"\n                     Height=\"16\" />\n            </Button>\n            <Button Grid.Column=\"2\"\n                    Width=\"30\"\n                    Height=\"30\"\n                    HorizontalAlignment=\"Right\"\n                    IsEnabled=\"{Binding TidyFixIcon.IsEnabled}\"\n                    Click=\"FixButton\"\n                    ToolTip=\"Fix\"\n                    Visibility=\"{Binding TidyFixIcon.Visibility}\">\n              <Image Source=\"{Binding TidyFixIcon.IconPath}\"\n                     VerticalAlignment=\"Center\"\n                     Width=\"16\"\n                     Height=\"16\" />\n            </Button>\n          </Grid>\n        </DataTemplate>\n      </ListView.ItemTemplate>\n\n      <ListView.GroupStyle>\n        <GroupStyle>\n          <GroupStyle.ContainerStyle>\n            <Style TargetType=\"{x:Type GroupItem}\">\n              <Setter Property=\"Template\">\n                <Setter.Value>\n                  <ControlTemplate>\n                    <Expander Background=\"Transparent\"\n                              BorderThickness=\"1\"\n                              DataContext=\"{Binding Items}\"\n                              Foreground=\"Transparent\"\n                              IsExpanded=\"True\">\n                      <Expander.Header>\n                        <StackPanel Orientation=\"Horizontal\">\n                          <TextBlock VerticalAlignment=\"Top\"\n                                     FontSize=\"14\"\n                                     FontWeight=\"Bold\"\n                                     Margin=\"5,0,0,0\"\n                                     Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\"\n                                     Text=\"{Binding FilesTypeString}\" />\n                        </StackPanel>\n                      </Expander.Header>\n                      <ItemsPresenter />\n                    </Expander>\n                  </ControlTemplate>\n                </Setter.Value>\n              </Setter>\n            </Style>\n          </GroupStyle.ContainerStyle>\n        </GroupStyle>\n      </ListView.GroupStyle>\n    </ListView>\n\n    <Grid Grid.Row=\"3\"\n          Grid.Column=\"1\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"20\" />\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"20\" />\n      </Grid.ColumnDefinitions>\n      <Grid.RowDefinitions>\n        <RowDefinition Height=\"10\" />\n        <RowDefinition Height=\"*\" />\n        <RowDefinition Height=\"*\" />\n      </Grid.RowDefinitions>\n\n      <Border Grid.Column=\"1\"\n              Grid.Row=\"1\"\n              BorderThickness=\"1\"\n              Height=\"200\"\n              BorderBrush=\"Transparent\"\n              Visibility=\"{Binding MessageModel.Visibility}\"\n              CornerRadius=\"5\">\n        <TextBlock Grid.Column=\"1\"\n                   Grid.Row=\"1\"\n                   HorizontalAlignment=\"Center\"\n                   VerticalAlignment=\"Center\"\n                   FontSize=\"17\"\n                   TextWrapping=\"Wrap\"\n                   Text=\"{Binding MessageModel.TextMessage}\"\n                   Foreground=\"{DynamicResource {x:Static vsfx:VsBrushes.WindowTextKey}}\" />\n      </Border>\n    </Grid>\n  </Grid>\n</UserControl>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TidyToolWindowView.xaml.cs",
    "content": "﻿using ClangPowerTools.MVVM.Models;\nusing ClangPowerToolsShared.MVVM.Commands;\nusing ClangPowerToolsShared.MVVM.ViewModels;\nusing System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace ClangPowerTools.Views\n{\n  /// <summary>\n  /// Interaction logic for CompilerSettingsView.xaml\n  /// </summary>\n  public partial class TidyToolWindowView : UserControl\n  {\n    private TidyToolWindowViewModel tidyToolWindowViewModel;\n\n    public TidyToolWindowView()\n    {\n      tidyToolWindowViewModel = new TidyToolWindowViewModel(this);\n      DataContext = tidyToolWindowViewModel;\n      InitializeComponent();\n    }\n\n    public void UpdateView(List<string> filesPath)\n    {\n      tidyToolWindowViewModel.UpdateViewModel(filesPath);\n    }\n\n    public void OpenTidyToolWindow(List<string> filesPath)\n    {\n      tidyToolWindowViewModel.OpenTidyToolWindow(filesPath);\n    }\n\n    private void DiffButton(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = sender as FrameworkElement;\n      var element = elementIndex.DataContext as FileModel;\n      if (element != null)\n      {\n        tidyToolWindowViewModel.DiffFile(element);\n      }\n    }\n\n    private void FixButton(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = sender as FrameworkElement;\n      var element = elementIndex.DataContext as FileModel;\n      if (element != null)\n      {\n        tidyToolWindowViewModel.FixAllFilesAsync(element).SafeFireAndForget();\n      }\n    }\n\n    private void CheckAll(object sender, RoutedEventArgs e)\n    {\n      tidyToolWindowViewModel.CheckOrUncheckAll();\n    }\n    private void CheckBox_Click(object sender, RoutedEventArgs e)\n    {\n      var elementIndex = sender as FrameworkElement;\n      var element = elementIndex.DataContext as FileModel;\n      if (element != null)\n      {\n        tidyToolWindowViewModel.UpdateCheckedNumber(element);\n      }\n    }\n\n    private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)\n    {\n      var item = sender as ListViewItem;\n      var file = item.Content as FileModel;\n      if (item != null && item.IsSelected)\n      {\n        FileCommand.TidyFixDiff(file);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/ToolWindows/FindToolWindow.cs",
    "content": "﻿using Microsoft.VisualStudio.Imaging;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace ClangPowerToolsShared.MVVM.Views.ToolWindows\n{\n  [Guid(WindowGuidString)]\n  public class FindToolWindow : ToolWindowPane\n  {\n    #region Members\n    public const string WindowGuidString = \"b6c99e5a-0649-4973-922a-a1a2a4057aeb\";\n    public const string Title = \"Clang Power Tools - Find\";\n    private object findToolWindowView;\n    private Type mObjType;\n\n    #endregion\n\n    #region Constructors\n\n    public FindToolWindow() : base()\n    {\n      Caption = Title;\n      BitmapImageMoniker = KnownMonikers.ImageIcon;\n      var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(\n        asm => asm.GetName().FullName.Contains(\"ClangPowerToolsLib\"));\n\n      mObjType = assembly.GetType(\"ClangPowerTools.Views.FindToolWindowView\");\n      findToolWindowView = Activator.CreateInstance(mObjType);\n\n      Content = findToolWindowView;\n    }\n\n    public void OpenFindToolWindow(List<string> filesPath)\n    {\n      MethodInfo method = mObjType.GetMethod(\"OpenFindToolWindow\");\n      method.Invoke(findToolWindowView, null);\n    }\n\n    public void RunQuery()\n    {\n      MethodInfo method = mObjType.GetMethod(\"RunQuery\");\n      method.Invoke(findToolWindowView, null);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/ToolWindows/TidyToolWindow.cs",
    "content": "﻿\nusing Microsoft.VisualStudio.Imaging;\nusing Microsoft.VisualStudio.Shell;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\n\nnamespace ClangPowerToolsShared.MVVM.Views.ToolWindows\n{\n  [Guid(WindowGuidString)]\n  public class TidyToolWindow : ToolWindowPane\n  {\n    #region Members\n\n    public const string WindowGuidString = \"e4e2ba26-a455-4c53-adb3-8225fb696f9b\";\n    public const string Title = \"Clang Power Tools - Tidy\";\n    private object tidyToolWindowView;\n    private Type mObjType;\n\n    #endregion\n\n    #region Constructors\n\n    public TidyToolWindow() : base()\n    {\n      Caption = Title;\n      BitmapImageMoniker = KnownMonikers.ImageIcon;\n      var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(\n        asm => asm.GetName().FullName.Contains(\"ClangPowerToolsLib\"));\n\n      mObjType = assembly.GetType(\"ClangPowerTools.Views.TidyToolWindowView\");\n      tidyToolWindowView = Activator.CreateInstance(mObjType);\n\n      Content = tidyToolWindowView;\n    }\n\n    #endregion\n\n    public void UpdateToolWindow(List<string> filesPath)\n    {\n      MethodInfo method = mObjType.GetMethod(\"UpdateView\");\n      method.Invoke(tidyToolWindowView, new object[] { filesPath });\n    }\n\n    public void OpenTidyToolWindow(List<string> filesPath)\n    {\n      MethodInfo method = mObjType.GetMethod(\"OpenTidyToolWindow\");\n      method.Invoke(tidyToolWindowView, new object[] { filesPath });\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TrialExpiredView.xaml",
    "content": "﻿<Window\n  x:Class=\"ClangPowerTools.MVVM.Views.TrialExpiredView\"\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n  xmlns:local=\"clr-namespace:ClangPowerTools\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  Title=\"Trial Expired\"\n  Width=\"760\"\n  Height=\"470\"\n  Icon=\"pack://application:,,,/ClangPowerTools;component/Resources/ClangPowerToolsIco.ico\"\n  ResizeMode=\"NoResize\"\n  WindowStartupLocation=\"CenterScreen\"\n  mc:Ignorable=\"d\">\n  <Grid>\n\n    <Grid.Resources>\n      <Style TargetType=\"{x:Type Hyperlink}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"Foreground\" Value=\"#E2E2E8\" />\n        <Setter Property=\"TextBlock.TextDecorations\" Value=\"{x:Null}\" />\n        <Style.Triggers>\n          <Trigger Property=\"IsMouseOver\" Value=\"True\">\n            <Setter Property=\"Foreground\" Value=\"White\" />\n          </Trigger>\n        </Style.Triggers>\n      </Style>\n    </Grid.Resources>\n\n    <Grid.Background>\n      <ImageBrush ImageSource=\"/ClangPowerTools;component/Resources/LoginBackground.png\" Stretch=\"UniformToFill\" />\n    </Grid.Background>\n\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n      <RowDefinition Height=\"Auto\" />\n    </Grid.RowDefinitions>\n\n    <TextBlock\n      Grid.Row=\"0\"\n      Margin=\"0,50,0,0\"\n      HorizontalAlignment=\"Center\"\n      FontSize=\"24\"\n      Foreground=\"#E2E2E8\"\n      Text=\"Your trial has expired\" />\n\n    <TextBlock\n      Grid.Row=\"1\"\n      Margin=\"0,5,0,0\"\n      HorizontalAlignment=\"Center\"\n      VerticalAlignment=\"Center\"\n      FontSize=\"18\"\n      Foreground=\"#E2E2E8\"\n      Text=\"To continue using the extension, create an account or sign in.\" />\n\n    <Grid Grid.Row=\"2\">\n      <Grid.ColumnDefinitions>\n        <ColumnDefinition Width=\"*\" />\n        <ColumnDefinition Width=\"*\" />\n      </Grid.ColumnDefinitions>\n\n      <Button\n        Name=\"FreeLicenceButton\"\n        Grid.Column=\"0\"\n        Width=\"240\"\n        Height=\"152\"\n        Margin=\"0,50,0,0\"\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        Background=\"Transparent\"\n        BorderThickness=\"0\"\n        Command=\"{Binding PersonalLicense}\">\n        <Button.Content>\n\n          <Grid Width=\"240\" Height=\"152\">\n            <Grid.Background>\n              <SolidColorBrush Opacity=\"0.15\" Color=\"#C383E0\" />\n            </Grid.Background>\n\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"Auto\" />\n              <RowDefinition Height=\"Auto\" />\n              <RowDefinition Height=\"Auto\" />\n            </Grid.RowDefinitions>\n\n            <Image\n              Grid.Row=\"0\"\n              Width=\"53\"\n              Height=\"53\"\n              Margin=\"0,22,0,0\"\n              HorizontalAlignment=\"Center\"\n              Source=\"/ClangPowerTools;component/Resources/iconPersonal.png\" />\n\n            <TextBlock\n              Grid.Row=\"1\"\n              Margin=\"0,18,0,0\"\n              HorizontalAlignment=\"Center\"\n              FontSize=\"18\"\n              Foreground=\"#C6C6D5\"\n              Text=\"Personal Use\" />\n\n            <TextBlock\n              Grid.Row=\"2\"\n              Margin=\"0,9,0,0\"\n              HorizontalAlignment=\"Center\"\n              FontSize=\"14\"\n              Foreground=\"White\"\n              Text=\"Free for hobby and EDU projects\" />\n\n          </Grid>\n        </Button.Content>\n\n        <Button.Template>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border>\n              <Grid>\n                <ContentPresenter />\n                <Grid\n                  x:Name=\"StatusPanel\"\n                  Background=\"White\"\n                  Opacity=\"0\" />\n              </Grid>\n            </Border>\n            <ControlTemplate.Triggers>\n              <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.1\" />\n              </Trigger>\n              <Trigger Property=\"IsPressed\" Value=\"true\">\n                <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.3\" />\n              </Trigger>\n            </ControlTemplate.Triggers>\n          </ControlTemplate>\n        </Button.Template>\n\n      </Button>\n\n      <Button\n        Name=\"CommercialLicenceButton\"\n        Grid.Column=\"1\"\n        Width=\"240\"\n        Height=\"152\"\n        Margin=\"0,50,0,0\"\n        HorizontalAlignment=\"Center\"\n        VerticalAlignment=\"Center\"\n        Background=\"Transparent\"\n        BorderThickness=\"0\"\n        Command=\"{Binding CommercialLicense}\">\n        <Button.Content>\n\n          <Grid Width=\"240\" Height=\"152\">\n            <Grid.Background>\n              <SolidColorBrush Opacity=\"0.30\" Color=\"#C383E0\" />\n            </Grid.Background>\n\n            <Grid.RowDefinitions>\n              <RowDefinition Height=\"Auto\" />\n              <RowDefinition Height=\"Auto\" />\n              <RowDefinition Height=\"Auto\" />\n            </Grid.RowDefinitions>\n\n            <Image\n              Grid.Row=\"0\"\n              Width=\"80\"\n              Height=\"53\"\n              Margin=\"0,22,0,0\"\n              HorizontalAlignment=\"Center\"\n              Source=\"/ClangPowerTools;component/Resources/iconCommercial.png\" />\n\n            <TextBlock\n              Grid.Row=\"1\"\n              Margin=\"0,18,0,0\"\n              HorizontalAlignment=\"Center\"\n              FontSize=\"18\"\n              Foreground=\"#C6C6D5\"\n              Text=\"Commercial Team License\" />\n\n            <TextBlock\n              Grid.Row=\"2\"\n              Margin=\"0,9,0,0\"\n              HorizontalAlignment=\"Center\"\n              FontSize=\"14\"\n              Foreground=\"White\"\n              Text=\"From $39/team/month\" />\n\n          </Grid>\n        </Button.Content>\n\n        <Button.Template>\n          <ControlTemplate TargetType=\"{x:Type Button}\">\n            <Border>\n              <Grid>\n                <ContentPresenter />\n                <Grid\n                  x:Name=\"StatusPanel\"\n                  Background=\"White\"\n                  Opacity=\"0\" />\n              </Grid>\n            </Border>\n            <ControlTemplate.Triggers>\n              <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.1\" />\n              </Trigger>\n              <Trigger Property=\"IsPressed\" Value=\"true\">\n                <Setter TargetName=\"StatusPanel\" Property=\"Opacity\" Value=\"0.3\" />\n              </Trigger>\n            </ControlTemplate.Triggers>\n          </ControlTemplate>\n        </Button.Template>\n\n      </Button>\n\n    </Grid>\n\n\n    <TextBlock\n      Grid.Row=\"3\"\n      Grid.Column=\"1\"\n      Width=\"170\"\n      Height=\"19\"\n      Margin=\"0,60,0,0\"\n      HorizontalAlignment=\"center\"\n      Background=\"Transparent\"\n      Cursor=\"Hand\"\n      FontFamily=\"SegoeUI\"\n      FontSize=\"14\"\n      Foreground=\"#E2E2E8\">\n      <Hyperlink Command=\"{Binding SignIn}\">\n        Already registered? Sign In\n      </Hyperlink>\n    </TextBlock>\n\n  </Grid>\n</Window>\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/Views/TrialExpiredView.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace ClangPowerTools.MVVM.Views\n{\n  /// <summary>\n  /// Interaction logic for License.xaml\n  /// </summary>\n  public partial class TrialExpiredView : Window\n  {\n    public TrialExpiredView()\n    {\n      InitializeComponent();\n      DataContext = new TrialExpiredViewModel(this);\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/WebApi/WebApiUrl.cs",
    "content": "﻿namespace ClangPowerTools.MVVM.WebApi\n{\n  public static class WebApiUrl\n  {\n    private static readonly string appId = \"5d011c6a375f6b5ed9716629\";\n    private static readonly string url = @\"https://account.clangpowertools.com\";\n\n    public static readonly string loginUrl = string.Concat(url, \"/api/\", appId, \"/user/\", \"login\");\n    public static readonly string licenseUrl = string.Concat(url, \"/api/\", appId, \"/license\");\n    public static readonly string forgotPasswordUrl = string.Concat(url, \"/api/\", appId, \"/user/\", \"forgot-password\");\n    public static readonly string signUpUrl = string.Concat(url, \"/api/\", appId, \"/user/\", \"register\");\n    public static readonly string userProfile = string.Concat(url, \"/api/\", appId, \"/user/\", \"profile\");\n    public static readonly string settingsConfig = string.Concat(url, \"/api/\", appId, \"/config\");\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/MVVM/XmlSerializer.cs",
    "content": "﻿using System.IO;\nusing NetSerializer = System.Xml.Serialization.XmlSerializer;\n\nnamespace ClangPowerTools\n{\n  public class XmlSerializer\n  {\n    private static readonly object mMutex = new object();\n\n    public void SerializeToFile(string aFilePath, object obj)\n    {\n      lock (mMutex)\n      {\n        NetSerializer xmlSerializer = new NetSerializer(obj.GetType());\n        using (FileStream fs = new FileStream(aFilePath, FileMode.Create))\n        {\n          using (StreamWriter sw = new StreamWriter(fs))\n          {\n            xmlSerializer.Serialize(sw, obj);\n          }\n        }\n      }\n\n    }\n\n    public T DeserializeFromFile<T>(string aFilePath)\n    {\n      lock (mMutex)\n      {\n        NetSerializer serializer = new NetSerializer(typeof(T));\n        using (FileStream fs = new FileStream(aFilePath, FileMode.Open))\n        {\n          return (T)serializer.Deserialize(fs);\n        }\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputContentModel.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.Output\n{\n  public class OutputContentModel\n  {\n    #region Properties\n\n    public HashSet<TaskErrorModel> Errors { get; set; } = new HashSet<TaskErrorModel>();\n    public List<string> Buffer { get; set; } = new List<string>();\n    public string Text { get; set; }\n    public bool MissingLLVM { get; set; }\n    public bool HasEncodingError { get; set; }\n    public string JsonFilePath { get; set; }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputProcessor.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Error;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace ClangPowerTools.Output\n{\n  public class OutputProcessor\n  {\n    #region Members \n\n    private ErrorDetector mErrorDetector = new ErrorDetector();\n    private readonly int kBufferSize = 5;\n\n\n    #endregion\n\n\n    #region Methods\n\n\n    #region Public methods\n\n\n    public int ProcessData(string aMessage, IVsHierarchy aHierarchy, OutputContentModel aOutputContent)\n    {\n      aOutputContent.Buffer.Add(aMessage);\n\n      var text = String.Join(\"\\n\", aOutputContent.Buffer.ToList()) + \"\\n\";\n\n      if (mErrorDetector.Detect(text, ErrorParserConstants.kJsonCompilationDbFilePathRegex, out Match matchResult))\n      {\n        aOutputContent.JsonFilePath = GetJsonFilePath(matchResult);\n        return VSConstants.S_OK;\n      }\n\n      if (mErrorDetector.HasEncodingError(aMessage))\n      {\n        aOutputContent.HasEncodingError = true;\n      }\n\n      if (CommandControllerInstance.CommandController.GetCurrentCommandId() == CommandIds.kClangFindRun\n        && mErrorDetector.Detect(text, ErrorParserConstants.kMatchMessageRegex, out Match aMatchResultt))\n      {\n        GetOutputAndErrors(text, aHierarchy, out string outputText, out List<TaskErrorModel> aDetectedErrors, ErrorParserConstants.kMatchMessageRegex);\n        aOutputContent.Text = outputText;\n        aOutputContent.Errors.UnionWith(aDetectedErrors);\n        aOutputContent.Buffer.Clear();\n        return VSConstants.S_OK;\n      }\n      else if (CommandControllerInstance.CommandController.GetCurrentCommandId() != CommandIds.kClangFindRun &&\n              mErrorDetector.Detect(text, ErrorParserConstants.kErrorMessageRegex, out Match aMatchResult))\n      {\n        GetOutputAndErrors(text, aHierarchy, out string outputText, out List<TaskErrorModel> aDetectedErrors, ErrorParserConstants.kErrorMessageRegex);\n        aOutputContent.Text = outputText;\n        aOutputContent.Errors.UnionWith(aDetectedErrors);\n        aOutputContent.Buffer.Clear();\n        return VSConstants.S_OK;\n      }\n      else if (kBufferSize <= aOutputContent.Buffer.Count)\n      {\n        aOutputContent.Text = aOutputContent.Buffer[0];\n        aOutputContent.Buffer.RemoveAt(0);\n        return VSConstants.S_OK;\n      }\n\n      return VSConstants.S_FALSE;\n    }\n\n    public bool FindMatchFinishKeyword(string text)\n    {\n      return mErrorDetector.Detect(text, ErrorParserConstants.kNumberMatchesRegex, out Match aMatchResult); ;\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private void GetOutputAndErrors(string aText, IVsHierarchy aHierarchy,\n      out string aOutputText, out List<TaskErrorModel> aDetectedErrors, string parser)\n    {\n      var aOutputBuilder = new StringBuilder();\n      aDetectedErrors = new List<TaskErrorModel>();\n\n      while (mErrorDetector.Detect(aText, parser, out Match aMatchResult))\n      {\n        var detectedError = GetDetectedError(aHierarchy, aMatchResult);\n        if (detectedError != null)\n          aDetectedErrors.Add(detectedError);\n\n        aOutputBuilder.Append(GetOutput(ref aText, aDetectedErrors.Count == 0 ? \"\" : aDetectedErrors.Last().FullMessage));\n      }\n      aOutputText = aOutputBuilder.ToString();\n    }\n\n\n    private TaskErrorModel GetDetectedError(IVsHierarchy aHierarchy, Match aMarchResult)\n    {\n      IBuilder<TaskErrorModel> errorBuilder = new TaskErrorModelBuilder(aHierarchy, aMarchResult);\n      errorBuilder.Build();\n      return errorBuilder.GetResult();\n    }\n\n\n    private string GetOutput(ref string aText, string aSearchedSubstring)\n    {\n      var errorFormatter = new ErrorFormatter();\n      aText = errorFormatter.Format(aText, aSearchedSubstring);\n\n      var substringBefore = aText.SubstringBefore(aSearchedSubstring);\n      var substringAfter = aText.SubstringAfter(aSearchedSubstring);\n\n      aText = substringAfter;\n      return substringBefore + aSearchedSubstring;\n    }\n\n\n    private string GetJsonFilePath(Match match) => match.Groups[1].Value;\n\n    #endregion\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputWindowBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Services;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\n\nnamespace ClangPowerTools.Output\n{\n  public class OutputWindowBuilder : IBuilder<OutputWindowModel>\n  {\n    #region Private Members\n\n\n    /// <summary>\n    /// Output window model instance\n    /// </summary>\n    private OutputWindowModel mOutputWindowModel = new OutputWindowModel();\n\n\n    /// <summary>\n    /// Output window model instance\n    /// </summary>\n    private AsyncPackage mAsyncPackage;\n\n\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Instance constructor\n    /// </summary>\n    /// <param name=\"aDte\"></param>\n    public OutputWindowBuilder(AsyncPackage aPackage, IVsOutputWindow aVsOutputWindow)\n    {\n      mOutputWindowModel.VsOutputWindow = aVsOutputWindow;\n      mAsyncPackage = aPackage;\n    }\n\n\n    #endregion\n\n\n    #region IAsyncBuilder Implementation\n\n\n    public void Build()\n    {\n      // Get the VS Output Window \n      if (null == mOutputWindowModel.VsOutputWindow)\n      {\n        if (VsServiceProvider.TryGetService(typeof(SVsOutputWindow), out object vsOutputWindow))\n          mOutputWindowModel.VsOutputWindow = vsOutputWindow as IVsOutputWindow;\n      }\n\n      if (null == mOutputWindowModel.Pane)\n      {\n        // Get the Pane object\n        Guid generalPaneGuid = mOutputWindowModel.PaneGuid;\n        mOutputWindowModel.VsOutputWindow.GetPane(ref generalPaneGuid, out IVsOutputWindowPane pane);\n\n        // If pane does not exists, create it\n        if (null == pane)\n        {\n          mOutputWindowModel.VsOutputWindow.CreatePane(ref generalPaneGuid, OutputWindowConstants.paneName, 0, 1);\n          mOutputWindowModel.VsOutputWindow.GetPane(ref generalPaneGuid, out pane);\n        }\n        mOutputWindowModel.Pane = pane;\n      }\n    }\n\n    public OutputWindowModel GetResult() => mOutputWindowModel;\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputWindowConstants.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public static class OutputWindowConstants\n  {\n    #region Constants\n\n    public const string paneName = \"Clang Power Tools\";\n    public const string start = \"Start\";\n    public const string done = \"Done\";\n    public static readonly Dictionary<int, string> commandName = new Dictionary<int, string>\n    {\n      {CommandIds.kFindViewMenuId, \"Clang Power Tools opens Find Tool Window\"},\n      {CommandIds.kCompileId, \"Clang Compile\"},\n      {CommandIds.kCompileToolbarId, \"Clang Compile\"},\n      {CommandIds.kTidyId, \"Clang Tidy\"},\n      {CommandIds.kOptimizeIncludesId, \"Clang Optimize Includes\"},\n      {CommandIds.kTidyToolWindowId, \"Clang Tidy\"},\n      {CommandIds.kTidyToolbarId, \"Clang Tidy\"},\n      {CommandIds.kTidyFixId, \"Clang Tidy-Fix\"},\n      {CommandIds.kTidyFixToolbarId, \"Clang Tidy-Fix\"},\n      {CommandIds.kDocumentationHtmlId, \"Clang Generate Documentation Html\"},\n      {CommandIds.kDocumentationYamlId, \"Clang Generate Documentation Yaml\"},\n      {CommandIds.kDocumentationMdId, \"Clang Generate Documentation Md\"},\n      {CommandIds.kClangFormat, \"Clang Format\"},\n      {CommandIds.kClangFind, \"Clang Power Tools opens Find Tool Window\"},\n      {CommandIds.kClangFindRun, \"Clang Find\"},\n      {CommandIds.kClangFormatToolbarId, \"Clang Format\"},\n      {CommandIds.kJsonCompilationDatabase, \"JSON Compilation Database\"}\n    };\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputWindowController.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Commands;\nusing ClangPowerTools.Error;\nusing ClangPowerTools.Events;\nusing ClangPowerTools.Handlers;\nusing ClangPowerTools.Helpers;\nusing ClangPowerTools.Services;\nusing ClangPowerToolsShared.Commands;\nusing EnvDTE80;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Threading;\n\nnamespace ClangPowerTools.Output\n{\n  public class OutputWindowController\n  {\n    #region Members\n\n    private readonly OutputProcessor outputProcessor = new OutputProcessor();\n\n    private IBuilder<OutputWindowModel> outputWindowBuilder;\n\n    private OutputContentModel outputContent = new OutputContentModel();\n\n    public event EventHandler<ErrorDetectedEventArgs> ErrorDetectedEvent;\n\n    public event EventHandler<CloseDataConnectionEventArgs> CloseDataConnectionEvent;\n\n    public event EventHandler<HasEncodingErrorEventArgs> HasEncodingErrorEvent;\n\n    public event EventHandler<JsonFilePathArgs> JsonCompilationDbFilePathEvent;\n\n    #endregion\n\n    #region Properties\n\n    private static Mutex mutex = new Mutex();\n    public List<string> Buffer => outputContent.Buffer;\n\n    public bool IsBufferEmpty => 0 == outputContent.Buffer.Count;\n\n    public HashSet<TaskErrorModel> Errors => outputContent.Errors;\n\n    public bool HasErrors => 0 != outputContent.Errors.Count;\n\n    private IVsHierarchy Hierarchy { get; set; }\n    private int machesNr = 0;\n\n    private HashSet<string> paths;\n    private List<string> tempPaths;\n\n    #endregion\n\n    public OutputWindowController()\n    {\n      paths = new HashSet<string>();\n      tempPaths = new List<string>();\n    }\n\n    #region Methods\n\n    #region Output window operations\n    private Package package;\n    public void Initialize(AsyncPackage aPackage, IVsOutputWindow aVsOutputWindow)\n    {\n      if (null == outputWindowBuilder)\n        outputWindowBuilder = new OutputWindowBuilder(aPackage, aVsOutputWindow);\n\n      outputWindowBuilder.Build();\n      package = aPackage;\n    }\n\n    public void ClearPanel(object sender, ClearEventArgs e) => Clear();\n\n    public void Clear()\n    {\n      outputContent = new OutputContentModel();\n      var outputWindow = outputWindowBuilder.GetResult();\n\n      UIUpdater.InvokeAsync(() =>\n      {\n        outputWindow.Pane.Clear();\n\n      }).SafeFireAndForget();\n    }\n\n    public void Show()\n    {\n      if (!SettingsProvider.CompilerSettingsModel.ShowOutputWindow)\n        return;\n\n      var outputWindow = outputWindowBuilder.GetResult();\n\n      UIUpdater.InvokeAsync(() =>\n      {\n        outputWindow.Pane.Activate();\n        if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        {\n          (dte as DTE2).ExecuteCommand(\"View.Output\", string.Empty);\n        }\n        VsWindowController.Activate(VsWindowController.PreviousWindow);\n      }).SafeFireAndForget();\n    }\n\n    public void Write(string aMessage)\n    {\n      if (string.IsNullOrWhiteSpace(aMessage))\n        return;\n\n      mutex.WaitOne();\n      var outputWindow = outputWindowBuilder.GetResult();\n      outputWindow.Pane.OutputStringThreadSafe(aMessage + \"\\n\");\n      mutex.ReleaseMutex();\n    }\n\n    public void Write(object sender, ClangCommandMessageEventArgs e)\n    {\n      if (e.ClearFlag)\n      {\n        Clear();\n      }\n      Show();\n      Write(e.Message);\n    }\n\n    protected virtual void OnFileHierarchyChanged(object sender, VsHierarchyDetectedEventArgs e)\n    {\n      if (null == e.Hierarchy)\n        return;\n      Hierarchy = e.Hierarchy;\n    }\n\n    #endregion\n\n    #region Data Handlers\n\n    public void GetFilesFromOutput(string output)\n    {\n      if (output == null)\n        return;\n\n      Regex regex = new Regex(ErrorParserConstants.kMatchTidyFileRegex);\n      Match match = regex.Match(output);\n\n      while (match.Success)\n      {\n        paths.Add(match.Groups[1].Value.Trim());\n        match = match.NextMatch();\n      }\n    }\n\n    public void OutputDataReceived(object sender, DataReceivedEventArgs e)\n    {\n      var id = CommandControllerInstance.CommandController.GetCurrentCommandId();\n      if (null == e.Data)\n        return;\n\n      if (id == CommandIds.kTidyId || id == CommandIds.kTidyToolbarId\n        || id == CommandIds.kTidyToolWindowId || id == CommandIds.kTidyFixId\n        || id == CommandIds.kTidyFixToolbarId)\n      {\n        GetFilesFromOutput(e.Data.ToString());\n      }\n\n      mutex.WaitOne();\n      var result = outputProcessor.ProcessData(e.Data, Hierarchy, outputContent);\n      mutex.ReleaseMutex();\n\n      if (VSConstants.S_FALSE == result && \n        !(id == CommandIds.kClangFindRun || id == CommandIds.kClangFind))\n        return;\n\n      if (!string.IsNullOrWhiteSpace(outputContent.JsonFilePath))\n        JsonCompilationDbFilePathEvent?.Invoke(this, new JsonFilePathArgs(outputContent.JsonFilePath));\n\n      //invoke show error event when match keyword was found,\n      //this will be applied on clang-query interactive mode (active document)\n      if ((id == CommandIds.kClangFindRun || id == CommandIds.kClangFind)\n        && (LookInMenuController.GetSelectedMenuItem().LookInMenu == LookInMenu.CurrentActiveDocument)\n        && outputProcessor.FindMatchFinishKeyword(e.Data))\n      {\n        CloseDataConnectionEvent?.Invoke(this, new CloseDataConnectionEventArgs());\n        OnErrorDetected(this, e);\n      }\n\n      // 1 - verbose\n      if (SettingsProvider.CompilerSettingsModel.VerbosityLevel != \"1\"\n        && (id == CommandIds.kClangFindRun || id == CommandIds.kClangFind))\n        return;\n\n      //show full text when find command is running\n      //otherwise show just matched text\n      if (id == CommandIds.kClangFindRun || id == CommandIds.kClangFind)\n        Write(e.Data);\n      else\n        Write(outputContent.Text);\n    }\n\n    public void OutputDataErrorReceived(object sender, DataReceivedEventArgs e)\n    {\n      if (null == e.Data)\n        return;\n\n      mutex.WaitOne();\n      var result = outputProcessor.ProcessData(e.Data, Hierarchy, outputContent);\n      mutex.ReleaseMutex();\n\n      var id = CommandControllerInstance.CommandController.GetCurrentCommandId();\n      if (VSConstants.S_FALSE == result &&\n        !(id == CommandIds.kClangFindRun || id == CommandIds.kClangFind))\n        return;\n\n      if (!string.IsNullOrWhiteSpace(outputContent.JsonFilePath))\n        JsonCompilationDbFilePathEvent?.Invoke(this, new JsonFilePathArgs(outputContent.JsonFilePath));\n\n      // 1 - verbose\n      if (SettingsProvider.CompilerSettingsModel.VerbosityLevel != \"1\" &&\n        (id == CommandIds.kClangFindRun || id == CommandIds.kClangFind))\n        return;\n\n      Write(outputContent.Text);\n    }\n\n    public void ClosedDataConnection(object sender, EventArgs e)\n    {\n      mutex.WaitOne();\n      string outputResult = String.Empty;\n      var id = CommandControllerInstance.CommandController.GetCurrentCommandId();\n\n      tempPaths.Clear();\n      outputResult = String.Join(\"\\n\", Buffer);\n      if(!(id == CommandIds.kClangFindRun || id == CommandIds.kClangFind))\n       Write(outputResult);\n      if (Buffer.Count != 0)\n      {\n        if (id == CommandIds.kClangFindRun)\n        {\n          Regex regex = new Regex(ErrorParserConstants.kNumberMatchesRegex);\n          var matchResult = regex.Match(outputResult);\n          if (matchResult != null && matchResult.Groups[0] != null\n            && matchResult.Groups[0].Value != null\n            && matchResult.Groups[0].Value.ToString() != string.Empty)\n          {\n            machesNr += Int32.Parse(matchResult.Groups[1].Value);\n          }\n        }\n      }\n      CloseDataConnectionEvent?.Invoke(this, new CloseDataConnectionEventArgs());\n\n      OnErrorDetected(this, e);\n\n      //open tidy tool window and pass paths\n      var tidySettings = SettingsProvider.TidySettingsModel;\n      if (id == CommandIds.kTidyToolWindowId || (id == CommandIds.kTidyFixId && !tidySettings.ApplyTidyFix))\n      {\n        foreach (var path in paths)\n        {\n          tempPaths.Add(path);\n        }\n        CommandControllerInstance.CommandController.LaunchCommandAsync\n          (CommandIds.kTidyToolWindowFilesId, CommandUILocation.ContextMenu, tempPaths);\n        paths.Clear();\n      }\n      mutex.ReleaseMutex();\n    }\n\n    public void OnFileHierarchyDetected(object sender, VsHierarchyDetectedEventArgs e)\n    {\n      Hierarchy = e.Hierarchy;\n    }\n\n    #endregion\n\n    public void OnErrorDetected(object sender, EventArgs e)\n    {\n      mutex.WaitOne();\n      if (Errors.Count > 0)\n      {\n        TaskErrorViewModel.Errors = Errors.ToList();\n\n        TaskErrorViewModel.FileErrorsPair = new Dictionary<string, List<TaskErrorModel>>();\n        foreach (var error in TaskErrorViewModel.Errors)\n        {\n          if (TaskErrorViewModel.FileErrorsPair.ContainsKey(error.Document))\n          {\n            TaskErrorViewModel.FileErrorsPair[error.Document].Add(error);\n          }\n          else\n          {\n            TaskErrorViewModel.FileErrorsPair.Add(error.Document, new List<TaskErrorModel>() { error });\n          }\n        }\n\n        ErrorDetectedEvent?.Invoke(this, new ErrorDetectedEventArgs(Errors));\n      }\n      mutex.ReleaseMutex();\n    }\n\n    public void WriteMatchesNr()\n    {\n      Write($\"🔎 We found {machesNr.ToString()} matches\");\n    }\n\n    public void ResetMatchesNr()\n    {\n      machesNr = 0;\n    }\n\n    public void OnEncodingErrorDetected(object sender, EventArgs e)\n    {\n      HasEncodingErrorEvent?.Invoke(this, new HasEncodingErrorEventArgs(outputContent));\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Output/OutputWindowModel.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell.Interop;\nusing System;\n\nnamespace ClangPowerTools.Output\n{\n  /// <summary>\n  /// Contains all the necessary VS Output Window elements\n  /// \n  public class OutputWindowModel\n  {\n    /// <summary>\n    /// Output window instance\n    /// </summary>\n    public IVsOutputWindow VsOutputWindow { get; set; }\n\n    /// <summary>\n    /// The output window pane to display messages\n    /// </summary>\n    public IVsOutputWindowPane Pane { get; set; }\n\n    /// <summary>\n    /// Standard guid for the output window pane \n    /// </summary>\n    public Guid PaneGuid { get; } = new Guid(\"AB9F45E4-2001-4197-BAF5-4B165222AF29\");\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Resources/LICENSE.txt",
    "content": "==============================================================================\nApache License v2.0 with LLVM Exceptions:\n==============================================================================\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n    1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n    2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n    3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n    4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n    5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n    6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n    7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n    8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n    9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n    END OF TERMS AND CONDITIONS\n\n    APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n    Copyright [yyyy] [name of copyright owner]\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n---- LLVM Exceptions to the Apache 2.0 License ----\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into an Object form of such source code, you\nmay redistribute such embedded portions in such Object form without complying\nwith the conditions of Sections 4(a), 4(b) and 4(d) of the License.\n\nIn addition, if you combine or link compiled forms of this Software with\nsoftware that is licensed under the GPLv2 (\"Combined Software\") and if a\ncourt of competent jurisdiction determines that the patent provision (Section\n3), the indemnity provision (Section 9) or other Section of the License\nconflicts with the conditions of the GPLv2, you may retroactively and\nprospectively choose to deem waived or otherwise exclude such Section(s) of\nthe License, but only in their entirety and only with respect to the Combined\nSoftware.\n\n==============================================================================\nSoftware from third parties included in the LLVM Project:\n==============================================================================\nThe LLVM Project contains third party software which is under different license\nterms. All such code will be identified clearly using at least one of two\nmechanisms:\n1) It will be in a separate directory tree with its own `LICENSE.txt` or\n   `LICENSE` file at the top containing the specific license and restrictions\n   which apply to that software, or\n2) It will contain specific license and restriction terms at the top of every\n   file.\n\n==============================================================================\nLegacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):\n==============================================================================\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2007-2019 University of Illinois at Urbana-Champaign.\nAll rights reserved.\n\nDeveloped by:\n\n    LLVM Team\n\n    University of Illinois at Urbana-Champaign\n\n    http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimers.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimers in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the names of the LLVM Team, University of Illinois at\n      Urbana-Champaign, nor the names of its contributors may be used to\n      endorse or promote products derived from this Software without specific\n      prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/ClangTidyModeParametersFactory.cs",
    "content": "﻿namespace ClangPowerTools.Script\n{\n  public class ClangTidyModeParametersFactory\n  {\n    #region Methods \n\n\n    #region Public Methods\n\n    /// <summary>\n    /// Create the clang tidy parameters depending on the tidy mode\n    /// </summary>\n    /// <param name=\"aTidyMode\">The searched tidy mode</param>\n    /// <param name=\"aUseClangTidyFileFlag\">Will be set to True if the clang tidy config file will be used. Will be set to False otherwise</param>\n    /// <returns>Clang tidy parameters</returns>\n    public string Create(string aTidyMode, ref bool aUseClangTidyFileFlag)\n    {\n      if (0 == string.Compare(ComboBoxConstants.kTidyFile, aTidyMode))\n        return UseClangConfigFile(ref aUseClangTidyFileFlag);\n\n      else if (0 == string.Compare(ComboBoxConstants.kCustomChecks, aTidyMode))\n        return GetChecks();\n\n      return string.Empty;\n    }\n\n\n    #endregion\n\n\n    #region Private Methods \n\n\n    /// <summary>\n    /// Get the use clang config file tag \n    /// </summary>\n    /// <returns>The use clang config file tag </returns>\n    private string UseClangConfigFile(ref bool aUseClangTidyFileFlag)\n    {\n      aUseClangTidyFileFlag = true;\n      return ScriptConstants.kTidyFile;\n    }\n\n\n    /// <summary>\n    /// Get the clang tidy parameters from the Custom Checks option page\n    /// </summary>\n    /// <returns></returns>\n    private string GetChecks()\n    {\n      string tidyChecks = SettingsProvider.TidySettingsModel.PredefinedChecks;\n\n      return !string.IsNullOrWhiteSpace(tidyChecks) ?\n        $\",{tidyChecks.Replace(';', ',')}\" :\n        string.Empty;\n    }\n\n    #endregion\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/GenericScriptBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Convertors;\nusing ClangPowerTools.Services;\nusing EnvDTE80;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClangPowerTools.Script\n{\n  /// <summary>\n  /// Contains all the script creation logic and parameters checking for the generic parameters components(environment and settings) \n  /// The result will be a string which represents the way how the power shell script will be called\n  /// </summary>\n  public class GenericScriptBuilder : IBuilder<string>\n  {\n    #region Members\n\n    /// <summary>\n    /// The final result after the build method\n    /// </summary>\n    private string mScript = string.Empty;\n\n    private string mVsEdition;\n    private string mVsVersion;\n    private int mCommandId;\n    private bool jsonCompilationDbActive;\n\n    #endregion\n\n\n    #region Constructor\n\n    /// <summary>\n    /// Instance constructor\n    /// </summary>\n    public GenericScriptBuilder(string aVsEdition, string aVsVersion, int aCommandId, bool jsonCompilation = false)\n    {\n      mVsEdition = aVsEdition;\n      mVsVersion = aVsVersion;\n      mCommandId = aCommandId;\n      jsonCompilationDbActive = jsonCompilation;\n    }\n\n    #endregion\n\n\n    #region Methods\n\n    #region Public Methods\n\n    #region IBuilder Implementation\n\n\n    /// <summary>\n    /// Create the generic script by gathering all the generic parameters from the environment and settings components \n    /// </summary>\n    public void Build()\n    {\n      // Append the General parameters and Tidy parameters from option pages\n      mScript = $\"{GetGeneralParameters()} {(CommandIds.kTidyId == mCommandId || CommandIds.kTidyFixId == mCommandId ? GetTidyParameters() : ScriptConstants.kParallel)}\";\n\n      var formatSettings = SettingsProvider.FormatSettingsModel;\n      var tidySettings = SettingsProvider.TidySettingsModel;\n\n      // Append the clang-format style\n      if (null != formatSettings && null != tidySettings && CommandIds.kTidyFixId == mCommandId && tidySettings.FormatAfterTidy)\n        mScript += $\" {ScriptConstants.kClangFormatStyle} {formatSettings.Style}\";\n\n      // Append the Visual Studio Version and Edition\n      mScript += $\" {ScriptConstants.kVsVersion} {mVsVersion}\";\n\n      // Append the solution path\n      if (VsServiceProvider.TryGetService(typeof(DTE2), out object dte))\n        mScript += $\" {ScriptConstants.kDirectory} '{(dte as DTE2).Solution.FullName}' \";\n    }\n\n\n    /// <summary>\n    /// Get the script after the build process\n    /// </summary>\n    /// <returns>The script which will contain the generic parameters</returns>\n    public string GetResult() => mScript;\n\n\n    #endregion\n\n\n    #endregion\n\n\n    #region Private Methods\n\n    /// <summary>\n    /// Get the parameters from the General option page\n    /// </summary>\n    /// <param name=\"mGeneralOptions\"></param>\n    /// <returns>The parameters from General option page</returns>\n    private string GetGeneralParameters()\n    {\n      var compilerSettings = SettingsProvider.CompilerSettingsModel;\n      var parameters = new StringBuilder();\n\n      // Get the Clang Flags list\n      if (!string.IsNullOrWhiteSpace(compilerSettings.CompileFlags))\n        parameters.Append(GetClangFlagsOption());\n\n      // Get the continue when errors are detected flag \n      if (compilerSettings.ContinueOnError)\n        parameters.Append($\" {ScriptConstants.kContinue}\");\n\n      // Get the verbose level flags\n      VerbosityScriptBuilder verbosityScriptBuilder = new VerbosityScriptBuilder(compilerSettings.VerbosityLevel);\n      verbosityScriptBuilder.Build();\n      parameters.Append(verbosityScriptBuilder.GetResult());\n\n      // Get the projects to ignore list \n      if (!string.IsNullOrWhiteSpace(compilerSettings.ProjectsToIgnore))\n        parameters.Append($\" {ScriptConstants.kProjectsToIgnore} ('{TransformInPowerShellArray(compilerSettings.ProjectsToIgnore)}')\");\n\n      // Get the files to ignore list\n      if (!string.IsNullOrWhiteSpace(compilerSettings.FilesToIgnore))\n        parameters.Append($\" {ScriptConstants.kFilesToIgnore} ('{TransformInPowerShellArray(compilerSettings.FilesToIgnore)}')\");\n\n      // Get the selected Additional Includes type  \n      if (0 == string.Compare(ClangGeneralAdditionalIncludesConvertor.ToString(compilerSettings.AdditionalIncludes), ComboBoxConstants.kSystemIncludeDirectories))\n        parameters.Append($\" {ScriptConstants.kSystemIncludeDirectories}\");\n\n      if (jsonCompilationDbActive)\n        parameters.Append($\" {ScriptConstants.kJsonCompilationDb}\");\n\n      return parameters.ToString();\n    }\n\n\n    /// <summary>\n    /// Get the clang flags in the power shell script format\n    /// </summary>\n    /// <returns>The clang flags</returns>\n    private string GetClangFlagsOption()\n    {\n      var compilerSettings = SettingsProvider.CompilerSettingsModel;\n\n      return string.Format(\"{0} {1}\", ScriptConstants.kClangFlags,\n        compilerSettings.WarningsAsErrors ?\n          $\" ('{ScriptConstants.kTreatWarningsAsErrors}','{TransformInPowerShellArray(compilerSettings.CompileFlags)}')\" :\n          $\" ('{TransformInPowerShellArray(compilerSettings.CompileFlags)}')\");\n    }\n\n\n    /// <summary>\n    /// Transform the UI parameters list in an power shell array \n    /// </summary>\n    /// <param name=\"aParametersList\">The list of UI parameters</param>\n    /// <returns>The power shell array containing the UI parameters</returns>\n    private string TransformInPowerShellArray(string aParametersList) =>\n      string.Join(\"','\", aParametersList.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries));\n\n\n    /// <summary>\n    /// Get the parameters from the Tidy related option page\n    /// </summary>\n    /// <returns></returns>\n    private string GetTidyParameters()\n    {\n      var tidySettings = SettingsProvider.TidySettingsModel;\n\n      // Get the clang tidy parameters depending on the tidy mode\n      var parameters = GetTidyChecks(tidySettings);\n\n      // Append the clang tidy type(tidy / tidy-fix) with / without clang tidy config file option attached  \n      if (!string.IsNullOrWhiteSpace(parameters))\n      {\n        if (tidySettings.UseChecksFrom != ClangTidyUseChecksFrom.TidyFile)\n        {\n          if (parameters.Count() == 3)\n            parameters = parameters.Remove(2, 1);\n          var filePath = Path.Combine(Path.GetTempPath(), \".clang-tidy\");\n          var text = $\"Checks: '{parameters}'\";\n\n          using FileStream fs = new FileStream(filePath, FileMode.Create);\n          using StreamWriter sw = new StreamWriter(fs);\n          sw.Write(text);\n          parameters = AppendClangTidyTypeOption(filePath);\n        }\n        else\n        {\n          parameters = AppendClangTidyTypeOption(parameters);\n        }\n      }\n\n      // Get the header filter option \n      if (!string.IsNullOrWhiteSpace(tidySettings.HeaderFilter))\n        parameters += $\" {GetHeaderFiltersOption()}\";\n\n      // Get the compilation database option\n      if (!string.IsNullOrWhiteSpace(tidySettings.CompilationDatabase))\n        parameters += $\" {GetCompilationDatabaseOption(tidySettings.CompilationDatabase)}\";\n\n      parameters += $\" {ScriptConstants.kParallel}\";\n      return parameters;\n    }\n\n\n    /// <summary>\n    /// Append the clang tidy type(tidy / tidy-fix) with/ without tidy config file option attached\n    /// </summary>\n    /// <param name=\"aParameters\"></param>\n    /// <returns>The <\"aParameters\"> value with the clang tidy type with / without the clang tidy config file option attached</returns>\n    private string AppendClangTidyTypeOption(string aParameters)\n    {\n      return string.Format(\"{0} '{1}'\",\n        (CommandIds.kTidyFixId == mCommandId ? ScriptConstants.kTidyFix : ScriptConstants.kTidy),\n        aParameters);\n    }\n\n\n    /// <summary>\n    /// Get the header filter option from the Clang Tidy Option page\n    /// </summary>\n    /// <returns>Header filter option</returns>\n    private string GetHeaderFiltersOption()\n    {\n      var tidySettings = SettingsProvider.TidySettingsModel;\n\n      return string.Format(\"{0} '{1}'\", ScriptConstants.kHeaderFilter,\n        string.IsNullOrWhiteSpace(ClangTidyHeaderFiltersConvertor.ScriptEncode(tidySettings.HeaderFilter)) ?\n           tidySettings.HeaderFilter :\n           ClangTidyHeaderFiltersConvertor.ScriptEncode(tidySettings.HeaderFilter));\n    }\n\n    private string GetTidyChecks(TidySettingsModel tidyModel)\n    {\n      ClangTidyUseChecksFrom useChecksFrom = tidyModel.UseChecksFrom;\n\n      if (useChecksFrom == ClangTidyUseChecksFrom.CustomChecks)\n      {\n        return ScriptConstants.kTidyCheckFirstElement + tidyModel.CustomChecks.Replace(';', ',').TrimEnd(',');\n      }\n      else if (useChecksFrom == ClangTidyUseChecksFrom.PredefinedChecks)\n      {\n        return ScriptConstants.kTidyCheckFirstElement + tidyModel.PredefinedChecks.Replace(';', ',').TrimEnd(',');\n      }\n      else\n      {\n        return ScriptConstants.kTidyFile;\n      }\n    }\n\n    /// <summary>\n    /// Get the compilation database file option from the Clang Tidy Option page\n    /// </summary>\n    /// <returns>Compilation database file option</returns>\n    private string GetCompilationDatabaseOption(string compilationDatabase)\n    {\n      DirectoryInfo dbPath = new DirectoryInfo(compilationDatabase);\n        return string.Format(\"{0} '{1}'\", ScriptConstants.kCompilationDatabaseDir, dbPath.Parent.FullName);\n    }\n    #endregion\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/ItemRelatedScriptBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Helpers;\nusing EnvDTE;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools.Script\n{\n  public class ItemRelatedScriptBuilder : IBuilder<string>\n  {\n    #region Members\n\n    /// <summary>\n    /// The resulted script after the build method\n    /// </summary>\n    private string mScript = string.Empty;\n\n    /// <summary>\n    /// The current item for which the script will be build\n    /// </summary>\n    private readonly IItem mItem;\n\n    private readonly List<IItem> items;\n\n    private readonly bool jsonCompilationDbActive;\n\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Instance constructor\n    /// </summary>\n    /// <param name=\"aItem\">The current item for which the script will be build</param>\n    /// <param name=\"aSolutionPath\">The path of the VS solution</param>\n    public ItemRelatedScriptBuilder(IItem aItem) => mItem = aItem;\n\n    public ItemRelatedScriptBuilder(IItem aItem, bool jsonCompilationDb) : this(aItem)\n    {\n      jsonCompilationDbActive = jsonCompilationDb;\n    }\n\n    public ItemRelatedScriptBuilder(List<IItem> itemsCollection, bool jsonCompilationDb)\n    {\n      items = itemsCollection;\n      jsonCompilationDbActive = jsonCompilationDb;\n    }\n\n    #endregion\n\n\n    #region Methods\n\n    #region IBuilder Implementation\n\n    /// <summary>\n    /// Get the item related script component\n    /// </summary>\n    /// <returns>Item related script component</returns>\n    public string GetResult() => mScript;\n\n    /// <summary>\n    /// Create the script by gathering all the item related parameters from the environment and settings components \n    /// CAKE\n    /// </summary>\n    public void Build()\n    {\n      if (SolutionInfo.OpenFolderModeActive)\n      {\n        CreateScriptForOpenFolderProjectItem();\n      }\n      else\n      {\n        // Create script for single file / project\n        if (mItem != null)\n        {\n          CreateScriptForSingleFile();\n        }\n        else if (items != null && items.Count > 0)\n        {\n          CreateScriptForFilesCollection();\n        }\n      }\n    }\n\n    private void CreateScriptForSingleFile()\n    {\n      if (mItem is CurrentProjectItem)\n      {\n        CreateScriptForProjectItem();\n      }\n      else if (mItem is CurrentProject)\n      {\n        CreateScriptForProject();\n      }\n    }\n\n    private void CreateScriptForFilesCollection()\n    {\n      if (items[0] is CurrentProjectItem)\n      {\n        CreateScriptForProjectItemCollection();\n      }\n      else if (items[0] is CurrentProject)\n      {\n        CreateScriptForProject();\n      }\n    }\n\n    private void CreateScriptForOpenFolderProjectItem()\n    {\n      var document = DocumentHandler.GetActiveDocument();\n\n      mScript = $\"{mScript} \" +\n        $\"{ScriptConstants.kFile} '{document.FullName}' \";\n    }\n\n    private void CreateScriptForProjectItem()\n    {\n      ProjectItem projectItem = mItem.GetObject() as ProjectItem;\n      string containingProject = projectItem.ContainingProject.FullName;\n\n      var filePath = projectItem.Properties.Item(\"FullPath\").Value;\n      var configuration = ProjectConfigurationHandler.GetConfiguration(projectItem.ContainingProject);\n      var platform = ProjectConfigurationHandler.GetPlatform(projectItem.ContainingProject);\n\n      var projectData = jsonCompilationDbActive ?\n        string.Empty : $\"{ScriptConstants.kProject} '{containingProject}' \";\n\n      mScript = $\"{mScript} {projectData}\" +\n        $\"{ScriptConstants.kFile} '{filePath}' {ScriptConstants.kActiveConfiguration} \" +\n        $\"'{configuration}|{platform}'\";\n    }\n\n    private void CreateScriptForProjectItemCollection()\n    {\n      ProjectItem projectItem = items[0].GetObject() as ProjectItem;\n      string containingProject = projectItem.ContainingProject.FullName;\n\n      var filesPath = string.Join(\"','\", items.Select(projItem => ((ProjectItem)projItem.GetObject()).Properties.Item(\"FullPath\").Value));\n      var configuration = ProjectConfigurationHandler.GetConfiguration(projectItem.ContainingProject);\n      var platform = ProjectConfigurationHandler.GetPlatform(projectItem.ContainingProject);\n\n      var projectData = jsonCompilationDbActive ?\n        string.Empty : $\"{ScriptConstants.kProject} '{containingProject}' \";\n\n      mScript = $\"{mScript} {projectData}\" +\n        $\"{ScriptConstants.kFile} ('{filesPath}') {ScriptConstants.kActiveConfiguration} \" +\n        $\"'{configuration}|{platform}'\";\n    }\n\n    private void CreateScriptForProject()\n    {\n      Project project = mItem.GetObject() as Project;\n      mScript = $\"{mScript} {ScriptConstants.kProject} '{project.FullName}' {ScriptConstants.kActiveConfiguration} \" +\n        $\"'{ProjectConfigurationHandler.GetConfiguration(project)}|{ProjectConfigurationHandler.GetPlatform(project)}'\";\n    }\n\n    #endregion\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/PowerShellWrapper.cs",
    "content": "﻿using ClangPowerTools.Output;\nusing ClangPowerToolsShared.Commands;\nusing ClangPowerToolsShared.MVVM.Constants;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Process = System.Diagnostics.Process;\n\nnamespace ClangPowerTools\n{\n  public static class PowerShellWrapper\n  {\n    #region Properties\n\n    public static DataReceivedEventHandler DataErrorHandler { get; set; }\n    public static DataReceivedEventHandler DataHandler { get; set; }\n    public static EventHandler ExitedHandler { get; set; }\n\n    public static OutputWindowController mOutputWindowController;\n    public static string InteractivCommands { get; set; } = string.Empty;\n    private static bool mInteractiveMode = false;\n    private static Process mInteractiveProcess;\n\n\n    #endregion\n\n    #region Public Methods\n    public static bool StartProcess(string aScript, string aExecutablePath = \"\", bool aRunAsPwsh = false)\n    {\n      Process process = new Process();\n      try\n      {\n        process.StartInfo = new ProcessStartInfo()\n        {\n          FileName = aExecutablePath,\n          RedirectStandardError = true,\n          RedirectStandardOutput = true,\n          CreateNoWindow = true,\n          UseShellExecute = false,\n\n          /*\n          When we are dealing with file paths that contain single quotes, we are running into \n          trouble because whey are messing up our script invocation text. The situation is further \n          complicated by the fact that this invocation is imbricated (invoke inside invoke).\n          Explanation: we are invoking powershell.exe and telling it using -command what to invoke itself, \n          which would be our very own clang-buils.ps1 script. \n\n          All this script invocation command is enveloped in single quotes. One, quick to mind solution \n          would be to use double quotes. However, this is not practical because it would lead to further \n          issues down the road since those strings are interpolated (and the $ sign is valid in a Windows file path).\n\n          We have to keep using single quotes, but make sure that we double escape them when we find them.\n          IMPORTANT: there are single quotes which we should not escape. \n          In order to precisely match the quotes that we need, we are exploiting the following detail:\n          file paths containing single quotes will never have spaces to the left or right of them, but the ones we \n          are not interested in will have space either to the left or the right.\n           */\n          Arguments = Regex.Replace(aScript, @\"([\\w|\\\\])'([\\w|\\\\])\", \"$1''$2\")\n        };\n\n        //Update process.StartInfo.Filename (exe to run) with aExecutablePath depending on\n        //running platform, pwsh or windows powershell.\n        //For pwsh need to add \"-Command\" when running a command (all this for cpt Alias command)\n        if (string.IsNullOrEmpty(aExecutablePath))\n        {\n          process.StartInfo.FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\";\n          //Update arguments and FileName path for Cpt alias added from pwsh\n          if (SettingsProvider.CompilerSettingsModel.Powershell7)\n          {\n            process.StartInfo.FileName = File.Exists(GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)) ?\n              GetFilePathFromEnviromentVar(ScriptConstants.kPwsh) :\n              $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\";\n            if (aRunAsPwsh)\n            {\n              process.StartInfo.Arguments = \"-Command \\\"\" + process.StartInfo.Arguments + \"\\\"\";\n            }\n          }\n        }\n\n        //download include what you use tool and add to PATH\n        string iwyuTool = string.Empty;\n        if (CommandControllerInstance.CommandController.GetCurrentCommandId() == CommandIds.kOptimizeIncludesId)\n        {\n          iwyuTool = DownloadTool(ScriptConstants.kIwyu) + \"\\\\\";\n        }\n        process.StartInfo.EnvironmentVariables[\"Path\"] = CreatePathEnvironmentVariable(iwyuTool);\n        process.StartInfo.EnvironmentVariables[\"CPT_CPULIMIT\"] = GetNumberOfProcessors().ToString();\n\n        var customTidyExecutable = GetCustomTidyPath();\n\n        if (string.IsNullOrWhiteSpace(customTidyExecutable) == false)\n          process.StartInfo.EnvironmentVariables[ScriptConstants.kEnvrionmentTidyPath] = customTidyExecutable;\n\n        process.EnableRaisingEvents = true;\n        process.ErrorDataReceived += DataErrorHandler;\n        process.OutputDataReceived += DataHandler;\n        process.Exited += ExitedHandler;\n        process.Disposed += ExitedHandler;\n\n        RunController.runningProcesses.Add(process);\n\n        process.Start();\n\n        process.BeginErrorReadLine();\n        process.BeginOutputReadLine();\n\n        process.WaitForExit();\n      }\n      catch (Exception e)\n      {\n        process.EnableRaisingEvents = false;\n        process.ErrorDataReceived -= DataErrorHandler;\n        process.OutputDataReceived -= DataHandler;\n        process.Exited -= ExitedHandler;\n        process.Disposed -= ExitedHandler;\n\n        process.Close();\n\n        throw e;\n      }\n      finally\n      {\n        RunController.runningProcesses.Remove(process);\n      }\n      return true;\n    }\n\n    public static bool Invoke(string aScript, bool aRunAsPwsh = false)\n    {\n      if (SettingsProvider.CompilerSettingsModel.Powershell7\n        && string.IsNullOrEmpty(GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)))\n      {\n        SettingsHandler settingsHandler = new SettingsHandler();\n        SettingsProvider.CompilerSettingsModel.Powershell7 = false;\n        settingsHandler.SaveSettings();\n        mOutputWindowController.Write(\"Can't find PowerShell 7 in PATH\");\n        return false;\n      }\n\n      return StartProcess(aScript, aRunAsPwsh: aRunAsPwsh);\n    }\n\n    public static void EndInteractiveMode()\n    {\n      if (mInteractiveProcess == null)\n        return;\n      RunController.runningProcesses.Kill(mInteractiveProcess);\n      {\n        mOutputWindowController.Write(\"❎ Interactive mode deactivated on document\");\n      }\n      if (mInteractiveProcess.HasExited || mInteractiveProcess.Responding == false)\n        mInteractiveProcess = null;\n      mInteractiveMode = false;\n    }\n\n    public static void InvokeInteractiveMode(KeyValuePair<string, string> aKeyValuePair)\n    {\n      if (SettingsProvider.CompilerSettingsModel.Powershell7\n        && string.IsNullOrEmpty(GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)))\n      {\n        mOutputWindowController.Write(\"Can't find PowerShell 7 in PATH\");\n        SettingsHandler settingsHandler = new SettingsHandler();\n        SettingsProvider.CompilerSettingsModel.Powershell7 = false;\n        settingsHandler.SaveSettings();\n        return;\n      }\n\n      mOutputWindowController.Write(\"✅ Interactive mode activated on document: \" + aKeyValuePair.Key);\n\n      if (mInteractiveProcess == null)\n        mInteractiveProcess = new Process();\n      if (mInteractiveMode)\n      {\n        mInteractiveProcess.StandardInput.WriteLine(InteractivCommands);\n      }\n      else\n        try\n        {\n          if (RunController.StopCommandActivated)\n          {\n            return;\n          }\n          mInteractiveProcess.StartInfo = new ProcessStartInfo()\n          {\n            FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\",\n            RedirectStandardError = true,\n            RedirectStandardOutput = true,\n            RedirectStandardInput = true,\n            CreateNoWindow = true,\n            UseShellExecute = false,\n            Arguments = Regex.Replace(aKeyValuePair.Value, @\"([\\w|\\\\])'([\\w|\\\\])\", \"$1''$2\")\n          };\n          mInteractiveProcess.StartInfo.EnvironmentVariables[\"Path\"] = CreatePathEnvironmentVariable();\n          mInteractiveProcess.StartInfo.EnvironmentVariables[\"CPT_CPULIMIT\"] = GetNumberOfProcessors().ToString();\n\n          var customTidyExecutable = GetCustomTidyPath();\n\n          if (string.IsNullOrWhiteSpace(customTidyExecutable) == false)\n            mInteractiveProcess.StartInfo.EnvironmentVariables[ScriptConstants.kEnvrionmentTidyPath] = customTidyExecutable;\n\n          mInteractiveProcess.EnableRaisingEvents = true;\n          mInteractiveProcess.ErrorDataReceived += DataErrorHandler;\n          mInteractiveProcess.OutputDataReceived += DataHandler;\n          mInteractiveProcess.Exited += ExitedHandler;\n          mInteractiveProcess.Disposed += ExitedHandler;\n\n          mInteractiveProcess.Start();\n\n          mInteractiveProcess.BeginErrorReadLine();\n          mInteractiveProcess.BeginOutputReadLine();\n\n          mInteractiveProcess.StandardInput.WriteLine(MatchConstants.SetOutpuDump);\n          mInteractiveProcess.StandardInput.WriteLine(InteractivCommands);\n          mInteractiveMode = true;\n        }\n        catch (Exception e)\n        {\n          mInteractiveProcess.EnableRaisingEvents = false;\n          mInteractiveProcess.ErrorDataReceived -= DataErrorHandler;\n          mInteractiveProcess.OutputDataReceived -= DataHandler;\n          mInteractiveProcess.Exited -= ExitedHandler;\n          mInteractiveProcess.Disposed -= ExitedHandler;\n          mInteractiveProcess.Close();\n          throw e;\n        }\n    }\n\n\n    public static void InvokePassSequentialCommands(Dictionary<string, string> aPathCommandPair)\n    {\n      if (SettingsProvider.CompilerSettingsModel.Powershell7\n        && string.IsNullOrEmpty(GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)))\n      {\n        mOutputWindowController.Write(\"Can't find PowerShell 7 in PATH\");\n        SettingsHandler settingsHandler = new SettingsHandler();\n        SettingsProvider.CompilerSettingsModel.Powershell7 = false;\n        settingsHandler.SaveSettings();\n        return;\n      }\n\n      var id = CommandControllerInstance.CommandController.GetCurrentCommandId();\n      int count = 0;\n\n      mOutputWindowController.Write(\"Will process \" + aPathCommandPair.Count + \" files\");\n      mOutputWindowController.ResetMatchesNr();\n\n      List<Task> tasks = new List<Task>();\n      Parallel.ForEach(aPathCommandPair, pathCommand =>\n      {\n        Process process = new Process();\n        try\n        {\n          if (RunController.StopCommandActivated)\n          {\n            return;\n          }\n          process.StartInfo = new ProcessStartInfo()\n          {\n            FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\",\n            RedirectStandardError = true,\n            RedirectStandardOutput = true,\n            RedirectStandardInput = true,\n            CreateNoWindow = true,\n            UseShellExecute = false,\n            Arguments = Regex.Replace(pathCommand.Value, @\"([\\w|\\\\])'([\\w|\\\\])\", \"$1''$2\")\n          };\n          process.StartInfo.EnvironmentVariables[\"Path\"] = CreatePathEnvironmentVariable();\n          process.StartInfo.EnvironmentVariables[\"CPT_CPULIMIT\"] = GetNumberOfProcessors().ToString();\n\n          var customTidyExecutable = GetCustomTidyPath();\n\n          if (string.IsNullOrWhiteSpace(customTidyExecutable) == false)\n            process.StartInfo.EnvironmentVariables[ScriptConstants.kEnvrionmentTidyPath] = customTidyExecutable;\n\n          process.EnableRaisingEvents = true;\n          process.ErrorDataReceived += DataErrorHandler;\n          process.OutputDataReceived += DataHandler;\n          process.Exited += ExitedHandler;\n          process.Disposed += ExitedHandler;\n          Interlocked.Increment(ref count);\n          mOutputWindowController.Write($\"{count}: {pathCommand.Key}\");\n\n          //Display pathCommand value, if is in verbose mode\n          // 1 - verbose\n          if (int.Parse(SettingsProvider.CompilerSettingsModel.VerbosityLevel) <= 1)\n          {\n            mOutputWindowController.Write($\"{count}: {pathCommand.Value}\");\n          }\n\n          RunController.runningProcesses.Add(process);\n\n          process.Start();\n\n          process.BeginErrorReadLine();\n          process.BeginOutputReadLine();\n\n          process.WaitForExit();\n        }\n        catch (Exception e)\n        {\n          process.EnableRaisingEvents = false;\n          process.ErrorDataReceived -= DataErrorHandler;\n          process.OutputDataReceived -= DataHandler;\n          process.Exited -= ExitedHandler;\n          process.Disposed -= ExitedHandler;\n          process.Close();\n          throw e;\n        }\n      });\n      mOutputWindowController.WriteMatchesNr();\n    }\n\n    /// <summary>\n    /// Get the number of processors that a process will run on\n    /// depend on environment var, NUMBER_OF_PROCESSORS and\n    /// percentage of CPU Limit choosed by user\n    /// </summary>\n    /// <returns></returns>\n    public static int GetNumberOfProcessors()\n    {\n      int processorsNumber = int.Parse(Environment.GetEnvironmentVariable(\"NUMBER_OF_PROCESSORS\"));\n      int cpuLimit = SettingsProvider.CompilerSettingsModel.CpuLimit;\n      return (cpuLimit * processorsNumber) / 100;\n    }\n\n    public static string CreatePathEnvironmentVariable(string aEnvPath = \"\")\n    {\n      var path = Environment.GetEnvironmentVariable(\"Path\");\n      var llvmModel = SettingsProvider.LlvmSettingsModel;\n\n      if (string.IsNullOrEmpty(llvmModel.LlvmSelectedVersion)) return path;\n\n      var llvmVersions = llvmModel.LlvmSelectedVersion.Split('.');\n      // for parallel execution llvm need to be >= 13.0.1\n      if ((Int16.Parse(llvmVersions[0]) >= 13))\n      {\n        if ((Int16.Parse(llvmVersions[0]) == 13)\n          && (Int16.Parse(llvmVersions[1]) == 0)\n          && (Int16.Parse(llvmVersions[2]) == 0))\n        {\n          return path;\n        }\n      }\n      else\n      {\n        CommandControllerInstance.CommandController.DisplayMessage\n          (message: \"⚠ Clang Power Tools requires a minimum LLVM version of 13.0.0 or higher.\");\n        return path;\n      }\n\n      var paths = path.Split(';').ToList();\n      paths.RemoveAt(paths.Count - 1);\n      paths.RemoveAll(ContainsLlvm);\n\n      if (string.IsNullOrWhiteSpace(llvmModel.PreinstalledLlvmPath) == false\n        && llvmModel.LlvmSelectedVersion == llvmModel.PreinstalledLlvmVersion)\n      {\n        paths.Add(llvmModel.PreinstalledLlvmPath);\n      }\n      else\n      {\n        paths.Add(GetUsedLlvmVersionPath(llvmModel.LlvmSelectedVersion));\n      }\n\n      //Add in path include-what-you-use on running optimize includes\n      if (!string.IsNullOrEmpty(aEnvPath))\n      {\n        paths.Add(aEnvPath);\n      }\n      return String.Join(\";\", paths);\n    }\n\n    /// <summary>\n    /// Run a process that download a tool (and returns path) if it wasn't found on disk\n    /// </summary>\n    /// <exception cref=\"Exception\"></exception>\n    public static string DownloadTool(string tool)\n    {\n      var getllvmScriptPath = GetLLVMScriptFilePath();\n\n      Process process = new Process();\n      process.StartInfo.UseShellExecute = false;\n      process.StartInfo.CreateNoWindow = true;\n      process.StartInfo.RedirectStandardInput = true;\n      process.StartInfo.RedirectStandardOutput = true;\n      process.StartInfo.RedirectStandardError = true;\n      process.StartInfo.EnvironmentVariables[\"Path\"] = PowerShellWrapper.CreatePathEnvironmentVariable();\n      process.StartInfo.EnvironmentVariables[\"CPT_CPULIMIT\"] = GetNumberOfProcessors().ToString();\n      process.StartInfo.FileName = $\"{Environment.SystemDirectory}\\\\{ScriptConstants.kPowerShellPath}\";\n\n      //Check if powershell 7 is in Path\n      string powershell = string.Empty;\n      if (SettingsProvider.CompilerSettingsModel.Powershell7)\n      {\n        powershell = ScriptConstants.kScriptBeginning;\n        if (string.IsNullOrEmpty(GetFilePathFromEnviromentVar(ScriptConstants.kPwsh)))\n        {\n          mOutputWindowController.Write(\"Can't find PowerShell 7 in PATH\");\n          SettingsHandler settingsHandler = new SettingsHandler();\n          SettingsProvider.CompilerSettingsModel.Powershell7 = false;\n          settingsHandler.SaveSettings();\n          return string.Empty;\n        }\n      }\n      else\n      {\n        powershell = ScriptConstants.kScriptBeginning;\n      }\n      process.StartInfo.Arguments = powershell + $\" '{getllvmScriptPath}' {tool} \\\"\";\n\n      RunController.runningProcesses.Add(process);\n\n      try\n      {\n        process.Start();\n        process.WaitForExit();\n        while (!process.StandardOutput.EndOfStream)\n        {\n          return process.StandardOutput.ReadLine();\n        }\n      }\n      catch (Exception exception)\n      {\n        throw new Exception(\n            $\"Cannot execute {process.StartInfo.FileName}.\\n{exception.Message}.\");\n      }\n      finally\n      {\n        // Remove the process from the runningProcesses list\n        RunController.runningProcesses.Remove(process);\n      }\n      return string.Empty;\n    }\n\n\n    /// <summary>\n    /// Return file path, if is found in PATH enviroment variables. \n    /// Returns empty string if path can't be found. \n    /// </summary>\n    /// <returns></returns>\n    public static string GetFilePathFromEnviromentVar(string aFile)\n    {\n      var path = Environment.GetEnvironmentVariable(\"Path\");\n      var paths = path.Split(';').ToList();\n\n      //Is file in path - first check\n      string filePath = paths.Find(p => p.Contains(ScriptConstants.kPowershell7PathPart))?.ToString();\n      if (!string.IsNullOrWhiteSpace(filePath))\n      {\n        //Check if file exists on this path\n        string absoluteFilePath = Path.Combine(filePath, aFile);\n        if (File.Exists(absoluteFilePath))\n          return absoluteFilePath;\n      }\n\n      //Search file in all paths - second check\n      var pathResult = paths.Find(p => File.Exists(Path.Combine(p, aFile)));\n      if (!string.IsNullOrEmpty(pathResult))\n      {\n        string absoluteFilePath = Path.Combine(paths.Find(p => File.Exists(Path.Combine(p, aFile))).ToString(), aFile);\n        if (File.Exists(absoluteFilePath))\n          return absoluteFilePath;\n      }\n      return string.Empty;\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private static string GetLLVMScriptFilePath()\n    {\n      var assemblyPath = Assembly.GetExecutingAssembly().Location;\n      var scriptDirectory = assemblyPath.Substring(0, assemblyPath.LastIndexOf('\\\\'));\n\n      return Path.Combine(scriptDirectory, \"Tooling\\\\v1\\\\psClang\", ScriptConstants.kGetLLVMScriptName);\n    }\n\n    private static string GetCustomTidyPath()\n    {\n      var executablePath = SettingsProvider.TidySettingsModel.CustomExecutable;\n\n      return string.IsNullOrWhiteSpace(executablePath) == false ? executablePath : string.Empty;\n    }\n\n    public static string GetClangBuildScriptPath()\n    {\n      var assemblyPath = Assembly.GetExecutingAssembly().Location;\n      var scriptDirectory = assemblyPath.Substring(0, assemblyPath.LastIndexOf('\\\\'));\n\n      return Path.Combine(scriptDirectory, ScriptConstants.ToolingV1, ScriptConstants.kScriptName);\n    }\n\n    private static string GetUsedLlvmVersionPath(string llvmVersion)\n    {\n      var settingsPathBuilder = new SettingsPathBuilder();\n      return settingsPathBuilder.GetLlvmBinPath(llvmVersion);\n    }\n\n    private static bool ContainsLlvm(string input)\n    {\n      return input.ToLower().Contains(\"llvm\");\n    }\n    #endregion\n\n  }\n}\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/RunModeScriptBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing System.IO;\nusing System.Reflection;\n\nnamespace ClangPowerTools.Script\n{\n  public class RunModeScriptBuilder : IBuilder<string>\n  {\n    #region Members \n\n    /// <summary>\n    /// The resulted script after the build\n    /// </summary>\n    private string mScript = string.Empty;\n\n    #endregion\n\n\n    #region Methods\n\n    #region Public Methods\n\n    #region IBuilder Implementation\n\n\n    /// <summary>\n    /// Create the power shell script run mod by setting the execution mode parameters with the main script(clang-build.ps1) file path attached\n    /// </summary>\n    public void Build()\n    {\n      mScript = $\"{ScriptConstants.kScriptBeginning} '{GetScriptFilePath()}'\";\n    }\n\n\n    /// <summary>\n    /// Get the power shell script run mode with the main script(clang-build.ps1) file path attached\n    /// </summary>\n    /// <returns>PowerShell script run mode with the script file attached</returns>\n    public string GetResult() => mScript;\n\n\n    #endregion\n\n\n    #endregion\n\n\n    #region Private Methods\n\n\n    /// <summary>\n    /// Get the power shell main script(clang-build.ps1) file path\n    /// </summary>\n    /// <returns>Script file path</returns>\n    protected string GetScriptFilePath()\n    {\n      var assemblyPath = Assembly.GetExecutingAssembly().Location;\n      var scriptDirectory = assemblyPath.Substring(0, assemblyPath.LastIndexOf('\\\\'));\n\n      return Path.Combine(scriptDirectory, ScriptConstants.ToolingV1, ScriptConstants.kScriptName);\n    }\n\n\n    #endregion\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/RunningProcesses.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Management;\nusing System.Threading;\n\nnamespace ClangPowerTools\n{\n  public class RunningProcesses\n  {\n    #region Members\n\n    private readonly static List<Process> commandProcesses = new List<Process>();\n    private readonly static List<Process> backgroundCommandProcesses = new List<Process>();\n    private readonly bool backgroundProcess = false;\n    private static Mutex mutex = new Mutex();\n\n    #endregion\n\n\n    #region Constructor \n\n    public RunningProcesses(bool background = false)\n    {\n      backgroundProcess = background;\n    }\n\n    #endregion\n\n\n    #region Public Methods\n\n    public void Add(Process aProcess)\n    {\n      mutex.WaitOne();\n      if (backgroundProcess)\n        backgroundCommandProcesses.Add(aProcess);\n      else\n        commandProcesses.Add(aProcess);\n      mutex.ReleaseMutex();\n    }\n\n    public void Add(Process aProcess, bool background = false)\n    {\n      if (background)\n        backgroundCommandProcesses.Add(aProcess);\n      else\n        commandProcesses.Add(aProcess);\n    }\n\n    public bool Exists(bool backgroundRunners)\n    {\n      return backgroundRunners ?\n        backgroundCommandProcesses.Count != 0 : commandProcesses.Count != 0;\n    }\n\n    public void Kill(bool background)\n    {\n      mutex.WaitOne();\n      var processes = GetProcesses(background);\n\n      foreach (var process in processes)\n      {\n        if (process.HasExited || process.Responding == false)\n          continue;\n\n        KillProcessAndChildren(process.Id);\n      }\n\n      Clear(processes);\n      mutex.ReleaseMutex();\n    }\n\n    public void Kill(Process process)\n    {\n      mutex.WaitOne();\n      if (process == null || process.HasExited || process.Responding == false)\n        return;\n      KillProcessAndChildren(process.Id);\n      mutex.ReleaseMutex();\n    }\n\n    public void Remove(Process process)\n    {\n      mutex.WaitOne();\n      commandProcesses.Remove(process);\n      mutex.ReleaseMutex();\n    }\n\n    public void KillById(int aId)\n    {\n      var procees = commandProcesses.FirstOrDefault(p => p.Id == aId);\n      if (null == procees)\n        return;\n      procees.Kill();\n    }\n\n    #endregion\n\n\n    #region Private Methods\n\n    private List<Process> GetProcesses(bool background)\n    {\n      return background ? backgroundCommandProcesses : commandProcesses;\n    }\n\n    private void Clear(List<Process> processes)\n    {\n      processes.ForEach(process => process.Close());\n      processes.Clear();\n    }\n\n    private static void KillProcessAndChildren(int aPid)\n    {\n      // Cannot close 'system idle process'\n      if (aPid == 0)\n        return;\n\n      Process proc = new Process();\n      try\n      {\n        ManagementObjectSearcher searcher = new ManagementObjectSearcher\n          (\"Select * From Win32_Process Where ParentProcessID=\" + aPid);\n        ManagementObjectCollection moc = searcher.Get();\n\n        foreach (ManagementObject mo in moc)\n          KillProcessAndChildren(Convert.ToInt32(mo[\"ProcessID\"]));\n        proc.Close();\n        proc = Process.GetProcessById(aPid);\n        proc.Kill();\n      }\n      catch (Exception)\n      {\n        // The process has already exited.\n        proc.Close();\n      }\n    }\n\n    #endregion\n\n  }\n}\n\n\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/ScriptConstants.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public class ScriptConstants\n  {\n    #region Constants\n\n    public const string kCppProjectGuid = \"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\";\n\n    #region Clang Compile/Tidy constants\n\n    public static readonly List<string> kAcceptedFileExtensionsWithoutHeaders = new List<string>()\n    {   \".c\",\n        \".cpp\",\n        \".cc\",\n        \".cxx\",\n        \".c++\",\n        \".cp\",\n        \".tli\",\n        \".tlh\",\n        \".cu\",\n        \".vcxproj\",\n        \".ixx\"\n    };\n\n    public static readonly List<string> kAcceptedFileExtensions = new List<string>\n      { \".c\",\n        \".cpp\",\n        \".cc\",\n        \".cxx\",\n        \".c++\",\n        \".cp\",\n        \".cu\",\n        \".h\",\n        \".hh\",\n        \".hpp\",\n        \".hxx\",\n        \".tli\",\n        \".tlh\",\n        \".vcxproj\",\n        \".ixx\"\n      };\n\n    public static readonly List<string> kExtendedAcceptedFileExtensions = new List<string>\n      { \".c\",\n        \".cpp\",\n        \".cc\",\n        \".inl\",\n        \".cxx\",\n        \".c++\",\n        \".cp\",\n        \".cu\",\n        \".cs\",\n        \".h\",\n        \".hh\",\n        \".hpp\",\n        \".hxx\",\n        \".tli\",\n        \".tlh\",\n        \".vcxproj\",\n        \".ixx\"\n      };\n\n    public const string kProjectFileExtension = \".vcxproj\";\n    public const string FileExtensionsSelectFile = \"Code files (*.c;*.cpp;*.cxx;*.cc;*.tli;*.tlh;*.h;*.hh;*.hpp;*.hxx;)|*.c;*.cpp;*.cxx;*.cc;*.tli;*.tlh;*.h;*.hh;*.hpp;*.hxx\";\n\n    public const string kCMakeConfigFile = \"cmakelists.txt\";\n\n    public const string kPowerShellPath = @\"WindowsPowerShell\\v1.0\\powershell.exe\";\n    public const string kScriptBeginning = @\"-ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command \"\" &\";\n    public const string kScriptName = \"clang-build.ps1\";\n    public const string kGetLLVMScriptName = \"get-llvm.ps1\";\n    public const string ToolingV1 = @\"Tooling\\v1\";\n    public const string kPowershell7PathPart = \"PowerShell\\\\7\";\n    public const string kPwsh = \"pwsh.exe\";\n    public const string kEnvrionmentTidyPath = \"CLANG_TIDY_PATH\";\n\n\n    public const string kFile = \"-file\";\n    public const string kProject = \"-proj\";\n    public const string kDirectory = \"-dir\";\n    public const string kLiteral = \"-literal\";\n\n    public const string kStringContinue = \"'continue'\";\n    public const string kTreatWarningsAsErrors = \"-Werror\";\n    public const string kParallel = \"-parallel\";\n    public const string kContinue = \"-continue\";\n    public const string kErrorMode = \"-ErrorAction\";\n    public const string kWaringMode = \"-WarningAction\";\n    public const string kInformationMode = \"-InformationAction\";\n    public const string kVerboseMode = \"-Verbose\";\n    public const string kDebugMode = \"-debug\";\n    public const string kSystemIncludeDirectories = \"-treat-sai\";\n\n    public const string kQueryFile = \"clang-query.exe\";\n\n    public const string kTidy = \"-tidy\";\n    public const string kTidyFix = \"-tidy-fix\";\n    public const string kTidyCheckFirstElement = \"-*,\";\n\n    public const string kClangFlags = \"-clang-flags\";\n    public const string kIncludeDirectores = \"-include-dirs\";\n    public const string kProjectsToIgnore = \"-proj-ignore\";\n    public const string kFilesToIgnore = \"-file-ignore\";\n\n    public const string kVsVersion = \"-vs-ver\";\n    public const string kVsEdition = \"-vs-sku\";\n    public const string kActiveConfiguration = \"-active-config\";\n\n    public const string kHeaderFilter = \"-header-filter\";\n    public const string kTidyFile = \".clang-tidy\";\n    public const string kCompilationDatabaseDir = \"-compilation-database-dir\";\n\n    public const string kClangFormatStyle = \"-format-style\";\n\n    #endregion\n\n    #region Clang Format constants\n\n    public const string kClangFormat = \"clang-format.exe\";\n    public const string kClangDoc = \"clang-doc.exe\";\n    public const string kIwyu = \"include-what-you-use.exe\";\n    public const string kIwyuTool = \"iwyu_tool.py\";\n    public const string kIwyuFixIncludes = \"fix_includes.py\";\n    public const string kClangTidy = \"clang-tidy.exe\";\n    public const string kCompilationDBFile = \"compile_commands.json\";\n    public const string kAssumeFilename = \"-assume-filename\";\n    public const string kFallbackStyle = \"-fallback-style\";\n\n    //public const string kSortIncludes = \"-sort-includes\";\n\n    public const string kStyle = \"-style\";\n\n    #endregion\n\n\n    #region JSON Compilation DB\n\n    public const string kJsonCompilationDb = \"-export-jsondb\";\n\n    #endregion\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Script/VerbosityScriptBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing System;\n\nnamespace ClangPowerTools.Script\n{\n  public class VerbosityScriptBuilder : IBuilder<string>\n  {\n    string mVerbosity = string.Empty;\n    string mResultScript = string.Empty;\n\n    public VerbosityScriptBuilder(string aVerbosity) => mVerbosity = \n      Convert.ToString(int.Parse(aVerbosity) + 1);\n\n    public void Build()\n    {\n      mResultScript = \"\";\n      bool finishBuild = false;\n\n      if (mVerbosity != \"1\" && !finishBuild)\n      {\n        mResultScript += $\" {ScriptConstants.kVerboseMode}\";\n      }\n      else if (mVerbosity == \"1\")\n      {\n        finishBuild = true;\n      }\n\n      if (mVerbosity != \"2\" && !finishBuild)\n      {\n        mResultScript += $\" {ScriptConstants.kInformationMode} {ScriptConstants.kStringContinue} \" +\n          $\"{ScriptConstants.kDebugMode} {ScriptConstants.kWaringMode} {ScriptConstants.kStringContinue}\";\n      }\n    }\n\n    public string GetResult()\n    {\n      return mResultScript;\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Services/PowerShellService.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.MVVM.Constants;\nusing System;\nusing System.IO;\nusing System.Net;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace ClangPowerTools.Services\n{\n  public class PowerShellService\n  {\n    #region Members\n\n    public CancellationTokenSource downloadCancellationToken = new();\n\n    private readonly SettingsPathBuilder settingsPathBuilder = new();\n\n    #endregion\n\n\n    #region Public Methods\n\n    public async Task UpdateScriptsAsync()\n    {\n      string scriptUri = PsUpdaterConstants.GitHubUri + PsUpdaterConstants.ClangBuildScript;\n      await DownloadScriptAsync(scriptUri, PsUpdaterConstants.ClangBuildScript);\n      ReplaceScripts();\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private async Task DownloadScriptAsync(string fileUri, string fileName)\n    {\n      string scriptsDirectory = settingsPathBuilder.GetPath(PsUpdaterConstants.PowerShellScriptsFolder);\n      string scriptFullName = Path.Combine(scriptsDirectory, fileName);\n      try\n      {\n        FileSystem.CreateDirectory(scriptsDirectory);\n        using WebClient client = new();\n        await client.DownloadFileTaskAsync(new Uri(fileUri), scriptFullName);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"PowerShell Scripts\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n      }\n    }\n\n    private void ReplaceScripts()\n    {\n      string destFolder = Path.GetDirectoryName(settingsPathBuilder.GetAssemblyLocalPath());\n      destFolder = Path.Combine(destFolder, PsUpdaterConstants.ToolingFolder, PsUpdaterConstants.V1Folder);\n      string sourceFolder = settingsPathBuilder.GetPath(PsUpdaterConstants.PowerShellScriptsFolder);\n\n      try\n      {\n        //Check if file was downloaded, delete destination folder, all files will be automatically downloaded\n        //If file wasn't download, an exception will throw on MoveFile action\n        FileInfo sourceFile = new FileInfo(Path.Combine(sourceFolder, PsUpdaterConstants.ClangBuildScript));\n        if (File.Exists(sourceFile.FullName) && sourceFile.Length > 0)\n        {\n          FileSystem.DeleteDirectory(destFolder);\n        }\n        else {\n          MessageBox.Show(\"The download of clang-build.ps1 cannot be completed due to a potential issue with your internet connection. Please verify your connectivity.\", \"PowerShell Scripts\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n          return;\n        }\n        \n        Directory.CreateDirectory(destFolder);\n        FileSystem.MoveFile(Path.Combine(sourceFolder, PsUpdaterConstants.ClangBuildScript),\n                            Path.Combine(destFolder, PsUpdaterConstants.ClangBuildScript));\n\n        destFolder = Path.Combine(destFolder, PsUpdaterConstants.PsClangFolder);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"PowerShell Scripts\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n\n      ClearFilesAfterReplace();\n      MessageBox.Show(\"PowerShell scripts were updated to the latest version.\", \"PowerShell Scripts\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n    }\n\n    private void ClearFilesAfterReplace()\n    {\n      string scriptsDirectory = settingsPathBuilder.GetPath(PsUpdaterConstants.PowerShellScriptsFolder);\n      try\n      {\n        FileSystem.DeleteDirectory(scriptsDirectory);\n      }\n      catch (Exception e)\n      {\n        MessageBox.Show(e.Message, \"PowerShell Scripts\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n      }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Services/VsServiceProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ClangPowerTools.Services\n{\n  /// <summary>\n  /// Contains all the logic of store and get VS services\n  /// </summary>\n  public static class VsServiceProvider\n  {\n    #region Members\n\n    /// <summary>\n    /// VS Services collection\n    /// </summary>\n    private static Dictionary<Type, object> mServices = new Dictionary<Type, object>();\n\n    #endregion\n\n\n    #region Public Methods\n\n    /// <summary>\n    /// Store the service\n    /// </summary>\n    /// <param name=\"aType\">The type of the service</param>\n    /// <param name=\"aService\">The service instance</param>\n    public static void Register(Type aType, object aService) => mServices.Add(aType, aService);\n\n\n    /// <summary>\n    /// Get the VS service. Throws an exception if the required service was not registered before.\n    /// </summary>\n    /// <param name=\"aType\">The type of the service</param>\n    /// <returns>The VS service object</returns>\n    public static object GetService(Type aType) => mServices[aType];\n\n\n    /// <summary>\n    /// Get the VS service. If the wanted service was not registered before the out parameter will be null.\n    /// </summary>\n    /// <param name=\"aType\">The type of the service</param>\n    /// <param name=\"aService\">The wanted VS service object</param>\n    /// <returns>True if the service was registered before. False otherwise</returns>\n    public static bool TryGetService(Type aType, out object aService)\n    {\n      return mServices.TryGetValue(aType, out aService);\n    }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/SilentFile/SilentFileChangerBuilder.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Services;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants;\n\nnamespace ClangPowerTools.SilentFile\n{\n  public class SilentFileChangerBuilder : IBuilder<SilentFileChangerModel>\n  {\n    #region Members\n\n    private SilentFileChangerModel mSilentFileChangerModel;\n\n    #endregion\n\n\n    #region Constructor\n\n\n    /// <summary>\n    /// Instance constructor\n    /// </summary>\n    /// <param name=\"aSite\">Async package</param>\n    /// <param name=\"aFileName\">The file path of the file for which the changes will be ignored</param>\n    /// <param name=\"aReloadDocument\">True if the file will be reloaded. False otherwise</param>\n    public SilentFileChangerBuilder(string aFileName, bool aReloadDocument)\n    {\n      mSilentFileChangerModel = new SilentFileChangerModel()\n      {\n        DocumentFileName = aFileName,\n        ReloadDocumentFlag = aReloadDocument,\n        IsSuspended = true\n      };\n    }\n\n\n    #endregion\n\n\n    #region IBuilder Implementation\n\n\n    /// <summary>\n    /// Create a new instance of silent file changer model\n    /// </summary>\n    public void Build()\n    {\n      var docData = IntPtr.Zero;\n      try\n      {\n        if (!VsServiceProvider.TryGetService(typeof(SVsRunningDocumentTable), out object vsRunningDocTable) || null == vsRunningDocTable as IVsRunningDocumentTable)\n          return;\n\n        ErrorHandler.ThrowOnFailure((vsRunningDocTable as IVsRunningDocumentTable).FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, \n          mSilentFileChangerModel.DocumentFileName, out IVsHierarchy hierarchy, out uint itemId, out docData, out uint docCookie));\n\n        if ((docCookie == (uint)ShellConstants.VSDOCCOOKIE_NIL) || docData == IntPtr.Zero)\n          return;\n\n        if (!VsServiceProvider.TryGetService(typeof(SVsFileChangeEx), out object vsFileChange) || null == vsFileChange as IVsFileChangeEx)\n          return;\n\n        ErrorHandler.ThrowOnFailure((vsFileChange as IVsFileChangeEx).IgnoreFile(0, mSilentFileChangerModel.DocumentFileName, 1));\n        if (docData == IntPtr.Zero)\n          return;\n\n        var unknown = Marshal.GetObjectForIUnknown(docData);\n        if (!(unknown is IVsPersistDocData))\n          return;\n\n        mSilentFileChangerModel.PersistDocData = (IVsPersistDocData)unknown;\n        if (!(mSilentFileChangerModel.PersistDocData is IVsDocDataFileChangeControl))\n          return;\n\n        mSilentFileChangerModel.FileChangeControl = mSilentFileChangerModel.PersistDocData as IVsDocDataFileChangeControl;\n      }\n      catch (InvalidCastException e)\n      {\n        Trace.WriteLine(\"Exception\" + e.Message);\n      }\n      finally\n      {\n        if (docData != IntPtr.Zero)\n          Marshal.Release(docData);\n      }\n    }\n\n\n    /// <summary>\n    /// Get the silent file changer model constructed earlier\n    /// </summary>\n    /// <returns>Silent file changer model</returns>\n    public SilentFileChangerModel GetResult() => mSilentFileChangerModel;\n\n\n    #endregion\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/SilentFile/SilentFileChangerController.cs",
    "content": "﻿using ClangPowerTools.Builder;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing Microsoft.VisualStudio;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace ClangPowerTools.SilentFile\n{\n  /// <summary>\n  /// Prevent visual studio to ask you if you want to reload the files\n  /// </summary>\n  public class SilentFileChangerController : IDisposable\n  {\n    #region Members\n\n\n    /// <summary>\n    /// Collection of all silent file changer models necessary when tidy-fix is executed\n    /// </summary>\n    private HashSet<SilentFileChangerModel> mSilentFileChangers =\n          new HashSet<SilentFileChangerModel>(new SilentFileChangerEqualityComparer());\n   \n\n    #endregion\n\n\n    #region Methods\n\n\n    #region Public methods\n\n\n    /// <summary>\n    /// Silent all files from a IEnumerable data collection\n    /// </summary>\n    /// <param name=\"aServiceProvider\">Async package instance</param>\n    /// <param name=\"aFilesPath\">Files path collection for the files for which the changes will be ignored</param>\n    public void SilentFiles(IEnumerable<string> aFilesPath)\n    {\n      foreach (var filePath in aFilesPath)\n      {\n        var silentFile = GetNewSilentFileChanger(filePath);\n        mSilentFileChangers.Add(silentFile);\n        Silent(silentFile);\n      }\n    }\n\n\n    /// <summary>\n    /// Silent all open files extracted from a DTE documents data collection\n    /// </summary>\n    /// <param name=\"aServiceProvider\">Async package instance</param>\n    /// <param name=\"aDte\">DTE instance to collect all the documents </param>\n    public void SilentFiles(Documents aDocuments)\n    {\n      foreach (Document doc in aDocuments)\n      {\n        var silentFile = GetNewSilentFileChanger(Path.Combine(doc.Path, doc.Name));\n        mSilentFileChangers.Add(silentFile);\n        Silent(silentFile);\n      }\n    }\n\n\n    #region IDisposable Implementation\n\n    /// <summary>\n    /// Stop ignoring the file changes for all stored files\n    /// </summary>\n    public void Dispose()\n    {\n      foreach (var silentFileChanger in mSilentFileChangers)\n        Resume(silentFileChanger);\n    }\n\n\n    #endregion\n\n\n    #endregion\n\n\n    #region Private Methods\n\n\n    /// <summary>\n    /// Create a new silent file changer model object\n    /// </summary>\n    /// <param name=\"aServiceProvider\">Async package instance</param>\n    /// <param name=\"aFilePath\">The file path of the file for which the changes will be ignored</param>\n    private SilentFileChangerModel GetNewSilentFileChanger(string aFilePath)\n    {\n      IBuilder<SilentFileChangerModel> silentFileChangerBuilder = \n        new SilentFileChangerBuilder(aFilePath, true);\n      silentFileChangerBuilder.Build();\n      var silentFile = silentFileChangerBuilder.GetResult();\n\n      return silentFile;\n    }\n\n\n    /// <summary>\n    /// Ignore all file changes of a file\n    /// </summary>\n    /// <param name=\"aSilentFileChanger\"></param>\n    private void Silent(SilentFileChangerModel aSilentFileChanger)\n    {\n      if (null != aSilentFileChanger.FileChangeControl)\n        ErrorHandler.ThrowOnFailure(aSilentFileChanger.FileChangeControl.IgnoreFileChanges(1));\n    }\n\n\n    /// <summary>\n    /// Stop ignoring the file changes for a certain files\n    /// </summary>\n    public void Resume(SilentFileChangerModel aSilentFileChanger)\n    {\n      if (null == aSilentFileChanger)\n        return;\n\n      if (!aSilentFileChanger.IsSuspended || null == aSilentFileChanger.PersistDocData)\n        return;\n\n      if (null != aSilentFileChanger.PersistDocData && aSilentFileChanger.ReloadDocumentFlag)\n        aSilentFileChanger.PersistDocData.ReloadDocData(0);\n\n      if (!VsServiceProvider.TryGetService(typeof(SVsFileChangeEx), out object vsFileChangeService) || null == vsFileChangeService as IVsFileChangeEx)\n        return;\n\n      var vsFileChange = vsFileChangeService as IVsFileChangeEx;\n      aSilentFileChanger.IsSuspended = false;\n      ErrorHandler.ThrowOnFailure(vsFileChange.SyncFile(aSilentFileChanger.DocumentFileName));\n      ErrorHandler.ThrowOnFailure(vsFileChange.IgnoreFile(0, aSilentFileChanger.DocumentFileName, 0));\n      if (aSilentFileChanger.FileChangeControl != null)\n        ErrorHandler.ThrowOnFailure(aSilentFileChanger.FileChangeControl.IgnoreFileChanges(0));\n    }\n\n\n    #endregion\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/SilentFile/SilentFileChangerEqualityComparer.cs",
    "content": "﻿using ClangPowerTools.SilentFile;\nusing System.Collections.Generic;\n\nnamespace ClangPowerTools\n{\n  public class SilentFileChangerEqualityComparer : IEqualityComparer<SilentFileChangerModel>\n  {\n    #region Public methods\n\n\n    public bool Equals(SilentFileChangerModel obj1, SilentFileChangerModel obj2)\n    {\n      if (obj2 == null && obj1 == null)\n        return true;\n      else if (obj1 == null | obj2 == null)\n        return false;\n      else if (obj1.DocumentFileName.ToLower() == obj2.DocumentFileName.ToLower())\n        return true;\n      else\n        return false;\n    }\n\n    public int GetHashCode(SilentFileChangerModel obj)\n    {\n      return obj.DocumentFileName.GetHashCode();\n    }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/SilentFile/SilentFileChangerModel.cs",
    "content": "﻿using Microsoft.VisualStudio.Shell.Interop;\n\nnamespace ClangPowerTools.SilentFile\n{\n  public class SilentFileChangerModel\n  {\n    #region Members\n\n\n    public string DocumentFileName { get; set; }\n    public IVsPersistDocData PersistDocData { get; set; }\n    public IVsDocDataFileChangeControl FileChangeControl { get; set; }\n    public bool IsSuspended { get; set; }\n    public bool ReloadDocumentFlag { get; set; }\n\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquiggleErrorTag.cs",
    "content": "﻿using Microsoft.VisualStudio.Text.Tagging;\n\nnamespace ClangPowerTools.Squiggle\n{\n  public class SquiggleErrorTag : ErrorTag\n  {\n    public SquiggleErrorTag(string type, string tooltip) : base(type, tooltip) { }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquiggleErrorTagger.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing ClangPowerTools.Error;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Text;\nusing Microsoft.VisualStudio.Text.Tagging;\n\nnamespace ClangPowerTools.Squiggle\n{\n  /// <summary>\n  /// This tagger will provide tags for every word in the buffer that\n  /// matches the word currently under the cursor.\n  /// </summary>\n  public class SquiggleErrorTagger : ITagger<SquiggleErrorTag>\n  {\n    #region Members\n\n    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;\n\n    private int line;\n    private int column;\n    private readonly string squiggleType = \"other error\";\n\n    private ITextBuffer SourceBuffer { get; set; }\n    private ConcurrentQueue<SquiggleModel> Squiggles { get; set; } = new ConcurrentQueue<SquiggleModel>();\n\n    #endregion\n\n    #region Constructor\n\n    public SquiggleErrorTagger(ITextBuffer sourceBuffer)\n    {\n      SourceBuffer = sourceBuffer;\n    }\n\n    #endregion\n\n    #region ITagger<HighlightWordTag> Implementation\n\n    /// <summary>\n    /// Find every instance of CurrentWord in the given span\n    /// </summary>\n    /// <param name=\"spans\">A read-only span of text to be searched for instances of CurrentWord</param>\n    public IEnumerable<ITagSpan<SquiggleErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans)\n    {\n      if (SettingsProvider.CompilerSettingsModel.ShowSquiggles == false)\n        yield break;\n\n      if (Squiggles == null || Squiggles.Count() == 0)\n      {\n        CreateSquiggles();\n        yield break;\n      }\n\n      if (spans.Count == 0)\n        yield break;\n\n      var tempEvent = TagsChanged;\n      if (tempEvent == null)\n        yield break;\n\n      foreach (var errorSquiggle in Squiggles)\n      {\n        yield return new TagSpan<SquiggleErrorTag>(errorSquiggle.Snapshout, errorSquiggle.Squiggle);\n      }\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    private void CreateSquiggles()\n    {\n      if (TaskErrorViewModel.FileErrorsPair == null || TaskErrorViewModel.FileErrorsPair.Count == 0)\n        return;\n\n      var dte = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n      var activeDocument = dte.ActiveDocument;\n\n      if (activeDocument == null)\n        return;\n\n      if (dte.ActiveWindow.Selection is TextSelection == false)\n        return;\n\n      TextSelection textSelection = (TextSelection)dte.ActiveWindow.Selection;\n      if (textSelection == null)\n        return;\n\n      var currentLineNumber = textSelection.CurrentLine;\n\n      if (TaskErrorViewModel.FileErrorsPair.ContainsKey(activeDocument.FullName) == false)\n        return;\n\n      foreach (var error in TaskErrorViewModel.FileErrorsPair[activeDocument.FullName])\n      {\n        var bufferLines = SourceBuffer.CurrentSnapshot.Lines.ToList();\n        line = error.Line.ForceInRange(0, bufferLines.Count - 1);\n\n        var currentLine = SourceBuffer.CurrentSnapshot.GetLineFromLineNumber(line);\n        var currentLineText = currentLine.GetText().TrimEnd();\n\n        if (string.IsNullOrWhiteSpace(currentLineText))\n          continue;\n\n        column = error.Column.ForceInRange(0, currentLineText.Length - 1);\n\n        if (column - 1 >= 0 && column + 1 < currentLineText.Length)\n        {\n          if (currentLineText[column - 1] == ' ' && currentLineText[column] != ' ' && currentLineText[column + 1] == ' ')\n          {\n            ThreadPool.QueueUserWorkItem((object threadContext) =>\n            {\n              var tagSpan = CreateTagSpan(column, 1, error.Text);\n              if(tagSpan != null)\n                Squiggles.Enqueue(tagSpan);\n            });\n            continue;\n          }\n        }\n\n        GetSquiggleValues(bufferLines, currentLineText, out int start, out int length);\n\n        ThreadPool.QueueUserWorkItem((object threadContext) =>\n        {\n          var tagSpan = CreateTagSpan(start, length, error.Text);\n          if(tagSpan != null)\n            Squiggles.Enqueue(tagSpan);\n        });\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private SquiggleModel CreateTagSpan(int start, int length, string tooltip)\n    {\n      try\n      {\n        var snapshotSpan = new SnapshotSpan(SourceBuffer.CurrentSnapshot, start, length);\n        var squiggle = new SquiggleErrorTag(squiggleType, tooltip);\n\n        return new SquiggleModel()\n        {\n          Snapshout = snapshotSpan,\n          Squiggle = squiggle\n        };\n      }\n      catch (Exception)\n      {\n        return null;\n      }\n    }\n\n    private int LengthUntilGivenPosition(List<ITextSnapshotLine> lines)\n    {\n      var count = 0;\n      for (var i = 0; i < line; ++i)\n      {\n        count += lines[i].GetText().Length;\n      }\n\n      return count + column + (line * 2) + 1;\n    }\n\n    private int FindTheBeginning(string text, int start, int iterationValue, out int stepsBack)\n    {\n      stepsBack = 0;\n      for (int i = iterationValue; i >= 0; --i)\n      {\n        if (text[i] == ' ' || text[i] == '\\n' || text[i] == '\\r')\n        {\n          break;\n        }\n        ++stepsBack;\n        --start;\n      }\n\n      return start;\n    }\n\n    private int FindLength(string text, int start)\n    {\n      var length = 0;\n      for (int i = start; i < text.Length; ++i)\n      {\n        if (text[i] == ' ')\n          break;\n\n        ++length;\n      }\n\n      return length;\n    }\n\n    private void GetSquiggleValues(List<ITextSnapshotLine> lines,\n      string text, out int start, out int length)\n    {\n      start = LengthUntilGivenPosition(lines);\n      start = start.ForceInRange(0, SourceBuffer.CurrentSnapshot.GetText().Length - 1);\n      start = FindTheBeginning(text, start, column, out int stepsBack);\n\n      length = FindLength(text, column - stepsBack + 1);\n    }\n\n    #endregion\n\n  }\n\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquiggleErrorTaggerProvider.cs",
    "content": "﻿using System.ComponentModel.Composition;\nusing Microsoft.VisualStudio.Text;\nusing Microsoft.VisualStudio.Text.Editor;\nusing Microsoft.VisualStudio.Text.Operations;\nusing Microsoft.VisualStudio.Text.Tagging;\nusing Microsoft.VisualStudio.Utilities;\n\nnamespace ClangPowerTools.Squiggle\n{\n  /// <summary>\n  /// Export a <see cref=\"IViewTaggerProvider\"/>\n  /// </summary>\n  [Export(typeof(IViewTaggerProvider))]\n  [ContentType(\"text\")]\n  [TagType(typeof(SquiggleErrorTag))]\n  public class SquiggleErrorTaggerProvider : IViewTaggerProvider\n  {\n    #region ITaggerProvider Members\n\n    [Import]\n    internal ITextStructureNavigatorSelectorService TextStructureNavigatorSelector { get; set; }\n\n    /// <summary>\n    /// This method is called by VS to generate the tagger\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    /// <param name=\"textView\"> The text view we are creating a tagger for</param>\n    /// <param name=\"buffer\"> The buffer that the tagger will examine for instances of the current word</param>\n    /// <returns> Returns a HighlightWordTagger instance</returns>\n    public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag\n    {\n      if (textView.TextBuffer != buffer)\n        return null;\n\n      return new SquiggleErrorTagger(buffer) as ITagger<T>;\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquiggleModel.cs",
    "content": "﻿using Microsoft.VisualStudio.Text;\n\nnamespace ClangPowerTools.Squiggle\n{\n  public class SquiggleModel\n  {\n    public SnapshotSpan Snapshout { get; set; }\n\n    public SquiggleErrorTag Squiggle { get; set; }\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquiggleViewModel.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerTools.Squiggle\n{\n  public class SquiggleViewModel\n  {\n    public IEnumerable<SquiggleModel> Squiggles { get; set; }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Squiggle/SquigglesFactory.cs",
    "content": "﻿using ClangPowerTools.Error;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft.VisualStudio.Text;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ClangPowerTools.Squiggle\n{\n  public class SquigglesFactory\n  {\n    #region Members\n\n    private readonly string squiggleType = \"other error\";\n\n    private ITextBuffer SourceBuffer { get; set; }\n    private int line;\n    private int column;\n\n    private const int rangeArea = 100;\n\n    public static List<SquiggleModel> Squiggles { get; set; } = new List<SquiggleModel>();\n\n    #endregion\n\n    #region Constuctor\n\n    public SquigglesFactory(ITextBuffer sourceBuffer)\n    {\n      SourceBuffer = sourceBuffer;\n    }\n\n    #endregion\n\n    #region Public Methods\n\n    public void Create()\n    {\n      if (TaskErrorViewModel.FileErrorsPair == null || TaskErrorViewModel.FileErrorsPair.Count == 0)\n        return;\n\n      var dte = (DTE2)VsServiceProvider.GetService(typeof(DTE2));\n      var activeDocument = dte.ActiveDocument;\n\n      if (activeDocument == null)\n        return;\n\n      if (dte.ActiveWindow.Selection is TextSelection == false)\n        return;\n\n      TextSelection textSelection = (TextSelection) dte.ActiveWindow.Selection;\n      if (textSelection == null)\n        return;\n\n      var currentLineNumber = textSelection.CurrentLine;\n\n      if (TaskErrorViewModel.FileErrorsPair.ContainsKey(activeDocument.FullName) == false)\n        return;\n\n      foreach (var error in TaskErrorViewModel.FileErrorsPair[activeDocument.FullName])\n      {\n        //var min = currentLineNumber - rangeArea <= 1 ? 1 : currentLineNumber - rangeArea;\n        //var max = currentLineNumber + rangeArea >= SourceBuffer.CurrentSnapshot.GetText().Length ?\n        //  SourceBuffer.CurrentSnapshot.GetText().Length - 1 : currentLineNumber + rangeArea;\n\n        //if (error.Line < min || error.Line > max)\n        //  continue;\n\n        var bufferLines = SourceBuffer.CurrentSnapshot.Lines.ToList();\n        line = error.Line.ForceInRange(0, bufferLines.Count - 1);\n\n        var currentLine = SourceBuffer.CurrentSnapshot.GetLineFromLineNumber(line);\n        var currentLineText = currentLine.GetText().TrimEnd();\n\n        if (string.IsNullOrWhiteSpace(currentLineText))\n          continue;\n\n        column = error.Column.ForceInRange(0, currentLineText.Length - 1);\n\n        if (column - 1 >= 0 && column + 1 < currentLineText.Length)\n        {\n          if (currentLineText[column - 1] == ' ' && currentLineText[column] != ' ' && currentLineText[column + 1] == ' ')\n          {\n            Squiggles.Add(CreateTagSpan(column, 1, error.Text));\n            continue;\n          }\n        }\n\n        GetSquiggleValues(bufferLines, currentLineText, out int start, out int length);\n\n        Squiggles.Add(CreateTagSpan(start, length, error.Text));\n      }\n    }\n\n    #endregion\n\n    #region Private Methods\n\n    private SquiggleModel CreateTagSpan(int start, int length, string tooltip)\n    {\n      var snapshotSpan = new SnapshotSpan(SourceBuffer.CurrentSnapshot, start, length);\n      var squiggle = new SquiggleErrorTag(squiggleType, tooltip);\n\n      return new SquiggleModel()\n      {\n        Snapshout = snapshotSpan,\n        Squiggle = squiggle\n      };\n    }\n\n    private int LengthUntilGivenPosition(List<ITextSnapshotLine> lines)\n    {\n      var count = 0;\n      for (var i = 0; i < line; ++i)\n      {\n        count += lines[i].GetText().Length;\n      }\n\n      return count + column + (line * 2) + 1;\n    }\n\n    private int FindTheBeginning(string text, int start, int iterationValue, out int stepsBack)\n    {\n      stepsBack = 0;\n      for (int i = iterationValue; i >= 0; --i)\n      {\n        if (text[i] == ' ' || text[i] == '\\n' || text[i] == '\\r')\n        {\n          break;\n        }\n        ++stepsBack;\n        --start;\n      }\n\n      return start;\n    }\n\n    private int FindLength(string text, int start)\n    {\n      var length = 0;\n      for (int i = start; i < text.Length; ++i)\n      {\n        if (text[i] == ' ')\n          break;\n\n        ++length;\n      }\n\n      return length;\n    }\n\n    private void GetSquiggleValues(List<ITextSnapshotLine> lines,\n      string text, out int start, out int length)\n    {\n      start = LengthUntilGivenPosition(lines);\n      start = start.ForceInRange(0, SourceBuffer.CurrentSnapshot.GetText().Length - 1);\n      start = FindTheBeginning(text, start, column, out int stepsBack);\n\n      length = FindLength(text, column - stepsBack + 1);\n    }\n    \n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/TextOperationsInterfaces/IDetector.cs",
    "content": "﻿using System.Text.RegularExpressions;\n\nnamespace ClangPowerTools.TextOperationsInterfaces\n{\n  public interface IDetector\n  {\n    bool Detect(string aText, string pattern, out Match aMatcheResult);\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/TextOperationsInterfaces/ITextFormatter.cs",
    "content": "﻿namespace ClangPowerTools.TextOperationsInterfaces\n{\n  public interface ITextFormatter\n  {\n    string Format(string aText, string aReplacement);\n\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/clang-build.ps1",
    "content": "﻿<#\n.SYNOPSIS\n    Compiles or tidies up code from Visual Studio .vcxproj project files.\n\n.DESCRIPTION\n    This PowerShell script scans for all .vcxproj Visual Studio projects inside a source directory.\n    One or more of these projects will be compiled or tidied up (modernized), using Clang.\n\n.PARAMETER aSolutionsPath\n    Alias 'dir'. Source directory to find sln files.\n                 Projects will be extracted from each sln.\n\n    Important: You can pass an absolute path to a sln. This way, no file searching will be done, and\n               only the projects from this solution file will be taken into account.\n\n.PARAMETER aVcxprojToCompile\n    Alias 'proj'. Array of project(s) to compile. If empty, all projects found in solutions are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*components').\n\n    Absolute disk paths to vcxproj files are accepted.\n\n    Can be passed as comma separated values.\n\n.PARAMETER aVcxprojToIgnore\n    Alias 'proj-ignore'. Array of project(s) to ignore, from the matched ones.\n    If empty, all already matched projects are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*components').\n\n    Can be passed as comma separated values.\n\n.PARAMETER aVcxprojConfigPlatform\n    Alias 'active-config'. Array of configuration-platform pairs, each pair being separated by |,\n    to be used when processing project files.\n\n    E.g. \"Debug|Win32\", \"Debug|x64\".\n    If not specified, the first configuration-platform found in the current project is used.\n    Projects will be processed for each configuration-platform specified, the ones that are missing will be skipped.\n\n.PARAMETER aCppToCompile\n    Alias 'file'. What cpp(s) to compile from the found project(s). If empty, all CPPs are compiled.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*table').\n\n    Note: If any headers are given then all translation units that include them will be processed.\n\n.PARAMETER aCppToIgnore\n    Alias 'file-ignore'. Array of file(s) to ignore, from the matched ones.\n    Regex matching is supported, using the [regex] prefix (e.g. [regex]'.*table').\n\n    Can be passed as comma separated values.\n\n.PARAMETER aUseParallelCompile\n    Alias 'parallel'. Switch to run in parallel mode, on all logical CPU cores.\n\n.PARAMETER aContinueOnError\n     Alias 'continue'. Switch to continue project compilation even when errors occur.\n\n.PARAMETER aTreatAdditionalIncludesAsSystemIncludes\n     Alias 'treat-sai'. Switch to treat project additional include directories as system includes.\n\n.PARAMETER aClangCompileFlags\n     Alias 'clang-flags'. Flags given to clang++ when compiling project,\n     alongside project-specific defines.\n\n.PARAMETER aTidyFlags\n      Alias 'tidy'. If not empty clang-tidy will be called with given flags, instead of clang++.\n      The tidy operation is applied to whole translation units, meaning all directory headers\n      included in the CPP will be tidied up too. Changes will not be applied, only simulated.\n\n      If aTidyFixFlags is present, it takes precedence over this parameter.\n\n      If '.clang-tidy' value is given, configuration will be read from .clang-tidy file\n      in the closest parent directory.\n\n.PARAMETER aTidyFixFlags\n      Alias 'tidy-fix'. If not empty clang-tidy will be called with given flags, instead of clang++.\n      The tidy operation is applied to whole translation units, meaning all directory headers\n      included in the CPP will be tidied up too. Changes will be applied to the file(s).\n\n      If present, this parameter takes precedence over aTidyFlags.\n\n      If '.clang-tidy' value is given, configuration will be read from .clang-tidy file\n      in the closest parent directory.\n\n.PARAMETER aAfterTidyFixFormatStyle\n      Alias 'format-style'. Used in combination with 'tidy-fix'. If present, clang-tidy will\n      also format the fixed file(s), using the specified style.\n      Possible values: - not present, no formatting will be done\n                       - 'file'\n                           Literally 'file', not a placeholder.\n                           Uses .clang-format file in the closest parent directory.\n                       - 'llvm'\n                       - 'google'\n                       - 'webkit'\n                       - 'mozilla'\n\n.PARAMETER aVisualStudioVersion\n      Alias 'vs-ver'. Version of Visual Studio (VC++) installed and that'll be used for\n      standard library include directories. E.g. 2017.\n\n      Optional. If not given, it will be inferred based on the project toolset version.\n\n.PARAMETER aVisualStudioSku\n      Alias 'vs-sku'. Sku of Visual Studio (VC++) installed and that'll be used for\n      standard library include directories. E.g. Professional.\n\n      If not given, the first detected Visual Studio SKU will be used.\n\n.NOTES\n    Control environment variable values:\n    CPT_CACHEREPO = 0   disables project-loading cache mechanism\n    CPT_LOAD_ALL  = 1   enables deep loading of property sheets, but slows down loading\n    CPT_CPULIMIT  = n   will use n logical processors for compile / tidy jobs, if not \n                        specified then NUMBER_OF_PROCESSORS will be used.\n    CPT_PCH_LIMIT = 1   create PCH when only one file needs to be compiled, by default this limit is 2\n\n    Author: Gabriel Diaconita\n#>\n#Requires -Version 5\nparam( [alias(\"proj\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Filter project(s) to compile/tidy\")]\n       [System.Object[]] $aVcxprojToCompile = @()\n\n     , [alias(\"dir\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Source directory for finding solutions; projects will be found from each sln\")]\n       [string] $aSolutionsPath\n\n     , [alias(\"proj-ignore\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify projects to ignore\")]\n       [System.Object[]] $aVcxprojToIgnore = @()\n\n     , [alias(\"active-config\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Config/platform to be used, e.g. Debug|Win32\")]\n       [string[]] $aVcxprojConfigPlatform = @()\n\n     , [alias(\"file\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Filter file(s) to compile/tidy\")]\n       [System.Object[]] $aCppToCompile = @()\n\n     , [alias(\"file-ignore\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify file(s) to ignore\")]\n       [System.Object[]] $aCppToIgnore = @()\n\n     , [alias(\"parallel\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Compile/tidy/tidy-fix projects in parallel\")]\n       [switch]   $aUseParallelCompile\n\n     , [alias(\"continue\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Allow CPT to continue immediately after encountering an error\")]\n       [switch]   $aContinueOnError\n\n     , [alias(\"resume\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Allow CPT to resume the last session (start from last active project / file number).\")]\n       [switch]   $aResumeAfterError\n\n     , [alias(\"treat-sai\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Treat project additional include directories as system includes\")]\n       [switch]   $aTreatAdditionalIncludesAsSystemIncludes\n\n     , [alias(\"clang-flags\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify compilation flags to CLANG\")]\n       [string[]] $aClangCompileFlags = @()\n\n     , [alias(\"tidy\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify flags to CLANG TIDY\")]\n       [string]   $aTidyFlags\n\n     , [alias(\"tidy-fix\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify flags to CLANG TIDY & FIX\")]\n       [string]   $aTidyFixFlags\n\n     , [alias(\"header-filter\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Enable Clang-Tidy to run on header files\")]\n       [string]   $aTidyHeaderFilter\n\n     , [alias(\"compilation-database-dir\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Specify a path of a directory where compile_commands.json is located.\")]\n       [string]   $aCompilationDatabaseDir\n\n     , [alias(\"format-style\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Used with 'tidy-fix'; tells CLANG TIDY-FIX to also format the fixed file(s)\")]\n       [string]   $aAfterTidyFixFormatStyle\n\n     , [alias(\"vs-ver\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Version of Visual Studio toolset to use for loading project\")]\n       [string]   $aVisualStudioVersion\n\n     , [alias(\"vs-sku\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Edition of Visual Studio toolset to use for loading project\")]\n       [string]   $aVisualStudioSku\n       \n     , [alias(\"export-jsondb\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"Switch to generate a JSON compilation database file, in the current working directory\")]\n       [switch]   $aExportJsonDB\n     )\n\nSet-StrictMode -version latest\n$ErrorActionPreference = 'Continue'\n\n# System Architecture Constants\n# ------------------------------------------------------------------------------------------------\n\nSet-Variable -name kCptGithubRepoBase -value `\n\"https://raw.githubusercontent.com/Caphyon/clang-power-tools/master/ClangPowerTools/ClangPowerToolsShared/Tooling/v1/\" `\n                                      -option Constant\nSet-Variable -name kPsMajorVersion    -value (Get-Host).Version.Major   -Option Constant \n# ------------------------------------------------------------------------------------------------\n# Return Value Constants\n\nSet-Variable -name kScriptFailsExitCode      -value  47                 -option Constant\n\n# ------------------------------------------------------------------------------------------------\n# File System Constants\n\nSet-Variable -name kExtensionVcxproj         -value \".vcxproj\"          -option Constant\nSet-Variable -name kExtensionSolution        -value \".sln\"              -option Constant\nSet-Variable -name kExtensionSolutionXml     -value \".slnx\"             -option Constant\nSet-Variable -name kExtensionYaml            -value \".yaml\"             -option Constant\nSet-Variable -name kExtensionClangPch        -value \".clang.pch\"        -option Constant\nSet-Variable -name kExtensionC               -value \".c\"                -option Constant\n\n\n# ------------------------------------------------------------------------------------------------\n# Envinroment Variables for controlling logic\n\nSet-Variable -name kVarEnvClangTidyPath     -value \"CLANG_TIDY_PATH\"-option Constant\n\n# ------------------------------------------------------------------------------------------------\n# Clang-Related Constants\n\nSet-Variable -name kClangFlagSupressLINK    -value @(\"-fsyntax-only\")   -option Constant\nSet-Variable -name kClangFlagIncludePch     -value \"-include-pch\"       -option Constant\nSet-Variable -name kClangFlagFasterPch      -value \"-fpch-instantiate-templates\" -option Constant\nSet-Variable -name kClangFlagMinusO         -value \"-o\"                 -option Constant\n\nSet-Variable -name kClangDefinePrefix       -value \"-D\"                 -option Constant\nSet-Variable -name kClangFlagNoUnusedArg    -value \"-Wno-unused-command-line-argument\" `\n                                                                        -option Constant\nSet-Variable -name kClangFlagNoMsInclude    -value \"-Wno-microsoft-include\" `\n                                                                        -Option Constant\nSet-Variable -name kClangFlagFileIsCPP      -value \"-x c++\"             -option Constant\nSet-Variable -name kClangFlagFileIsC        -value \"-x c\"               -option Constant\nSet-Variable -name kClangFlagForceInclude   -value \"-include\"           -option Constant\nSet-Variable -name kClangTidyFixExportFixes -value \"--export-fixes=\"    -option Constant\n\n\nSet-Variable -name kClangCompiler           -value \"clang++.exe\"        -option Constant\n\nSet-Variable -name kQuiet           -value '-quiet'  -option Constant\nSet-Variable -name kEndOptionMarker -value \"--\"      -option Constant\n\nSet-Variable -name kClangTidyFlagHeaderFilter -value \"-header-filter=\"  -option Constant\nSet-Variable -name kClangTidyFlagChecks       -value \"-checks=\"         -option Constant\nSet-Variable -name kClangTidyUseFile          -value \".clang-tidy\"      -option Constant\nSet-Variable -name kClangTidyFormatStyle      -value \"-format-style=\"   -option Constant\nSet-Variable -name kClangTidyCompilationDatabaseDir -value \"-p=\"        -option Constant\n\nSet-Variable -name kClangTidyFlagTempFile     -value \"\"\n\nSet-Variable -name kCptRegHiveSettings         -value \"HKCU:SOFTWARE\\Caphyon\\Clang Power Tools\"             -option Constant\nSet-Variable -name kCptVsixSettings            -value \"${env:APPDATA}\\ClangPowerTools\\settings.json\"        -option Constant\nSet-Variable -name kCptTidyFixReplacementsDir  -value \"${env:APPDATA}\\ClangPowerTools\\TidyFixReplacements\" -option Constant\n\n# ------------------------------------------------------------------------------------------------\n\nFunction cpt:getSetting([string] $name)\n{\n  if ((Test-Path $kCptVsixSettings))\n  {\n    $settingsJson = ( (Get-Content -Raw -Path $kCptVsixSettings) | ConvertFrom-Json)\n    $settingField = $settingsJson.Where{ $_ | Get-Member $name }\n    if (!$settingField)\n    {\n      return $null\n    }\n    \n    return $settingField.$name\n  }\n  return $null\n}\n\n# We define this separately from the implementation in io.ps1 because that may not yet be present and \n# in order to download it we need the connection-status greenlight.\nFunction cpt:testInternetConnectivity\n{  \n  $resp = Get-WmiObject -Class Win32_PingStatus -Filter 'Address=\"github.com\" and Timeout=100' | Select-Object ResponseTime\n  [bool] $hasInternetConnectivity = ($resp.ResponseTime -and $resp.ResponseTime -gt 0)\n  return $hasInternetConnectivity\n}\n\n# Include required scripts, or download them from Github, if necessary\n\nFunction cpt:ensureScriptExists( [Parameter(Mandatory=$true)] [string] $scriptName\n                               , [Parameter(Mandatory=$false)][bool]   $forceRedownload\n                               )\n{\n  [string] $scriptFilePath = \"$PSScriptRoot/psClang/$scriptName\"\n  if ( $forceRedownload -or (! (Test-Path $scriptFilePath)) )\n  {\n    Write-Verbose \"Download required script $scriptName ...\"\n    [string] $request = \"$kCptGithubRepoBase/psClang/$scriptName\"\n\n    if ( ! (Test-Path \"$PSScriptRoot/psClang\"))\n    {\n      New-Item \"$PSScriptRoot/psClang\" -ItemType Directory > $null\n    }\n\n    # Invoke-WebRequest has an issue when displaying progress on PowerShell 7, it won't go away\n    # and will keep nagging the user, and on PS5 it causes slow transfers  => we supress it.\n    \n    $prevPreference = $progressPreference\n    $ProgressPreference = \"SilentlyContinue\"\n    \n    Invoke-WebRequest -Uri $request -OutFile $scriptFilePath\n    (Get-Content $scriptFilePath -Raw).Replace(\"`n\",\"`r`n\") | Set-Content $scriptFilePath -Force -NoNewline\n\n    $ProgressPreference = $prevPreference\n    \n    if (! (Test-Path $scriptFilePath))\n    {\n      Write-Error \"Could not download required script file ($scriptName). Aborting...\"\n      exit 1\n    }\n  }\n\n  return $scriptFilePath\n}\n\n[bool] $shouldRedownloadForcefully = $false\n[Version] $cptVsixVersion = cpt:getSetting \"Version\"\nWrite-Verbose \"Current Clang Power Tools VSIX version: $cptVsixVersion\"\n\n$kLogicalCoreCount = 4;\nif($Env:NUMBER_OF_PROCESSORS -match \"^\\d+$\")\n{\n  $kLogicalCoreCount = $Env:NUMBER_OF_PROCESSORS\n  if($Env:CPT_CPULIMIT -match \"^\\d+$\")\n  {\n    $kLogicalCoreCount = $Env:CPT_CPULIMIT\n  }\n  #Set-Variable -name kLogicalCoreCount -value $Env:CPT_CPULIMIT   -option Constant\n}\n\n# If the main script has been updated meanwhile, we invalidate all other scripts, and force\n# them to update from github. We need to watch for this because older CPT VS Extensions (before v7.9)\n# did not updated all helper scripts, but a list of predefined ones; we need to update the new ones as well.\nif ( ( ![string]::IsNullOrWhiteSpace($cptVsixVersion) -and \n        [Version]::new($cptVsixVersion) -lt [Version]::new(7, 9, 0) ) -and\n     (Test-Path $kCptRegHiveSettings) )\n{\n  Write-Verbose \"Checking to see if we should redownload script helpers...\"\n  $regHive = Get-Item -LiteralPath $kCptRegHiveSettings\n  $currentHash = (Get-FileHash $PSCommandPath -Algorithm \"SHA1\").Hash\n  $savedHash = $regHive.GetValue('ScriptContentHash');\n\n  # we used to rely on timestamps but it's unreliable so make sure to clean up the reg value\n  if ($regHive.GetValue('ScriptTimestamp'))\n  {\n    Remove-ItemProperty -path $kCptRegHiveSettings -name 'ScriptTimestamp'\n  }\n\n  if (! (cpt:testInternetConnectivity) )\n  {\n    Write-Verbose \"No internet connectivity. Postponing helper scripts update from github...\"\n  }\n  \n  [string] $featureDisableValue = '42'\n  if ( (cpt:testInternetConnectivity) -and \n      ($savedHash -ne $currentHash) -and\n      ($savedHash -ne $featureDisableValue) )\n  {\n    Write-Verbose \"Detected changes in main script. Will redownload helper scripts from Github...\"\n    Write-Verbose \"Current main script SHA1: $currentHash. Saved SHA1: $savedHash\"\n    Set-ItemProperty -path $kCptRegHiveSettings -name 'ScriptContentHash' -value $currentHash\n    $shouldRedownloadForcefully = $true\n  }\n}\n\n@( \"io.ps1\"\n , \"visualstudio-detection.ps1\"\n , \"msbuild-expression-eval.ps1\"\n , \"msbuild-project-data.ps1\"\n , \"msbuild-project-load.ps1\"\n , \"msbuild-project-cache-repository.ps1\"\n , \"get-header-references.ps1\"\n , \"itemdefinition-context.ps1\"\n , \"jsondb-export.ps1\"\n , \"get-llvm-helper.ps1\"\n)                                                                        |\nForEach-Object { cpt:ensureScriptExists $_ $shouldRedownloadForcefully } |\nForEach-Object { . $_ }\n\nWrite-InformationTimed \"Imported scripts\"\n\n#-------------------------------------------------------------------------------------------------\n# do not include in list above because it is an invokable script, dot-sourcing does not work.\n\ncpt:ensureScriptExists \"get-llvm.ps1\" $shouldRedownloadForcefully | Out-Null\n\n#-------------------------------------------------------------------------------------------------\n# we may have a custom path for Clang-Tidy. Use it if that's the case.\n\n[string] $customTidyPath = (Get-QuotedPath -path ([Environment]::GetEnvironmentVariable($kVarEnvClangTidyPath)))\nif (![string]::IsNullOrWhiteSpace($customTidyPath))\n{\n  Set-Variable -name kClangTidy                         -value $customTidyPath                    -option Constant\n}\nelse\n{\n  Set-Variable -name kClangTidy                         -value \"clang-tidy.exe\"                   -option Constant\n  Set-Variable -name kClangApplyReplacements            -value \"clang-apply-replacements.exe\"     -option Constant\n}\n\nSet-Variable -name kCacheRepositorySaveIsNeeded -value $false \n\n#-------------------------------------------------------------------------------------------------\n# Custom Types\n\n\nWrite-InformationTimed \"Before .NET enum types\"\n\nif ($kPsMajorVersion -lt 5)\n{\nAdd-Type -TypeDefinition @\"\n  public enum WorkloadType\n  {\n    Compile,\n    Tidy,\n    TidyFix\n  }\n\"@\n\nAdd-Type -TypeDefinition @\"\n  public enum StopReason\n  {\n    Unknown,\n    ConfigurationNotFound\n  }\n\"@\n}\nelse \n{\n  # this is much faster if PowerShell supports enums, we will save some time\n  Invoke-Expression @\"\n  enum WorkloadType \n  {\n    Compile\n    Tidy\n    TidyFix\n  }\n\n  enum StopReason \n  {\n    Unknown\n    ConfigurationNotFound\n  }\n\"@\n}\n\nWrite-InformationTimed \"Created .NET enum types\"\n#-------------------------------------------------------------------------------------------------\n# Global variables\n\n# temporary files created during project processing (e.g. PCH files)\n[System.Collections.ArrayList] $global:FilesToDeleteWhenScriptQuits = @()\n\n# filePath-fileData for SLN files located in source directory\n[System.Collections.Generic.Dictionary[String,String]] $global:slnFiles = @{}\n\n# flag to signal when errors are encounteres during project processing\n[Boolean]                      $global:FoundErrors                  = $false\n\n# directory path where tidy fix replacement files will be stored\n[string] $global:tidyFixReplacementDirPath = \"\"\n\n# default ClangPowerTools version of visual studio to use\n[string] $global:cptDefaultVisualStudioVersion = \"2017\"\n\n[string[]] $global:cptIgnoredFilesPool = @()\n\n# holds file items to process and their contextual properties (inherited + locally defined)\n[System.Collections.Hashtable] $global:cptFilesToProcess = @{}\n\n#-------------------------------------------------------------------------------------------------\n# Global functions\n\nFunction Exit-Script([Parameter(Mandatory=$false)][int] $code = 0)\n{\n  Write-Verbose-Array -array $global:FilesToDeleteWhenScriptQuits `\n                      -name \"Cleaning up PCH temporaries\"\n  # Clean-up\n  foreach ($file in $global:FilesToDeleteWhenScriptQuits)\n  {\n    Remove-Item -LiteralPath $file -ErrorAction SilentlyContinue > $null\n  }\n\n  if ($aTidyFixFlags)\n  {\n    Write-Verbose \"Cleaning up temporaries tidy-fix replacements\"\n    Remove-Item -path $global:tidyFixReplacementDirPath -Recurse -ErrorAction SilentlyContinue > $null\n  }\n    \n  # Restore working directory\n  Pop-Location\n\n  exit $code\n}\n\nFunction Fail-Script([parameter(Mandatory=$false)][string] $msg = \"Got errors.\")\n{\n  if (![string]::IsNullOrEmpty($msg))\n  {\n    Write-Err $msg\n  }\n  Exit-Script($kScriptFailsExitCode)\n}\n\nFunction Apply-TidyFixReplacements([Parameter(Mandatory=$true) ][WorkloadType] $workloadType)\n{\n  if ($workloadType -eq [WorkloadType]::TidyFix -and \n  (Test-Path -LiteralPath $global:tidyFixReplacementDirPath))\n  {\n    Write-Verbose \"Apply tidy-fix replacements\"\n    [string] $pathToBinary =  (Join-Path -path $global:llvmLocation `\n                                         -ChildPath $kClangApplyReplacements)\n\n    if (![string]::IsNullOrEmpty($aAfterTidyFixFormatStyle))\n    {\n      & $pathToBinary -format -style=\"$aAfterTidyFixFormatStyle\" $global:tidyFixReplacementDirPath\n    }\n    else\n    {\n      & $pathToBinary $global:tidyFixReplacementDirPath\n    }\n    Wait-AndProcessBuildJobs\n  }\n}\n\nFunction Get-SourceDirectory()\n{\n  [bool] $isDirectory = ($(Get-Item -LiteralPath $aSolutionsPath) -is [System.IO.DirectoryInfo])\n  if ($isDirectory)\n  {\n    return $aSolutionsPath\n  }\n  else\n  {\n    return (Get-FileDirectory -filePath $aSolutionsPath)\n  }\n}\n\nfunction Load-Solutions()\n{\n   Write-Verbose \"Scanning for solution files\"\n   [string] $pathToCheck = $aSolutionsPath\n   Try\n   {\n     # no need of long path prefix for Powershell > 5.0\n     $slns = @(Get-ChildItem -recurse -LiteralPath $pathToCheck -Filter \"*$kExtensionSolution\")\n     $slnxs = @(Get-ChildItem -recurse -LiteralPath $pathToCheck -Filter \"*$kExtensionSolutionXml\")\n   }\n   Catch\n   {\n     # use long path prefix for PowerShell <= 5.0\n     $pathToCheck = \"\\\\?\\$aSolutionsPath\"\n     $slns = @(Get-ChildItem -recurse -LiteralPath $pathToCheck -Filter \"*$kExtensionSolution\")\n     $slnxs = @(Get-ChildItem -recurse -LiteralPath $pathToCheck -Filter \"*$kExtensionSolutionXml\")\n   }\n\n   # Combine both .sln and .slnx files\n   [System.Collections.ArrayList] $allSolutions = @()\n   if ($slns) { $allSolutions += $slns }\n   if ($slnxs) { $allSolutions += $slnxs }\n\n   foreach ($sln in $allSolutions)\n   {\n     Write-Verbose \"Caching solution file $sln\"\n     $slnPath = $sln.FullName\n\n     # remove the UNC long path prefix\n     $slnPath = $slnPath.Replace('\\\\?\\', '')\n     $global:slnFiles[$slnPath] = (Get-Content -LiteralPath $slnPath)\n     \n     Write-Verbose \"Solution full path: $slnPath\"\n     Write-Verbose \"Solution data length: $($global:slnFiles[$slnPath].Length)\"\n   }\n\n   Write-Verbose-Array -array $global:slnFiles.Keys  -name \"Solution file paths\"\n}\n\nfunction Get-SolutionProjects([Parameter(Mandatory=$true)][string] $slnPath)\n{\n  Write-Verbose \"Retrieving project list for solution: $slnPath\"\n  \n  # Check if this is a .slnx (XML) or .sln (text) file\n  if ($slnPath.EndsWith($kExtensionSolutionXml))\n  {\n    # Parse SLNX (XML-based solution file)\n    [string] $slnDirectory = Get-FileDirectory -file $slnPath\n    Write-Verbose \"SLNX solution directory: $slnDirectory\"\n    \n    try\n    {\n      [xml]$slnxContent = $global:slnFiles[$slnPath]\n      $projectNodes = $slnxContent.SelectNodes(\"//Project[@Path]\")\n      Write-Verbose \"Found $($projectNodes.Count) project nodes in SLNX\"\n      \n      [string[]] $projectAbsolutePaths = @()\n      \n      foreach ($projectNode in $projectNodes)\n      {\n        [string] $projectPath = $projectNode.GetAttribute(\"Path\")\n        if ([string]::IsNullOrWhiteSpace($projectPath)) { continue }\n        \n        $projExpandedPath = [Environment]::ExpandEnvironmentVariables($projectPath)\n        if (! $projExpandedPath.EndsWith($kExtensionVcxproj)) { continue }\n        \n        $projExpandedPath = Canonize-Path -base $slnDirectory -child $projExpandedPath -ignoreErrors\n        \n        if (![string]::IsNullOrWhiteSpace($projExpandedPath)) {\n          $projectAbsolutePaths += @($projExpandedPath)\n        }\n      }\n      \n      Write-Verbose-Array -array $projectAbsolutePaths -name \"Resolved SLNX project paths\"\n      return $projectAbsolutePaths\n    }\n    catch\n    {\n      Write-Warning \"Failed to parse SLNX file: $slnPath. Error: $($_.Exception.Message)\"\n      return @()\n    }\n  }\n  \n  # Parse traditional .sln (text-based solution file)\n  [string] $slnDirectory = Get-FileDirectory -file $slnPath\n  $matches = [regex]::Matches($global:slnFiles[$slnPath], 'Project\\([{}\\\"A-Z0-9\\-]+\\) = \\\".*?\\\",\\s\\\"(.*?)\\\"')\n  Write-Verbose \"Found $($matches.Count) project matches in SLN\"\n\n  [string[]] $projectAbsolutePaths = @()\n  foreach ($projPathMatch in $matches)\n  {\n    [string] $matchValue = $projPathMatch.Groups[1].Value.Replace('\"','')\n    if ([string]::IsNullOrWhiteSpace($matchValue))\n    {\n      continue\n    }\n\n    $projExpandedPath = [Environment]::ExpandEnvironmentVariables($matchValue)\n    if ( ! $projExpandedPath.EndsWith($kExtensionVcxproj))\n    {\n      continue\n    }\n\n    # canonize-path is smart enough to figure out if this is a relative path or not\n    $projExpandedPath = Canonize-Path -base $slnDirectory -child $projExpandedPath -ignoreErrors\n  \n    $projectAbsolutePaths += @($projExpandedPath)\n  }\n  Write-Verbose-Array -array $projectAbsolutePaths -name \"Resolved project paths for solution $slnPath\"\n  return $projectAbsolutePaths\n}\n\nfunction Get-ProjectSolution()\n{\n  foreach ($slnPath in $global:slnFiles.Keys)\n  {\n    [string[]] $solutionProjectPaths = @(Get-SolutionProjects $slnPath)\n    if ($solutionProjectPaths -and $solutionProjectPaths -contains $global:vcxprojPath)\n    {\n      return $slnPath\n    }\n  }\n  return \"\"\n}\n\nFunction Get-Projects()\n{\n  [string[]] $projects = @()\n\n  foreach ($slnPath in $global:slnFiles.Keys)\n  {\n    [string[]] $solutionProjects = @(Get-SolutionProjects -slnPath $slnPath)\n    if ($solutionProjects -and $solutionProjects.Count -gt 0)\n    {\n      $projects += $solutionProjects\n    }\n  }\n\n  return ($projects | Select -Unique);\n}\n\nFunction Get-ClangIncludeDirectories( [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                                    , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                                    )\n{\n  [string[]] $returnDirs = @()\n\n  foreach ($includeDir in $includeDirectories)\n  {\n    $returnDirs += (\"-isystem\" + (Get-QuotedPath $includeDir))\n  }\n  foreach ($includeDir in $additionalIncludeDirectories)\n  {\n    if ($aTreatAdditionalIncludesAsSystemIncludes)\n    {\n      $returnDirs += (\"-isystem\" + (Get-QuotedPath $includeDir))\n    }\n    else\n    {\n      $returnDirs += (\"-I\"+ (Get-QuotedPath $includeDir))\n    }\n  }\n\n  return $returnDirs\n}\n\nFunction Get-ProjectFileLanguageFlag([Parameter(Mandatory=$true)] [string]   $fileFullName)\n{\n  [bool] $isCpp = $true\n  if ($fileFullName.EndsWith($kExtensionC))\n  {\n    $isCpp = $false\n  }\n\n  try\n  {\n    [string] $compileAsVal = (Get-ProjectFileSetting -fileFullName $fileFullName -propertyName \"CompileAs\")\n    [bool] $isDefault = [string]::IsNullOrWhiteSpace($compileAsVal) -or $compileAsVal -ieq \"Default\"\n    if ($isDefault)\n    {\n      $isCpp = ! $fileFullName.EndsWith($kExtensionC)\n    }\n    else \n    {\n      $isCpp = $compileAsVal -ine $kCProjectCompile\n    }\n  }  \n  catch {}\n\n  [string] $languageFlag = If ($isCpp) { $kClangFlagFileIsCPP } else { $kClangFlagFileIsC }\n\n  return $languageFlag\n}\n\nFunction Generate-Pch( [Parameter(Mandatory=$true)] [string]   $stdafxDir\n                     , [Parameter(Mandatory=$true)] [string]   $stdafxCpp\n                     , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                     , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                     , [Parameter(Mandatory=$true)] [string]   $stdafxHeaderName\n                     , [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions)\n{\n  [string] $stdafxSource = (Canonize-Path -base $stdafxDir -child $stdafxHeaderName)\n  [string] $stdafx = $stdafxSource + \".hpp\"\n\n  # Clients using Perforce will have their source checked-out as readonly files, so the \n  # PCH copy would be, by-default, readonly as well, which would present problems. Make sure to remove the RO attribute.\n  Copy-Item -LiteralPath $stdafxSource -Destination $stdafx -PassThru | Set-ItemProperty -name isreadonly -Value $false\n\n  $global:FilesToDeleteWhenScriptQuits.Add($stdafx) > $null\n\n  [string] $vcxprojShortName = [System.IO.Path]::GetFileNameWithoutExtension($global:vcxprojPath);\n  [string] $stdafxPch = (Join-Path -path (Get-SourceDirectory) `\n                                   -ChildPath \"$vcxprojShortName$kExtensionClangPch\")\n  Remove-Item -LiteralPath \"$stdafxPch\" -ErrorAction SilentlyContinue > $null\n\n  $global:FilesToDeleteWhenScriptQuits.Add($stdafxPch) > $null\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $stdafxCpp)\n\n  [string[]] $compilationFlags = @((Get-QuotedPath $stdafx)\n                                  ,$kClangFlagMinusO\n                                  ,(Get-QuotedPath $stdafxPch)\n                                  ,$languageFlag\n                                  ,(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n                                  ,$kClangFlagNoUnusedArg\n                                  ,$preprocessorDefinitions\n                                  )\n  if ($kLLVMVersion -ge 11)\n  {\n    # this flag gets around 15% faster PCH compilation times\n    # https://www.phoronix.com/scan.php?page=news_item&px=LLVM-Clang-11-PCH-Instant-Temp\n    $compilationFlags += $kClangFlagFasterPch\n  }\n\n  $compilationFlags += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                                   -additionalIncludeDirectories $additionalIncludeDirectories\n\n  # Remove empty arguments from the list because Start-Process will complain\n  $compilationFlags = $compilationFlags | Where-Object { $_ } | Select -Unique\n\n  [string] $exeToCallVerbosePath  = $kClangCompiler\n  if (![string]::IsNullOrWhiteSpace($global:llvmLocation))\n  {\n    $exeToCallVerbosePath = \"$($global:llvmLocation)\\$exeToCallVerbosePath\"\n  }\n  Write-Verbose \"INVOKE: $exeToCallVerbosePath $compilationFlags\"\n\n  $kClangWorkingDir = \"$(Get-SourceDirectory)\" -replace '\\[', '`[' -replace ']', '`]'\n  # We could skip the WorkingDir parameter as all paths are absolute but \n  # Powershell 3-5 has a bug when calling Start-Process from a directory containing square brackets\n  # in its path. This can be overcome by providing escaped brackets in the WorkingDirectory arg.\n  # Powershell 7 does not have this limitation.\n  [System.Diagnostics.Process] $processInfo = Start-Process -FilePath $kClangCompiler `\n                                                            -ArgumentList $compilationFlags `\n                                                            -WorkingDirectory $kClangWorkingDir `\n                                                            -NoNewWindow `\n                                                            -Wait `\n                                                            -PassThru\n  if (($processInfo.ExitCode -ne 0) -and (!$aContinueOnError))\n  {\n    Fail-Script \"Errors encountered during PCH creation\"\n  }\n\n  if (Test-Path -LiteralPath $stdafxPch)\n  {\n    return $stdafxPch\n  }\n  else\n  {\n    return \"\"\n  }\n}\n\nFunction Get-ExeToCall([Parameter(Mandatory=$true)][WorkloadType] $workloadType)\n{\n  switch ($workloadType)\n  {\n     \"Compile\"  { return $kClangCompiler }\n     \"Tidy\"     { return $kClangTidy     }\n     \"TidyFix\"  { return $kClangTidy     }\n  }\n}\n\nFunction Get-CompileCallArguments( [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions\n                                 , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                                 , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                                 , [Parameter(Mandatory=$false)][string[]] $forceIncludeFiles\n                                 , [Parameter(Mandatory=$false)][string]   $pchFilePath\n                                 , [Parameter(Mandatory=$true)][string]    $fileToCompile)\n{\n  [string[]] $projectCompileArgs = @()\n  if (! [string]::IsNullOrEmpty($pchFilePath) -and ! $fileToCompile.EndsWith($kExtensionC))\n  {\n    $projectCompileArgs += @($kClangFlagIncludePch , (Get-QuotedPath $pchFilePath))\n  }\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $fileToCompile)\n\n  $projectCompileArgs += @( $languageFlag\n                          , (Get-QuotedPath $fileToCompile)\n                          , @(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n                          , $kClangFlagSupressLINK\n                          , $preprocessorDefinitions\n                          )\n\n  $projectCompileArgs += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                                     -additionalIncludeDirectories $additionalIncludeDirectories\n\n  if ($forceIncludeFiles)\n  {\n    $projectCompileArgs += $kClangFlagNoMsInclude;\n\n    foreach ($file in $forceIncludeFiles)\n    {\n      $projectCompileArgs += \"$kClangFlagForceInclude $(Get-QuotedPath $file)\"\n    }\n  }\n\n  return $projectCompileArgs\n}\n\nFunction Get-TidyCallArguments( [Parameter(Mandatory=$false)][string[]] $preprocessorDefinitions\n                              , [Parameter(Mandatory=$false)][string[]] $includeDirectories\n                              , [Parameter(Mandatory=$false)][string[]] $additionalIncludeDirectories\n                              , [Parameter(Mandatory=$false)][string[]] $forceIncludeFiles\n                              , [Parameter(Mandatory=$true)][string]   $fileToTidy\n                              , [Parameter(Mandatory=$false)][string]  $pchFilePath\n                              , [Parameter(Mandatory=$false)][switch]  $fix\n                              , [Parameter(Mandatory=$false)][string]  $compilationDatabaseDir)\n{\n  [string[]] $tidyArgs = @()\n  if ($fix)\n  {\n    # Map tidy-fix replacements temprorary file path to original file path\n    if(![string]::IsNullOrEmpty($fileToTidy))\n    {\n      [string] $tidyFixReplacementYamlPath = Join-Path  -Path ($global:tidyFixReplacementDirPath) `\n                                                        -ChildPath ([guid]::NewGuid().ToString() + $kExtensionYaml)\n      $tidyArgs += $kClangTidyFixExportFixes + @((Get-QuotedPath $tidyFixReplacementYamlPath))\n    }\n  }\n\n  $tidyArgs += (Get-QuotedPath $fileToTidy)\n  if (![string]::IsNullOrWhiteSpace($aTidyFlags) -and ($aTidyFlags -ne $kClangTidyUseFile) -and !(Test-Path $aTidyFlags))\n  {\n    $tidyArgs += \"$kClangTidyFlagChecks`\"$aTidyFlags`\"\"\n  }  \n  if (![string]::IsNullOrWhiteSpace($aTidyFixFlags) -and ($aTidyFixFlags -ne $kClangTidyUseFile) -and !(Test-Path $aTidyFixFlags))\n  {\n    $tidyArgs += \"$kClangTidyFlagChecks`\"$aTidyFixFlags`\"\"\n  }\n\n  # The header-filter flag enables clang-tidy to run on headers too.\n  if (![string]::IsNullOrEmpty($aTidyHeaderFilter))\n  {\n    if ($aTidyHeaderFilter -eq '_')\n    {\n      [string] $fileNameMatch = \"\"\"$(Get-FileName -path $fileToTidy -noext).*\"\"\"\n      $tidyArgs += \"$kClangTidyFlagHeaderFilter$fileNameMatch\"\n    }\n    else\n    {\n      $tidyArgs += \"$kClangTidyFlagHeaderFilter\"\"$aTidyHeaderFilter\"\"\"\n    }\n  }\n\n  $tidyArgs += $kQuiet\n  if (![string]::IsNullOrEmpty($compilationDatabaseDir))\n  {\n      if ($compilationDatabaseDir -eq '_')\n      {\n          $compilationDatabaseDir = Get-SourceDirectory\n      }\n      # When passed to cmd.exe the quote cannot be preceded by a backslash or it's escaped\n      $tidyArgs += \"$kClangTidyCompilationDatabaseDir`\"$($compilationDatabaseDir.TrimEnd(\"\\\"))`\"\"\n      # When we use compilation database, we don't need to add further args with\n      # compilation flags\n      return $tidyArgs\n  }\n\n  $tidyArgs += $kEndOptionMarker\n\n  $tidyArgs += Get-ClangIncludeDirectories -includeDirectories           $includeDirectories `\n                                           -additionalIncludeDirectories $additionalIncludeDirectories\n\n  [string] $languageFlag = (Get-ProjectFileLanguageFlag -fileFullName $fileToTidy)\n\n  # We reuse flags used for compilation and preprocessor definitions.\n  $tidyArgs += @(Get-ClangCompileFlags -isCpp ($languageFlag -ieq $kClangFlagFileIsCPP))\n  $tidyArgs += $preprocessorDefinitions\n  $tidyArgs += $languageFlag\n\n  if (! [string]::IsNullOrEmpty($pchFilePath) -and ! $fileToTidy.EndsWith($kExtensionC))\n  {\n    $tidyArgs += @($kClangFlagIncludePch , (Get-QuotedPath $pchFilePath))\n  }\n\n  if ($forceIncludeFiles)\n  {\n    $tidyArgs += $kClangFlagNoMsInclude;\n\n    foreach ($file in $forceIncludeFiles)\n    {\n      $tidyArgs += \"$kClangFlagForceInclude $file\"\n    }\n  }\n\n  return $tidyArgs\n}\n\nFunction Get-ExeCallArguments( [Parameter(Mandatory=$false)][string]       $pchFilePath\n                             , [Parameter(Mandatory=$false)][string[]]     $includeDirectories\n                             , [Parameter(Mandatory=$false)][string[]]     $additionalIncludeDirectories\n                             , [Parameter(Mandatory=$false)][string[]]     $preprocessorDefinitions\n                             , [Parameter(Mandatory=$false)][string[]]     $forceIncludeFiles\n                             , [Parameter(Mandatory=$true) ][string]       $currentFile\n                             , [Parameter(Mandatory=$true) ][WorkloadType] $workloadType\n                             , [Parameter(Mandatory=$false)][string]       $compilationDatabaseDir)\n{\n  switch ($workloadType)\n  {\n    Compile { return Get-CompileCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                              -includeDirectories            $includeDirectories `\n                                              -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                              -forceIncludeFiles             $forceIncludeFiles `\n                                              -pchFilePath                   $pchFilePath `\n                                              -fileToCompile                 $currentFile }\n    Tidy    { return Get-TidyCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                           -includeDirectories            $includeDirectories `\n                                           -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                           -forceIncludeFiles             $forceIncludeFiles `\n                                           -pchFilePath                   $pchFilePath `\n                                           -fileToTidy                    $currentFile `\n                                           -compilationDatabaseDir        $compilationDatabaseDir}\n    TidyFix { return Get-TidyCallArguments -preprocessorDefinitions       $preprocessorDefinitions `\n                                           -includeDirectories            $includeDirectories `\n                                           -additionalIncludeDirectories  $additionalIncludeDirectories `\n                                           -forceIncludeFiles             $forceIncludeFiles `\n                                           -pchFilePath                   $pchFilePath `\n                                           -fileToTidy                    $currentFile `\n                                           -compilationDatabaseDir        $compilationDatabaseDir `\n                                           -fix}\n  }\n}\n\nFunction Process-ProjectResult($compileResult)\n{\n  $global:cptCurrentClangJobCounter = $compileResult.JobCounter\n  Write-Debug \"Receiving results for clang job $($global:cptCurrentClangJobCounter)\"\n\n  if (!$compileResult.Success)\n  {\n    Write-Err ($compileResult.Output)\n\n    if (!$aContinueOnError)\n    {\n      # Wait for other workers to finish. They have a lock on the PCH file\n      Get-Job -state Running | Wait-Job | Remove-Job > $null\n      Fail-Script\n    }\n\n    $global:FoundErrors = $true\n  }\n  else\n  {\n    if ( $compileResult.Output.Length -gt 0)\n    {\n      Write-Output $compileResult.Output\n    }\n  }\n}\n\nFunction Wait-AndProcessBuildJobs([switch]$any)\n{\n  $runningJobs = @(Get-Job -state Running)\n\n  if ($any)\n  {\n    $runningJobs | Wait-Job -Any > $null\n  }\n  else\n  {\n    $runningJobs | Wait-Job > $null\n  }\n\n  $jobData = Get-Job -State Completed\n  foreach ($job in $jobData)\n  {\n    $buildResult = Receive-Job $job\n    Process-ProjectResult -compileResult $buildResult\n  }\n\n  Remove-Job -State Completed\n}\n\nFunction Wait-ForWorkerJobSlot()\n{\n  # We allow as many background workers as we have logical CPU cores\n  $runningJobs = @(Get-Job -State Running)\n\n  if ($runningJobs.Count -ge $kLogicalCoreCount)\n  {\n    Wait-AndProcessBuildJobs -any\n  }\n}\n\nFunction Run-ClangJobs( [Parameter(Mandatory=$true)] $clangJobs\n                      , [Parameter(Mandatory=$true)][WorkloadType] $workloadType\n                      )\n{\n  # Script block (lambda) for logic to be used when running a clang job.\n  $jobWorkToBeDone = `\n  {\n    param( $job )\n\n    Push-Location -LiteralPath $job.WorkingDirectory\n\n    # This temp file will hold compilation args for clang++ and clang-tidy, not to be\n    # confused with check-flags for clang-tidy.\n    [string] $clangConfigFile = [System.IO.Path]::GetTempFileName()\n\n    [string] $clangConfigContent = \"\"\n    if ($job.FilePath -like '*tidy*')\n    {\n      if (!($job.ArgumentList -like \"$($job.kClangTidyCompilationDatabaseDir)*\"))\n      {\n          # We have to separate Clang args from Tidy args\n          $splitparams = $job.ArgumentList -split \" -- \"\n          $clangConfigContent = $splitparams[1]\n\n          # We may have an explicit .clang-tidy check-flag config file to be used\n          if (![string]::IsNullOrWhiteSpace($job.TidyFlagsTempFile) -and (Test-Path -LiteralPath $job.TidyFlagsTempFile))\n          {\n            $splitparams[0] += \" --config-file=\"\"$($job.TidyFlagsTempFile)\"\" \"\n          }\n\n          $job.ArgumentList = \"$($splitparams[0]) -- --config \"\"$clangConfigFile\"\"\"\n      }\n    }\n    else\n    {\n      # Tell Clang to take its compilation args from a config file\n      $clangConfigContent = $job.ArgumentList\n      $job.ArgumentList = \"--config \"\"$clangConfigFile\"\"\"\n    }\n\n    # escape slashes for file paths\n    # make sure escaped double quotes are not messed up\n    $clangConfigContent = $clangConfigContent -replace '\\\\([^\"])', '\\\\$1'\n\n    # save compilation arguments to clang config file\n    $clangConfigContent > $clangConfigFile\n\n    # When PowerShell encounters errors, the first one is handled differently from consecutive ones\n    # To circumvent this, do not execute the job directly, but execute it via cmd.exe\n    # See also https://stackoverflow.com/a/35980675\n    $callOutput = cmd /c \"$($job.FilePath) $($job.ArgumentList) 2>&1\" | Out-String\n\n    $callSuccess = $LASTEXITCODE -eq 0\n    if (!$callSuccess)\n    {\n    }\n\n    Remove-Item $clangConfigFile\n    Pop-Location\n\n    return New-Object PsObject -Prop @{ \"File\"    = $job.File\n                                      ; \"Success\" = $callSuccess\n                                      ; \"Output\"  = $callOutput\n                                      ; \"JobCounter\" = $job.JobCounter\n                                      }\n  }\n\n  if (!$aResumeAfterError)\n  {\n    $global:cptCurrentClangJobCounter = $clangJobs.Count\n  }\n  else\n  {\n    if (!(VariableExists 'cptCurrentClangJobCounter'))\n    {\n      Write-Warning \"Can't resume. Previous state is unreliable. Processing all files...\"\n      $global:cptCurrentClangJobCounter = $clangJobs.Count\n    }\n    else\n    {\n      if ($global:cptCurrentClangJobCounter -gt 0)\n      {\n        Write-Output \"Resuming from file #$($global:cptCurrentClangJobCounter)\"\n      }\n    }\n  }\n\n  [int] $crtJobCount = $clangJobs.Count\n\n  foreach ($job in $clangJobs)\n  {\n    if ($global:cptCurrentClangJobCounter -ge 0 -and $crtJobCount -gt $global:cptCurrentClangJobCounter)\n    {\n      $crtJobCount--\n      continue\n    }\n\n    $job.JobCounter = $crtJobCount\n\n    # Check if we must wait for background jobs to complete\n    Wait-ForWorkerJobSlot\n\n    # Inform console what CPP we are processing next\n    Write-Output \"$($crtJobCount): $($job.File)\"\n\n    if ($aUseParallelCompile)\n    {\n      Start-Job -ScriptBlock  $jobWorkToBeDone `\n                -ArgumentList $job `\n                -ErrorAction Continue > $null\n    }\n    else\n    {\n      $compileResult = Invoke-Command -ScriptBlock  $jobWorkToBeDone `\n                                      -ArgumentList $job\n      Process-ProjectResult -compileResult $compileResult\n      $global:cptCurrentClangJobCounter = $compileResult.JobCounter\n    }\n\n    $crtJobCount -= 1\n  }\n\n  Wait-AndProcessBuildJobs\n\n  $global:cptCurrentClangJobCounter = -1 # stop the mechanism after one project\n}\n\nFunction Get-ProjectFileSetting( [Parameter(Mandatory=$true)] [string] $fileFullName\n                               , [Parameter(Mandatory=$true)] [string] $propertyName\n                               , [Parameter(Mandatory=$false)][string] $defaultValue)\n{\n  if (!$global:cptFilesToProcess.ContainsKey($fileFullName))\n  {\n    throw \"File $aFileFullName is not in processing queue.\"\n  }\n\n  if ($global:cptFilesToProcess[$fileFullName].Properties -and\n      $global:cptFilesToProcess[$fileFullName].Properties.ContainsKey($propertyName))\n  {\n    return $global:cptFilesToProcess[$fileFullName].Properties[$propertyName]\n  }\n\n  if ($defaultValue -ne $null)\n  {\n    return $defaultValue\n  }\n\n  throw \"Could not find $propertyName for $fileFullName. No default value specified.\"\n}\n\nFunction Process-Project( [Parameter(Mandatory=$true)] [string]       $vcxprojPath\n                        , [Parameter(Mandatory=$true)] [WorkloadType] $workloadType\n                        , [Parameter(Mandatory=$false)][string]       $platformConfig\n                        )\n{\n  #-----------------------------------------------------------------------------------------------\n  $global:cptCurrentConfigPlatform = $platformConfig\n\n  $projCounter = $global:cptProjectCounter\n  [string] $projectOutputString = (\"PROJECT$(if ($projCounter -gt 1) { \" #$projCounter\" } else { } ): \" + $vcxprojPath)\n  \n  [bool] $loadedFromCache = $false\n  try\n  { \n    Set-Variable 'kCacheRepositorySaveIsNeeded' -value $false\n    Write-InformationTimed \"Before project load\"\n    \n    if (Is-CacheLoadingEnabled)\n    {\n      Write-InformationTimed \"Trying to load project from cache\"\n      $loadedFromCache = Load-ProjectFromCache $vcxprojPath\n      \n      if (!$loadedFromCache)\n      {\n        LoadProject $vcxprojPath\n        Set-Variable 'kCacheRepositorySaveIsNeeded' -value $true\n      }\n    }\n    else \n    {\n      LoadProject $vcxprojPath\n    }\n    \n    Write-InformationTimed \"After project load\"\n    Write-Output \"$projectOutputString [$($global:cptCurrentConfigPlatform)]\"\n  }\n  catch [ProjectConfigurationNotFound]\n  {\n    [string] $configPlatform = ([ProjectConfigurationNotFound]$_.Exception).ConfigPlatform\n    \n    Write-Output \"$projectOutputString [$($global:cptCurrentConfigPlatform)]\"\n    Write-Output (\"Skipped. Configuration not present: \" + $configPlatform);\n    \n    Pop-Location\n    return\n  }\n  \n  Write-InformationTimed \"Detecting toolset\"\n\n  #-----------------------------------------------------------------------------------------------\n  # DETECT PLATFORM TOOLSET\n\n  if (! $loadedFromCache)\n  {\n    [string] $global:platformToolset = Get-ProjectPlatformToolset\n    Write-Verbose \"Platform toolset: $platformToolset\"\n    Add-ToProjectSpecificVariables 'platformToolset'\n\n    if ( $platformToolset -match \"^v\\d+(_xp)?$\" )\n    {\n      [int] $toolsetVersion = [int]$platformToolset.Remove(0, 1).Replace(\"_xp\", \"\")\n\n      [string] $desiredVisualStudioVer = \"\"\n\n      # toolsets attached to specific Visual Studio versions\n      if ($toolsetVersion -le 120)\n      {\n        $desiredVisualStudioVer = \"2013\"\n      }\n      elseif ($toolsetVersion -eq 140)\n      {\n        $desiredVisualStudioVer = \"2015\"\n      }\n      elseif ($toolsetVersion -eq 141)\n      {\n        $desiredVisualStudioVer = \"2017\"\n      }\n      elseif ($toolsetVersion -eq 142)\n      {\n        $desiredVisualStudioVer = \"2019\";\n      }\n      elseif ($toolsetVersion -eq 143)\n      {\n        $desiredVisualStudioVer = \"2022\";\n      }\n      elseif ($toolsetVersion -eq 145)\n      {\n        $desiredVisualStudioVer = \"2026\";\n      }\n\n      [string] $desiredVisualStudioVerNumber = (Get-VisualStudio-VersionNumber $desiredVisualStudioVer)\n      if ($VisualStudioVersion -ne $desiredVisualStudioVerNumber)\n      {\n        [bool] $shouldReload = $false\n\n        if ([double]::Parse($VisualStudioVersion) -gt [double]::Parse($desiredVisualStudioVerNumber))\n        {\n          # in this case we may have a newer Visual Studio with older toolsets installed\n          [string[]] $supportedVsToolsets = Get-VisualStudioToolsets\n    \n          if ($supportedVsToolsets -notcontains $toolsetVersion)\n          {\n              $shouldReload = $true\n          }\n          else \n          {\n            Write-Verbose \"[ INFO ] Detected project using older toolset ($toolsetVersion)\"\n            Write-Verbose \"Loading using Visual Studio $VisualStudioVersion with toolset $toolsetVersion\"\n          }\n        }\n        else \n        {\n          # project uses a newer VS version, clearly we should reload using the newer version\n          $shouldReload = $true\n        }\n\n        if ($shouldReload)\n        {\n          # We need to reload everything and use the VS version we decided upon above\n          Write-Verbose \"[ RELOAD ] Project will reload because of toolset requirements change...\"\n          Write-Verbose \"Current = $VisualStudioVersion. Required = $desiredVisualStudioVerNumber.\"\n\n          $global:cptVisualStudioVersion = $desiredVisualStudioVer\n          LoadProject($vcxprojPath)\n          \n          Write-InformationTimed \"Project reloaded\"\n        }\n      }\n    }\n  \n    Write-InformationTimed \"Detected toolset\"\n\n    #-----------------------------------------------------------------------------------------------\n    # FIND FORCE INCLUDES\n\n    [string[]] $global:forceIncludeFiles = @(Get-ProjectForceIncludes)\n    Write-Verbose-Array -array $forceIncludeFiles -name \"Force includes\"\n    Add-ToProjectSpecificVariables 'forceIncludeFiles'\n\n    #-----------------------------------------------------------------------------------------------\n    # DETECT PROJECT PREPROCESSOR DEFINITIONS\n\n    [string[]] $global:preprocessorDefinitions = @(Get-ProjectPreprocessorDefines)\n    if ([int]$global:cptVisualStudioVersion -ge 2017)\n    {\n      # [HACK] pch generation crashes on VS 15.5 because of STL library, known bug.\n      # Triggered by addition of line directives to improve std::function debugging.\n      # There's a definition that supresses line directives.\n\n      $preprocessorDefinitions += @('\"-D_DEBUG_FUNCTIONAL_MACHINERY\"')\n    }\n    Add-ToProjectSpecificVariables 'preprocessorDefinitions'\n    \n    Write-InformationTimed \"Detected preprocessor definitions\"\n\n    Write-Verbose-Array -array $preprocessorDefinitions -name \"Preprocessor definitions\"\n\n    #-----------------------------------------------------------------------------------------------\n    # DETECT PROJECT ADDITIONAL INCLUDE DIRECTORIES AND CONSTRUCT INCLUDE PATHS\n\n    [string[]] $global:additionalIncludeDirectories = @(Get-ProjectAdditionalIncludes)\n    \n    Write-Verbose-Array -array $additionalIncludeDirectories -name \"Additional include directories\"\n    Add-ToProjectSpecificVariables 'additionalIncludeDirectories'\n\n    [string[]] $includeDirectories = @(Get-ProjectIncludeDirectories)\n    # We use the same mechanism for injecting external include paths\n    $includeDirectories += @(Get-IncludePathsFromAdditionalOptions)\n    $includeDirectories += @(Get-ProjectExternalIncludePaths)\n    Write-Verbose-Array -array $includeDirectories -name \"Include directories\"\n    Add-ToProjectSpecificVariables 'includeDirectories'\n\n    Write-InformationTimed \"Detected include directories\"\n\n    #-----------------------------------------------------------------------------------------------\n    # FIND LIST OF CPPs TO PROCESS\n\n    $global:projectAllCpps = @{}\n    foreach ($fileToCompileInfo in (Get-ProjectFilesToCompile))\n    {\n      if ($fileToCompileInfo.File)\n      {\n        $global:projectAllCpps[$fileToCompileInfo.File] = $fileToCompileInfo\n      }\n    }\n    \n    Add-ToProjectSpecificVariables 'projectAllCpps'\n    \n    Write-InformationTimed \"Detected cpps to process\"\n  } # past the caching boundary here, we must see what else needs to be computed live \n  \n  $global:cptFilesToProcess = $global:projectAllCpps # reset to full project cpp list\n  \n  #-----------------------------------------------------------------------------------------------\n  # LOCATE STDAFX.H DIRECTORY\n\n  [string] $stdafxCpp    = \"\"\n  [string] $stdafxDir    = \"\"\n  [string] $stdafxHeader = \"\"\n  [string] $stdafxHeaderFullPath = \"\"\n\n  [int] $minTranslationUnitsForPCH = If (Test-Path env:CPT_PCH_LIMIT) { [int]$env:CPT_PCH_LIMIT } else { 2 }\n\n  [bool] $kPchIsNeeded = $global:cptFilesToProcess.Keys.Count -ge $minTranslationUnitsForPCH\n  if ($kPchIsNeeded)\n  {\n    # if we have only one rooted file in the script parameters, then we don't need to detect PCH\n    if ($aCppToCompile.Count -eq 1 -and [System.IO.Path]::IsPathRooted($aCppToCompile[0]))\n    {\n      $kPchIsNeeded = $false\n    }\n  }\n\n  foreach ($projCpp in $global:cptFilesToProcess.Keys)\n  {\n    if ( (Get-ProjectFileSetting -fileFullName $projCpp -propertyName 'PrecompiledHeader') -ieq 'Create')\n    {\n      $stdafxCpp = $projCpp\n    }\n  }\n\n  if (![string]::IsNullOrEmpty($stdafxCpp))\n  {\n    Write-Verbose \"PCH cpp name: $stdafxCpp\"\n\n    if ($forceIncludeFiles.Count -gt 0)\n    {\n      $stdafxHeader = $forceIncludeFiles[0]\n    }\n\n    if (!$stdafxHeader)\n    {\n      $stdafxHeader = Get-PchCppIncludeHeader -pchCppFile $stdafxCpp\n    }\n\n    if (!$stdafxHeader)\n    {\n      try\n      {\n        $stdafxHeader = Get-ProjectFileSetting -fileFullName $stdafxCpp -propertyName 'PrecompiledHeaderFile'\n      }\n      catch {}\n    }\n\n    Write-Verbose \"PCH header name: $stdafxHeader\"\n    $stdafxDir = Get-ProjectStdafxDir -pchHeaderName                $stdafxHeader       `\n                                      -includeDirectories           $includeDirectories `\n                                      -additionalIncludeDirectories $additionalIncludeDirectories\n  }\n\n  if ([string]::IsNullOrEmpty($stdafxDir))\n  {\n    Write-Verbose (\"No PCH information for this project!\")\n    $kPchIsNeeded = $false\n  }\n  else\n  {\n    Write-Verbose (\"PCH directory: $stdafxDir\")\n\n    $includeDirectories = @(Remove-PathTrailingSlash -path $stdafxDir) + $includeDirectories\n\n    $stdafxHeaderFullPath = Canonize-Path -base $stdafxDir -child $stdafxHeader -ignoreErrors\n\n    if (!$kPchIsNeeded)\n    {\n      Write-Verbose \"PCH is disabled for this project. Will not generate.\"\n    }\n  }\n  \n  Write-InformationTimed \"Detected PCH information\"\n\n\n  #-----------------------------------------------------------------------------------------------\n  # FILTER LIST OF CPPs TO PROCESS\n  if ($global:cptFilesToProcess.Count -gt 0 -and $aCppToIgnore.Count -gt 0)\n  {\n    [System.Collections.Hashtable] $filteredCpps = @{}\n    foreach ($cpp in $global:cptFilesToProcess.Keys)\n    {\n      if ( ! (Should-IgnoreFile -file $cpp) )\n      {\n        $filteredCpps[$cpp] = $global:cptFilesToProcess[$cpp]\n      }\n    }\n    $global:cptFilesToProcess = $filteredCpps\n  }\n\n  if ($global:cptFilesToProcess.Count -gt 0 -and $aCppToCompile.Count -gt 0)\n  {\n    [System.Collections.Hashtable] $filteredCpps = @{}\n    [bool] $dirtyStdafx = $false\n    foreach ($cpp in $aCppToCompile)\n    {\n      if ($cpp -ieq $stdafxHeaderFullPath)\n      {\n        # stdafx modified => compile all\n        $dirtyStdafx = $true\n        break\n      }\n\n      if (![string]::IsNullOrEmpty($cpp))\n      {\n        if ([System.IO.Path]::IsPathRooted($cpp))\n        {\n          if ($global:cptFilesToProcess.ContainsKey($cpp))\n          {\n            # really fast, use cache\n            $filteredCpps[$cpp] = $global:cptFilesToProcess[$cpp]\n          }\n        }\n        else\n        {\n          # take the slow road and check if it matches\n          $global:cptFilesToProcess.Keys | Where-Object {  IsFileMatchingName -filePath $_ -matchName $cpp } | `\n                                           ForEach-Object { $filteredCpps[$_] = $global:cptFilesToProcess[$_] }\n        }\n      }\n    }\n\n    if (!$dirtyStdafx)\n    {\n      $global:cptFilesToProcess = $filteredCpps\n    }\n    else\n    {\n      Write-Verbose \"PCH header has been targeted as dirty. Building entire project\"\n    }\n  }\n  \n  Write-InformationTimed \"Filtered out CPPs from bucket\"\n\n  Write-Verbose (\"Processing \" + $global:cptFilesToProcess.Count + \" cpps\")\n\n  #-----------------------------------------------------------------------------------------------\n  # CREATE PCH IF NEED BE, ONLY FOR TWO CPPS OR MORE\n  #\n  # JSON Compilation Database file will outlive this execution run, while the PCH is temporary \n  # so we disable PCH creation for that case as well.\n\n  if ($kPchIsNeeded -and $global:cptFilesToProcess.Count -lt $minTranslationUnitsForPCH)\n  {\n    $kPchIsNeeded = $false\n  }\n\n  [string] $pchFilePath = \"\"\n  if ($kPchIsNeeded -and !$aExportJsonDB)\n  {\n    # COMPILE PCH\n    Write-Verbose \"Generating PCH...\"\n    $pchFilePath = Generate-Pch -stdafxDir        $stdafxDir    `\n                                -stdafxCpp        $stdafxCpp    `\n                                -stdafxHeaderName $stdafxHeader `\n                                -preprocessorDefinitions $preprocessorDefinitions `\n                                -includeDirectories $includeDirectories `\n                                -additionalIncludeDirectories $additionalIncludeDirectories\n    Write-Verbose \"PCH: $pchFilePath\"\n    if ([string]::IsNullOrEmpty($pchFilePath) -and $aContinueOnError)\n    {\n      Write-Output \"Skipping project. Reason: cannot create PCH.\"\n      return\n    }\n    Write-InformationTimed \"Created PCH\"\n  }  \n\n  if ($kCacheRepositorySaveIsNeeded)\n  {\n    Write-InformationTimed \"Before serializing project\"\n    Save-ProjectToCacheRepo\n    Write-InformationTimed \"After serializing project\"\n  }\n\n  #-----------------------------------------------------------------------------------------------\n  # PROCESS CPP FILES. CONSTRUCT COMMAND LINE JOBS TO BE INVOKED\n\n  $clangJobs = @()\n\n  # Create directory where to store tidy fix replacements\n  if ($aTidyFixFlags)\n  {\n    $global:tidyFixReplacementDirPath = (Join-Path -path $kCptTidyFixReplacementsDir `\n                                                   -ChildPath (Split-Path (Get-SourceDirectory) -Leaf)) `\n                                                   + \"_\" + ([guid]::NewGuid().ToString())\n    # check if SolutionDir for tidy fix replacements already exists\n    if (Test-Path -LiteralPath $global:tidyFixReplacementDirPath)\n    {\n      Remove-Item $global:tidyFixReplacementDirPath -Recurse\n      New-Item -Path $global:tidyFixReplacementDirPath -ItemType \"directory\" > $null\n    }\n    else\n    {\n      New-Item -Path $global:tidyFixReplacementDirPath -ItemType \"directory\" > $null\n    }\n  }\n\n  foreach ($cpp in $global:cptFilesToProcess.Keys)\n  {\n    [string] $cppPchSetting = Get-ProjectFileSetting -propertyName 'PrecompiledHeader' -fileFullName $cpp -defaultValue 'Use'\n\n    if ($cppPchSetting -ieq 'Create')\n    {\n        continue # no point in compiling the PCH CPP\n    }\n\n    [string[]] $cppForceIncludes = Get-FileForceIncludes -fileFullName $cpp\n    [string] $exeToCall = Get-ExeToCall -workloadType $workloadType\n\n    [string] $finalPchPath = $pchFilePath\n    if ($cppPchSetting -ieq 'NotUsing')\n    {\n      $finalPchPath = \"\"\n      Write-Verbose \"`n[PCH] Will ignore precompiled headers for $cpp`n\"\n    }\n\n    [string] $exeArgs   = Get-ExeCallArguments -workloadType            $workloadType `\n                                               -pchFilePath             $finalPchPath `\n                                               -preprocessorDefinitions $preprocessorDefinitions `\n                                               -forceIncludeFiles       $cppForceIncludes `\n                                               -currentFile             $cpp `\n                                               -includeDirectories      $includeDirectories `\n                                               -additionalIncludeDirectories $additionalIncludeDirectories `\n                                               -compilationDatabaseDir  $aCompilationDatabaseDir\n\n    $newJob = New-Object PsObject -Prop @{ 'FilePath'          = $exeToCall\n                                         ; 'WorkingDirectory'  = Get-SourceDirectory\n                                         ; 'ArgumentList'      = $exeArgs\n                                         ; 'File'              = $cpp\n                                         ; 'JobCounter'        = 0 <# will be lazy initialized #>\n                                         ; 'TidyFlagsTempFile' = $kClangTidyFlagTempFile\n                                         ; 'kClangTidyCompilationDatabaseDir' = $kClangTidyCompilationDatabaseDir\n                                         }\n    $clangJobs += $newJob\n  }\n  \n  Write-InformationTimed \"Created job workers\"\n\n  #-----------------------------------------------------------------------------------------------\n  # PRINT DIAGNOSTICS\n\n  if ($clangJobs.Count -ge 1)\n  {\n    [string] $exeToCallVerbosePath  = $exeToCall\n    if (![string]::IsNullOrWhiteSpace($global:llvmLocation))\n    {\n      $exeToCallVerbosePath = \"$($global:llvmLocation)\\$exeToCallVerbosePath\"\n    }\n    Write-Verbose \"INVOKE: $exeToCallVerbosePath $($clangJobs[0].ArgumentList)\"\n  }\n\n  Write-InformationTimed \"Running workers\"\n\n  #-----------------------------------------------------------------------------------------------\n  # RUN CLANG JOBS\n  \n  if ($aExportJsonDB)\n  {\n   foreach ($job in $clangJobs)\n   {\n     [string] $clangToolPath = $job.FilePath\n     if (Exists-Command $clangToolPath)\n     {\n       # see precisely what path the tool has, to prevent ambiguities.\n       $clangToolPath = (Get-Command $job.FilePath).Source\n     }\n     [string] $clangCommand = \"\"\"$clangToolPath\"\" $($job.ArgumentList)\"\n     JsonDB-Push -directory $job.WorkingDirectory -file $job.File -command $clangCommand\n   }\n  }\n  else \n  {\n    Run-ClangJobs -clangJobs $clangJobs -workloadType $workloadType\n    Apply-TidyFixReplacements -workloadType $workloadType\n  }\n}\n\n#-------------------------------------------------------------------------------------------------\n# If we didn't get a location to run CPT at, use the current working directory\n\nif (!$aSolutionsPath)\n{\n  $aSolutionsPath = (Get-Location).Path\n}\n\n# ------------------------------------------------------------------------------------------------\n# Load param values from configuration file (if exists)\n\nUpdate-ParametersFromConfigFile\nWrite-InformationTimed \"Updated script parameters from cpt.config\"\n\n# ------------------------------------------------------------------------------------------------\n# Initialize the Visual Studio version variable\n\n$global:cptVisualStudioVersion = If ( $aVisualStudioVersion ) `\n                                    { $aVisualStudioVersion } Else `\n                                    { $global:cptDefaultVisualStudioVersion }\n\n#-------------------------------------------------------------------------------------------------\n# Print script parameters\n\nPrint-InvocationArguments\nWrite-InformationTimed \"Print args\"\n\n[WorkloadType] $workloadType = [WorkloadType]::Compile\n\nif (![string]::IsNullOrEmpty($aTidyFlags))\n{\n   $workloadType = [WorkloadType]::Tidy\n   if (Test-Path -LiteralPath $aTidyFlags)\n   {\n     $kClangTidyFlagTempFile = $aTidyFlags\n   }\n}\n\nif (![string]::IsNullOrEmpty($aTidyFixFlags))\n{\n   $workloadType = [WorkloadType]::TidyFix\n   if (Test-Path -LiteralPath $aTidyFixFlags)\n   {\n     $kClangTidyFlagTempFile = $aTidyFixFlags\n   }\n}\n\n#-------------------------------------------------------------------------------------------------\n# Script entry point\n\nWrite-Verbose \"CPU logical core count: $kLogicalCoreCount\"\n\n# If LLVM is not in PATH try to detect it automatically\n[string] $global:llvmLocation = \"\"\n\n$clangToolWeNeed = Get-ExeToCall -workloadType $workloadType\n\n$global:llvmLocation = Ensure-LLVMTool-IsPresent $clangToolWeNeed\nif ($aTidyFixFlags)\n{\n  Ensure-LLVMTool-IsPresent $kClangApplyReplacements\n}\nif (![string]::IsNullOrEmpty($global:llvmLocation))\n{\n  $env:Path += \";\" + $global:llvmLocation\n}\nSet-Variable -name \"kLLVMVersion\" -value (Get-ClangVersion $clangToolWeNeed) -scope Global\n\n# initialize JSON compilation db support, if required\nif ($aExportJsonDB) \n{ \n  JsonDB-Init \n}\n\nPush-Location -LiteralPath (Get-SourceDirectory)\n\nWrite-InformationTimed \"Searching for solutions\"\n\n# fetch .sln paths and data\nLoad-Solutions\n\nWrite-InformationTimed \"End solution search\"\n\n# This PowerShell process may already have completed jobs. Discard them.\nRemove-Job -State Completed\nWrite-InformationTimed \"Discarded already finished jobs\"\n\nWrite-Verbose \"Source directory: $(Get-SourceDirectory)\"\nWrite-Verbose \"Scanning for project files\"\n\nWrite-InformationTimed \"Searching for project files\"\n[System.IO.FileInfo[]] $projects = @(Get-Projects)\n[int] $initialProjectCount       = $projects.Count\nWrite-Verbose (\"Found $($projects.Count) projects\")\nWrite-InformationTimed \"End project files search\"\n\n# ------------------------------------------------------------------------------------------------\n# If we get headers in the -file arg we have to detect CPPs that include that header\n\nif ($aCppToCompile -and $aCppToCompile.Count -gt 0)\n{\n  # We've been given particular files to compile. If headers are among them\n  # we'll find all source files that include them and tag them for processing.\n  Write-Progress -Activity \"#Include discovery\" -Status \"Detecting CPPs which include the specified headers...\"\n  [string[]] $headerRefs = @(Get-HeaderReferences -files $aCppToCompile)\n  Write-Progress -Activity \"#Include discovery\" -Completed\n  if ($headerRefs.Count -gt 0)\n  {\n    Write-Verbose-Array -name \"Detected referenced source files to process\" -array $headerRefs\n\n    $aCppToCompile += @($headerRefs | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n  }\n}\n\nif ($aCppToIgnore -and $aCppToIgnore.Count -gt 0)\n{\n  # We've been given particular files to ignore. If headers are among them\n  # we'll find all source files that include them and tag them to be ignored.\n\n  Write-Progress -Activity \"CPP Ignore Detection\" -Status \"Detecting CPPs which include the specified ignore-headers...\"\n  [string[]] $headerRefs = @(Get-HeaderReferences -files $aCppToIgnore)\n  Write-Progress -Activity \"CPP Ignore Detection\" -Completed\n\n  if ($headerRefs.Count -gt 0)\n  {\n    Write-Verbose-Array -name \"Detected referenced source files to ignore\" -array $headerRefs\n\n    $global:cptIgnoredFilesPool += @($headerRefs | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n  }\n}\n\n# ------------------------------------------------------------------------------------------------\n\nWrite-InformationTimed \"Starting projects\"\n\n[System.IO.FileInfo[]] $projectsToProcess = @()\n[System.IO.FileInfo[]] $ignoredProjects   = @()\n\nif (!$aVcxprojToCompile -and !$aVcxprojToIgnore)\n{\n  $projectsToProcess = $projects # we process all projects\n}\nelse\n{\n  # some filtering has to be done\n\n  if ($aVcxprojToCompile)\n  {\n    $projects = $projects | Where-Object { Should-CompileProject -vcxprojPath $_.FullName }\n    $projectsToProcess = @($projects)\n  }\n\n  if ($aVcxprojToIgnore)\n  {\n    $projectsToProcess = @($projects | `\n                         Where-Object { !(Should-IgnoreProject  -vcxprojPath $_.FullName ) })\n\n    $ignoredProjects = ($projects | Where-Object { $projectsToProcess -notcontains $_ })\n  }\n}\n\nif ($projectsToProcess.Count -eq 0)\n{\n  Write-Err \"Cannot find given project(s)\"\n}\n\nif ($aCppToCompile -and $projectsToProcess.Count -gt 1)\n{\n  # We've been given particular files to compile, we can narrow down\n  # the projects to be processed (those that include any of the particular files)\n\n  # For obvious performance reasons, no filtering is done when there's only one project to process.\n  [System.IO.FileInfo[]] $projectsThatIncludeFiles = @(Get-SourceCodeIncludeProjects -projectPool $projectsToProcess `\n                                                                                     -files $aCppToCompile)\n  Write-Verbose-Array -name \"Detected projects\" -array $projectsThatIncludeFiles\n\n  # some projects include files using wildcards, we won't match anything in them\n  # so when matching nothing we don't do filtering at all\n  if ($projectsThatIncludeFiles)\n  {\n    $projectsToProcess = $projectsThatIncludeFiles\n  }\n}\n\nif ($projectsToProcess.Count -eq $initialProjectCount)\n{\n  Write-Verbose \"PROCESSING ALL PROJECTS\"\n}\nelse\n{\n  if ($projectsToProcess.Count -gt 1)\n  {\n      Write-Array -name \"PROJECTS\" -array $projectsToProcess\n  }\n\n  if ($ignoredProjects)\n  {\n    Write-Array -name \"IGNORED PROJECTS\" -array $ignoredProjects\n  }\n}\n\n# ------------------------------------------------------------------------------------------------\n\nif (!$aResumeAfterError)\n{\n  $global:cptProjectCounter = $projectsToProcess.Length\n}\nelse\n{\n  if (!(VariableExists 'cptProjectCounter') -or !(VariableExists 'cptProjectsBucket'))\n  {\n    Write-Warning \"Can't resume. Previous state is unreliable. Processing all projects...\"\n    $global:cptProjectCounter = $projectsToProcess.Length\n  }\n  elseif ((Compare-Object $projectsToProcess $global:cptProjectsBucket))\n  {\n    Write-Warning \"Can't resume. Previous state is unreliable. Processing all projects...`n`nREMINDER: Don't change arguments when adding -resume.`n`n\"\n    $global:cptProjectCounter = $projectsToProcess.Length\n  }\n  else\n  {\n    Write-Output \"Resuming from project #$($global:cptProjectCounter)\"\n  }\n}\n\n[System.IO.FileInfo[]] $global:cptProjectsBucket = $projectsToProcess\n\n[int] $localProjectCounter = $projectsToProcess.Length;\nforeach ($project in $projectsToProcess)\n{\n  if ($localProjectCounter -gt $global:cptProjectCounter)\n  {\n    $localProjectCounter--;\n    continue\n  }\n\n  [string] $vcxprojPath = $project.FullName;\n  \n\n  [string[]] $configPlatforms = $aVcxprojConfigPlatform\n  if ($configPlatforms.Count -eq 0)\n  {\n    $configPlatforms += @(\"\")\n  }\n\n  foreach ($crtPlatformConfig in $configPlatforms)\n  {    \n    Write-InformationTimed \"Before project process\"\n    Process-Project -vcxprojPath $vcxprojPath -workloadType $workloadType -platformConfig $crtPlatformConfig\n    Write-InformationTimed \"After project process\"\n\n    Write-Output \"\" # empty line separator\n  }\n\n  $localProjectCounter -= 1\n  $global:cptProjectCounter = $localProjectCounter\n}\n\nif ($aExportJsonDB) \n{ \n  JsonDB-Finalize\n}\n\n\nWrite-InformationTimed \"Goodbye\"\n\nif ($global:FoundErrors)\n{\n  Fail-Script\n}\nelse\n{\n  Exit-Script\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/get-header-references.ps1",
    "content": "# line limit for scanning files for #include\n[int] $global:cpt_header_include_line_limit = 30\n\n# after the line limit, if any includes are still found we\n# extend the limit with this value\n[int] $global:cpt_header_include_line_extension = 10\n\n[string[]] $global:headerExtensions = @('h', 'hh', 'hpp', 'hxx')\n[string[]] $global:sourceExtensions = @('c', 'cc', 'cpp', 'cxx')\n\nFunction detail:FindHeaderReferences( [Parameter(Mandatory = $false)] [string[]] $headers\n                                    , [Parameter(Mandatory = $false)] [System.IO.FileInfo[]] $filePool\n                                    , [Parameter(Mandatory = $false)] [System.Collections.Hashtable] $alreadyFound = @{}\n                                    )\n{\n    if (!$headers)\n    {\n        return @()\n    }\n\n    [string] $regexHeaders = @($headers | ForEach-Object { ([System.IO.FileInfo]$_).BaseName } `\n                                       | Select-Object -Unique `\n                                       | Where-Object { $_ -ine \"stdafx\" -and $_ -ine \"resource\" } `\n                              ) -join '|'\n\n    if ($regexHeaders.Length -eq 0)\n    {\n        return @()\n    }\n\n    [string] $regex = \"[/\"\"]($regexHeaders)\\.($($global:headerExtensions -join '|'))\"\"\"\n    Write-Debug \"Regex for header reference find: $regex`n\"\n\n    [string[]] $returnRefs = @()\n    if (!$filePool)\n    {\n        # initialize pool of files that we look into\n        [string[]] $allFileExts = @(($global:sourceExtensions + `\n                                     $global:headerExtensions) | ForEach-Object { \"*.$_\" })\n        $filePool = Get-ChildItem -recurse -include $allFileExts\n    }\n\n    foreach ($file in $filePool)\n    {\n        if ($alreadyFound.ContainsKey($file.FullName))\n        {\n            continue\n        }\n\n        [int] $lineCount = 0\n        [int] $lineLimit = $global:cpt_header_include_line_limit\n        foreach($line in [System.IO.File]::ReadLines($file))\n        {\n            if ([string]::IsNullOrWhiteSpace($line))\n            {\n                # skip empty lines\n                continue\n            }\n\n            if ($line -match $regex)\n            {\n                if ( ! $alreadyFound.ContainsKey($file.FullName))\n                {\n                    $alreadyFound[$file.FullName] = $true\n                    $returnRefs += $file.FullName\n                }\n\n                if ($lineCount -eq $lineLimit)\n                {\n                    # we still have includes to scan\n                    $lineLimit += $global:cpt_header_include_line_extension\n                }\n            }\n\n            if ( (++$lineCount) -gt $lineLimit)\n            {\n                break\n            }\n        }\n    }\n\n    if ($returnRefs.Count -gt 0)\n    {\n        [string[]] $headersLeftToSearch = @($returnRefs | Where-Object `\n                                            { FileHasExtension -filePath $_ `\n                                                               -ext $global:headerExtensions } )\n        if ($headersLeftToSearch.Count -gt 0)\n        {\n            Write-Debug \"[!] Recursive reference detection in progress for: \"\n            Write-Debug ($headersLeftToSearch -join \"`n\")\n            $returnRefs += detail:FindHeaderReferences -headers      $headersLeftToSearch `\n                                                       -filePool     $filePool `\n                                                       -alreadyFound $alreadyFound\n        }\n    }\n\n    $returnRefs = $returnRefs | Select-Object -Unique\n    Write-Debug \"Found header refs (regex $regex)\"\n    Write-Debug ($returnRefs -join \"`n\")\n    return $returnRefs\n}\n\n<#\n.SYNOPSIS\nDetects source files that reference given headers.\n\nReturns an array with full paths of files that reference the header(s).\n.DESCRIPTION\nWhen modifying a header, all translation units that include that header\nhave to compiled. This function detects those files that include it.\n.PARAMETER files\nHeader files of which we want references to be found\nAny files that are not headers will be ignored.\n#>\nFunction Get-HeaderReferences([Parameter(Mandatory = $false)][string[]] $files)\n{\n    if ($files.Count -eq 0)\n    {\n        return @()\n    }\n\n    # we take interest only in files that reference headers\n    $files = @($files | Where-Object { FileHasExtension -filePath $_ `\n                                                        -ext $global:headerExtensions })\n    if ($files.Count -eq 0)\n    {\n        return @()\n    }\n\n    [string[]] $refs = @()\n\n    if ($files.Count -gt 0)\n    {\n        Write-Verbose-Timed \"Headers changed. Detecting which source files to process...\"\n        $refs = detail:FindHeaderReferences -headers $files\n        Write-Verbose-Timed \"Finished detecting source files.\"\n\n        $refs = $refs | Where-Object { ! [string]::IsNullOrWhiteSpace($_) }\n    }\n\n    return $refs\n}\n\n<#\n.SYNOPSIS\nDetects projects that reference given source files (i.e. cpps).\n\nReturns an array with full paths of detected projects.\n.DESCRIPTION\nWhen modifying a file, only projects that reference that file should be recompiled.\n.PARAMETER projectPool\nProjects in which to look\n.PARAMETER files\nSource files to be found in projects.\n#>\nFunction Get-SourceCodeIncludeProjects([Parameter(Mandatory = $false)][System.IO.FileInfo[]] $projectPool,\n                                       [Parameter(Mandatory = $false)][string[]] $files)\n{\n    [System.Collections.Hashtable] $fileCache = @{}\n    foreach ($file in $files)\n    {\n        if ($file)\n        {\n            $fileCache[$file.Trim().ToLower()] = $true\n        }\n    }\n\n    [System.IO.FileInfo[]] $matchedProjects = @()\n\n    [string] $clPrefix    = '<ClCompile Include=\"'\n    [string] $clSuffix    = '\" />'\n    [string] $endGroupTag = '</ItemGroup>'\n\n    foreach ($proj in $projectPool)\n    {\n        [string] $projDir  = $proj.Directory.FullName\n\n        [bool] $inClIncludeSection = $false\n        foreach($line in [System.IO.File]::ReadLines($proj.FullName))\n        {\n            $line = $line.Trim()\n\n            if ($line.StartsWith($clPrefix))\n            {\n                if (!$inClIncludeSection)\n                {\n                    $inClIncludeSection = $true\n                }\n\n                [string] $filePath = $line.Substring($clPrefix.Length, `\n                                                     $line.Length - $clPrefix.Length - $clSuffix.Length)\n                if (![System.IO.Path]::IsPathRooted($filePath))\n                {\n                    $filePath = Canonize-Path -base $projDir -child $filePath -ignoreErrors\n                }\n                if ([string]::IsNullOrEmpty($filePath))\n                {\n                    continue\n                }\n\n                [System.IO.FileInfo] $sourceFile = $filePath\n                if ($fileCache.ContainsKey($sourceFile.FullName.Trim().ToLower()) -or `\n                    $fileCache.ContainsKey($sourceFile.Name.Trim().ToLower()))\n                {\n                    $matchedProjects += $proj\n                    break\n                }\n            }\n\n            if ($inClIncludeSection -and $line -eq $endGroupTag)\n            {\n                # nothing more to check in this project\n                break\n            }\n        }\n    }\n\n    return $matchedProjects\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/get-llvm-helper.ps1",
    "content": "# This helper makes sure we have the LLVM tool we require present on disk.\n# If it's not available then we download it from GitHub.\n \n# REQUIRES \"io.ps1\" to be included\n\n# ------------------------------------------------------------------------------------------------\n# Default install locations of LLVM. If present there, we automatically use it\n\nSet-Variable -name kLLVMInstallLocations    -value @(\"${Env:ProgramW6432}\\LLVM\\bin\"\n                                                    ,\"${Env:ProgramFiles(x86)}\\LLVM\\bin\"\n                                                    )                   -option Constant\n#Url to assets (clang++ and clang-tidy) from previous release made by Clang Power Tools on github \nSet-Variable -name kCptGithubLlvm -value \"https://github.com/Caphyon/clang-power-tools/releases/download/v2025.8.0\" `\n                                  -option Constant\nSet-Variable -name kCptGithubLlvmVersion -value \"21.1.6 (LLVM 21.1.6)\" -Option Constant\n\n# Clang Constants\n\nSet-Variable -name kCss            -value \"clang-doc-default-stylesheet.css\"       -option Constant\nSet-Variable -name kClangDoc       -value \"clang-doc.exe\"                          -option Constant\nSet-Variable -name kIndex          -value \"index.js\"                               -option Constant\n\nFunction Move-Tool-To-LlvmBin([Parameter(Mandatory = $true)][string] $clangToolWeNeed,\n                              [Parameter(Mandatory = $true)][string] $llvmLiteBinDir)\n{\n\n  $llvmLiteDir = (get-item $llvmLiteBinDir).Parent.FullName\n\n  if(Test-Path \"$llvmLiteDir\\$clangToolWeNeed\")\n  {\n    Move-Item -Path \"$llvmLiteDir\\$clangToolWeNeed\" -Destination \"$llvmLiteBinDir\\$clangToolWeNeed\"\n  }\n\n}\n\nFunction Ensure-LLVMTool-IsPresent([Parameter(Mandatory = $true)][string] $clangToolWeNeed) {\n  [string] $ret = \"\"\n\n  # see if we can reach the tool through PATH\n  if (Exists-Command $clangToolWeNeed )\n  {\n    [System.IO.FileInfo] $toolPath = (Get-Command $clangToolWeNeed).Source\n    return $toolPath.Directory.FullName\n  }\n  \n  # search in predefined locations\n  foreach ($locationLLVM in $kLLVMInstallLocations)\n  {\n    if (Test-Path -LiteralPath \"$locationLLVM\\$clangToolWeNeed\")\n    {\n      return $locationLLVM\n    }\n  }\n  # download read-to-use binary from github\n\n  [string] $llvmLiteDirParent = \"${env:APPDATA}\\ClangPowerTools\"\n  [string] $llvmLiteDir       = \"$llvmLiteDirParent\\LLVM_Lite\\Bin\"\n\n  [string] $llvmLiteToolPath = \"$llvmLiteDir\\$clangToolWeNeed\"\n  if (Test-Path $llvmLiteToolPath)\n  {\n    $versionPresent = (Get-Item $llvmLiteToolPath).VersionInfo.ProductVersion\n    if ($versionPresent -eq $kCptGithubLlvmVersion)\n    {\n      # we already have downloaded the latest standalone tool, reuse it\n      return $llvmLiteDir\n    }\n  }\n\n  if (Test-InternetConnectivity)\n  {\n    if ([string]::IsNullOrEmpty($ret))\n    {\n      if (!(Test-Path $llvmLiteDirParent))\n      {\n        New-Item -Path $llvmLiteDirParent -ItemType Directory | Out-Null\n      }\n      if (!(Test-Path $llvmLiteDir))\n      {\n        New-Item -Path $llvmLiteDir -ItemType Directory | Out-Null\n      }\n      \n      # check if tool already exists Llvm_lite folder, to move it in Llvm_lite/bin\n      Move-Tool-To-LlvmBin $clangToolWeNeed $llvmLiteDir\n\n      # the displayed progress slows downloads considerably, so disable it\n      $prevPreference = $ProgressPreference\n      $ProgressPreference = 'SilentlyContinue'\n      [string] $clangCompilerWebPath = \"$kCptGithubLlvm/$clangToolWeNeed\"\n      \n      if (Test-Path  $llvmLiteToolPath)\n      {\n        # we have an older version downloaded, remove it first\n        Remove-Item $llvmLiteToolPath -Force\n      }\n\n      Write-Verbose \"Downloading $clangToolWeNeed $kCptGithubLlvmVersion ...\"\n      # grab ready-to-use LLVM binaries from Github\n      Invoke-WebRequest -Uri $clangCompilerWebPath -OutFile $llvmLiteToolPath\n      # download css file if needed tool is clang-doc.exe\n      if($clangToolWeNeed -eq $kClangDoc)\n      {\n        [string] $parentDirLite = (get-item $llvmLiteDir ).Parent.FullName\n        [string] $llvmLiteCssFolderPath = \"$parentDirLite\\share\\clang\"\n        if (!(Test-Path $llvmLiteCssFolderPath))\n        {\n          New-Item $llvmLiteCssFolderPath -ItemType Directory | Out-Null\n        }\n        Invoke-WebRequest -Uri \"$kCptGithubLlvm/$kCss\" -OutFile \"$llvmLiteCssFolderPath\\$kCss\"\n        Invoke-WebRequest -Uri \"$kCptGithubLlvm/$kIndex\" -OutFile \"$llvmLiteCssFolderPath\\$kIndex\"\n      } \n      $ProgressPreference = $prevPreference\n\n      $ret = $llvmLiteDir\n    }\n  }\n  return $ret\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/get-llvm.ps1",
    "content": "<#\n.SYNOPSIS\n    Downloads ready-to-use one or more LLVM binaries, if not already available on system.\n\n.DESCRIPTION\n    Purpose of this script is to ensure that LLVM binaries are available for use.\n    The strategy used, for each tool, is: \n     * search in PATH\n     * search in Program Files\n     * search in %APPDATA%\\ClangPowerTools\\LLVM_Lite\n     * if not found, download tool and save in LLVM_Lite location\n\n.PARAMETER aTool\n    Alias 'tool'. The LLVM tool(s) to potentially download.\n\n.NOTES\n    Author: Gabriel Diaconita, Marina Rusu\n#>\n#Requires -Version 3\nparam( [alias(\"tool\")]\n       [Parameter(Mandatory=$false, HelpMessage=\"LLVM tool(s) to ensure exist\")]\n       [string[]] $aTools = @()\n     )\n\nSet-StrictMode -version latest\n$ErrorActionPreference = 'Continue'\n\n. \"$PSScriptRoot\\io.ps1\"\n. \"$PSScriptRoot\\get-llvm-helper.ps1\"\n\n$ret = @()\nforeach ($tool in $aTools)\n{\n  [string] $toolLocation = Ensure-LLVMTool-IsPresent $tool\n  $ret += @($toolLocation)\n}\n\nWrite-Output $ret"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/integration-project.tests.ps1",
    "content": "BeforeAll {\n @( \"$PSScriptRoot\\io.ps1\"\n  , \"$PSScriptRoot\\visualstudio-detection.ps1\"\n  , \"$PSScriptRoot\\msbuild-expression-eval.ps1\"\n  , \"$PSScriptRoot\\msbuild-project-load.ps1\"\n  , \"$PSScriptRoot\\msbuild-project-data.ps1\"\n  , \"$PSScriptRoot\\itemdefinition-context.ps1\"\n  ) | ForEach-Object { . $_ }\n}\n\nfunction LoadIntegrationProject($name)\n{\n  $slnPath = \"$PSScriptRoot\\integration-projects\\CptIntegrationProjects.sln\";\n  if (! (VariableExists 'slnFiles'))\n  {\n    Set-Variable -name 'slnFiles' -value @{} -scope Global\n    Set-Variable -name 'cptVisualStudioVersion' -value '2017' -scope Global\n  }\n  $global:slnFiles[$slnPath] = (Get-Content $slnPath)\n  [string] $projPath = \"$PSScriptRoot\\test-projects\\$name\\test.vcxproj\"\n  LoadProject $projPath\n}\n\nDescribe \"Integration Project Unit Tests\" {\n  It \"Should correctly load Item Groups\" {\n\n  #LoadIntegrationProject -name 'itemgroups'\n  #$includeDirs =  Get-ProjectIncludeDirectories\n\n  # todo validate includeDirs\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/integration-projects/CptIntegrationProjects.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.421\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"itemgroups\", \"itemgroups\\test.vcxproj\", \"{558406F5-E257-4B00-B2C5-27A947DBB111}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x86 = Debug|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{558406F5-E257-4B00-B2C5-27A947DBB111}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{558406F5-E257-4B00-B2C5-27A947DBB111}.Debug|x86.Build.0 = Debug|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {EE1D3380-CA68-4AE8-B0BD-630FEBA1824F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/integration-projects/itemgroups/test.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{558406F5-E257-4B00-B2C5-27A947DBB111}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>cpttestprojone</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>\n    <ProjectName>itemgroups</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <ItemGroup>\n    <CptTest Include=\"$([System.IO.Directory]::GetDirectories(&quot;$(APPDATA)\\Microsoft&quot;, &quot;*&quot;, SearchOption.AllDirectories))\" />\n  </ItemGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IncludePath>@(CptTest);$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"pch.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"cpt_test_proj_one.cpp\" />\n    <ClCompile Include=\"pch.cpp\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/io.ps1",
    "content": "#Console IO\n# ------------------------------------------------------------------------------------------------\nFunction Write-Message([parameter(Mandatory = $true)][string] $msg\n    , [Parameter(Mandatory = $true)][System.ConsoleColor] $color)\n{\n    $foregroundColor = $host.ui.RawUI.ForegroundColor\n    $host.ui.RawUI.ForegroundColor = $color\n    Write-Output $msg\n    $host.ui.RawUI.ForegroundColor = $foregroundColor\n}\n\nfunction Write-InformationTimed($message)\n{\n  if ($InformationPreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n  [DateTime] $lastTime = [DateTime]::Now\n  [string] $kTimeStampVar = \"lastCptTimestamp\"\n  if (VariableExists -name $kTimeStampVar)\n  {\n     $lastTime = (Get-Variable -name $kTimeStampVar -scope Global).Value\n  }\n  Set-Variable -name $kTimeStampVar -scope Global -value ([DateTime]::Now)\n  \n  [DateTime] $now = [DateTime]::Now;\n  [System.TimeSpan] $delta = $now - $lastTime\n\n  Write-Information \"$message at $([DateTime]::Now.ToString(\"mm:ss:fff\")). dt = $($delta.TotalMilliseconds)\"\n}\n\n# Writes an error without the verbose PowerShell extra-info (script line location, etc.)\nFunction Write-Err([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n  Write-Message -msg $msg -color Red\n}\n\nFunction Write-Success([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n  Write-Message -msg $msg -color Green\n}\n\nFunction Write-Array($array, $name)\n{\n    Write-Output \"$($name):\"\n    $array | ForEach-Object { Write-Output \"  $_\" }\n    Write-Output \"\" # empty line separator\n}\n\nFunction Write-Verbose-Array($array, $name)\n{\n  if ($VerbosePreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n  Write-Verbose \"$($name):\"\n  $array | ForEach-Object { Write-Verbose \"  $_\" }\n  Write-Verbose \"\" # empty line separator\n}\n\nFunction Write-Verbose-Timed([parameter(ValueFromPipeline, Mandatory = $true)][string] $msg)\n{\n    Write-Verbose \"$([DateTime]::Now.ToString(\"[HH:mm:ss]\")) $msg\"\n}\n\nFunction Print-InvocationArguments()\n{\n  if ($VerbosePreference -eq \"SilentlyContinue\")\n  {\n    return\n  }\n\n  $bParams = $PSCmdlet.MyInvocation.BoundParameters\n  if ($bParams)\n  {\n    [string] $paramStr = \"clang-build.ps1 invocation args: `n\"\n    foreach ($key in $bParams.Keys)\n    {\n      $paramStr += \"  $($key) = $($bParams[$key]) `n\"\n    }\n    Write-Verbose $paramStr\n  }\n}\n\nFunction Print-CommandParameters([Parameter(Mandatory = $true)][string] $command)\n{\n    $params = @()\n    foreach ($param in ((Get-Command $command).ParameterSets[0].Parameters))\n    {\n        if (!$param.HelpMessage)\n        {\n            continue\n        }\n\n        $params += New-Object PsObject -Prop @{ \"Option\" = \"-$($param.Aliases[0])\"\n                                              ; \"Description\" = $param.HelpMessage\n                                              }\n    }\n\n   $params | Sort-Object -Property \"Option\" | Out-Default\n}\n\n\n\n# Function that gets the name of a command argument when it is only known by its alias\n# For streamlining purposes, it also accepts the name itself.\nFunction Get-CommandParameterName([Parameter(Mandatory = $true)][string] $command\n                                 ,[Parameter(Mandatory = $true)][string] $nameOrAlias)\n{\n  foreach ($param in ((Get-Command $command).ParameterSets[0].Parameters))\n  {\n    if ($param.Name    -eq       $nameOrAlias -or\n        $param.Aliases -contains $nameOrAlias)\n    {\n      return $param.Name\n    }\n  }\n  return \"\"\n}\nFunction VariableExists([Parameter(Mandatory = $true)][string] $name)\n{\n    if ( ! ( Get-Variable $name  -ErrorAction 'Ignore') )\n    {\n        return $false\n    }\n    return $true\n}\n\nFunction VariableExistsAndNotEmpty([Parameter(Mandatory = $true)][string] $name)\n{\n    if ( ! (VariableExists $name) )\n    {\n        return $false\n    }\n\n    if ( [string]::IsNullOrWhiteSpace( (Get-Variable $name).Value ) )\n    {\n        return $false\n    }\n    return $true\n}\nfunction HasProperty($object, $property)\n{\n    return ($property -in $object.PSobject.Properties.Name)\n}\n\n# File IO\n# ------------------------------------------------------------------------------------------------\nFunction Get-QuotedPath([Parameter(Mandatory = $false)][string] $path)\n{\n    if ([string]::IsNullOrWhiteSpace($path))\n    {\n        return $path\n    }\n\n    [string] $returnPath = $path\n\n    if (!$path.StartsWith('\"'))\n    {\n        $returnPath = \"\"\"$path\"\"\"\n    }\n\n    return $returnPath\n}\n\nFunction Get-UnquotedPath([Parameter(Mandatory = $false)][string] $path)\n{\n    [string] $retPath = $path\n    if ( ! [string]::IsNullOrWhiteSpace($retPath) -and $retPath.StartsWith('\"') )\n    {\n        $retPath = $retPath.Remove(0, 1);\n\n        if ( $retPath.EndsWith('\"') )\n        {\n            $retPath = $retPath.Remove($retPath.Length - 1, 1)\n        }\n        else \n        {\n            # if it begins with double quote, should end with double quote...\n            # something else may be going on, return the original path.\n            $retPath = $path\n        }\n    }\n    return $retPath\n}\n\nFunction Remove-PathTrailingSlash([Parameter(Mandatory = $true)][string] $path)\n{\n    return $path -replace '\\\\$', ''\n}\n\nFunction Get-FileDirectory([Parameter(Mandatory = $true)][string] $filePath)\n{\n    return ([System.IO.Path]::GetDirectoryName($filePath) + \"\\\")\n}\n\nFunction Get-FileName( [Parameter(Mandatory = $false)][string] $path\n                     , [Parameter(Mandatory = $false)][switch] $noext)\n{\n    if ($noext)\n    {\n        return ([System.IO.Path]::GetFileNameWithoutExtension($path))\n    }\n    else\n    {\n        return ([System.IO.Path]::GetFileName($path))\n    }\n}\n\nFunction IsFileMatchingName( [Parameter(Mandatory = $true)][string] $filePath\n                           , [Parameter(Mandatory = $true)] $matchName)\n{\n    [string] $matchString = $matchName.ToString() # works for both strings and regex types\n\n    if ($matchName -is [string])\n    {\n        if ([System.IO.Path]::IsPathRooted($matchString))\n        {\n            if ($matchName.Length -le $filePath.Length -and\n                ($filePath.Substring(0, $matchName.Length) -ieq $matchName))\n            {\n              return $true\n            }\n        }\n\n        [string] $fileName      = (Get-FileName -path $filePath)\n        if ($fileName -ieq $matchString)\n        {\n            return $true\n        }\n\n        [string] $fileNameNoExt = (Get-FileName -path $filePath -noext)\n        if ($fileNameNoExt -ieq $matchString)\n        {\n            return $true\n        }\n\n        if ($filePath.ToLower().EndsWith($matchName.ToLower()))\n        {\n            return $true\n        }\n\n        while (![string]::IsNullOrWhiteSpace($filePath))\n        {\n            if ($filePath.ToLower().EndsWith($matchName.ToLower()))\n            {\n                return $true\n            }\n            $filePath = [System.IO.Path]::GetDirectoryName($filePath)\n        }\n\n        return $false\n    }\n    elseif ($matchName -is [regex])\n    {\n        return $filePath -match $matchString\n    }\n    else\n    {\n        throw \"Unsupported match object type $($matchName.GetType().ToString())\"\n    }\n}\n\nFunction FileHasExtension( [Parameter(Mandatory = $true)][string]   $filePath\n                         , [Parameter(Mandatory = $true)][string[]] $ext\n                         )\n{\n    foreach ($e in $ext)\n    {\n        if ($filePath.EndsWith($e))\n        {\n            return $true\n        }\n    }\n    return $false\n}\n\nFunction Get-RandomString( [Parameter(Mandatory=$false)][int] $aLength = 10)\n{\n  return (-Join ((65..90) + (97..122) | Get-Random -Count $aLength | % { [char] $_ }))\n}\n\n<#\n  .DESCRIPTION\n  Merges an absolute and a relative file path.\n  .EXAMPLE\n  Having base = C:\\Windows\\System32 and child = .. we get C:\\Windows\n  .EXAMPLE\n  Having base = C:\\Windows\\System32 and child = ..\\..\\..\\.. we get C:\\ (cannot go further up)\n  .PARAMETER base\n  The absolute path from which we start.\n  .PARAMETER child\n  The relative path(s) to be merged into base. If multiple paths are specified, they can be separated \n  semicolon or space.\n  .PARAMETER ignoreErrors\n  If this switch is not present, an error will be triggered if the resulting path\n  is not present on disk (e.g. c:\\Windows\\System33).\n\n  If present and the resulting path does not exist, the function returns an empty string.\n  #>\nFunction Canonize-Path( [Parameter(Mandatory = $true)][string] $base\n    , [Parameter(Mandatory = $true)][string] $child\n    , [switch] $ignoreErrors)\n{\n    [string[]] $children = @()\n\n    $tokensBySemicolon = $child.Trim().Split(';')\n\n    foreach ($semicolonTok in $tokensBySemicolon)\n    {\n        if ([string]::IsNullOrWhiteSpace($semicolonTok))\n        {\n            continue\n        }\n        $tokensBySpace = $semicolonTok.Trim().Split(' ')\n        $currentToken = \"\"\n        foreach ($tok in $tokensBySpace)\n        {\n            if ($tok -match \"[A-Z]:.*\")\n            {\n                if ( ! [string]::IsNullOrWhiteSpace($currentToken))\n                {\n                    $children += $currentToken\n                }\n                $currentToken = $tok\n            }\n            else\n            {\n                if ($tok -ne $tokensBySpace[0])\n                {\n                    $currentToken += ' '\n                }\n                $currentToken += $tok\n            }\n        }\n        $children += $currentToken\n    }\n\n    Write-Debug \"Canonizing for base = $base and children = $children\"\n\n    [string[]] $retPaths = @()\n    [string] $errorAction = If ($ignoreErrors) {\"SilentlyContinue\"} Else {\"Stop\"}\n\n    if (Test-Path -LiteralPath $base)\n    {\n        # Join-Path doesn't support LiteralPath so make sure we sanitize\n        # the base path for unsupported characters\n        $base = $base.Replace('[', '`[');\n        $base = $base.Replace(']', '`]');\n    }\n\n    foreach ($childPath in $children)\n    {\n        $childPath = Get-UnquotedPath $childPath\n        $childPath = $childPath -replace \"`r\", \"\"\n        $childPath = $childPath -replace \"`n\", \"\"\n\n        if ([System.IO.Path]::IsPathRooted($childPath))\n        {\n            if ((Test-Path -LiteralPath $childPath))\n            {\n              $retPaths += @($childPath)\n            }\n        }\n        else\n        {\n            [string[]] $paths = @(Join-Path -Path \"$base\" -ChildPath \"$childPath\" -Resolve -ErrorAction $errorAction)\n            $retPaths += $paths\n        }\n    }\n\n    return $retPaths\n}\n\nfunction cpt::HasTrailingSlash([Parameter(Mandatory = $true)][string] $str)\n{\n    return $str.EndsWith('\\') -or $str.EndsWith('/')\n}\n\n\nfunction EnsureTrailingSlash([Parameter(Mandatory = $true)][string] $str)\n{\n    [string] $ret = If (cpt::HasTrailingSlash($str)) { $str } else { \"$str\\\" }\n    return $ret\n}\n\nfunction cpt::Exists([Parameter(Mandatory = $false)][string] $path)\n{\n    if ([string]::IsNullOrEmpty($path))\n    {\n        return $false\n    }\n\n    return Test-Path -LiteralPath $path\n}\n\nfunction cpt::MakePathRelative( [Parameter(Mandatory = $true)][string] $base\n                         , [Parameter(Mandatory = $true)][string] $target\n                         )\n{\n    Push-Location \"$base\\\"\n    [string] $relativePath = (Resolve-Path -Relative $target) -replace '^\\.\\\\',''\n    Pop-Location\n    if ( (cpt::HasTrailingSlash $target) -or $target.EndsWith('.') )\n    {\n        $relativePath += '\\'\n    }\n    return \"$relativePath\"\n}\n\n\nfunction cpt::GetDirNameOfFileAbove( [Parameter(Mandatory = $true)][string] $startDir\n                                   , [Parameter(Mandatory = $true)][string] $targetFile\n                                   )\n{\n    if ($targetFile.Contains('$'))\n    {\n        $targetFile = Invoke-Expression $targetFile\n    }\n    if ($startDir.Contains('$'))\n    {\n        $startDir = Invoke-Expression $startDir\n    }\n\n    [string] $base = $startDir\n    while ([string]::IsNullOrEmpty((Canonize-Path -base  $base        `\n                    -child $targetFile  `\n                    -ignoreErrors)))\n    {\n        $base = [System.IO.Path]::GetDirectoryName($base)\n        if ([string]::IsNullOrEmpty($base))\n        {\n            return \"\"\n        }\n    }\n    return $base\n}\n\nfunction cpt::GetPathOfFileAbove([Parameter(Mandatory = $true)][string] $targetFile,\n                                 [Parameter(Mandatory = $true)][string] $startDir\n                                )\n{\n    if ($targetFile.Contains('$'))\n    {\n        $targetFile = Invoke-Expression $targetFile\n    }\n\n    $base = (cpt::GetDirNameOfFileAbove -targetFile $targetFile -startDir $startDir)\n    if ([string]::IsNullOrWhiteSpace($base))\n    {\n        return \"\"\n    }\n    return \"$(EnsureTrailingSlash $base)$targetFile\"\n}\n\n# Command IO\n# ------------------------------------------------------------------------------------------------\nFunction Exists-Command([Parameter(Mandatory = $true)][string] $command)\n{\n    try\n    {\n        Get-Command -name $command -ErrorAction Stop | out-null\n        return $true\n    }\n    catch\n    {\n        return $false\n    }\n}\n\nFunction Get-ClangVersion([Parameter(Mandatory = $true)][string] $toolToCheck)\n{\n    if (Exists-Command $toolToCheck)\n    {\n        [string] $s = &\"$toolToCheck\" --version\n        $regexMatch = [regex]::match($s, 'version (\\d+).')\n        if ($regexMatch)\n        {\n            return ($regexMatch.Groups[1].Value -as [int])\n        }\n    }\n    return 0\n}\n\nFunction Test-InternetConnectivity\n{  \n  $resp = Get-WmiObject -Class Win32_PingStatus -Filter 'Address=\"github.com\" and Timeout=100' | Select-Object ResponseTime\n  [bool] $hasInternetConnectivity = ($resp.ResponseTime -and $resp.ResponseTime -gt 0)\n  return $hasInternetConnectivity\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/io.tests.ps1",
    "content": "﻿#Clear-Host\n\nBeforeAll {\n  @(\n   , \"$PSScriptRoot\\io.ps1\"\n   ) | ForEach-Object { . $_ }\n}\n\nDescribe \"VariableExists\" {\n  \n  It \"Should verify VariableExists\" {\n    VariableExists 'Foobar_VariableExists' | Should -BeExactly $false\n    $Foobar_VariableExists = 1\n    VariableExists 'Foobar_VariableExists' | Should -BeExactly $true\n    $Foobar_VariableExists = @()\n    VariableExists 'Foobar_VariableExists' | Should -BeExactly $true\n\n    Remove-Variable 'Foobar_VariableExists' | Out-Null\n    VariableExistsAndNotEmpty 'Foobar_VariableExists' | Should -BeExactly $false\n    $Foobar_VariableExists = \"       \"\n    VariableExists            'Foobar_VariableExists' | Should -BeExactly $true\n    VariableExistsAndNotEmpty 'Foobar_VariableExists' | Should -BeExactly $false\n    $Foobar_VariableExists = \" \"\n    VariableExistsAndNotEmpty 'Foobar_VariableExists' | Should -BeExactly $false\n    $Foobar_VariableExists = \"1\"\n    VariableExistsAndNotEmpty 'Foobar_VariableExists' | Should -BeExactly $true\n  }\n}\n\nDescribe \"HasProperty\" {\n  \n  It \"Should verify HasProperty\" {\n    [string] $s = \"abc\"\n    HasProperty $s \"Length\"  | Should -BeExactly $true\n    HasProperty Ss \"Lengthh\" | SHould -BeExactly $false\n    HasProperty $s \"Trim\"    | Should -BeExactly $false # this is a method\n  }\n}\n\nDescribe \"File IO\" {\n\n  It \"Get-QuotedPath\" {\n   Get-QuotedPath ''       | Should -BeExactly ''\n   Get-QuotedPath '    '   | Should -BeExactly '    '\n   Get-QuotedPath '   '    | Should -BeExactly '   '\n   Get-QuotedPath 'test'   | Should -BeExactly '\"test\"'\n   Get-QuotedPath '\"test\"' | Should -BeExactly '\"test\"'\n   Get-QuotedPath 'c:\\some file'   | Should -BeExactly '\"c:\\some file\"'\n   Get-QuotedPath '\"c:\\some file\"' | Should -BeExactly '\"c:\\some file\"'\n  }\n\n  It \"Remove-PathTrailingSlash\" {\n    Remove-PathTrailingSlash \"c:\\windows\\\" | Should -BeExactly \"c:\\windows\"\n    Remove-PathTrailingSlash \"c:\\windows\" | Should -BeExactly \"c:\\windows\"\n    Remove-PathTrailingSlash \"..\\foo\\bar\\\" | Should -BeExactly \"..\\foo\\bar\"\n  }\n\n  It \"Get-FileDirectory\" {\n    Get-FileDirectory \"$env:SystemRoot\\explorer.exe\" | Should -BeExactly \"$env:SystemRoot\\\"\n    Get-FileDirectory \"$env:SystemRoot\\explorer.exe\" | Should -BeExactly \"$env:SystemRoot\\\"\n    Get-FileDirectory \"$env:SystemRoot\\foobar.nonexistent\" | Should -BeExactly \"$env:SystemRoot\\\"\n    Get-FileDirectory \"foo\\bar\" | Should -BeExactly \"foo\\\"\n  }\n\n  It \"Get-FileName\" {\n    Get-FileName \"$env:SystemRoot\\explorer.exe\" | Should -BeExactly \"explorer.exe\"\n    Get-FileName \"$env:SystemRoot\\foobar.nonexistent\" | Should -BeExactly \"foobar.nonexistent\"\n  }\n\n  It \"IsFileMatchingName - no regex\" {\n    $path = \"$env:SystemRoot\\notepad.exe\"\n    IsFileMatchingName -filePath $path -matchName \"notepad\" | Should     -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName \"notepad.exe\" | Should -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName \"notepad.ex\" | Should  -BeExactly $false\n    IsFileMatchingName -filePath $path -matchName \"note\" | Should        -BeExactly $false\n    IsFileMatchingName -filePath $path -matchName \".*\" | Should          -BeExactly $false\n  }\n\n  It \"IsFileMatchingName - with regex\" {\n    $path = \"$env:SystemRoot\\notepad.exe\"\n    IsFileMatchingName -filePath $path -matchName ([regex]\"notepad\") | Should     -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName ([regex]\"notepad.exe\") | Should -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName ([regex]\"notepad.ex\") | Should  -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName ([regex]\"note\") | Should        -BeExactly $true\n    IsFileMatchingName -filePath $path -matchName ([regex]\".*\") | Should          -BeExactly $true\n  }\n\n  It \"FileHasExtension\" {\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext 'bar' | Should -BeExactly $true\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext 'bar2' | Should -BeExactly $false\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext @('bar') | Should -BeExactly $true\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext @('bar2') | Should -BeExactly $false\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext @('bar', 'bar2') | Should -BeExactly $true\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext @('bar2', 'bar') | Should -BeExactly $true\n    FileHasExtension -filePath \"c:\\foo.bar\" -ext @('bar2', 'bar2') | Should -BeExactly $false\n  }\n\n  It \"Canonize-Path\" {\n    $sysDrive = \"$env:SystemDrive\\\"\n    Canonize-Path -base $sysDrive -child \"Windows\" | Should -Be $env:SystemRoot\n    { Canonize-Path -base $sysDrive -child \"foobar\" } | Should -throw\n    { Canonize-Path -base $sysDrive -child \"foobar\" -ignoreErrors } | Should -not -throw\n    Canonize-Path -base $sysDrive -child \"foobar\" -ignoreErrors | Should -BeExactly $null\n\n    [string[]] $files = Canonize-Path -base $sysDrive -child \"*\" # get all children\n    $files.Count | Should -BeGreaterThan 1\n  }\n\n  It \"Exists\" {\n    [string] $winDir = $env:SystemRoot\n    cpt::Exists $winDir | should -BeExactly $true\n    cpt::Exists \"$winDir\\notepad.exe\" | should -BeExactly $true\n    cpt::Exists \"$winDir\\foobar_surely_nonextant\" | should -BeExactly $false\n  }\n\n  It \"HasTrailingSlash\" {\n    cpt::HasTrailingSlash \"ab\" | should -BeExactly $false\n    cpt::HasTrailingSlash \"ab\\\" | should -BeExactly $true\n    cpt::HasTrailingSlash \"ab/\" | should -BeExactly $true\n    cpt::HasTrailingSlash \"a/b/\" | should -BeExactly $true\n  }\n\n  It \"EnsureTrailingSlash\" {\n    EnsureTrailingSlash \"ab\" | should -BeExactly \"ab\\\"\n    EnsureTrailingSlash \"ab\\\" | should -BeExactly \"ab\\\"\n    EnsureTrailingSlash \"ab/\" | should -BeExactly \"ab/\"\n    EnsureTrailingSlash \"a/b/\" | should -BeExactly \"a/b/\"\n  }\n}\n\nDescribe \"Command IO\" {\n  It \"Exists-Command\" {\n    Exists-Command \"Get-Process\" | Should -BeExactly $true\n    Exists-Command \"Get-JiggyWithIt\" | Should -BeExactly $false\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/itemdefinition-context.ps1",
    "content": "# Powershell code for creating item definition group contexts\n\n[System.Collections.Hashtable] $global:itemProperties = @{}\n[string] $global:itemPropertyNamespace = \"\"\n\nfunction Reset-ProjectItemContext()\n{\n    $global:itemProperties = @{}\n    $global:itemPropertyNamespace = \"\"\n}\n\nfunction Push-ProjectItemContext([Parameter(Mandatory = $true)][string] $name)\n{\n    [string] $toAdd = \"\"\n    if ($global:itemPropertyNamespace.Length -gt 0)\n    {\n        $toAdd = \".\";\n    }\n    $toAdd += $name\n\n    $global:itemPropertyNamespace += $toAdd\n\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Pop-ProjectItemContext()\n{\n    [int] $dotPos = $global:itemPropertyNamespace.LastIndexOf(\".\")\n    if ($dotPos -ge 0)\n    {\n        $global:itemPropertyNamespace = $global:itemPropertyNamespace.Substring(0, $dotPos)\n    }\n    else\n    {\n        $global:itemPropertyNamespace = \"\"\n    }\n\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Set-ProjectItemContext([Parameter(Mandatory = $true)][AllowEmptyString()][string] $name)\n{\n    if ( (VariableExists 'itemPropertyNameSpace') -and ($global:itemPropertyNamespace -eq $name) )\n    {\n        return\n    }\n\n    $global:itemPropertyNamespace = $name\n    Write-Verbose \"[CONTEXT] item namespace = @($global:itemPropertyNamespace)\"\n}\n\nfunction Get-ProjectItemContext()\n{\n    return $global:itemPropertyNamespace\n}\n\nfunction Get-ProjectItemProperty([Parameter(Mandatory = $false)][string] $propertyName)\n{\n    if (! $global:itemProperties.ContainsKey($global:itemPropertyNamespace))\n    {\n        return $null\n    }\n\n    [System.Collections.Hashtable] $propMap = $global:itemProperties[$global:itemPropertyNamespace]\n    if (!$propertyName)\n    {\n        return $propMap\n    }\n\n    if (! $propMap.ContainsKey($propertyName))\n    {\n        return $null\n    }\n\n    return $propMap[$propertyName]\n}\n\nfunction Set-ProjectItemProperty([Parameter(Mandatory = $true)][string] $propertyName,\n                                 [Parameter(Mandatory = $true)] $value)\n{\n    if (! $global:itemProperties.ContainsKey($global:itemPropertyNamespace))\n    {\n        $global:itemProperties.Add($global:itemPropertyNamespace, @{})\n        $global:ProjectSpecificVariables.Add('itemProperties') | out-null\n    }\n\n    [System.Collections.Hashtable] $propMap = $global:itemProperties[$global:itemPropertyNamespace]\n    if (! $propMap.ContainsKey($propertyName))\n    {\n        $propMap.Add($propertyName, $value)\n    }\n    else\n    {\n        $propMap[$propertyName] = $value\n    }\n\n    Write-Verbose \"[CONTEXT] propSet: $propertyName = $value\"\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/jsondb-export.ps1",
    "content": "function JsonDB-Init()\n{\n  [string] $outputPath = (EnsureTrailingSlash( Get-SourceDirectory ))\n  $outputPath += \"compile_commands.json\"\n  Set-Variable -name \"kJsonCompilationDbPath\" -value $outputPath -option Constant -scope Global\n  Set-Variable -name \"kJsonCompilationDbCount\" -value 0 -scope Global\n  \n  \"[\" | Out-File $kJsonCompilationDbPath -Encoding \"UTF8\"\n}\n\nfunction JsonDB-Append($text)\n{\n  $text | Out-File $kJsonCompilationDbPath -append -Encoding \"UTF8\"\n}\n\nfunction JsonDB-Finalize()\n{\n  JsonDB-Append \"]\"\n  Write-Output \"Exported JSON Compilation Database to $kJsonCompilationDbPath\"\n}\n\nfunction JsonDB-Push($directory, $file, $command)\n{\n  if ($kJsonCompilationDbCount -ge 1)\n  {\n    JsonDB-Append \"  ,\"\n  }\n  \n  # use only slashes\n  $command = $command.Replace('\\', '/')\n  $file = $file.Replace('\\', '/')\n  $directory = $directory.Replace('\\', '/')\n  \n  # escape double quotes\n  $command = $command.Replace('\"', '\\\"')\n  \n  # make paths relative to directory\n  $command = $command.Replace(\"$directory/\", \"\")\n  $file = $file.Replace(\"$directory/\", \"\")\n  \n  JsonDB-Append \"  {`r`n    \"\"directory\"\": \"\"$directory\"\",`r`n    \"\"command\"\": \"\"$command\"\",`r`n    \"\"file\"\": \"\"$file\"\"`r`n  }\"\n   \n  Set-Variable -name \"kJsonCompilationDbCount\" -value ($kJsonCompilationDbCount + 1) -scope Global\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/jsondb-export.tests.ps1",
    "content": "Describe \"Json Compilation Database Export\" {\n  It \"WIP\" {\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-expression-eval.ps1",
    "content": "# REQUIRES io.ps1 to be included\n\n[string[]] $buildUtilPaths = @(\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles}\\Microsoft Visual Studio\\2022\\Enterprise\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Professional\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2019\\Enterprise\\MSBuild\\Current\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Professional\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n    ,\"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\Microsoft.Build.Utilities.Core.dll\"\n)\n\nforeach ($buildUtilPath in $buildUtilPaths)\n{\n    if (Test-Path -LiteralPath $buildUtilPath)\n    {\n        Add-Type -path $buildUtilPath\n        Write-Verbose \"Loaded assembly $buildUtilPath\"\n        break\n    }\n}\n\nSet-Variable -name \"kMsbuildExpressionToPsRules\" <#-option Constant#>     `\n    -value @(                                                             `\n        <# backticks are control characters in PS, replace them #>        `\n          ('`'                               , ''''                      )`\n        <# Temporarily replace $( #>                                      `\n        , ('\\$\\s*\\('                         , '!@#'                     )`\n        <# Escape $ #>                                                    `\n        , ('\\$'                              , '`$'                      )`\n        <# Put back $( #>                                                 `\n        , ('!@#'                             , '$('                      )`\n        <# Various operators #>                                           `\n        , (\"([\\s\\)\\'\"\"])!=\"                  , '$1 -ne '                 )`\n        , (\"([\\s\\)\\'\"\"])<=\"                  , '$1 -le '                 )`\n        , (\"([\\s\\)\\'\"\"])>=\"                  , '$1 -ge '                 )`\n        , (\"([\\s\\)\\'\"\"])==\"                  , '$1 -eq '                 )`\n        , (\"([\\s\\)\\'\"\"])<\"                   , '$1 -lt '                 )`\n        , (\"([\\s\\)\\'\"\"])>\"                   , '$1 -gt '                 )`\n        , (\"([\\s\\)\\'\"\"])or\"                  , '$1 -or '                 )`\n        , (\"([\\s\\)\\'\"\"])and\"                 , '$1 -and '                )`\n        <# Use only double quotes #>                                      `\n        , (\"\\'\"                              , '\"'                       )`\n        , (\"Exists\\((.*?)\\)(\\s|$)\"           , '(cpt::Exists($1))$2'          )`\n        , (\"HasTrailingSlash\\((.*?)\\)(\\s|$)\" , '(cpt::HasTrailingSlash($1))$2')`\n        , (\"(\\`$\\()(Registry:)(.*?)(\\))\"     , '$$(GetRegValue(\"$3\"))'   )`\n        , (\"\\[MSBuild\\]::GetDirectoryNameOfFileAbove\\((.+?),\\s*`\"?'?((\\$.+?\\))|(.+?))((|`\"|')\\))+\"`\n        ,'cpt::GetDirNameOfFileAbove -startDir $1 -targetFile ''$2'')'        )`\n        , (\"\\(\\[MSBuild\\]::GetPathOfFileAbove\\(`\"?(.+?)`\"?,\\s*((`\"(.+)`\"\\)+)|((\\$\\(.+?\\))\\)*))\"`\n        ,'(cpt::GetPathOfFileAbove -startDir \"$4$6\" -targetFile ''$1'')'    )`\n        , (\"\\[MSBuild\\]::MakeRelative\\((.+?),\\s*\"\"?'?((\\$.+?\\))|(.+?))((|\"\"|')\\)\\))+\"`\n        ,'cpt::MakePathRelative -base $1 -target \"$2\")'                       )`\n        , ('SearchOption\\.', '[System.IO.SearchOption]::'                )`\n        , (\"@\\((.*?)\\)\", '$(Get-Project-Item(\"$1\"))'                     )`\n        , (\"%\\((.*?)\\)\", '$(Get-ProjectItemProperty(\"$1\"))'              )`\n        , ('\\$\\(HOME\\)', '$(CPT_SHIM_HOME)'                              )`\n        <# Rules for making sure the $ sign is put on correctly in expressions #> `\n        , ('\\$\\(([a-zA-Z_][a-zA-Z0-9_\\-]+)\\)', '$${$1}'                  )`\n        , ('\\(([a-zA-Z_][a-zA-Z0-9_\\-]+\\.)', '($$$1'                     )`\n)\n\nfunction GetRegValue([Parameter(Mandatory = $true)][string] $regPath)\n{\n    Write-Debug \"REG_READ $regPath\"\n\n    [int] $separatorIndex = $regPath.IndexOf('@')\n    [string] $valueName = \"\"\n    if ($separatorIndex -gt 0)\n    {\n        [string] $valueName = $regPath.Substring($separatorIndex + 1)\n        $regPath = $regPath.Substring(0, $separatorIndex)\n    }\n    if ([string]::IsNullOrEmpty($valueName))\n    {\n        throw \"Cannot retrieve an empty registry value\"\n    }\n    $regPath = $regPath -replace \"HKEY_LOCAL_MACHINE\\\\\", \"HKLM:\\\"\n\n    if (Test-Path $regPath)\n    {\n        return (Get-Item $regPath).GetValue($valueName)\n    }\n    else\n    {\n        return \"\"\n    }\n}\n\nfunction Initialize-ExpressionVariables([string] $expression)\n{\n    # expressions that call member functions of unintialized variables will throw\n    # unless we initialize those variables\n    $regexMatches = [regex]::matches($expression, '\\$(\\w+)\\.')\n    if ($regexMatches.Count -gt 0)\n    {\n        foreach ($regexMatch in $regexMatches)\n        {\n            $varName = $regexMatch.Groups[1].Value\n            if (! ( Get-Variable $varName  -ErrorAction 'Ignore') )\n            {\n                Write-Debug \"Initializing expression variable $varName to empty value\"\n                Set-Var -name $varName -value \"\" \n            }\n        }\n    }\n}\n\nfunction Evaluate-MSBuildExpression([string] $expression, [switch] $isCondition)\n{\n    # A lot of MSBuild expressions refer uninitialized variables\n    Set-StrictMode -Off\n\n    Write-Debug \"Start evaluate MSBuild expression $expression\"\n\n    foreach ($rule in $kMsbuildExpressionToPsRules)\n    {\n        $expression = $expression -replace $rule[0], $rule[1]\n    }\n\n    if ( !$isCondition -and ($expression.IndexOf('$') -lt 0))\n    {\n        # we can stop here, further processing is not required\n        return $expression\n    }\n\n    Write-Debug \"Intermediate PS expression: $expression\"\n\n    Initialize-ExpressionVariables $expression\n    [string] $res = \"\"\n\n    try\n    {\n        if ( ($expression.IndexOf('::') -ge 0) -or $isCondition)\n        {\n            try\n            {\n                $resInvokeResult = Invoke-Expression $expression\n\n                if ($resInvokeResult -is [array])\n                {\n                    $res = $resInvokeResult -join ';'\n                }\n                else\n                {\n                    $res = $resInvokeResult\n                }\n            }\n            catch\n            {\n                Write-Verbose $_.Exception.Message\n                $res = $ExecutionContext.InvokeCommand.ExpandString($expression)\n            }\n        }\n        else\n        {\n            $res = $ExecutionContext.InvokeCommand.ExpandString($expression)\n        }\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n    }\n\n    Write-Debug \"Evaluated expression to: $res\"\n\n    return $res\n}\nfunction Evaluate-MSBuildCondition([Parameter(Mandatory = $true)][string] $condition)\n{\n    Write-Debug \"Evaluating condition $condition\"\n\n    try\n    {\n        [string] $expression = Evaluate-MSBuildExpression -expression $condition -isCondition\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n        return $false\n    }\n\n    if ($expression -ieq \"true\")\n    {\n        return $true\n    }\n\n    if ($expression -ieq \"false\")\n    {\n        return $false\n    }\n\n    $expression = $expression -replace 'False', '$false'\n    $expression = $expression -replace 'True', '$true'\n\n    try\n    {\n        [bool] $res = (Invoke-Expression $expression) -eq $true\n    }\n    catch\n    {\n        Write-Verbose $_.Exception.Message\n        return $false\n    }\n    Write-Debug \"Evaluated condition to $res\"\n\n    return $res\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-expression-eval.tests.ps1",
    "content": "﻿#Clear-Host\n\n# IMPORT code blocks\n\nBeforeAll {\n  @(\n   , \"$PSScriptRoot\\io.ps1\"\n   , \"$PSScriptRoot\\itemdefinition-context.ps1\"\n   , \"$PSScriptRoot\\msbuild-expression-eval.ps1\"\n   ) | ForEach-Object { . $_ }\n}\n\nDescribe \"MSBuild - Powershell Expression translation\" {\n  It \"Plain expressions\" {\n    Evaluate-MSBuildExpression \"MyProjectString\" | Should -BeExactly \"MyProjectString\"\n    Evaluate-MSBuildExpression \"1905\" | Should -BeExactly \"1905\"\n    Evaluate-MSBuildExpression \"a;;b;c\" | Should -BeExactly \"a;;b;c\"\n    Evaluate-MSBuildExpression \"a-b-c\" | Should -BeExactly \"a-b-c\"\n    Evaluate-MSBuildExpression \"1-2-3\" | Should -BeExactly \"1-2-3\"\n    Evaluate-MSBuildExpression \"{1-2-3-4}\" | Should -BeExactly \"{1-2-3-4}\"\n    Evaluate-MSBuildExpression \"1.2.3.4\" | Should -BeExactly \"1.2.3.4\"\n    Evaluate-MSBuildExpression \"c:\\foo\\bar.ini\" | Should -BeExactly \"c:\\foo\\bar.ini\"\n    Evaluate-MSBuildExpression \"..\\foo\\bar\" | Should -BeExactly \"..\\foo\\bar\"\n  }\n\n  It \"Arithmetical operators\" {\n    Evaluate-MSBuildExpression \"`$(1+2+3)\" | Should -BeExactly \"6\"\n    Evaluate-MSBuildExpression \"`$(1-2-3)\" | Should -BeExactly \"-4\"\n    Evaluate-MSBuildExpression \"`$(1*2*3)\" | Should -BeExactly \"6\"\n    Evaluate-MSBuildExpression \"`$(10/2)\" | Should -BeExactly \"5\"\n  }\n\n  It \"Read from registry\" {\n    $e = '$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion@ProgramFilesDir)'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    $e = '$(GetRegValue(\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion@ProgramFilesDir\"))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n  }\n\n  It \"Property expansion\" {\n    $ProjectDir = \"C:\\Users\\Default\"\n    Evaluate-MSBuildExpression \"`$Foo;`$(ProjectDir);..\\..;..\\..\\third-party\" `\n                    | Should -BeExactly     '$Foo;C:\\Users\\Default;..\\..;..\\..\\third-party'\n\n    $TargetName = \"Test\"\n    Evaluate-MSBuildExpression \"%(ASDASD);`$(TargetName)\" | Should -BeExactly \";Test\"\n\n    $prop = \"123\"\n    Evaluate-MSBuildExpression 'plaintext;\"$(prop)\"' | Should -BeExactly 'plaintext;\"123\"'\n    Evaluate-MSBuildExpression 'plaintext;''$(prop)''' | Should -BeExactly 'plaintext;\"123\"'\n    Evaluate-MSBuildExpression 'plaintext;$(prop)-$(prop)' | Should -BeExactly 'plaintext;123-123'\n\n    $TestDir = $env:ProgramFiles\n    Evaluate-MSBuildExpression '$(TestDir)\\first\\second' | Should -BeExactly \"$env:ProgramFiles\\first\\second\"\n  }\n\n  It \"GetDirectoryNameOfFileAbove() / GetPathOfFileAbove() MSBuild builtin functions\" {\n    [string] $MSBuildThisFileDirectory = $env:SystemRoot\n\n    $e = '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), ''Program Files'')Program Files'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(''Program Files'', $(MSBuildThisFileDirectory))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    $e = '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), \"Program Files\")Program Files'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(\"Program Files\", $(MSBuildThisFileDirectory))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(\"Program Files\", ''$(MSBuildThisFileDirectory)''))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    [string] $MSBuildThisFileDirectory2 = $MSBuildThisFileDirectory + \"\\System32\"\n    $e = '$([MSBuild]::GetPathOfFileAbove(''Program Files'', \"$(MSBuildThisFileDirectory2)../\"))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    $e = \"`$([MSBuild]::GetDirectoryNameOfFileAbove('$MSBuildThisFileDirectory', 'Program Files')Program Files\"\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = \"`$([MSBuild]::GetPathOfFileAbove('Program Files', '$MSBuildThisFileDirectory')\"\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    [string] $whatToFind = \"Program Files\"\n    $e = '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), ''$(whatToFind)'')Program Files'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(''$(whatToFind)'', $(MSBuildThisFileDirectory))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    $e = '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), Program Files)Program Files'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(Program Files, $(MSBuildThisFileDirectory)))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(Program Files, ''$(MSBuildThisFileDirectory)''))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n    $e = '$([MSBuild]::GetPathOfFileAbove(''Program Files'', ''$(MSBuildThisFileDirectory)''))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly $env:ProgramFiles\n\n    [string] $_DirectoryBuildPropsFile = \"clang-build.ps1\"\n    [string] $MSBuildProjectDirectory  = \"$PSScriptRoot\"\n    [string] $DirParent = [System.IO.Directory]::GetParent($MSBuildProjectDirectory)\n\n    $e = '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), ''$(_DirectoryBuildPropsFile)''))'\n    Evaluate-MSBuildExpression $e | Should -Be \"$DirParent\"\n    $e = '$([MSBuild]::GetPathOfFileAbove(''$(_DirectoryBuildPropsFile)'', $(MSBuildProjectDirectory)))'\n    Evaluate-MSBuildExpression $e | Should -Be \"$DirParent\\$_DirectoryBuildPropsFile\"\n  }\n\n  It \"MakeRelative() MSBuild builtin function\" {\n    $SystemDrive  = $env:SystemDrive\n    $SystemRoot   = $env:SystemRoot\n    $ProgramFiles = $env:ProgramFiles\n\n    $e = \"`$([MSBuild]::MakeRelative('$SystemDrive', '$SystemRoot'))\"\n    Evaluate-MSBuildExpression $e | Should -Be \"Windows\"\n\n    $e = \"`$([MSBuild]::MakeRelative(`$(SystemDrive), '$SystemRoot'))\"\n    Evaluate-MSBuildExpression $e | Should -Be \"Windows\"\n\n    $e = '$([MSBuild]::MakeRelative($(SystemDrive), $(SystemRoot)\\System32))'\n    Evaluate-MSBuildExpression $e | Should -Be \"Windows\\System32\"\n\n    $e = '$([MSBuild]::MakeRelative($(SystemRoot), $(SystemRoot)\\System32))'\n    Evaluate-MSBuildExpression $e | Should -Be \"System32\"\n\n    $e = '$([MSBuild]::MakeRelative($(ProgramFiles), $(SystemRoot)\\System32))'\n    Evaluate-MSBuildExpression $e | Should -Be \"..\\Windows\\System32\"\n  }\n\n  It \".NET Method invocation\" {\n    $Sys32Folder = \"System32\"\n    $WinDir = $env:SystemRoot\n    $e = '$([System.IO.Path]::Combine(''$(WinDir)'', ''$(Sys32Folder)''))'\n    Evaluate-MSBuildExpression $e | Should -BeExactly \"$WinDir\\$Sys32Folder\"\n  }\n}\n\nDescribe \"Condition evaluation\" {\n  It \"Logical operators\" {\n    Evaluate-MSBuildCondition '0 != 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '1 != 1' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '1 == 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '0 == 1' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '0 < 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '1 <= 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '1 < 0' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '1 <= 0' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '1 > 0' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '1 >= 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '1 < 0 or 0 < 1' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '!(1 < 0 or 0 < 1)' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '1 < 0 and 0 < 1' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '1 < 0 and 0 < 1' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '((1 < 0) or (0 < 1)) and !(\"a\"==\"b\")' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '\"apple\" == \"apple\"' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '''apple'' == ''apple''' | Should -BeExactly $true\n    Evaluate-MSBuildCondition '''apple'' == ''pear''' | Should -BeExactly $false\n    Evaluate-MSBuildCondition '\"apple\" != \"pear\"' | Should -BeExactly $true\n  }\n\n  It \"Registry access\" {\n    $c = \"'`$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion@ProgramFilesDir)' != ''\"\n    Evaluate-MSBuildCondition $c | Should -BeExactly $true\n\n    $ProgramFiles = $env:ProgramFiles\n    $c = \"'`$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion@ProgramFilesDir)' == '`$(ProgramFiles)'\"\n    Evaluate-MSBuildCondition $c | Should -BeExactly $true\n\n    $c = \"'`$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion@NonexistentValue)' == ''\"\n    Evaluate-MSBuildCondition $c | Should -BeExactly $true\n  }\n\n  It \"Variable expansion\" {\n\n    $Configuration = \"Release2\"\n    $Platform = \"Win32\"\n\n    Evaluate-MSBuildCondition \"'`$(Configuration)|`$(Platform)'=='Debug|Win32' or '`$(Configuration)' == 'Release2'\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"'`$(Configuration)|`$(Platform)'=='Release|Win32'\" | Should -BeExactly $false\n    Evaluate-MSBuildCondition '$(Platform.Replace(\" \", \"\")) and $(testB)' | Should -BeExactly $false\n  }\n\n  It \"Exists() MSBuild builtin function\" {\n\n    $WinDir = $env:SystemRoot\n    Evaluate-MSBuildCondition \"exists('`$(WinDir)')\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"1 == 1 and exists('`$(WinDir)')\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"exists('`$(WinDir)\\System32')\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"exists('`$(WinDir)\\System64')\" | Should -BeExactly $false\n\n    $WinDir += \"gibberish12345\"\n    Evaluate-MSBuildCondition \"exists('`$(WinDir)')\" | Should -BeExactly $false\n    Evaluate-MSBuildCondition \"0 == 1 and exists('`$(WinDir)')\" | Should -BeExactly $false\n\n    [System.Reflection.Assembly]::LoadWithPartialName(\"System.IO\")\n    $eression = 'Exists(\"$([System.IO.Directory]::GetCurrentDirectory())\")'\n    Evaluate-MSBuildCondition $eression | Should -BeExactly $true\n    $eression = 'Exists(\"$([System.IO.Directory]::GetCurrentDirectory())\\nonexistent12345\")'\n    Evaluate-MSBuildCondition $eression | Should -BeExactly $false\n\n    $Sys32 = \"$env:SystemRoot\\System32\"\n    $WinDir = \"$Sys32..\\..\"\n    Evaluate-MSBuildCondition \"Exists('`$(Sys32)\\..')\" | Should -BeExactly  $true\n  }\n\n  It \"Access to [String] builtin functions\" {\n\n    $TargetName    = \"AnotherTest\"\n    Evaluate-MSBuildCondition \"`$(TargetName.EndsWith('Test'))\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"`$(TargetName.EndsWith('Test2'))\" | Should -BeExactly $false\n\n    $myVar = 'TwoThree'\n    $MySelector = \"One;Two;Three\"\n    Evaluate-MSBuildCondition \"`$(MySelector.Contains(`$(myVar.Substring(3, 3))))\"`\n                   | Should -BeExactly  $true\n\n    $MySelector = \"One;Two;Three\"\n    $myVar = \"Two\"\n    Evaluate-MSBuildCondition \"`$(MySelector.Contains(`$(myVar)))\" | Should -BeExactly $true\n\n    $MySelector = \"One;Two;Three\"\n    Evaluate-MSBuildCondition \"`$(MySelector.Contains('Three'))\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"`$(MySelector.Contains('Four'))\" | Should -BeExactly $false\n  }\n\n  It \".NET method invocation\" {\n    $year = (Get-Date).Year\n    Evaluate-MSBuildCondition \"`$([System.DateTime]::Now.Year) == `$(year)\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"`$([System.DateTime]::Now.Year) != `$(year)\" | Should -BeExactly $false\n  }\n\n  It \"HasTrailingSlash() MSBuild builtin function\" {\n    Evaluate-MSBuildCondition \"HasTrailingSlash('c:\\windows\\')\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"HasTrailingSlash('c:\\windows')\" | Should -BeExactly $false\n\n    $c = \"HasTrailingSlash('c:\\windows\\') and hasTrailingSlash('c:\\temp/')\"\n    Evaluate-MSBuildCondition $c | Should -BeExactly $true\n\n    $c = \"HasTrailingSlash('c:\\windows\\') and !hasTrailingSlash('c:\\temp/')\"\n    Evaluate-MSBuildCondition $c | Should -BeExactly $false\n\n    $prop = \"c:\\windows\\\"\n    Evaluate-MSBuildCondition \"hasTrailingSlash(`$(prop))\" | Should -BeExactly $true\n\n    $prop = \"c:\\windows\"\n    Evaluate-MSBuildCondition \"hasTrailingSlash(`$(prop))\" | Should -BeExactly $false\n  }\n\n  It \"Itemgroupdefinition\" {\n    $defVal = \"bar\"\n\n    Set-ProjectItemProperty \"foo\" $defVal\n    Evaluate-MSBuildExpression \"%(foo)\" | Should -BeExactly $defVal\n    Evaluate-MSBuildCondition \"'%(foo)' == '$defVal'\" | Should -BeExactly $true\n    Evaluate-MSBuildCondition \"'%(foo)' != '$defVal'\" | Should -BeExactly $false\n\n    $P1 = \"prop_value\"\n    Evaluate-MSBuildExpression '%(foo)|$(P1)' | Should -BeExactly \"$defVal|$P1\"\n    Evaluate-MSBuildExpression '%(foo);$(P1)' | Should -BeExactly \"$defVal;$P1\"\n  }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-cache-repository.ps1",
    "content": "Set-Variable -name kCptCacheRepo -value \"$env:APPDATA\\ClangPowerTools\\CacheRepository\" -option Constant\n\nFunction Is-CacheLoadingEnabled()\n{\n  if (\"${Env:CPT_CACHEREPO}\" -eq \"0\")\n  {\n    return $false\n  }\n  # if the cache repository directory exists, then we use caching\n  return (Test-Path $kCptCacheRepo)\n}\n\nFunction Remove-CachedProjectFile([Parameter(Mandatory = $true)][string] $aCachedFilePath)\n{\n  if ($aCachedFilePath.StartsWith($kCptCacheRepo))\n  {\n    Remove-Item $aCachedFilePath | Out-Null\n  }\n}\n\nFunction Get-CacheRepositoryIndex()\n{\n  Write-Verbose \"Loading project cache repository index\"\n  [System.Collections.Hashtable] $cacheIndex = @{}\n  if (Is-CacheLoadingEnabled)\n  {\n    [string] $cptCacheRepoIndex = \"$kCptCacheRepo\\index.dat\"\n    if (Test-Path $cptCacheRepoIndex)\n    {\n      try\n      {\n        $cacheIndex = [System.Management.Automation.PSSerializer]::Deserialize((Get-Content $cptCacheRepoIndex))\n      }\n      catch\n      {\n        Write-Verbose \"Error: Could not deserialize corrupted cache repository index. Rebuilding from scratch...\"\n        return $cacheIndex\n      }\n    }\n  }\n  return $cacheIndex\n}\n\nFunction Save-CacheRepositoryIndex([Parameter(Mandatory = $true)][System.Collections.Hashtable] $cacheIndex)\n{\n  Write-Verbose \"Saving project cache repository index\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    return\n  }\n\n  [System.Collections.ArrayList] $indexKeys = @()\n  foreach ($keyIndex in $cacheIndex.Keys)\n  {\n    # make sure we don't invalidate the cacheIndex.Keys collection iterators when modifying it\n    $indexKeys.Add($keyIndex) > $null\n  }\n\n  foreach ($indexKey in $indexKeys)\n  {\n    [string] $CachedDataPath = $cacheIndex[$indexKey].CachedDataPath\n    if (! (Test-Path $CachedDataPath))\n    {\n      Write-Verbose \"Pruning zombie entry ($($indexKey) : $($CachedDataPath)) from cache repository index\"\n      $cacheIndex.Remove($indexKey) > $null\n    }\n  }\n\n  [string] $cptCacheRepoIndex = \"$kCptCacheRepo\\index.dat\"\n  $serialized = [System.Management.Automation.PSSerializer]::Serialize($cacheIndex)\n  $serialized > $cptCacheRepoIndex\n}\n\nFunction Join-ConfigurationPlatformScriptArgs()\n{\n  return ($aVcxprojConfigPlatform -join \",\")\n}\n\nFunction Save-ProjectToCacheRepo()\n{\n  Write-Verbose \"Saving current project data to cache repository\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    return\n  }\n\n  Write-Verbose \"Collecting $($global:ProjectSpecificVariables.Count) project specific variables\"\n  [System.Collections.Hashtable] $projectVariablesMap = @{}\n  foreach ($varName in $global:ProjectSpecificVariables)\n  {\n    $projectVariablesMap[$varName] = Get-Variable -name $varName -ValueOnly\n  }\n  \n  [System.Collections.Hashtable] $genericVariablesMap = @{}\n  $genericVariablesMap['cptVisualStudioVersion'  ] = Get-Variable 'cptVisualStudioVersion'   -scope Global -ValueOnly\n  $genericVariablesMap['cptCurrentConfigPlatform'] = Get-Variable 'cptCurrentConfigPlatform' -scope Global -ValueOnly\n\n  $dataToSerialize = New-Object PsObject -Prop @{ \"ProjectSpecificVariables\"  = $projectVariablesMap\n                                                ; \"GenericVariables\"          = $genericVariablesMap\n                                                }\n  [string] $pathToSave = \"\"\n  while ($true)\n  {\n    [string] $pathToSave = \"$kCptCacheRepo\\$(Get-RandomString).dat\"\n    # make sure we don't overwrite an already existing cache entry\n    if (! (Test-Path $pathToSave))\n    {\n      break\n    }\n  }\n  $serialized = [System.Management.Automation.PSSerializer]::Serialize($dataToSerialize)\n  $serialized > $pathToSave\n  Write-Verbose \"Wrote project to cache repository using moniker $pathToSave\"\n  \n  [System.Collections.Hashtable] $projectFilesHashes = @{}\n  foreach ($projectFile in $global:ProjectInputFiles)\n  {\n    $projectFilesHashes[$projectFile] = (Get-FileHash $projectFile -Algorithm \"SHA1\").Hash\n  }\n  \n  [System.Collections.Hashtable] $cacheIndex = Get-CacheRepositoryIndex\n\n  $cacheObject = New-Object PsObject -Prop @{ \"ProjectFilesHashes\"     = $projectFilesHashes\n                                            ; \"CachedDataPath\"         = $pathToSave\n                                            ; \"ConfigurationPlatform\"  = Join-ConfigurationPlatformScriptArgs\n                                            ; \"CptCacheSyntaxVersion\"  = $kCacheSyntaxVer\n                                            }\n  $cacheIndex[$MSBuildProjectFullPath] = $cacheObject\n  \n  Save-CacheRepositoryIndex $cacheIndex\n}\n\nFunction Load-ProjectFromCache([Parameter(Mandatory = $true)][string] $aVcxprojPath)\n{\n  Write-Verbose \"Trying to load project $aVcxprojPath from cache repository\"\n  if (!  (Is-CacheLoadingEnabled) )\n  {\n    Write-Verbose \"Cache repository not enabled in %APPDATA%/ClangPowerTools/CacheRepository\"\n    return $false\n  }\n\n  [System.Collections.Hashtable] $cacheIndex = Get-CacheRepositoryIndex\n  if ( ! $cacheIndex.ContainsKey($aVcxprojPath))\n  {\n    Write-Verbose \"Cache repository does not contain record of project\"\n    return $false\n  }\n\n  $projectCacheObject = $cacheIndex[$aVcxprojPath]\n\n  if ( ! (Test-Path $projectCacheObject.CachedDataPath))\n  {\n    Write-Verbose \"Error: Cache repository contains record of project but cached file no longer exists\"\n    return $false\n  }\n  \n  if ($projectCacheObject.CptCacheSyntaxVersion -ne $kCacheSyntaxVer)\n  {\n    Write-Verbose \"Cached version of project uses older syntax version. Discarding...\"\n    # the cached version uses an outdated syntax, safely discard it\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n  \n  [System.Collections.Hashtable] $projectFilesHashes = $projectCacheObject.ProjectFilesHashes\n  foreach ($projectFilePath in $projectFilesHashes.Keys)\n  {\n    Write-Verbose \"Checking hash of project file $projectFilePath\"\n\n    $newFileHash = (Get-FileHash $projectFilePath -Algorithm \"SHA1\").Hash\n\n    if ($newFileHash -ne $projectFilesHashes[$projectFilePath])\n    {\n      Write-Verbose \"Cached version of project has different file hash. Discarding...\"\n      # project file hash not matching, safely discard cached version\n      Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n      return $false\n    }\n  }\n\n  if ($projectCacheObject.ConfigurationPlatform -ne (Join-ConfigurationPlatformScriptArgs))\n  {\n    Write-Verbose \"Cached version of project uses different configuration platform. Discarding...\"\n    # config-platform not maching, safely discard cached version\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  # Clean global variables that have been set by a previous project load\n  Clear-Vars\n\n  $global:vcxprojPath = $aVcxprojPath\n\n  Write-Verbose \"Loading cached project from $($projectCacheObject.CachedDataPath)\"\n  [string] $data = Get-Content $projectCacheObject.CachedDataPath\n  $deserialized = $null\n  try \n  {\n    $deserialized = [System.Management.Automation.PSSerializer]::Deserialize($data)\n  }\n  catch\n  {\n    Write-Verbose \"Error: Failure to deserialize cached project data. Discarding corrupted file\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  [System.Collections.Hashtable] $projectSpecificVariablesMap = $deserialized.ProjectSpecificVariables\n  [System.Collections.Hashtable] $genericVariablesMap = $deserialized.GenericVariables\n\n  Write-Verbose \"Cached version of project has $($projectSpecificVariablesMap.Count) variables to load\"\n  if ($projectSpecificVariablesMap.Keys -notcontains \"MSBuildThisFileFullPath\")\n  {\n    Write-Verbose \"Cached project does not contain MSBuildThisFileFullPath. Discarding...\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n  \n  if ( $projectSpecificVariablesMap['MSBuildThisFileFullPath'] -ne $aVcxprojPath )\n  {\n    Write-Verbose \"Cached project looks to be a different project ($($projectSpecificVariablesMap['MSBuildThisFileFullPath'])). Discarding...\"\n    Remove-CachedProjectFile $projectCacheObject.CachedDataPath\n    return $false\n  }\n\n  foreach ($var in $projectSpecificVariablesMap.Keys)\n  {\n    Set-Var -name $var -value $projectSpecificVariablesMap[$var]\n  }\n  \n  # these variables should be garbage collected between projects\n  # using our custom Set-Var would allow that to happen\n  foreach ($var in $genericVariablesMap.Keys)\n  {\n    Set-Variable -name $var -value $genericVariablesMap[$var] -scope Global\n  }\n\n  Write-Verbose \"Cache repository - project load was successful\"\n  return $true\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-cache-repository.tests.ps1",
    "content": "Describe \"Project Cache Repository\" {\n  It \"WIP\" {\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-data.ps1",
    "content": "#-------------------------------------------------------------------------------------------------\n# PlatformToolset constants\n\nSet-Variable -name kDefinesUnicode   -value @('\"-DUNICODE\"'\n                                             ,'\"-D_UNICODE\"'\n                                             ) `\n                                     -option Constant\n\nSet-Variable -name kDefinesClangXpTargeting `\n             -value @('\"-D_USING_V110_SDK71_\"') `\n             -option Constant\n\nSet-Variable -name kIncludePathsXPTargetingSDK  `\n             -value \"${Env:ProgramFiles(x86)}\\Microsoft SDKs\\Windows\\v7.1A\\Include\"  `\n             -option Constant\n\nSet-Variable -name kVStudioDefaultPlatformToolset -Value \"v141\" -option Constant\n\nSet-Variable -name kClangFlag32BitPlatform        -value \"-m32\" -option Constant\n\n# ------------------------------------------------------------------------------------------------\n# Default platform sdks and standard\n\nSet-Variable -name kVSDefaultWinSDK            -value '8.1'             -option Constant\nSet-Variable -name kVSDefaultWinSDK_XP         -value '7.0'             -option Constant\nSet-Variable -name kDefaultCppStd              -value \"stdcpp14\"        -option Constant\n\n# ------------------------------------------------------------------------------------------------\nSet-Variable -name kCProjectCompile         -value \"CompileAsC\" -option Constant\n\nFunction Should-CompileProject([Parameter(Mandatory = $true)][string] $vcxprojPath)\n{\n    if ($aVcxprojToCompile -eq $null)\n    {\n        return $true\n    }\n\n    foreach ($projMatch in $aVcxprojToCompile)\n    {\n        if (IsFileMatchingName -filePath $vcxprojPath -matchName $projMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Should-IgnoreProject([Parameter(Mandatory = $true)][string] $vcxprojPath)\n{\n    if ($aVcxprojToIgnore -eq $null)\n    {\n        return $false\n    }\n\n    foreach ($projIgnoreMatch in $aVcxprojToIgnore)\n    {\n        if (IsFileMatchingName -filePath $vcxprojPath -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Should-IgnoreFile([Parameter(Mandatory = $true)][string] $file)\n{\n    if ($aCppToIgnore -eq $null)\n    {\n        return $false\n    }\n\n    foreach ($projIgnoreMatch in $aCppToIgnore)\n    {\n        if (IsFileMatchingName -filePath $file -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    foreach ($projIgnoreMatch in $global:cptIgnoredFilesPool)\n    {\n        if (IsFileMatchingName -filePath $file -matchName $projIgnoreMatch)\n        {\n            return $true\n        }\n    }\n\n    return $false\n}\n\nFunction Get-ProjectFilesToCompile()\n{\n    $projectCompileItems = @(Get-Project-ItemList \"ClCompile\")\n    if (!$projectCompileItems)\n    {\n        Write-Verbose \"Project does not have any items to compile\"\n        return @()\n    }\n\n    $files = @()\n    foreach ($item in $projectCompileItems)\n    {\n        [System.Collections.Hashtable] $itemProps = $item[1];\n\n        if ($itemProps -and $itemProps.ContainsKey('ExcludedFromBuild'))\n        {\n            if ($itemProps['ExcludedFromBuild'] -ieq 'true')\n            {\n                Write-Verbose \"Skipping $($item[0]) because it is excluded from build\"\n                continue\n            }\n        }\n\n        [string[]] $matchedFiles = @(Canonize-Path -base $ProjectDir -child $item[0] -ignoreErrors)\n        if ($matchedFiles.Count -gt 0)\n        {\n            foreach ($file in $matchedFiles)\n            {\n                $files += New-Object PsObject -Prop @{ \"File\"       = $file\n                                                     ; \"Properties\" = $itemProps\n                                                     }\n            }\n        }\n    }\n\n    return $files\n}\n\nFunction Get-ProjectHeaders()\n{\n    $projectCompileItems = @(Get-Project-ItemList \"ClInclude\")\n\n    [string[]] $headerPaths = @()\n\n    foreach ($item in $projectCompileItems)\n    {\n        [string[]] $paths = @(Canonize-Path -base $ProjectDir -child $item[0] -ignoreErrors)\n        if ($paths.Count -gt 0)\n        {\n            $headerPaths += $paths\n        }\n    }\n    return $headerPaths\n}\n\nFunction Get-Project-SDKVer()\n{\n    if (! (VariableExists 'WindowsTargetPlatformVersion'))\n    {\n        return \"\"\n    }\n\n    if ([string]::IsNullOrEmpty($WindowsTargetPlatformVersion))\n    {\n        return \"\"\n    }\n\n    return $WindowsTargetPlatformVersion.Trim()\n}\n\nFunction Get-Project-MultiThreaded-Define()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    [string] $runtimeLibrary = Get-ProjectItemProperty \"RuntimeLibrary\"\n\n    # /MT or /MTd\n    if (@(\"MultiThreaded\", \"MultiThreadedDebug\") -contains $runtimeLibrary)\n    {\n        return @('\"-D_MT\"')\n    }\n\n    return @('\"-D_MT\"', '\"-D_DLL\"') # default value /MD\n}\n\nFunction Is-Project-Unicode()\n{\n    if (VariableExists 'CharacterSet')\n    {\n        return $CharacterSet -ieq \"Unicode\"\n    }\n    return $false\n}\n\nFunction Get-Project-CppStandard()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $cppStd = Get-ProjectItemProperty \"LanguageStandard\"\n    if (!$cppStd)\n    {\n        $cppStd = $kDefaultCppStd\n    }\n\n    $cppStdMap = @{ 'stdcpplatest' = 'c++2c'\n                  ; 'stdcpp14'     = 'c++14'\n                  ; 'stdcpp17'     = 'c++17'\n                  ; 'stdcpp20'     = 'c++20'\n                  ; 'stdcpp23'     = 'c++23'\n                  }\n    if ($kLLVMVersion -ge 13)\n    {\n        $cppStdMap['stdcpplatest'] = 'c++2b'\n    }\n\n    [string] $cppStdClangValue = $cppStdMap[$cppStd]\n\n    return $cppStdClangValue\n}\n\nFunction Get-ClangCompileFlags([Parameter(Mandatory = $false)][bool] $isCpp = $true)\n{\n    [string[]] $flags = $aClangCompileFlags\n    if ($isCpp -and !($flags -match \"-std=.*\"))\n    {\n        [string] $cppStandard = Get-Project-CppStandard\n\n        $flags = @(\"-std=$cppStandard\") + $flags\n    }\n\n    if ($Platform -ieq \"x86\" -or $Platform -ieq \"Win32\")\n    {\n        $flags += @($kClangFlag32BitPlatform)\n    }\n\n    return $flags\n}\n\nFunction Get-ProjectPlatformToolset()\n{\n    if (VariableExists 'PlatformToolset')\n    {\n        return $PlatformToolset\n    }\n    else\n    {\n        return $kVStudioDefaultPlatformToolset\n    }\n}\nfunction Get-LatestSDKVersion()\n{\n    [string] $parentDir = \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\\"\n    if (!(Test-Path -LiteralPath $parentDir))\n    {\n        Write-Verbose \"Windows 10 SDK parent directory could not be located\"\n        return \"\"\n    }\n\n    [System.IO.DirectoryInfo[]]$subdirs = @( get-childitem -path $parentDir      | `\n                                             where { $_.Name.StartsWith(\"10.\") } | `\n                                             sort -Descending -Property Name )\n    if ($subdirs.Count -eq 0)\n    {\n        Write-Verbose \"[ERR] Could not detect latest Windows 10 SDK location\"\n        return \"\"\n    }\n\n    return $subdirs[0].Name\n}\n\nFunction Get-ProjectIncludesFromIncludePathVar\n{\n    [string[]] $returnArray = @()\n    if ( (VariableExists 'IncludePath') )\n    {\n        $returnArray += ($IncludePath -split \";\")                                                         | `\n                        Where-Object { ![string]::IsNullOrWhiteSpace($_) }                                | `\n                        ForEach-Object { Canonize-Path -base $ProjectDir -child $_.Trim() -ignoreErrors } | `\n                        Where-Object { ![string]::IsNullOrEmpty($_) }                                     | `\n                        ForEach-Object { $_ -replace '\\\\$', '' }\n    }\n    return $returnArray\n}\n\nFunction Get-ProjectIncludeDirectories()\n{\n    [string[]] $returnArray = @()\n\n    [string] $vsPath = Get-VisualStudio-Path\n    Write-Verbose \"Visual Studio location: $vsPath\"\n\n    [string] $platformToolset = Get-ProjectPlatformToolset\n\n    if (([int] $global:cptVisualStudioVersion) -lt 2017)\n    {\n        $returnArray += Get-VisualStudio-Includes -vsPath $vsPath\n    }\n    else\n    {\n        $mscVer = Get-MscVer -visualStudioPath $vsPath\n        Write-Verbose \"MSCVER: $mscVer\"\n\n        $returnArray += Get-VisualStudio-Includes -vsPath $vsPath -mscVer $mscVer\n    }\n\n    $sdkVer = Get-Project-SDKVer\n\n    # We did not find a WinSDK version in the vcxproj. We use Visual Studio's defaults\n    if ([string]::IsNullOrEmpty($sdkVer))\n    {\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $sdkVer = $kVSDefaultWinSDK_XP\n        }\n        else\n        {\n            $sdkVer = $kVSDefaultWinSDK\n        }\n    }\n\n    Write-Verbose \"WinSDK version: $sdkVer\"\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 10\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"10\")))\n    {\n        if ($sdkVer -eq \"10.0\")\n        {\n            # Project uses the latest Win10 SDK. We have to detect its location.\n            $sdkVer = Get-LatestSDKVersion\n        }\n\n        $returnArray += @(\"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\ucrt\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @($kIncludePathsXPTargetingSDK)\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\um\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\shared\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\winrt\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\$sdkVer\\cppwinrt\"\n            )\n        }\n    }\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 8 / 8.1\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"8.\")))\n    {\n        $returnArray += @(\"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @($kIncludePathsXPTargetingSDK)\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\um\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\shared\"\n                , \"${Env:ProgramFiles(x86)}\\Windows Kits\\$sdkVer\\Include\\winrt\"\n            )\n        }\n    }\n\n    # ----------------------------------------------------------------------------------------------\n    # Windows 7\n\n    if ((![string]::IsNullOrEmpty($sdkVer)) -and ($sdkVer.StartsWith(\"7.0\")))\n    {\n        $returnArray += @(\"$vsPath\\VC\\Auxiliary\\VS\\include\")\n\n        if ($platformToolset.EndsWith(\"xp\"))\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\"\n                , $kIncludePathsXPTargetingSDK\n            )\n        }\n        else\n        {\n            $returnArray += @( \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\7.0\\ucrt\")\n        }\n    }\n\n    if ($env:CPT_LOAD_ALL -eq '1')\n    {\n        return @(Get-ProjectIncludesFromIncludePathVar)\n    }\n    else\n    {\n        $returnArray += @(Get-ProjectIncludesFromIncludePathVar)\n    }\n\n    return ( $returnArray | ForEach-Object { Remove-PathTrailingSlash -path $_ } )\n}\n\n<#\n.DESCRIPTION\n  Retrieve array of preprocessor definitions for a given project, in Clang format (-DNAME )\n#>\nFunction Get-ProjectPreprocessorDefines()\n{\n    [string[]] $defines = @()\n\n    if (Is-Project-Unicode)\n    {\n        $defines += $kDefinesUnicode\n    }\n\n    $defines += @(Get-Project-MultiThreaded-Define)\n\n    if ( (VariableExists 'UseOfMfc') -and $UseOfMfc -ieq \"Dynamic\")\n    {\n        $defines += @('\"-D_AFXDLL\"')\n    }\n\n    [string] $platformToolset = Get-ProjectPlatformToolset\n    if ($platformToolset.EndsWith(\"xp\"))\n    {\n        $defines += $kDefinesClangXpTargeting\n    }\n\n    Set-ProjectItemContext \"ClCompile\"\n    $preprocDefNodes = Get-ProjectItemProperty \"PreprocessorDefinitions\"\n    if (!$preprocDefNodes)\n    {\n        return $defines\n    }\n\n    [string[]] $tokens = @($preprocDefNodes -split \";\")\n\n    # make sure we add the required prefix and escape double quotes\n    $defines += @( $tokens | `\n                   ForEach-Object { $_.Trim() } | `\n                   Where-Object { $_ } | `\n                   ForEach-Object { '\"' + $(($kClangDefinePrefix + $_) -replace '\"', '\\\"') + '\"' } )\n\n    return $defines\n}\n\n\nFunction Get-ProjCanonizedPaths([Parameter(Mandatory = $true)][string] $rawPaths)\n{\n    [string[]] $tokens = @($rawPaths -split \";\")\n\n    foreach ($token in $tokens)\n    {\n        if ([string]::IsNullOrWhiteSpace($token))\n        {\n            continue\n        }\n\n        [string] $includePath = Canonize-Path -base $ProjectDir -child $token.Trim() -ignoreErrors\n        if (![string]::IsNullOrEmpty($includePath))\n        {\n            $includePath -replace '\\\\$', ''\n        }\n    }\n}\n\nFunction Get-ProjectExternalIncludePaths()\n{\n    if (!(VariableExistsAndNotEmpty -name \"ExternalIncludePath\"))\n    {\n       return @()\n    }\n    return Get-ProjCanonizedPaths -rawPaths $ExternalIncludePath\n}\n\nFunction Get-PathsFromText([Parameter(Mandatory = $true)][string] $text)\n{\n    $result = @()\n    [regex]$regex = '\"[^\"]*\\/[^\"]*\"'\n    $regex.Matches($text) | foreach-object { $result += $_.Value}\n    return $result\n}\n\n# replace unix paths found in a string with dos paths\nFunction Convert-UnixPathToDos([Parameter(Mandatory = $true)][string] $content)\n{\n    $paths = @(Get-PathsFromText -text $content)\n    foreach ($path in $paths)\n    {\n        if (([string]::IsNullOrWhiteSpace($path)))\n        {\n            continue\n        }\n        # Escape the backslashes in before using it in -replace.\n        $escapedPath = [regex]::Escape($path)\n        $content = $content -replace $escapedPath, ($path -replace '/','\\')\n    }\n    return $content\n}\n\n# we will treat two cases of specifying external headers: /external:env:var and /external:I path\n# /external:env:var - we need to get value from key var \n# /external:I path - we need do get just path\nFunction Get-PathsFromAdditionalOptions([Parameter(Mandatory = $true)][string] $options)\n{\n    Write-Verbose \"Trying to get paths from AdditionalOptions\"\n\n    # to avoid any problems we will convert unix paths (generarly generated by cmake) in dos paths\n    $options = Convert-UnixPathToDos -content $options\n\n    [string[]] $paths = @()\n    [string[]] $tokens = @($options -split \"/\")\n\n    foreach ($token in $tokens)\n    {\n        if (([string]::IsNullOrWhiteSpace($token)) -or ($token -notlike \"*external:*\"))\n        {\n            continue\n        }\n\n        # get the specified path after /external:I\n        $patternExternalIncludes = '^(external:I)\\s+(.*)$'\n        if($token -match $patternExternalIncludes)\n        {\n            if(! [string]::IsNullOrWhiteSpace($Matches[2]))\n            {\n                Write-Verbose \"Path from /external:I is $($Matches[2])\"\n                $paths += $Matches[2]\n            } else {\n                Write-Verbose \"Cannot get path from /external:I\"\n            }\n        }\n        \n        # retrieve the value of the environment variable specified after the /external:env option\n        if($token -like \"*external:env*\")\n        {\n            [string[]] $externalAndVar = @($token -split \":\")\n            if(! [string]::IsNullOrWhiteSpace($externalAndVar[2]))\n            {\n                $envValue = [Environment]::GetEnvironmentVariable($externalAndVar[2])\n                \n                if ($envValue -eq $null) {\n                    Write-Verbose \"The environment variable $($externalAndVar[2]) is not set.\"\n                } else {\n                    $envPaths = $envValue -split \";\"\n                    $paths += $envPaths\n                    Write-Verbose \"The value of $($externalAndVar[2]) is: $envValue\"\n                }\n            } \n            else {\n                Write-Verbose \"Cannot get path from /external:I\"\n            }\n        }\n    }\n    return $paths\n}\n\nFunction Get-IncludePathsFromAdditionalOptions()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $data = Get-ProjectItemProperty \"AdditionalOptions\"\n    if (!(VariableExistsAndNotEmpty -name \"data\"))\n    {\n        return @()\n    }\n\n    $paths = Get-PathsFromAdditionalOptions -options $data\n    if (!(VariableExistsAndNotEmpty -name \"paths\"))\n    {\n        return @()\n    }\n    return Get-ProjCanonizedPaths -rawPaths ($paths -join \";\")\n}\n\nFunction Get-ProjectAdditionalIncludes()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $data = Get-ProjectItemProperty \"AdditionalIncludeDirectories\"\n    if (!(VariableExistsAndNotEmpty -name \"data\"))\n    {\n        return @()\n    }\n    return Get-ProjCanonizedPaths -rawPaths $data\n}\n\nFunction Get-ProjectForceIncludes()\n{\n    Set-ProjectItemContext \"ClCompile\"\n    $forceIncludes = Get-ProjectItemProperty \"ForcedIncludeFiles\"\n    if ($forceIncludes)\n    {\n        return @($forceIncludes -split \";\" | Where-Object { ![string]::IsNullOrWhiteSpace($_) })\n    }\n\n    return $null\n}\n\nFunction Get-FileForceIncludes([Parameter(Mandatory=$true)] [string] $fileFullName)\n{\n    try\n    {\n        [string] $forceIncludes = Get-ProjectFileSetting -fileFullName $fileFullName -propertyName \"ForcedIncludeFiles\"\n        return ($forceIncludes -split \";\")                                                       | `\n               Where-Object { ![string]::IsNullOrWhiteSpace($_) }                                | `\n               ForEach-Object { Canonize-Path -base $ProjectDir -child $_.Trim() -ignoreErrors } | `\n               Where-Object { ![string]::IsNullOrEmpty($_) }                                     | `\n               ForEach-Object { $_ -replace '\\\\$', '' }\n    }\n    catch\n    {\n        return $null\n    }\n}\n\n\n<#\n.DESCRIPTION\n  Retrieve directory in which stdafx.h resides\n#>\nFunction Get-ProjectStdafxDir( [Parameter(Mandatory = $true)]  [string]   $pchHeaderName\n    , [Parameter(Mandatory = $false)] [string[]] $includeDirectories\n    , [Parameter(Mandatory = $false)] [string[]] $additionalIncludeDirectories\n)\n{\n    [string] $stdafxPath = \"\"\n\n    [string[]] $projectHeaders = @(Get-ProjectHeaders)\n    if ($projectHeaders.Count -gt 0)\n    {\n        # we need to use only backslashes so that we can match against file header paths\n        $pchHeaderName = $pchHeaderName.Replace(\"/\", \"\\\")\n\n        $stdafxPath = $projectHeaders | Where-Object { (Get-FileName -path $_) -eq $pchHeaderName }\n    }\n\n    if ([string]::IsNullOrEmpty($stdafxPath))\n    {\n        [string[]] $searchPool = @($ProjectDir);\n        if ($includeDirectories.Count -gt 0)\n        {\n            $searchPool += $includeDirectories\n        }\n        if ($additionalIncludeDirectories.Count -gt 0)\n        {\n            $searchPool += $additionalIncludeDirectories\n        }\n\n        foreach ($dir in $searchPool)\n        {\n            [string] $stdafxPathTest = Canonize-Path -base $dir -child $pchHeaderName -ignoreErrors\n            if (![string]::IsNullOrEmpty($stdafxPathTest))\n            {\n                $stdafxPath = $stdafxPathTest\n                break\n            }\n        }\n    }\n\n    if ([string]::IsNullOrEmpty($stdafxPath))\n    {\n        return \"\"\n    }\n    # Handle case where the PCH header project setting contains directory names from upper hierarchy.\n    # E.g. <PrecompiledHeaderFile>$(ProjectName)\\$(ProjectName)_headers.h</PrecompiledHeaderFile>\n    # More details at https://github.com/Caphyon/clang-power-tools/issues/1227\n    elseif ($stdafxPath.EndsWith($pchHeaderName))\n    {\n        [string] $stdafxDir = $stdafxPath.Remove($stdafxPath.Length - $pchHeaderName.Length)\n        return $stdafxDir\n    }\n    else\n    {\n        [string] $stdafxDir = Get-FileDirectory($stdafxPath)\n        return $stdafxDir\n    }\n}\n\nFunction Get-PchCppIncludeHeader([Parameter(Mandatory = $true)][string] $pchCppFile)\n{\n    [string] $cppPath = Canonize-Path -base $ProjectDir -child $pchCppFile\n\n    [string[]] $fileLines = @(Get-Content -LiteralPath $cppPath)\n    foreach ($line in $fileLines)\n    {\n        $regexMatch = [regex]::match($line, '^\\s*#include\\s+\"(\\S+)\"')\n        if ($regexMatch.Success)\n        {\n            return $regexMatch.Groups[1].Value\n        }\n    }\n    return \"\"\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-data.tests.ps1",
    "content": "﻿#Clear-Host\n\n# IMPORT code blocks\n\nBeforeAll {\n  @(\n   , \"$PSScriptRoot\\io.ps1\"\n   , \"$PSScriptRoot\\msbuild-expression-eval.ps1\"\n   , \"$PSScriptRoot\\msbuild-project-load.ps1\"\n   , \"$PSScriptRoot\\msbuild-project-data.ps1\"\n   ) | ForEach-Object { . $_ }\n}\n\nDescribe \"VC++ Project Data Processing\" {\n  It \"To be implemented\" {\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-load.ps1",
    "content": "#-------------------------------------------------------------------------------------------------\n# Global variables\n\n# vcxproj and property sheet files declare MsBuild properties (e.g. $(MYPROP)).\n# they are used in project xml nodes expressions. we have a\n# translation engine (MSBUILD-POWERSHELL) for these. it relies on\n# PowerShell to evaluate these expressions. We have to inject project\n# properties in the PowerShell runtime context. We keep track of them in\n# this list, so that each project can know to clean previous vars before loading begins.\nif (! (Test-Path variable:global:ProjectSpecificVariables))\n{\n  [System.Collections.ArrayList] $global:ProjectSpecificVariables    = @()\n}\n\nif (! (Test-Path variable:global:ProjectInputFiles))\n{\n  [System.Collections.ArrayList] $global:ProjectInputFiles = @{}\n}\n\nFunction Add-ToProjectSpecificVariables([Parameter(Mandatory = $true)] [string] $variableName)\n{\n  $global:ProjectSpecificVariables.Add($variableName) > $null\n}\n\nif (! (Test-Path variable:global:ScriptParameterBackupValues))\n{\n  [System.Collections.Hashtable] $global:ScriptParameterBackupValues = @{}\n}\n\n# path of current project\n[string] $global:vcxprojPath                     = \"\";\n\n\nSet-Variable -name \"kRedundantSeparatorsReplaceRules\" -option Constant `\n              -value @( <# handle multiple consecutive separators #>   `\n                        (\";+\" , \";\")                                   `\n                        <# handle separator at end                #>   `\n                      , (\";$\" , \"\")                                    `\n                        <# handle separator at beginning          #>   `\n                      , (\"^;\" , \"\")                                    `\n                      )\nSet-Variable -name \"kCacheSyntaxVer\" -Option Constant -value \"1\"\n\nAdd-Type -TypeDefinition @\"\npublic class ProjectConfigurationNotFound : System.Exception\n{\n    public string ConfigPlatform;\n    public string Project;\n\n    public ProjectConfigurationNotFound(string proj, string configPlatform)\n    {\n        this.Project = proj;\n        this.ConfigPlatform = configPlatform;\n    }\n}\n\"@\n\nFunction Set-Var([parameter(Mandatory = $false)][string] $name\n                ,[parameter(Mandatory = $false)]         $value\n                ,[parameter(Mandatory = $false)][switch] $asScriptParameter\n                )\n{\n    if ($name -ieq \"home\")\n    {\n        Write-Verbose \"Shimming HOME variable\"\n        # the HOME PowerShell variable is protected and we can't overwrite it\n        $name = \"CPT_SHIM_HOME\"\n    }\n\n    if ($asScriptParameter)\n    {\n        if (Test-Path \"variable:$name\")\n        {\n          $oldVar = Get-Variable $name\n          $oldValue = $oldVar.Value\n\n          if ($oldValue           -and\n              $oldValue.GetType() -and\n              $oldValue.GetType().ToString() -eq \"System.Management.Automation.SwitchParameter\")\n          {\n            $oldValue = $oldValue.ToBool()\n          }\n\n          $global:ScriptParameterBackupValues[$name] = $oldValue\n        }\n        else\n        {\n          $global:ScriptParameterBackupValues[$name] = $null\n        }\n    }\n\n    Write-Verbose \"SET_VAR $($name): $value\"\n    if ($asScriptParameter)\n    {\n      Set-Variable -name $name -Value $value -Scope Script\n    }\n    else\n    {\n      Set-Variable -name $name -Value $value -Scope Global\n    }\n\n    if (!$asScriptParameter -and !$global:ProjectSpecificVariables.Contains($name))\n    {\n      Add-ToProjectSpecificVariables $name\n    }\n}\n\nFunction Add-Project-Item([parameter(Mandatory = $false)][string] $name\n                         ,[parameter(Mandatory = $false)]         $value\n                         ,[parameter(Mandatory = $false)]         $properties = $null)\n{\n    if (!$value)\n    {\n        return\n    }\n\n    $itemVarName = \"CPT_PROJITEM_$name\"\n    if (!(Get-Variable $itemVarName -ErrorAction SilentlyContinue))\n    {\n        $itemList = New-Object System.Collections.ArrayList\n        Set-Var -name $itemVarName -value $itemList\n    }\n\n    $itemList = (Get-Variable $itemVarName).Value\n    if ($value -is [array])\n    {\n        foreach ($arrayValue in $value)\n        {\n            $itemList.Add( @($arrayValue, $properties) ) > $null\n        }\n    }\n    else\n    {\n        $itemList.Add(@($value, $properties)) > $null\n    }\n}\n\nFunction Get-Project-Item([parameter(Mandatory = $true)][string] $name)\n{\n    $itemVarName = \"CPT_PROJITEM_$name\"\n\n    $itemVar = Get-Variable $itemVarName -ErrorAction SilentlyContinue\n    if ($itemVar)\n    {\n        $retStr = \"\"\n\n        if ($itemVar.Value.GetType().Name -ieq \"ArrayList\")\n        {\n            foreach ($v in $itemVar.Value)\n            {\n                if ($retStr)\n                {\n                    $retStr += \";\"\n                }\n                $retStr += $v[0] # index0 = item; index1 = properties\n            }\n        }\n        else\n        {\n            $retStr = $itemVar.Value[0] # index0 = item; index1 = properties\n        }\n\n        return $retStr\n    }\n\n    return $null\n}\n\nFunction Get-Project-ItemList([parameter(Mandatory = $true)][string] $name)\n{\n    $retList = New-Object System.Collections.ArrayList\n\n    $itemVarName = \"CPT_PROJITEM_$name\"\n\n    $itemVar = Get-Variable $itemVarName -ErrorAction SilentlyContinue\n    if ($itemVar)\n    {\n        $retStr = \"\"\n\n        if ($itemVar.Value.GetType().Name -ieq \"ArrayList\")\n        {\n            foreach ($v in $itemVar.Value)\n            {\n                if ($retStr)\n                {\n                    $retStr += \";\"\n                }\n                $retList.Add($v) > $null # v is a pair. index0 = item; index1 = properties\n            }\n        }\n        else\n        {\n            $retList.Add($itemVar.Value) > $null\n        }\n    }\n\n    return $retList\n}\n\nFunction Clear-Vars()\n{\n    Write-Verbose-Array -array $global:ProjectSpecificVariables `\n        -name \"Deleting variables initialized by previous project\"\n\n    foreach ($var in $global:ProjectSpecificVariables)\n    {\n        Remove-Variable -name $var -scope Global -ErrorAction SilentlyContinue\n    }\n\n    foreach ($varName in $global:ScriptParameterBackupValues.Keys)\n    {\n        Write-Verbose \"Restoring $varName to old value $($ScriptParameterBackupValues[$varName])\"\n        Set-Variable -name $varName -value $ScriptParameterBackupValues[$varName]\n    }\n\n    $global:ScriptParameterBackupValues.Clear()\n\n    $global:ProjectSpecificVariables.Clear()\n\n    $global:ProjectInputFiles.Clear()\n\n    Reset-ProjectItemContext\n}\n\nFunction UpdateScriptParameter([Parameter(Mandatory = $true)] [string] $paramName\n                              ,[Parameter(Mandatory = $false)][string] $paramValue)\n{\n  [bool]   $isSwitch  = $false\n  $evalParamValue     = \"\" # no type specified because we don't know it yet\n\n  if ($paramValue) # a parameter\n  {\n    $evalParamValue = Invoke-Expression $paramValue # evaluate expression to get actual value\n  }\n  else # a switch\n  {\n    $isSwitch = $true\n  }\n\n  # the parameter name we detected may be an alias => translate it into the real name\n  [string] $realParamName = Get-CommandParameterName -command \"$PSScriptRoot\\..\\clang-build.ps1\" `\n                                                     -nameOrAlias $paramName\n  if (!$realParamName)\n  {\n    Write-Output \"OVERVIEW: Clang Power Tools: compiles or tidies up code from Visual Studio .vcxproj project files`n\"\n\n    Write-Output \"USAGE: clang-build.ps1 [options]`n\"\n\n    Write-Output \"OPTIONS: \"\n    Print-CommandParameters \"$PSScriptRoot\\..\\clang-build.ps1\"\n\n    Fail-Script \"Unsupported option '$paramName'. Check cpt.config.\"\n  }\n\n  if ($isSwitch)\n  {\n    Set-Var -name $realParamName -value $true -asScriptParameter\n  }\n  else\n  {\n    Set-Var -name $realParamName -value $evalParamValue -asScriptParameter\n  }\n}\n\nFunction Get-ConfigFileParameters()\n{\n  [System.Collections.Hashtable] $retArgs = @{}\n\n  [string] $startDir = If ( VariableExistsAndNotEmpty 'ProjectDir' )  { $ProjectDir } else { $aSolutionsPath }\n  [string] $configFile = (cpt::GetDirNameOfFileAbove -startDir $startDir -targetFile \"cpt.config\") + \"\\cpt.config\"\n  if (!(Test-Path -LiteralPath $configFile))\n  {\n      return $retArgs\n  }\n  Write-Verbose \"Found cpt.config in $configFile\"\n\n  [xml] $configXml = Get-Content $configFile\n  $configXpathNS= New-Object System.Xml.XmlNamespaceManager($configXml.NameTable)\n  $configXpathNS.AddNamespace(\"ns\", $configXml.DocumentElement.NamespaceURI)\n\n  [System.Xml.XmlElement[]] $argElems = $configXml.SelectNodes(\"/ns:cpt-config/*\", $configXpathNS)\n\n  foreach ($argEl in $argElems)\n  {\n    if ($argEl.Name.StartsWith(\"vsx-\"))\n    {\n        continue # settings for the Visual Studio Extension\n    }\n\n    if ($argEl.HasAttribute(\"Condition\"))\n    {\n      [bool] $isApplicable = Evaluate-MSBuildCondition -condition $argEl.GetAttribute(\"Condition\")\n      if (!$isApplicable)\n      {\n        continue\n      }\n    }\n    $retArgs[$argEl.Name] = $argEl.InnerText\n  }\n\n  return $retArgs\n}\n\nFunction Update-ParametersFromConfigFile()\n{\n  [System.Collections.Hashtable] $configParams = Get-ConfigFileParameters\n  if (!$configParams)\n  {\n      return\n  }\n\n  foreach ($paramName in $configParams.Keys)\n  {\n    UpdateScriptParameter -paramName $paramName -paramValue $configParams[$paramName]\n  }\n}\n\nFunction InitializeMsBuildProjectProperties()\n{\n    Write-Verbose \"Importing environment variables into current scope\"\n    foreach ($var in (Get-ChildItem Env:))\n    {\n        Set-Var -name $var.Name -value $var.Value\n    }\n\n    Set-Var -name \"MSBuildProjectFullPath\"   -value $global:vcxprojPath\n    Set-Var -name \"ProjectDir\"               -value (Get-FileDirectory -filePath $global:vcxprojPath)\n    Set-Var -name \"MSBuildProjectExtension\"  -value ([IO.Path]::GetExtension($global:vcxprojPath))\n    Set-Var -name \"MSBuildProjectFile\"       -value (Get-FileName -path $global:vcxprojPath)\n    Set-Var -name \"MSBuildProjectName\"       -value (Get-FileName -path $global:vcxprojPath -noext)\n    Set-Var -name \"MSBuildProjectDirectory\"  -value (Get-FileDirectory -filePath $global:vcxprojPath)\n    Set-Var -name \"MSBuildProgramFiles32\"    -value \"${Env:ProgramFiles(x86)}\"\n    # defaults for projectname and targetname, may be overriden by project settings\n    Set-Var -name \"ProjectName\"              -value $MSBuildProjectName\n    Set-Var -name \"TargetName\"               -value $MSBuildProjectName\n\n    Set-Var -name \"UserRootDir\"              -value \"$LocalAppData\\Microsoft\\MSBuild\\v4.0\"\n    # These would enable full project platform references parsing, experimental right now\n    if ($env:CPT_LOAD_ALL -eq '1')\n    {\n        Set-Var -name \"ConfigurationType\"        -value \"Application\"\n        Set-Var -name \"VCTargetsPath\"            -value \"$(Get-VisualStudio-Path)\\Common7\\IDE\\VC\\VCTargets\\\"\n        Set-Var -name \"VsInstallRoot\"            -value (Get-VisualStudio-Path)\n        Set-Var -name \"MSBuildExtensionsPath\"    -value \"$(Get-VisualStudio-Path)\\MSBuild\"\n        Set-Var -name \"LocalAppData\"             -value $env:LOCALAPPDATA\n        Set-Var -name \"UniversalCRT_IncludePath\" -value \"${Env:ProgramFiles(x86)}\\Windows Kits\\10\\Include\\10.0.10240.0\\ucrt\"\n    }\n\n    [string] $vsVer = (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n    Set-Var -name \"VisualStudioVersion\"    -value $vsVer\n    Set-Var -name \"MSBuildToolsVersion\"    -value $vsVer\n\n    [string] $projectSlnPath = Get-ProjectSolution\n    [string] $projectSlnDir = Get-FileDirectory -filePath $projectSlnPath\n    Set-Var -name \"SolutionDir\" -value $projectSlnDir\n    [string] $projectSlnName = Get-FileName -path $projectSlnPath -noext\n    Set-Var -name \"SolutionName\" -value $projectSlnName\n\n    # pre-initialize Configuration and Platform properties\n    if ( VariableExistsAndNotEmpty -name 'aVcxprojConfigPlatform')\n    {\n        Detect-ProjectDefaultConfigPlatform\n    }\n\n    Update-ParametersFromConfigFile\n}\n\nFunction InitializeMsBuildCurrentFileProperties([Parameter(Mandatory = $true)][string] $filePath)\n{\n    Set-Var -name \"MSBuildThisFileFullPath\"  -value $filePath\n    Set-Var -name \"MSBuildThisFileExtension\" -value ([IO.Path]::GetExtension($filePath))\n    Set-Var -name \"MSBuildThisFile\"          -value (Get-FileName -path $filePath)\n    Set-Var -name \"MSBuildThisFileName\"      -value (Get-FileName -path $filePath -noext)\n    Set-Var -name \"MSBuildThisFileDirectory\" -value (Get-FileDirectory -filePath $filePath)\n}\n\n<#\n.DESCRIPTION\n   Sets the Configuration and Platform project properties so that\n   conditions can be properly evaluated.\n#>\nfunction Detect-ProjectDefaultConfigPlatform()\n{\n    [string] $configPlatformName = \"\"\n\n    # detect the first platform/config pair from the project itemgroup\n    $configItems = @(Get-Project-ItemList \"ProjectConfiguration\")\n\n    if (![string]::IsNullOrWhiteSpace($global:cptCurrentConfigPlatform))\n    {\n        # we have script parameters we can use to set the platform/config\n        $configPlatformName = $global:cptCurrentConfigPlatform\n    }\n\n\n    if ((!$configItems -or $configItems.Count -eq 0))\n    {\n        if ([string]::IsNullOrWhiteSpace($configPlatformName))\n        {\n            throw [ProjectConfigurationNotFound]::new($global:vcxprojPath, \"\");\n        }\n    }\n    else\n    {\n        $targetConfiguration = $null\n\n        if ([string]::IsNullOrEmpty($configPlatformName))\n        {\n            $targetConfiguration = $configItems[0]\n        }\n        else\n        {\n            foreach ($configItem in $configItems)\n            {\n                [string] $platformName = $configItem[0]\n                if ($platformName -ieq $configPlatformName)\n                {\n                    $targetConfiguration = $configItem\n\n                    break\n                }\n            }\n            if ($null -eq $targetConfiguration)\n            {\n                throw [ProjectConfigurationNotFound]::new($global:vcxprojPath, $configPlatformName);\n            }\n        }\n\n        $configPlatformName = $targetConfiguration[0]\n    }\n\n    $global:cptCurrentConfigPlatform = $configPlatformName\n\n    [string[]] $configAndPlatform = $configPlatformName.Split('|')\n    Set-Var -Name \"Configuration\"       -Value $configAndPlatform[0]\n    Set-Var -Name \"Platform\"            -Value $configAndPlatform[1]\n    # manually set PlatformTarget for vcpkg\n    # note that $(PlatformTarget) is not available at the top of the .vcxproj file.\n    if($configAndPlatform[1] -eq \"Win32\")\n    {\n        # solution platforms use 'x86' and 'x64', not Win32\n        # set PlatformTarget to 'x86' to build the correct path for vcpkg lib\n        Set-Var -Name \"PlatformTarget\"  -Value \"x86\"\n    }\n    else\n    {\n        Set-Var -Name \"PlatformTarget\"  -Value $configAndPlatform[1]\n    }\n}\n\nfunction NodeHasUnsatisfiedCondition([System.Xml.XmlNode] $node)\n{\n    if ($node.HasAttribute(\"Condition\"))\n    {\n        [string] $nodeCondition = $node.GetAttribute(\"Condition\")\n        [bool] $conditionSatisfied = ((Evaluate-MSBuildCondition($nodeCondition)) -eq $true)\n        return !$conditionSatisfied\n    }\n\n    return $false\n}\n\nfunction SanitizeProjectNode([System.Xml.XmlNode] $node)\n{\n    if ($node.Name -ieq \"#comment\")\n    {\n        return\n    }\n\n    [System.Collections.ArrayList] $nodesToRemove = @()\n\n    if ($node.Name -ieq \"#text\" -and $node.InnerText.Length -gt 0)\n    {\n        # evaluate node content\n        $node.InnerText = Evaluate-MSBuildExpression $node.InnerText\n    }\n\n    if ($node.Name -ieq \"Import\")\n    {\n        [string] $relPath = Evaluate-MSBuildExpression $node.GetAttribute(\"Project\")\n        if (!$relPath)\n        {\n            return\n        }\n        [string[]] $paths = @(Canonize-Path -base (Get-Location) -child $relPath -ignoreErrors)\n\n        [bool] $loadedProjectSheet = $false\n        foreach ($path in $paths)\n        {\n            if (![string]::IsNullOrEmpty($path) -and (Test-Path -LiteralPath $path))\n            {\n                Write-Verbose \"Property sheet: $path\"\n                ParseProjectFile($path)\n                $loadedProjectSheet = $true\n            }\n        }\n        if (!$loadedProjectSheet)\n        {\n            Write-Verbose \"Could not find property sheet $relPath\"\n            if ($relPath -like \"\\Microsoft.Cpp.props\")\n            {\n                # now we can begin to evaluate directory.build.props XML element conditions, load it\n                LoadDirectoryBuildPropSheetFile\n            }\n        }\n    }\n\n    if ( ($node.Name -ieq \"ClCompile\" -or $node.Name -ieq \"ClInclude\") -and\n        ![string]::IsNullOrEmpty($node.GetAttribute(\"Include\")) )\n    {\n        [string] $expandedAttr = Evaluate-MSBuildExpression $node.GetAttribute(\"Include\")\n        $node.Attributes[\"Include\"].Value = $expandedAttr\n    }\n\n    if ($node.Name -ieq \"Otherwise\")\n    {\n        [System.Xml.XmlElement[]] $siblings = @($node.ParentNode.ChildNodes | `\n            Where-Object { $_.GetType().Name -ieq \"XmlElement\" -and $_ -ne $node })\n        if ($siblings.Count -gt 0)\n        {\n            # means there's a <When> element that matched\n            # <Otherwise> should not be evaluated, we could set unwated properties\n            return\n        }\n    }\n\n    if ($node.Name -ieq \"ItemGroup\")\n    {\n        [string] $oldItemContextName = Get-ProjectItemContext\n        foreach ($child in $node.ChildNodes)\n        {\n            if ($child.GetType().Name -ine \"XmlElement\")\n            {\n                continue\n            }\n\n            [string] $childEvaluatedValue = Evaluate-MSBuildExpression $child.GetAttribute(\"Include\")\n            $itemProperties = @{}\n\n            Set-ProjectItemContext $child.Name\n            $contextProperties = Get-ProjectItemProperty\n            if ($contextProperties -ne $null)\n            {\n                foreach ($k in $contextProperties.Keys)\n                {\n                    $itemProperties[$k] = $contextProperties[$k]\n                }\n            }\n\n            foreach ($nodePropChild in $child.ChildNodes)\n            {\n                if ($nodePropChild.GetType().Name -ine \"XmlElement\")\n                {\n                    continue\n                }\n\n                if (NodeHasUnsatisfiedCondition -node $nodePropChild)\n                {\n                    continue\n                }\n\n                $itemProperties[$nodePropChild.Name] = Evaluate-MSBuildExpression $nodePropChild.InnerText\n            }\n\n            Add-Project-Item -name $child.Name -value $childEvaluatedValue -properties $itemProperties\n        }\n\n        Set-ProjectItemContext $oldItemContextName\n\n        if ($node.GetAttribute(\"Label\") -ieq \"ProjectConfigurations\")\n        {\n            Detect-ProjectDefaultConfigPlatform\n        }\n    }\n\n    if ($node.Name -ieq \"ItemDefinitionGroup\")\n    {\n        foreach ($child in $node.ChildNodes)\n        {\n            if ($child.GetType().Name -ine \"XmlElement\")\n            {\n                continue\n            }\n\n            Push-ProjectItemContext $child.Name\n\n            foreach ($propNode in $child.ChildNodes)\n            {\n                if ($propNode.GetType().Name -ine \"XmlElement\")\n                {\n                    continue\n                }\n\n                if (NodeHasUnsatisfiedCondition -node $propNode)\n                {\n                    continue\n                }\n\n                [string] $propVal = Evaluate-MSBuildExpression $propNode.InnerText\n                Set-ProjectItemProperty $propNode.Name $propVal\n            }\n\n            Pop-ProjectItemContext\n        }\n    }\n\n    if ($node.ParentNode -and $node.ParentNode.Name -ieq \"PropertyGroup\")\n    {\n        # set new property value\n        [string] $propertyName = $node.Name\n        [string] $propertyValue = Evaluate-MSBuildExpression $node.InnerText\n\n        Set-Var -Name $propertyName -Value $propertyValue\n\n        return\n    }\n\n    if ($node.ChildNodes.Count -eq 0)\n    {\n        return\n    }\n\n    foreach ($child in $node.ChildNodes)\n    {\n        [bool] $validChild = $true\n        if ($child.GetType().Name -ieq \"XmlElement\")\n        {\n            if ($child.HasAttribute(\"Condition\"))\n            {\n                # process node condition\n                [string] $nodeCondition = $child.GetAttribute(\"Condition\")\n                $validChild = ((Evaluate-MSBuildCondition($nodeCondition)) -eq $true)\n                if ($validChild)\n                {\n                    $child.RemoveAttribute(\"Condition\")\n                }\n            }\n        }\n        if (!$validChild)\n        {\n            $nodesToRemove.Add($child) > $null\n            continue\n        }\n        else\n        {\n            SanitizeProjectNode($child)\n        }\n    }\n\n    foreach ($nodeToRemove in $nodesToRemove)\n    {\n        $nodeToRemove.ParentNode.RemoveChild($nodeToRemove) > $null\n    }\n}\n\n<#\n.DESCRIPTION\n   Parses a project file and loads data into corresponding data structures.\n   Project elements that are conditioned will be evaluated and discarded if their\n   condition is evaluted to False.\n#>\nfunction ParseProjectFile([string] $projectFilePath)\n{\n    if ($projectFilePath.EndsWith(\"vcpkg.props\"))\n    {\n        [string] $installDir = cpt::GetPathOfFileAbove -startDir (Get-FileDirectory $projectFilePath) -targetFile \"Installed\"\n        if (! [string]::IsNullOrWhiteSpace($installDir)             -and \n            ! (VariableExistsAndNotEmpty -name \"VcpkgInstalledDir\") -and\n             (Evaluate-MSBuildCondition \"'`$(VcpkgEnableManifest)' != 'true'\" ))\n        {\n            Set-Var -name \"VcpkgInstalledDir\" -value $installDir \n        }\n\n        [string] $rootDir = cpt::GetDirNameOfFileAbove -startDir (Get-FileDirectory $projectFilePath) -targetFile \".vcpkg-root\"\n        if ( ![string]::IsNullOrWhiteSpace($rootDir) -and ! (VariableExistsAndNotEmpty -name \"VcpkgRoot\"))\n        {\n            Set-Var -name \"VcpkgRoot\" -value $rootDir\n        }\n    }\n\n    # keep current file path, we'll need to restore it\n    [string] $currentFile = \"\"\n    if (VariableExistsAndNotEmpty 'MSBuildThisFileFullPath')\n    {\n        $currentFile = $MSBuildThisFileFullPath\n    }\n\n    Write-Verbose \"`nSanitizing $projectFilePath\"\n\n    [xml] $fileXml = Get-Content -LiteralPath $projectFilePath\n\n    $global:ProjectInputFiles.Add($projectFilePath) > $null\n\n    Push-Location -LiteralPath (Get-FileDirectory -filePath $projectFilePath)\n\n    InitializeMsBuildCurrentFileProperties -filePath $projectFilePath\n    SanitizeProjectNode($fileXml.Project)\n\n    Pop-Location\n\n    # restore previous path\n    if (![string]::IsNullOrWhiteSpace(($currentFile)))\n    {\n        Write-Verbose \"[INFO] Restoring project file properties localstate to parent file\"\n        InitializeMsBuildCurrentFileProperties -filePath $currentFile\n    }\n}\n\nfunction LoadDirectoryBuildPropSheetFile()\n{\n    if ($env:CPT_LOAD_ALL -ne \"1\")\n    {\n        # Tries to find a Directory.Build.props property sheet, starting from the\n        # project directory, going up. When one is found, the search stops.\n        # Multiple Directory.Build.props sheets are not supported.\n        [string] $directoryBuildSheetPath = (cpt::GetDirNameOfFileAbove -startDir $ProjectDir `\n                                             -targetFile \"Directory.Build.props\") + \"\\Directory.Build.props\"\n        if (Test-Path -LiteralPath $directoryBuildSheetPath)\n        {\n            ParseProjectFile($directoryBuildSheetPath)\n        }\n\n        [string] $vcpkgIncludePath = \"$env:LOCALAPPDATA\\vcpkg\\vcpkg.user.props\"\n        if (Test-Path -LiteralPath $vcpkgIncludePath)\n        {\n            ParseProjectFile($vcpkgIncludePath)\n        }\n        [string] $vcpkgIncludePath = \"$env:LOCALAPPDATA\\vcpkg\\vcpkg.user.targets\"\n        if (Test-Path -LiteralPath $vcpkgIncludePath)\n        {\n            ParseProjectFile($vcpkgIncludePath)\n        }\n    }\n}\n\n<#\n.DESCRIPTION\nLoads vcxproj and property sheets into memory. This needs to be called only once\nwhen processing a project. Accessing project data can be done using ItemGroups and Properties\n#>\nfunction LoadProject([string] $vcxprojPath)\n{\n    # Clean global variables that have been set by a previous project load\n    Clear-Vars\n\n    $global:vcxprojPath = $vcxprojPath\n\n    InitializeMsBuildProjectProperties\n\n    ParseProjectFile -projectFilePath $global:vcxprojPath\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/msbuild-project-load.tests.ps1",
    "content": "﻿#Clear-Host\n\n# IMPORT code blocks\n\nBeforeAll {\n  @(\n   , \"$PSScriptRoot\\io.ps1\"\n   , \"$PSScriptRoot\\msbuild-expression-eval.ps1\"\n   , \"$PSScriptRoot\\msbuild-project-load.ps1\"\n   ) | ForEach-Object { . $_ }\n}\n\nDescribe \"VC++ Project Data Loading\" {\n  It \"To be implemented\" {\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/visualstudio-detection.ps1",
    "content": "# ------------------------------------------------------------------------------------------------\n# Helpers for locating Visual Studio on the computer\n\n# VsWhere is available starting with Visual Studio 2017 version 15.2.\nSet-Variable -name   kVsWhereLocation `\n    -value  \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\Installer\\vswhere.exe\" #`\n#-option Constant\n\nFunction Convert-MSVCFolderName2Toolset([Parameter(Mandatory = $true)][string] $internalVer)\n{\n    # https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering\n    $internalVer = $internalVer.Replace('.', '');\n\n    return $internalVer.Substring(0, 3);\n}\n\nFunction Convert-PlatformToolset2VsVer([Parameter(Mandatory = $true)][string] $toolset)\n{\n    switch ($toolset)\n    {\n        \"141\" { \"2017\" }\n        \"142\" { \"2019\" }\n        \"143\" { \"2022\" }\n        \"145\" { \"2026\" }\n    }\n}\n\nFunction Get-VisualStudioToolsets()\n{\n    $toolsetFolders = (Get-Item \"$(Get-VisualStudio-Path)\\VC\\Tools\\MSVC\\\" | Get-ChildItem)\n    [string[]] $toolsets = @()\n\n    foreach ($folder in $toolsetFolders)\n    {\n        $toolsets += @(Convert-MSVCFolderName2Toolset -internalVer $folder.Name)\n    }\n\n    return ($toolsets | Where-Object { ![string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique)\n}\n\nFunction Get-MscVer()\n{\n    [string[]] $mscVerFolders = ((Get-Item \"$(Get-VisualStudio-Path)\\VC\\Tools\\MSVC\\\" | Get-ChildItem).Name | Sort-Object -Descending)\n    foreach ($mscVerFolderName in $mscVerFolders)\n    {\n        # get the latest toolset (mscver) that matches our target Visual Studio version\n\n        [string] $platformToolset = Convert-MSVCFolderName2Toolset $mscVerFolderName\n        [string] $vsTargetVer = Convert-PlatformToolset2VsVer $platformToolset\n        if ($vsTargetVer -eq $global:cptVisualStudioVersion)\n        {\n            return $mscVerFolderName\n        }\n    }\n}\n \nFunction Get-VisualStudio-Includes([Parameter(Mandatory = $true)][string]  $vsPath,\n    [Parameter(Mandatory = $false)][string] $mscVer)\n{\n    [string] $mscVerToken = \"\"\n    If (![string]::IsNullOrEmpty($mscVer))\n    {\n        $mscVerToken = \"Tools\\MSVC\\$mscVer\\\"\n    }\n\n    return @( \"$vsPath\\VC\\$($mscVerToken)include\"\n            , \"$vsPath\\VC\\$($mscVerToken)atlmfc\\include\"\n            , \"$vsPath\\VC\\Auxiliary\\VS\\include\"\n            )\n}\n\nFunction Get-VsWhere-VisualStudio-Version()\n{\n    switch ($global:cptVisualStudioVersion)\n    {\n        \"2013\"  { return \"[12.0, 13)\" }\n        \"2015\"  { return \"[14.0, 15)\" }\n        \"2017\"  { return \"[15.0, 16)\" }\n        \"2019\"  { return \"[16.0, 17)\" }\n        \"2022\"  { return \"[17.0, 18)\" }\n        \"2026\"  { return \"[18.0, 19)\" }\n        default { throw \"Unsupported Visual Studio version: $cptVisualStudioVersion\" }\n    }\n}\n\nFunction Get-VisualStudio-VersionNumber([Parameter(Mandatory = $true)][string]  $vsYearVersion)\n{\n    switch ($vsYearVersion)\n    {\n        \"2013\"  { return \"12.0\" }\n        \"2015\"  { return \"14.0\" }\n        \"2017\"  { return \"15.0\" }\n        \"2019\"  { return \"16.0\" }\n        \"2022\"  { return \"17.0\" }\n        \"2026\"  { return \"18.0\" }\n        default { throw \"Unsupported Visual Studio version: $vsYearVersion\" }\n    }\n}\n\n# Newer Visual Studio versions support installing older toolset versions, for compatibility reasons.\n# Returns default instalation path of the current VS version/toolset.\nFunction Get-VisualStudio-CompatiblityToolset-InstallLocation()\n{\n    return \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio \" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n}\n\nFunction Get-VisualStudio2015-RegistryLocation()\n{\n    return \"HKLM:SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\\" + (Get-VisualStudio-VersionNumber $global:cptVisualStudioVersion)\n}\n\nFunction Get-VisualStudio-Path()\n{\n    # Depending of the version of Visual Studio, we have different approaches to locating it.\n\n    if ( ([int] $global:cptVisualStudioVersion) -le 2015 )\n    {\n        # Older Visual Studio (<= 2015). VSWhere is not available.\n\n        [string] $installLocation = (Get-Item (Get-VisualStudio2015-RegistryLocation)).GetValue(\"InstallDir\")\n        if ($installLocation)\n        {\n            $installLocation = Canonize-Path -base $installLocation -child \"..\\..\" -ignoreErrors\n        }\n        if ($installLocation)\n        {\n            return $installLocation\n        }\n\n        # we may have a newer VS installation with an older toolset feature installed\n        [string] $toolsetDiskLocation = (Get-VisualStudio-CompatiblityToolset-InstallLocation)\n        [string] $iostreamLocation = Canonize-Path -base $toolsetDiskLocation `\n                                                   -child \"VC\\include\\iostream\" -ignoreErrors\n        if ($iostreamLocation)\n        {\n            return $toolsetDiskLocation\n        }\n\n        Write-Err \"Visual Studio $($global:cptVisualStudioVersion) installation location could not be detected\"\n    }\n    else\n    {\n        # modern Visual Studio (> 2017). Use VSWhere to locate it.\n        if (Test-Path -LiteralPath $kVsWhereLocation)\n        {\n\n            [string] $product = \"*\"\n            if (![string]::IsNullOrEmpty($aVisualStudioSku))\n            {\n              $product = \"Microsoft.VisualStudio.Product.$aVisualStudioSku\"\n            }\n\n            [string] $version = Get-VsWhere-VisualStudio-Version\n            [string[]] $output = @(& \"$kVsWhereLocation\" -nologo `\n                                                        -property installationPath `\n                                                        -products $product `\n                                                        -version $version `\n                                                        -prerelease)\n\n            # the -prerelease switch is not available on older VS2017 versions\n            if (($output -join \"\").Contains(\"0x57\")) <# error code for unknown parameter #>\n            {\n                $output = (& \"$kVsWhereLocation\" -nologo `\n                                                 -property installationPath `\n                                                 -version $version `\n                                                 -products $product)\n            }\n\n            if (!$output)\n            {\n                throw \"VsWhere could not detect Visual Studio $($global:cptVisualStudioVersion) $product.\"\n            }\n\n            [string] $installationPath = $output[0]\n            Write-Verbose \"Detected (vswhere) VisualStudio installation path: $installationPath\"\n            return $installationPath\n        }\n\n        if ( ([int] $global:cptVisualStudioVersion) -le 2022)\n        {\n           [string] $kVsDefaultLocation = \"${Env:ProgramFiles}\\Microsoft Visual Studio\\$global:cptVisualStudioVersion\\$aVisualStudioSku\"\n        }\n        else\n        {\n           [string] $kVsDefaultLocation = \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio\\$global:cptVisualStudioVersion\\$aVisualStudioSku\"\n        }\n      \n        if (Test-Path -LiteralPath $kVsDefaultLocation)\n        {\n            return $kVsDefaultLocation\n        }\n\n        throw \"Cannot locate Visual Studio $($global:cptVisualStudioVersion)\"\n    }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/visualstudio-detection.tests.ps1",
    "content": "﻿# #Clear-Host\n\n# # IMPORT code blocks\n\n# BeforeAll {\n#   @(\n#    , \"$PSScriptRoot\\io.ps1\"\n#    , \"$PSScriptRoot\\visualstudio-detection.ps1\"\n#    ) | ForEach-Object { . $_ }\n# }\n\n# Describe \"Visual Studio detection\" {\n#   # Mock script parameters\n#   $global:cptVisualStudioVersion = \"2017\"\n#   $aVisualStudioSku     = \"Professional\"\n\n#   It \"Get-MscVer\" {\n#     [string[]] $mscVer = Get-MscVer\n#     $mscVer.Count | Should -BeExactly 1\n#     $mscVer[0] | Should -Not -BeNullOrEmpty\n#     $mscVer[0].Length | Should -BeGreaterThan 3\n#     $mscVer[0].Contains(\".\") | Should -BeExactly $true\n#   }\n\n#   It \"Get-VisualStudio-Path\" {\n#     $vsPath = Get-VisualStudio-Path\n#     $vsPath | Should -Not -BeNullOrEmpty\n#   }\n\n#   It \"Get-VisualStudio-Path [2015]\" {\n#     # see first if VS 2015 is installed\n#     [Microsoft.Win32.RegistryKey] $vs14Key = Get-Item \"HKLM:SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\14.0\"\n#     [bool] $vs2015isInstalled = $vs14Key -and ![string]::IsNullOrEmpty($vs14Key.GetValue(\"InstallDir\"))\n\n#     $oldMockValue = $global:cptVisualStudioVersion\n\n#     $vsPath = Get-VisualStudio-Path\n#     $vsPath | Should -Not -BeNullOrEmpty\n\n#     # Re-Mock script parameter\n#     $global:cptVisualStudioVersion = \"2015\"\n\n#     # Maybe we have a VS 2017 installation with v140 toolset installed\n#     [string] $vs2017ToolsetV140Path = \"${Env:ProgramFiles(x86)}\\Microsoft Visual Studio 14.0\"\n#     if (Test-Path \"$vs2017ToolsetV140Path\\VC\\include\\iostream\")\n#     {\n#       $vs2015isInstalled = $true\n#     }\n\n#     if ($vs2015isInstalled)\n#     {\n#       $vs2015Path = Get-VisualStudio-Path\n#       $vs2015Path | Should -Not -BeNullOrEmpty\n#       $vs2015Path | Should -Not -Be $vsPath\n#     }\n#     else\n#     {\n#       { Get-VisualStudio-Path } | Should -Throw\n#     }\n\n#     $global:cptVisualStudioVersion = $oldMockValue\n#   }\n\n#   It \"Get-VisualStudio-Includes\" {\n#     [string] $vsPath = Get-VisualStudio-Path\n#     [string] $mscver = Get-MscVer\n#     [string[]] $includes = Get-VisualStudio-Includes -vsPath $vsPath -mscVer $mscver\n#     $includes.Count | Should -BeGreaterThan 1\n#     $includes | ForEach-Object { [System.IO.Directory]::Exists($_) | Should -BeExactly $true }\n#   }\n# }\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsShared/Tooling/v1/psClang/~advinst.tests.ps1",
    "content": "BeforeAll {\n  . \"$PsScriptRoot\\io.ps1\"\n}\n\nDescribe \"ai\" {\n  It \"Should build Advanced Installer\" {\n\n   [string] $advinstRepo = $env:ADVINST_CPT\n\n   if ($advinstRepo)\n   {\n    Push-Location $advinstRepo\n\n    [string] $scriptLocation = Canonize-Path -base \"$PSScriptRoot\" -child \"..\\clang-build.ps1\"\n    &\"$scriptLocation\" 2>&1 | Out-Default\n    [int] $exitCode = $LASTEXITCODE\n    Pop-Location\n\n    Write-Output \"$PSScriptRoot\"\n    $exitCode | Should -BeExactly 0\n   }\n  }\n}"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/ClangCommandTests/IgnoreCompileCommandTests.cs",
    "content": "﻿using ClangPowerTools.Commands;\nusing EnvDTE80;\nusing Xunit;\n\nnamespace ClangPowerTools.Tests\n{\n  [VsTestSettings(UIThread = true)]\n  public class IgnoreCompileCommandTests\n  {\n    #region Members\n\n    private const string kGeneralSettingsPath = @\"C:\\Users\\Enache Ionut\\AppData\\Roaming\\ClangPowerTools\\GeneralConfiguration.config\";\n\n    private DTE2 mDte;\n    private IgnoreCompileCommand mIgnoreCompileCommand;\n\n    #endregion\n\n    /*\n    #region Test Methods\n\n    // Empty State \n\n    [VsFact(Version = \"2019\")]\n    public async Task SaveFilesToIgnore_EmptyState_UIAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n\n      //Act\n      Initialize(string.Empty);\n      await IgnoreFilesAsync(IgnoreCommand.kSingleFileToIgnore);\n      settingsHandler.SaveSettings();\n\n      var filesToIgnore = settingsProvider.GetCompilerSettingsModel().FilesToIgnore;\n      var expectedRestul = string.Join(\";\", IgnoreCommand.kSingleFileToIgnore);\n      settingsHandler.ResetSettings();\n\n      //Assert\n      Assert.Equal(filesToIgnore, expectedRestul);\n    }\n\n\n        [VsFact(Version = \"2019\")]\n        public async Task SaveFilesToIgnore_EmptyState_ConfigAsync()\n        {\n          await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n          await UnitTestUtility.LoadPackageAsync();\n\n          Initialize(string.Empty);\n          await IgnoreFilesAsync(IgnoreCommand.kSingleFileToIgnore);\n          SettingsHandler.SaveGeneralSettings();\n\n          if (!File.Exists(kGeneralSettingsPath))\n            Assert.False(true);\n\n          XmlSerializer serializer = new XmlSerializer();\n          var generalSettingsModel = serializer.DeserializeFromFile<ClangOptions>(kGeneralSettingsPath);\n\n          var filesToIgnore = generalSettingsModel.FilesToIgnoreCollection;\n          var expectedRestul = string.Join(\";\", IgnoreCommand.kSingleFileToIgnore);\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          Assert.Equal(filesToIgnore, expectedRestul);\n        }\n\n\n        [VsFact(Version = \"2019\")]\n        public async Task SaveMultipleFilesToIgnore_EmptyState_UIAsync()\n        {\n          await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n          await UnitTestUtility.LoadPackageAsync();\n\n          Initialize(string.Empty);\n          await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsHandler.SaveGeneralSettings();\n\n          var filesToIgnore = mGeneralOptions.FilesToIgnore;\n          var expectedRestul = string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          Assert.Equal(filesToIgnore, expectedRestul);\n        }\n\n\n        [VsFact(Version = \"2019\")]\n        public async Task SaveMultipleFilesToIgnore_EmptyState_ConfigAsync()\n        {\n          await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n          await UnitTestUtility.LoadPackageAsync();\n\n          Initialize(string.Empty);\n          await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsHandler.SaveGeneralSettings();\n\n          if (!File.Exists(kGeneralSettingsPath))\n            Assert.False(true);\n\n          XmlSerializer serializer = new XmlSerializer();\n          var generalSettingsModel = serializer.DeserializeFromFile<ClangOptions>(kGeneralSettingsPath);\n\n          var filesToIgnore = generalSettingsModel.FilesToIgnoreCollection;\n          var expectedRestul = string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          Assert.Equal(filesToIgnore, expectedRestul);\n        }\n\n\n        // No Empty State\n\n        [VsFact(Version = \"2019\")]\n        public async Task SaveFilesToIgnore_NoEmptyState_UIAsync()\n        {\n          await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n          await UnitTestUtility.LoadPackageAsync();\n\n          var expectedResult = string.Join(\";\", IgnoreCommand.kStartUpMultipleFilesToIgnore);\n          Initialize(expectedResult);\n          await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsHandler.SaveGeneralSettings();\n\n          expectedResult += \";\" + string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n          var filesToIgnore = mGeneralOptions.FilesToIgnore;\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          Assert.Equal(filesToIgnore, expectedResult);\n        }\n\n\n        [VsFact(Version = \"2019\")]\n        public async Task SaveFilesToIgnore_NoEmptyState_ConfigAsync()\n        {\n          await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n          await UnitTestUtility.LoadPackageAsync();\n\n          var expectedResult = string.Join(\";\", IgnoreCommand.kStartUpMultipleFilesToIgnore);\n          Initialize(string.Empty);\n\n          await IgnoreFilesAsync(IgnoreCommand.kStartUpMultipleFilesToIgnore);\n          await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n          SettingsHandler.SaveGeneralSettings();\n\n          if (!File.Exists(kGeneralSettingsPath))\n            Assert.False(true);\n\n          XmlSerializer serializer = new XmlSerializer();\n\n          var generalSettingsModel = serializer.DeserializeFromFile<ClangOptions>(kGeneralSettingsPath);\n          expectedResult += \";\" + string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n\n          var filesToIgnore = generalSettingsModel.FilesToIgnoreCollection;\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          Assert.Equal(filesToIgnore, expectedResult);\n        }\n\n        #endregion\n\n\n        #region Private Methods\n\n        private void Initialize(string ignoreFiles)\n        {\n          ThreadHelper.ThrowIfNotOnUIThread();\n          mDte = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));\n          SettingsTestUtility.ResetClangGeneralOptionsView();\n\n          mIgnoreCompileCommand = IgnoreCompileCommand.Instance;\n          mGeneralOptions = SettingsProvider.GeneralSettings;\n          mGeneralOptions.FilesToIgnore = ignoreFiles;\n        }\n\n        private Task IgnoreFilesAsync(List<string> aFilesToIgnore)\n        {\n          return Task.Run(() =>\n          {\n            mIgnoreCompileCommand.AddIgnoreFilesToSettings(aFilesToIgnore);\n          });\n        }\n\n        #endregion\n        */\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/ClangCommandTests/IgnoreFormatCommandTests.cs",
    "content": "﻿using ClangPowerTools.Commands;\nusing EnvDTE80;\nusing Xunit;\n\nnamespace ClangPowerTools.Tests\n{\n  [VsTestSettings(UIThread = true)]\n  public class IgnoreFormatCommandTests\n  {\n\n    #region Members\n\n    private const string kFormatSettingsPath = @\"C:\\Users\\Enache Ionut\\AppData\\Roaming\\ClangPowerTools\\FormatConfiguration.config\";\n\n    private DTE2 mDte;\n    private IgnoreFormatCommand mIgnoreFormatCommand;\n\n    #endregion\n    /*\n  #region Public Methods\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveFilesToIgnore_EmptyState_UIAsync()\n  {\n    //Arrange\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n    var settingsHandler = new SettingsHandler();\n    var settingsProvider = new SettingsProvider();\n\n    // Act\n    Initialize(string.Empty);\n    await IgnoreFilesAsync(IgnoreCommand.kSingleFileToIgnore);\n\n    var filesToIgnore = settingsProvider.GetFormatSettingsModel().FilesToIgnore;\n    var expectedRestul = string.Join(\";\", IgnoreCommand.kSingleFileToIgnore);\n    settingsHandler.ResetSettings();\n\n    // Assert\n    Assert.Equal(filesToIgnore, expectedRestul);\n  }\n\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveFilesToIgnore_EmptyState_ConfigAsync()\n  {\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n\n    Initialize(string.Empty);\n    await IgnoreFilesAsync(IgnoreCommand.kSingleFileToIgnore);\n    SettingsHandler.SaveFormatSettings();\n\n    if (!File.Exists(kFormatSettingsPath))\n      Assert.False(true);\n\n    XmlSerializer serializer = new XmlSerializer();\n    var formatSettingsModel = serializer.DeserializeFromFile<ClangFormatOptions>(kFormatSettingsPath);\n\n    var filesToIgnore = formatSettingsModel.SkipFiles;\n    var expectedRestul = string.Join(\";\", IgnoreCommand.kSingleFileToIgnore);\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    Assert.Equal(filesToIgnore, expectedRestul);\n  }\n\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveMultipleFilesToIgnore_EmptyState_UIAsync()\n  {\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n\n    Initialize(string.Empty);\n    await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsHandler.SaveFormatSettings();\n\n    var filesToIgnore = mFormatOptions.FilesToIgnore;\n    var expectedRestul = string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    Assert.Equal(filesToIgnore, expectedRestul);\n  }\n\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveMultipleFilesToIgnore_EmptyState_ConfigAsync()\n  {\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n\n    Initialize(string.Empty);\n    await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsHandler.SaveFormatSettings();\n\n    if (!File.Exists(kFormatSettingsPath))\n      Assert.False(true);\n\n    XmlSerializer serializer = new XmlSerializer();\n    var formatSettingsModel = serializer.DeserializeFromFile<ClangFormatOptions>(kFormatSettingsPath);\n\n    var filesToIgnore = formatSettingsModel.SkipFiles;\n    var expectedRestul = string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    Assert.Equal(filesToIgnore, expectedRestul);\n  }\n\n\n  // No Empty State\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveFilesToIgnore_NoEmptyState_UIAsync()\n  {\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n\n    var expectedResult = string.Join(\";\", IgnoreCommand.kStartUpMultipleFilesToIgnore);\n    Initialize(expectedResult);\n    await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsHandler.SaveFormatSettings();\n\n    expectedResult += \";\" + string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n\n    var filesToIgnore = mFormatOptions.FilesToIgnore;\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    Assert.Equal(filesToIgnore, expectedResult);\n  }\n\n\n  [VsFact(Version = \"2019\")]\n  public async Task SaveFilesToIgnore_NoEmptyState_ConfigAsync()\n  {\n    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n    await UnitTestUtility.LoadPackageAsync();\n\n    var expectedResult = string.Join(\";\", IgnoreCommand.kStartUpMultipleFilesToIgnore);\n    Initialize(expectedResult);\n    await IgnoreFilesAsync(IgnoreCommand.kMultipleFilesToIgnore);\n    SettingsHandler.SaveFormatSettings();\n\n    if (!File.Exists(kFormatSettingsPath))\n      Assert.False(true);\n\n    XmlSerializer serializer = new XmlSerializer();\n\n    var formatSettingsModel = serializer.DeserializeFromFile<ClangFormatOptions>(kFormatSettingsPath);\n    expectedResult += \";\" + string.Join(\";\", IgnoreCommand.kMultipleFilesToIgnore);\n\n    var filesToIgnore = formatSettingsModel.SkipFiles;\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    Assert.Equal(filesToIgnore, expectedResult);\n  }\n\n  #endregion\n\n\n  #region Private Methods\n\n  private void Initialize(string ignoreFiles)\n  {\n    ThreadHelper.ThrowIfNotOnUIThread();\n    mDte = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));\n    SettingsTestUtility.ResetClangFormatOptionsView();\n\n    mIgnoreFormatCommand = IgnoreFormatCommand.Instance;\n    mFormatOptions = SettingsProvider.ClangFormatSettings;\n    mFormatOptions.FilesToIgnore = ignoreFiles;\n  }\n\n  private async Task IgnoreFilesAsync(List<string> aFilesToIgnore)\n  {\n    await System.Threading.Tasks.Task.Run(() =>\n    {\n      mIgnoreFormatCommand.AddIgnoreFilesToSettings(aFilesToIgnore);\n    });\n  }\n\n  #endregion\n*/\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/ClangCommandTests/ScriptTests.cs",
    "content": "﻿using ClangPowerTools.Helpers;\nusing ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Microsoft;\nusing Microsoft.VisualStudio.Shell;\nusing System.Collections.Generic;\nusing Xunit;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Tests.ClangCommandTests\n{\n\n  [VsTestSettings(UIThread = true)]\n  public class ScriptTests\n  {\n    #region Members\n\n    private readonly string solutionPath = @\"C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln\";\n\n    // Expected results for files\n    private readonly string compileOnFileExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.vcxproj'' -file ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.cpp'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -parallel -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n    private readonly string tidyOnFileExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.vcxproj'' -file ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.cpp'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -tidy ''-*,modernize-avoid-bind,modernize-avoid-c-arrays,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-default-member-init,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-trailing-return-type,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,modernize-use-using,readability-avoid-const-params-in-decls,readability-braces-around-statements,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-deleted-default,readability-delete-null-pointer,readability-else-after-return,readability-identifier-naming,readability-implicit-bool-conversion,readability-inconsistent-declaration-parameter-name,readability-isolate-declaration,readability-magic-numbers,readability-misleading-indentation,readability-misplaced-array-index,readability-named-parameter,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-member-init,readability-redundant-preprocessor,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-boolean-expr,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-uppercase-literal-suffix'' -header-filter ''.*'' -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n    private readonly string tidyFixOnFileExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.vcxproj'' -file ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocatorTest\\CustomAllocatorTest.cpp'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -tidy-fix ''-*,modernize-avoid-bind,modernize-avoid-c-arrays,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-default-member-init,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-trailing-return-type,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,modernize-use-using,readability-avoid-const-params-in-decls,readability-braces-around-statements,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-deleted-default,readability-delete-null-pointer,readability-else-after-return,readability-identifier-naming,readability-implicit-bool-conversion,readability-inconsistent-declaration-parameter-name,readability-isolate-declaration,readability-magic-numbers,readability-misleading-indentation,readability-misplaced-array-index,readability-named-parameter,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-member-init,readability-redundant-preprocessor,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-boolean-expr,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-uppercase-literal-suffix'' -header-filter ''.*'' -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n\n    // Expected results for projects\n    private readonly string compileOnProjectExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator\\CustomAllocator.vcxproj'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -parallel -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n    private readonly string tidyOnProjectExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator\\CustomAllocator.vcxproj'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -tidy ''-*,modernize-avoid-bind,modernize-avoid-c-arrays,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-default-member-init,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-trailing-return-type,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,modernize-use-using,readability-avoid-const-params-in-decls,readability-braces-around-statements,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-deleted-default,readability-delete-null-pointer,readability-else-after-return,readability-identifier-naming,readability-implicit-bool-conversion,readability-inconsistent-declaration-parameter-name,readability-isolate-declaration,readability-magic-numbers,readability-misleading-indentation,readability-misplaced-array-index,readability-named-parameter,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-member-init,readability-redundant-preprocessor,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-boolean-expr,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-uppercase-literal-suffix'' -header-filter ''.*'' -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n    private readonly string tidyFixOnProjectExpectedResult = @\"PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Noninteractive -command '& ''c:\\users\\enache ionut\\appdata\\local\\microsoft\\visualstudio\\16.0_ada83f57exp\\extensions\\caphyon\\clang power tools\\5.2.1\\clang-build.ps1''  -proj ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator\\CustomAllocator.vcxproj'' -active-config ''Debug|x64'' -clang-flags  (''-Wall'',''-fms-compatibility-version=19.10'',''-Wmicrosoft'',''-Wno-invalid-token-paste'',''-Wno-unknown-pragmas'',''-Wno-unused-value'') -tidy-fix ''-*,modernize-avoid-bind,modernize-avoid-c-arrays,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-default-member-init,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-trailing-return-type,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,modernize-use-using,readability-avoid-const-params-in-decls,readability-braces-around-statements,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-deleted-default,readability-delete-null-pointer,readability-else-after-return,readability-identifier-naming,readability-implicit-bool-conversion,readability-inconsistent-declaration-parameter-name,readability-isolate-declaration,readability-magic-numbers,readability-misleading-indentation,readability-misplaced-array-index,readability-named-parameter,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-member-init,readability-redundant-preprocessor,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-boolean-expr,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-uppercase-literal-suffix'' -header-filter ''.*'' -vs-ver 2019 -vs-sku Professional -dir ''C:\\GitRepos\\ClangPowerToolsTests\\CustomAllocator\\CustomAllocator.sln'' '\";\n\n    private readonly Dictionary<string, string> mVsVersions = new Dictionary<string, string>\n    {\n      {\"11.0\", \"2010\"},\n      {\"12.0\", \"2012\"},\n      {\"13.0\", \"2013\"},\n      {\"14.0\", \"2015\"},\n      {\"15.0\", \"2017\"},\n      {\"16.0\", \"2019\"}\n    };\n\n    #endregion\n\n    #region Test Methods\n\n    #region On File Tests\n\n\n    [VsFact(Version = \"2019\")]\n    public async Task CompileOnFile_CreateScript_Async()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, true);\n      var compileOnFileScriptTestResult = CreateScript(CommandIds.kCompileId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(compileOnFileScriptTestResult, compileOnFileExpectedResult);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task TidyOnFile_CreateScript_Async()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, true);\n      var tidyOnFileScriptTestResult = CreateScript(CommandIds.kTidyId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(tidyOnFileScriptTestResult, tidyOnFileExpectedResult);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task TidyFixOnFile_CreateScript_Async()\n    {\n      //Arrange\n\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, true);\n      var tidyFixOnFileScriptTestResult = CreateScript(CommandIds.kTidyFixId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(tidyFixOnFileScriptTestResult, tidyFixOnFileExpectedResult);\n    }\n\n    #endregion\n\n    #region On Project Tests\n\n    [VsFact(Version = \"2019\")]\n    public async Task CompileOnProject_CreateScript_Async()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, false);\n      var compileOnProjectScriptTestResult = CreateScript(CommandIds.kCompileId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(compileOnProjectScriptTestResult, compileOnProjectExpectedResult);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task TidyOnProject_CreateScript_Async()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, false);\n      var tidyOnProjectScriptTestResult = CreateScript(CommandIds.kTidyId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(tidyOnProjectScriptTestResult, tidyOnProjectExpectedResult);\n    }\n\n\n    [VsFact(Version = \"2019\")]\n    public async Task TidyFixOnProject_CreateScript_Async()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      var settingsHandler = new SettingsHandler();\n\n      //Act\n      LoadSolution();\n      settingsHandler.ResetSettings();\n\n      GetVisualStudioInfo(out string edition, out string version, out IItem item, false);\n      var tidyFixOnProjectScriptTestResult = CreateScript(CommandIds.kTidyFixId, edition, version, item);\n\n      CloseSolution();\n\n      //Assert\n      Assert.Equal(tidyFixOnProjectScriptTestResult, tidyFixOnProjectExpectedResult);\n    }\n\n    #endregion\n\n    #endregion\n\n    #region Private Methods\n\n    private void LoadSolution()\n    {\n      ThreadHelper.ThrowIfNotOnUIThread();\n      var dte = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));\n      Assumes.Present(dte);\n\n      dte.Solution.Open(solutionPath);\n\n      var build = dte.Solution.SolutionBuild;\n      build.Build(true);\n    }\n\n    private void CloseSolution()\n    {\n      ThreadHelper.ThrowIfNotOnUIThread();\n      var dte = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));\n      Assumes.Present(dte);\n\n      dte.Solution.Close();\n    }\n\n    private string CreateScript(int commandId, string edition, string version, IItem item)\n    {\n      var runModeParameters = ScriptGenerator.GetRunModeParamaters();\n      var genericParameters = ScriptGenerator.GetGenericParamaters(commandId, edition, version);\n\n      var itemRelatedParameters = item is CurrentProject ?\n        ScriptGenerator.GetItemRelatedParameters(item as CurrentProject) :\n        ScriptGenerator.GetItemRelatedParameters(item as CurrentProjectItem);\n\n      return JoinUtility.Join(\" \", runModeParameters.Remove(runModeParameters.Length - 1), itemRelatedParameters, genericParameters, \"'\");\n    }\n\n    private void GetVisualStudioInfo(out string edition, out string version, out IItem item, bool onFile)\n    {\n      ThreadHelper.ThrowIfNotOnUIThread();\n\n      var dte = (DTE2)VsServiceProvider.GetService(typeof(DTE));\n      edition = dte.Edition;\n\n      mVsVersions.TryGetValue(dte.Version, out string vsVersion);\n      version = vsVersion;\n\n      item = onFile ?\n        (IItem) new CurrentProjectItem(dte.Solution.Projects.Item(1).ProjectItems.Item(4)) :\n        (IItem) new CurrentProject(dte.Solution.Projects.Item(2));\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/ClangPowerToolsUnitTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <PlatformTarget>x86</PlatformTarget>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"EnvDTE80\" Version=\"8.0.3\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" Version=\"16.0.200\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.1\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.1\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"VsixTesting.Xunit\" Version=\"0.1.49-beta\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClangPowerTools\\ClangPowerTools.csproj\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/Constants/IgnoreCommand.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ClangPowerToolsUnitTests.Constants\n{\n  public class IgnoreCommand\n  {\n    public static readonly List<string> kSingleFileToIgnore = new List<string>()\n    {\n      @\"DispatcherHandler.cpp\",\n    };\n\n    public static readonly List<string> kMultipleFilesToIgnore = new List<string>()\n    {\n      @\"DispatcherHandler.cpp\",\n      @\"VsServiceProviderTests.cpp\",\n      @\"AsyncPackageTests.cpp\"\n    };\n\n    public static readonly List<string> kStartUpMultipleFilesToIgnore = new List<string>()\n    {\n      @\"CommandController.cpp\",\n      @\"Settings.cpp\",\n      @\"Options.cpp\"\n    };\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/PackageTests/AsyncPackageTests.cs",
    "content": "﻿using Microsoft;\nusing Microsoft.VisualStudio.Shell;\nusing Microsoft.VisualStudio.Shell.Interop;\nusing System;\nusing Xunit;\nusing Task = System.Threading.Tasks.Task;\n\nnamespace ClangPowerTools.Tests\n{\n  public class AsyncPackageTests\n  {\n    [VsTheory(Version = \"2019\")]\n    [InlineData(RunClangPowerToolsPackage.PackageGuidString, true)]\n    [InlineData(\"11111111-2222-3333-4444-555555555555\", false)]\n    public async Task LoadTestAsync(string guidString, bool expectedSuccess)\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      IVsShell7 shell = (IVsShell7)ServiceProvider.GlobalProvider.GetService(typeof(SVsShell));\n      await UnitTestUtility.LoadPackageAsync();\n\n      //Act\n      Assumes.Present(shell);\n      Guid guid = Guid.Parse(guidString);\n\n      //Assert\n      if (expectedSuccess)\n      {\n        await shell.LoadPackageAsync(ref guid);\n        Assert.True(true, \"Package loaded\");\n      }\n      else\n      {\n        Assert.True(true, \"Package failed to load\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/Settings Tests/CompilerSettingsTests.cs",
    "content": "﻿using Xunit;\n\nnamespace ClangPowerTools.Tests.Settings\n{\n  [VsTestSettings(UIThread = true)]\n  public class CompilerSettingsTests\n  {\n    [VsFact(Version = \"2019-\")]\n    public void CompilerSettings_NotNull()\n    {\n      //Arrange\n      var settingsProvider = new SettingsProvider();\n\n      //Act\n      var compilerSettingsModel = settingsProvider.GetCompilerSettingsModel();\n\n      //Assert\n      Assert.NotNull(compilerSettingsModel);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void CompileFlags_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        CompileFlags = \"-Wall\"\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.CompileFlags, settingsProvider.GetCompilerSettingsModel().CompileFlags);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FilesToIgnore_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        FilesToIgnore = \"Test.cpp\"\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.FilesToIgnore, settingsProvider.GetCompilerSettingsModel().FilesToIgnore);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void ProjectToIgnore_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        ProjectsToIgnore = \"TestProject\"\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.ProjectsToIgnore, settingsProvider.GetCompilerSettingsModel().ProjectsToIgnore);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void AdditionalIncludes_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        AdditionalIncludes = ClangGeneralAdditionalIncludes.SystemIncludeDirectories\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.AdditionalIncludes, settingsProvider.GetCompilerSettingsModel().AdditionalIncludes);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void TreatWarningsAsErrors_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        WarningsAsErrors = true\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.WarningsAsErrors, settingsProvider.GetCompilerSettingsModel().WarningsAsErrors);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void ContinueOnError_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        ContinueOnError = true\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.ContinueOnError, settingsProvider.GetCompilerSettingsModel().ContinueOnError);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void ClangCompileAfterVsCompile_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        ClangAfterMSVC = true\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.ClangAfterMSVC, settingsProvider.GetCompilerSettingsModel().ClangAfterMSVC);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void VerboseMode_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var compilerSettingsModel = new CompilerSettingsModel\n      {\n        VerboseMode = true\n      };\n\n      settingsProvider.SetCompilerSettingsModel(compilerSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(compilerSettingsModel.VerboseMode, settingsProvider.GetCompilerSettingsModel().VerboseMode);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/Settings Tests/FormatSettingsTests.cs",
    "content": "﻿using Xunit;\n\nnamespace ClangPowerTools.Tests.Settings\n{\n  [VsTestSettings(UIThread = true)]\n  public class FormatSettingsTests\n  {\n    [VsFact(Version = \"2019-\")]\n    public void FormatSettings_NotNull()\n    {\n      //Arrange\n      var settingsProvider = new SettingsProvider();\n\n      //Act\n      var formatSettingsModel = settingsProvider.GetFormatSettingsModel();\n\n      //Assert\n      Assert.NotNull(formatSettingsModel);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FormatOnSave_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        FormatOnSave = true\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.FormatOnSave, settingsProvider.GetFormatSettingsModel().FormatOnSave);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FileExtensions_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        FileExtensions = \".cpp\"\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.FileExtensions, settingsProvider.GetFormatSettingsModel().FileExtensions);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FilesToIgnore_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        FilesToIgnore = \"Test.cpp\"\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.FilesToIgnore, settingsProvider.GetFormatSettingsModel().FilesToIgnore);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void AssumeFilename_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        AssumeFilename = \"Test\"\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.AssumeFilename, settingsProvider.GetFormatSettingsModel().AssumeFilename);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FallbackStyle_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        FallbackStyle = ClangFormatFallbackStyle.Mozilla\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.FallbackStyle, settingsProvider.GetFormatSettingsModel().FallbackStyle);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FormatStyle_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        Style = ClangFormatStyle.Mozilla\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.Style, settingsProvider.GetFormatSettingsModel().Style);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void CustomExecutable_ChangeValue_CompareViewToFile()\n    {\n\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var formatSettingsModel = new FormatSettingsModel\n      {\n        CustomExecutable = @\"D:\\Test.exe\"\n      };\n\n      settingsProvider.SetFormatSettingsModel(formatSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(formatSettingsModel.CustomExecutable, settingsProvider.GetFormatSettingsModel().CustomExecutable);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/Settings Tests/GeneralSettingsTests.cs",
    "content": "﻿using Xunit;\n\nnamespace ClangPowerTools.Tests.Settings\n{\n  [VsTestSettings(UIThread = true)]\n  public class GeneralSettingsTests\n  {\n    [VsFact(Version = \"2019-\")]\n    public void GeneralSettings_NotNull()\n    {\n      //Arrange\n      var settingsProvider = new SettingsProvider();\n\n      //Act\n      var generalSettingsModel = settingsProvider.GetGeneralSettingsModel();\n\n      //Assert\n      Assert.NotNull(generalSettingsModel);\n    }\n\n    [VsFact(Version =\"2019-\")]\n    public void Version_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var generalSettingsModel = new GeneralSettingsModel\n      {\n        Version = \"5.0.0\"\n      };\n\n      settingsProvider.SetGeneralSettingsModel(generalSettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(generalSettingsModel.Version, settingsProvider.GetGeneralSettingsModel().Version);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/Settings Tests/TidySettingsTests.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Text;\nusing Xunit;\n\nnamespace ClangPowerTools.Tests.Settings\n{\n  [VsTestSettings(UIThread = true)]\n  public class TidySettingsTests\n  {\n    [VsFact(Version = \"2019-\")]\n    public void TidySettings_NotNull()\n    {\n      //Arrange\n      var settingsProvider = new SettingsProvider();\n\n      //Act\n      var tidySettingsModel = settingsProvider.GetTidySettingsModel();\n\n      //Assert\n      Assert.NotNull(tidySettingsModel);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void FormatAfterTidy_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        FormatAfterTidy = true\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.FormatAfterTidy, settingsProvider.GetTidySettingsModel().FormatAfterTidy);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void ClangTidyOnSave_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        TidyOnSave = true\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.TidyOnSave, settingsProvider.GetTidySettingsModel().TidyOnSave);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void HeaderFilter_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        HeaderFilter = \"test\"\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.HeaderFilter, settingsProvider.GetTidySettingsModel().HeaderFilter);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void ChecksFrom_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        UseChecksFrom = ClangTidyUseChecksFrom.TidyFile\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.UseChecksFrom, settingsProvider.GetTidySettingsModel().UseChecksFrom);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void CustomExecutable_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        CustomExecutable = @\"D:\\Test.exe\"\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.CustomExecutable, settingsProvider.GetTidySettingsModel().CustomExecutable);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void PredefinedChecks_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n\n      var tidyChecks = new TidyChecks();\n      var tidyPredefinedChecks = new List<TidyCheckModel>(tidyChecks.Checks);\n      var checks = new StringBuilder();\n\n      tidyPredefinedChecks[0].IsChecked = true;\n      foreach (TidyCheckModel item in tidyPredefinedChecks)\n      {\n        if (item.IsChecked)\n        {\n          checks.Append(item.Name).Append(\";\");\n        }\n      }\n\n      var tidySettingsModel = new TidySettingsModel\n      {\n        PredefinedChecks = checks.ToString()\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.PredefinedChecks, settingsProvider.GetTidySettingsModel().PredefinedChecks);\n    }\n\n    [VsFact(Version = \"2019-\")]\n    public void CustomChecks_ChangeValue_CompareViewToFile()\n    {\n      var settingsHandler = new SettingsHandler();\n      var settingsProvider = new SettingsProvider();\n      var tidySettingsModel = new TidySettingsModel\n      {\n        CustomChecks = \"test-check\"\n      };\n\n      settingsProvider.SetTidySettingsModel(tidySettingsModel);\n      settingsHandler.SaveSettings();\n      settingsHandler.ResetSettings();\n      settingsHandler.LoadSettings();\n\n      Assert.Equal(tidySettingsModel.CustomChecks, settingsProvider.GetTidySettingsModel().CustomChecks);\n    }\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/VSVersionTests.cs",
    "content": "﻿using Xunit;\n\nnamespace ClangPowerTools.Tests\n{\n  [VsTestSettings(UIThread = true)]\n  public class VsVersionTests\n  {\n    #region Test Methods\n\n    //[VsFact(Version = \"2015\")]\n    //public void RunVisualStudio2015_Test()\n    //{\n    //  Assert.Equal(\"14.0\", UnitTestUtility.GetVsVersion());\n    //}\n\n    [VsFact(Version = \"2017\")]\n    public void RunVisualStudio2017()\n    {\n      Assert.Equal(\"15.0\", UnitTestUtility.GetVsVersion());\n    }\n\n    [VsFact(Version = \"2019\")]\n    public void RunVisualStudio2019()\n    {\n      Assert.Equal(\"16.0\", UnitTestUtility.GetVsVersion());\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/ClangPowerToolsUnitTests/VsServiceProviderTests.cs",
    "content": "﻿using ClangPowerTools.Services;\nusing EnvDTE;\nusing EnvDTE80;\nusing Xunit;\nusing Microsoft.VisualStudio.Shell;\nusing Task = System.Threading.Tasks.Task;\nusing Microsoft.VisualStudio.Shell.Interop;\n\nnamespace ClangPowerTools.Tests\n{\n  [VsTestSettings(UIThread = true)]\n  public class VsServiceProviderTests\n  {\n    #region Test Methods\n\n    [VsFact(Version = \"2019\")]\n    public async Task DteService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(DTE), out object dteService);\n\n      //Assert\n      Assert.NotNull(dteService as DTE);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task Dte2Service_SuccessfulRegistrationAsync()\n    {\n      // Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(DTE), out object dteService);\n\n      // Assert\n      Assert.NotNull(dteService as DTE2);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task OutputWindowService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(SVsOutputWindow), out object outputWindowService);\n\n      // Assert\n      Assert.NotNull(outputWindowService as IVsOutputWindow);\n    }\n\n    // ----------------------------------------------------------------------------\n    [VsFact(Version = \"2019\")]\n    public async Task VsStatusbarService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n\n      VsServiceProvider.TryGetService(typeof(SVsStatusbar), out object statusBarService);\n\n      // Assert\n      Assert.NotNull(statusBarService as IVsStatusbar);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task RunningDocumentTableService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(SVsRunningDocumentTable), out object runningDocumentTableService);\n\n      // Assert\n      Assert.NotNull(runningDocumentTableService as IVsRunningDocumentTable);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task FileChangeService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(SVsFileChangeEx), out object fileChangeService);\n\n      // Assert\n      Assert.NotNull(fileChangeService as IVsFileChangeEx);\n    }\n\n    [VsFact(Version = \"2019\")]\n    public async Task SolutionService_SuccessfulRegistrationAsync()\n    {\n      //Arrange\n      await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n      await UnitTestUtility.LoadPackageAsync();\n      VsServiceProvider.TryGetService(typeof(SVsSolution), out object vsSolutionService);\n\n      // Assert\n      Assert.NotNull(vsSolutionService as IVsSolution);\n    }\n\n    #endregion\n\n  }\n}\n"
  },
  {
    "path": "ClangPowerTools/VsixAI/InfoDocument.txt",
    "content": "Here i will generate ClangPowerTools.vsix and ClangPowerTools2022.vsix"
  },
  {
    "path": "LICENSE.TXT",
    "content": "==============================================================================\nApache License v2.0 with LLVM Exceptions:\n==============================================================================\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n    1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n    2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n    3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n    4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n    5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n    6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n    7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n    8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n    9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n    END OF TERMS AND CONDITIONS\n\n    APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n    Copyright [yyyy] [name of copyright owner]\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n---- LLVM Exceptions to the Apache 2.0 License ----\n\nAs an exception, if, as a result of your compiling your source code, portions\nof this Software are embedded into an Object form of such source code, you\nmay redistribute such embedded portions in such Object form without complying\nwith the conditions of Sections 4(a), 4(b) and 4(d) of the License.\n\nIn addition, if you combine or link compiled forms of this Software with\nsoftware that is licensed under the GPLv2 (\"Combined Software\") and if a\ncourt of competent jurisdiction determines that the patent provision (Section\n3), the indemnity provision (Section 9) or other Section of the License\nconflicts with the conditions of the GPLv2, you may retroactively and\nprospectively choose to deem waived or otherwise exclude such Section(s) of\nthe License, but only in their entirety and only with respect to the Combined\nSoftware.\n\n==============================================================================\nSoftware from third parties included in the LLVM Project:\n==============================================================================\nThe LLVM Project contains third party software which is under different license\nterms. All such code will be identified clearly using at least one of two\nmechanisms:\n1) It will be in a separate directory tree with its own `LICENSE.txt` or\n   `LICENSE` file at the top containing the specific license and restrictions\n   which apply to that software, or\n2) It will contain specific license and restriction terms at the top of every\n   file.\n\n==============================================================================\nLegacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):\n==============================================================================\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2007-2019 University of Illinois at Urbana-Champaign.\nAll rights reserved.\n\nDeveloped by:\n\n    LLVM Team\n\n    University of Illinois at Urbana-Champaign\n\n    http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimers.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimers in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the names of the LLVM Team, University of Illinois at\n      Urbana-Champaign, nor the names of its contributors may be used to\n      endorse or promote products derived from this Software without specific\n      prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "\n# <img src=\"ClangPowerTools.png\" height=\"48\"> Clang Power Tools\n\nA tool bringing clang-tidy magic to Visual Studio C++ developers.\n\n[www.clangpowertools.com](http://www.clangpowertools.com)\n\n### Version History\n\n[Release Notes](http://www.clangpowertools.com/CHANGELOG)\n\n### FAQ\n\n[Frequently asked questions](http://www.clangpowertools.com/QaA)\n"
  }
]