Path: blob/main/extensions/copilot/src/platform/parser/test/node/indentationStructure.spec.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { outdent } from 'outdent';6import { afterAll, describe, expect, test } from 'vitest';7import type * as vscode from 'vscode';8import { StringTextDocument } from '../../../editing/common/abstractText';9import { getStructureUsingIndentation } from '../../node/indentationStructure';10import { OverlayNode } from '../../node/nodes';11import { _dispose } from '../../node/parserImpl';12import { insertRangeMarkers } from './markers';1314describe('getStructure', () => {15afterAll(() => _dispose());1617function treeToFlatList(18node: OverlayNode19): { startIndex: number; endIndex: number; kind: string }[] {20const result: { startIndex: number; endIndex: number; kind: string }[] =21[];22for (const child of node.children) {23result.push({24startIndex: child.startIndex,25endIndex: child.endIndex,26kind: child.kind.toUpperCase(),27});28result.push(...treeToFlatList(child));29}30return result;31}3233async function srcWithAnnotatedStructure(34source: string,35languageId: string,36formattingOptions: vscode.FormattingOptions37) {38const structure = await getStructureUsingIndentation(39new StringTextDocument(source),40languageId,41formattingOptions42);43const flatList = structure ? treeToFlatList(structure) : [];44return insertRangeMarkers(source, flatList);45}4647describe('indentation structure', () => {48test('csharp file', async () => {49const source = outdent`50using System.Collections.Generic;51using System.Threading.Tasks;52using Ardalis.GuardClauses;53using Ardalis.Result;54using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;55using Microsoft.eShopWeb.ApplicationCore.Interfaces;56using Microsoft.eShopWeb.ApplicationCore.Specifications;5758namespace Microsoft.eShopWeb.ApplicationCore.Services;5960public class BasketService : IBasketService61{62private readonly IRepository<Basket> _basketRepository;63private readonly IAppLogger<BasketService> _logger;6465public BasketService(IRepository<Basket> basketRepository,66IAppLogger<BasketService> logger)67{68_basketRepository = basketRepository;69_logger = logger;70}7172public async Task<Basket> AddItemToBasket(string username, int catalogItemId, decimal price, int quantity = 1)73{74var basketSpec = new BasketWithItemsSpecification(username);75var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);7677if (basket == null)78{79basket = new Basket(username);80await _basketRepository.AddAsync(basket);81}8283basket.AddItem(catalogItemId, price, quantity);8485await _basketRepository.UpdateAsync(basket);86return basket;87}8889public async Task DeleteBasketAsync(int basketId)90{91var basket = await _basketRepository.GetByIdAsync(basketId);92Guard.Against.Null(basket, nameof(basket));93await _basketRepository.DeleteAsync(basket);94}9596public async Task<Result<Basket>> SetQuantities(int basketId, Dictionary<string, int> quantities)97{98var basketSpec = new BasketWithItemsSpecification(basketId);99var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);100101foreach (var item in basket.Items)102{103if (quantities.TryGetValue(item.Id.ToString(), out var quantity))104{105_logger.LogInformation($"Updating quantity of item ID:{item.Id} to {quantity}.");106item.SetQuantity(quantity);107}108}109basket.RemoveEmptyItems();110await _basketRepository.UpdateAsync(basket);111return basket;112}113114public async Task TransferBasketAsync(string anonymousId, string userName)115{116var anonymousBasketSpec = new BasketWithItemsSpecification(anonymousId);117var anonymousBasket = await _basketRepository.FirstOrDefaultAsync(anonymousBasketSpec);118if (anonymousBasket == null) return;119var userBasketSpec = new BasketWithItemsSpecification(userName);120var userBasket = await _basketRepository.FirstOrDefaultAsync(userBasketSpec);121if (userBasket == null)122{123userBasket = new Basket(userName);124await _basketRepository.AddAsync(userBasket);125}126foreach (var item in anonymousBasket.Items)127{128userBasket.AddItem(item.CatalogItemId, item.UnitPrice, item.Quantity);129}130await _basketRepository.UpdateAsync(userBasket);131await _basketRepository.DeleteAsync(anonymousBasket);132}133}134`;135expect(136await srcWithAnnotatedStructure(source, 'csharp', {137tabSize: 4,138insertSpaces: false,139})140).toMatchInlineSnapshot(`141"<LINE>using System.Collections.Generic;142</LINE><LINE-1>using System.Threading.Tasks;143</LINE-1><LINE-2>using Ardalis.GuardClauses;144</LINE-2><LINE-3>using Ardalis.Result;145</LINE-3><LINE-4>using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;146</LINE-4><LINE-5>using Microsoft.eShopWeb.ApplicationCore.Interfaces;147</LINE-5><LINE-6>using Microsoft.eShopWeb.ApplicationCore.Specifications;148</LINE-6><LINE-7>149</LINE-7><LINE-8>namespace Microsoft.eShopWeb.ApplicationCore.Services;150</LINE-8><LINE-9>151</LINE-9><LINE-10>public class BasketService : IBasketService152</LINE-10><FOLD>{153<LINE-11> private readonly IRepository<Basket> _basketRepository;154</LINE-11><LINE-12> private readonly IAppLogger<BasketService> _logger;155</LINE-12><LINE-13>156</LINE-13><FOLD-1> public BasketService(IRepository<Basket> basketRepository,157IAppLogger<BasketService> logger)158</FOLD-1><FOLD-2> {159<LINE-14> _basketRepository = basketRepository;160</LINE-14><LINE-15> _logger = logger;161</LINE-15> }162</FOLD-2><LINE-16>163</LINE-16><LINE-17> public async Task<Basket> AddItemToBasket(string username, int catalogItemId, decimal price, int quantity = 1)164</LINE-17><FOLD-3> {165<LINE-18> var basketSpec = new BasketWithItemsSpecification(username);166</LINE-18><LINE-19> var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);167</LINE-19><LINE-20>168</LINE-20><LINE-21> if (basket == null)169</LINE-21><FOLD-4> {170<LINE-22> basket = new Basket(username);171</LINE-22><LINE-23> await _basketRepository.AddAsync(basket);172</LINE-23> }173</FOLD-4><LINE-24>174</LINE-24><LINE-25> basket.AddItem(catalogItemId, price, quantity);175</LINE-25><LINE-26>176</LINE-26><LINE-27> await _basketRepository.UpdateAsync(basket);177</LINE-27><LINE-28> return basket;178</LINE-28> }179</FOLD-3><LINE-29>180</LINE-29><LINE-30> public async Task DeleteBasketAsync(int basketId)181</LINE-30><FOLD-5> {182<LINE-31> var basket = await _basketRepository.GetByIdAsync(basketId);183</LINE-31><LINE-32> Guard.Against.Null(basket, nameof(basket));184</LINE-32><LINE-33> await _basketRepository.DeleteAsync(basket);185</LINE-33> }186</FOLD-5><LINE-34>187</LINE-34><LINE-35> public async Task<Result<Basket>> SetQuantities(int basketId, Dictionary<string, int> quantities)188</LINE-35><FOLD-6> {189<LINE-36> var basketSpec = new BasketWithItemsSpecification(basketId);190</LINE-36><LINE-37> var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);191</LINE-37><LINE-38>192</LINE-38><LINE-39> foreach (var item in basket.Items)193</LINE-39><FOLD-7> {194<LINE-40> if (quantities.TryGetValue(item.Id.ToString(), out var quantity))195</LINE-40><FOLD-8> {196<LINE-41> _logger.LogInformation($"Updating quantity of item ID:{item.Id} to {quantity}.");197</LINE-41><LINE-42> item.SetQuantity(quantity);198</LINE-42> }199</FOLD-8> }200</FOLD-7><LINE-43> basket.RemoveEmptyItems();201</LINE-43><LINE-44> await _basketRepository.UpdateAsync(basket);202</LINE-44><LINE-45> return basket;203</LINE-45> }204</FOLD-6><LINE-46>205</LINE-46><LINE-47> public async Task TransferBasketAsync(string anonymousId, string userName)206</LINE-47><FOLD-9> {207<LINE-48> var anonymousBasketSpec = new BasketWithItemsSpecification(anonymousId);208</LINE-48><LINE-49> var anonymousBasket = await _basketRepository.FirstOrDefaultAsync(anonymousBasketSpec);209</LINE-49><LINE-50> if (anonymousBasket == null) return;210</LINE-50><LINE-51> var userBasketSpec = new BasketWithItemsSpecification(userName);211</LINE-51><LINE-52> var userBasket = await _basketRepository.FirstOrDefaultAsync(userBasketSpec);212</LINE-52><LINE-53> if (userBasket == null)213</LINE-53><FOLD-10> {214<LINE-54> userBasket = new Basket(userName);215</LINE-54><LINE-55> await _basketRepository.AddAsync(userBasket);216</LINE-55> }217</FOLD-10><LINE-56> foreach (var item in anonymousBasket.Items)218</LINE-56><FOLD-11> {219<LINE-57> userBasket.AddItem(item.CatalogItemId, item.UnitPrice, item.Quantity);220</LINE-57> }221</FOLD-11><LINE-58> await _basketRepository.UpdateAsync(userBasket);222</LINE-58><LINE-59> await _basketRepository.DeleteAsync(anonymousBasket);223</LINE-59> }224</FOLD-9>}</FOLD>"225`);226});227228test('issue #1034', async () => {229const source = outdent`230if(something) {231console.log('something')232} else {233console.log('!something');234}235console.log('a line');236`;237expect(238await srcWithAnnotatedStructure(source, 'plaintext', {239tabSize: 4,240insertSpaces: false,241})242).toMatchInlineSnapshot(`243"<FOLD>if(something) {244console.log('something')245</FOLD><FOLD-1>} else {246console.log('!something');247</FOLD-1><FOLD-2>}248console.log('a line');</FOLD-2>"249`);250});251252test('issue #6614', async () => {253const source = outdent`254<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->255<!DOCTYPE html>256<html>257<head>258<meta charset="utf-8" />259</head>260261<body aria-label="">262</body>263264<!-- Startup (do not modify order of script tags!) -->265<script src="../../../../bootstrap.js"></script>266<script src="../../../../vs/loader.js"></script>267<script src="../../../../bootstrap-window.js"></script>268<script src="workbench.js"></script>269</html>270`;271expect(272await srcWithAnnotatedStructure(source, 'plaintext', {273tabSize: 4,274insertSpaces: false,275})276).toMatchInlineSnapshot(`277"<LINE><!-- Copyright (C) Microsoft Corporation. All rights reserved. -->278</LINE><LINE-1><!DOCTYPE html>279</LINE-1><FOLD><html>280<FOLD-1> <head>281<LINE-2> <meta charset="utf-8" />282</LINE-2> </head>283</FOLD-1><LINE-3>284</LINE-3><LINE-4> <body aria-label="">285</LINE-4><LINE-5> </body>286</LINE-5><LINE-6>287</LINE-6><LINE-7> <!-- Startup (do not modify order of script tags!) -->288</LINE-7><LINE-8> <script src="../../../../bootstrap.js"></script>289</LINE-8><LINE-9> <script src="../../../../vs/loader.js"></script>290</LINE-9><LINE-10> <script src="../../../../bootstrap-window.js"></script>291</LINE-10><LINE-11> <script src="workbench.js"></script>292</LINE-11></html></FOLD>"293`);294});295296test('issue #12306', async () => {297const source = outdent`298/*---------------------------------------------------------------------------------------------299* Copyright (c) Microsoft Corporation. All rights reserved.300* Licensed under the MIT License. See License.txt in the project root for license information.301*--------------------------------------------------------------------------------------------*/302303/*304@keyframes blink { 50% { border-color: orange; } }305*/306307.monaco-editor {308.inline-edits-view-indicator {309display: flex;310311z-index: 34; /* Below the find widget */312height: 20px;313314color: var(--vscode-inlineEdit-indicator-foreground);315background-color: var(--vscode-inlineEdit-indicator-background);316border: 1px solid var(--vscode-inlineEdit-indicator-border);317border-radius: 3px;318319align-items: center;320padding: 2px;321padding-right: 10px;322margin: 0 4px;323324/*325animation: blink 1s;326animation-iteration-count: 3;327*/328329opacity: 0;330331&.contained {332transition: opacity 0.2s ease-in-out;333transition-delay: 0.4s;334}335336&.visible {337opacity: 1;338}339340&.top {341opacity: 1;342343.icon {344transform: rotate(90deg);345}346}347348&.bottom {349opacity: 1;350351.icon {352transform: rotate(-90deg);353}354}355356.icon {357display: flex;358align-items: center;359margin: 0 2px;360transform: none;361transition: transform 0.2s ease-in-out;362.codicon {363color: var(--vscode-inlineEdit-indicator-foreground);364}365}366367.label {368margin: 0 2px;369370display: flex;371justify-content: center;372width: 100%;373}374}375376.inline-edits-view {377&.toolbarDropdownVisible, .editorContainer.showHover:hover {378.toolbar {379display: block;380}381}382383.editorContainer {384color: var(--vscode-editorHoverWidget-foreground);385386.toolbar {387display: none;388border-top: 1px solid rgba(69, 69, 69, 0.5);389background-color: var(--vscode-editorHoverWidget-statusBarBackground);390391a {392color: var(--vscode-foreground);393}394395a:hover {396color: var(--vscode-foreground);397}398399.keybinding {400display: flex;401margin-left: 4px;402opacity: 0.6;403}404405.keybinding .monaco-keybinding-key {406font-size: 8px;407padding: 2px 3px;408}409410.availableSuggestionCount a {411display: flex;412min-width: 19px;413justify-content: center;414}415416.inlineSuggestionStatusBarItemLabel {417margin-right: 2px;418}419420}421422.preview {423.monaco-editor {424.view-overlays .current-line-exact {425border: none;426}427428.current-line-margin {429border: none;430}431}432}433434.inline-edits-view-zone.diagonal-fill {435opacity: 0.5;436}437}438}439440.strike-through {441text-decoration: line-through;442}443444.inlineCompletions-line-insert {445background: var(--vscode-inlineEdit-modifiedChangedLineBackground);446}447448.inlineCompletions-line-delete {449background: var(--vscode-inlineEdit-originalChangedLineBackground);450}451452.inlineCompletions-char-insert {453background: var(--vscode-inlineEdit-modifiedChangedTextBackground);454}455456.inlineCompletions-char-delete {457background: var(--vscode-inlineEdit-originalChangedTextBackground);458}459460.inlineCompletions-char-delete.diff-range-empty {461margin-left: -1px;462border-left: solid var(--vscode-inlineEdit-originalChangedTextBackground) 3px;463}464465.inlineCompletions-char-insert.diff-range-empty {466border-left: solid var(--vscode-inlineEdit-modifiedChangedTextBackground) 3px;467}468469.inlineCompletions-char-delete.single-line-inline,470.inlineCompletions-char-insert.single-line-inline {471border-radius: 4px;472border: 1px solid var(--vscode-editorHoverWidget-border);473padding: 2px;474}475476.inlineCompletions-char-delete.single-line-inline.empty,477.inlineCompletions-char-insert.single-line-inline.empty {478display: none;479}480481/* Adjustments due to being a decoration */482.inlineCompletions-char-delete.single-line-inline {483margin: -2px 0 0 -2px;484}485486.inlineCompletions.strike-through {487text-decoration-thickness: 1px;488}489490/* line replacement bubbles */491492.inlineCompletions-modified-bubble{493background: var(--vscode-inlineEdit-modifiedChangedTextBackground);494}495496.inlineCompletions-original-bubble{497background: var(--vscode-inlineEdit-originalChangedTextBackground);498border-radius: 4px;499}500501.inlineCompletions-modified-bubble,502.inlineCompletions-original-bubble {503pointer-events: none;504}505506.inlineCompletions-modified-bubble.start {507border-top-left-radius: 4px;508border-bottom-left-radius: 4px;509}510511.inlineCompletions-modified-bubble.end {512border-top-right-radius: 4px;513border-bottom-right-radius: 4px;514}515516.inline-edit.ghost-text,517.inline-edit.ghost-text-decoration,518.inline-edit.ghost-text-decoration-preview,519.inline-edit.suggest-preview-text .ghost-text {520&.syntax-highlighted {521opacity: 1 !important;522}523background: var(--vscode-inlineEdit-modifiedChangedTextBackground) !important;524outline: 2px slid var(--vscode-inlineEdit-modifiedChangedTextBackground) !important;525526font-style: normal !important;527}528}529530.monaco-menu-option {531color: var(--vscode-editorActionList-foreground);532font-size: 13px;533padding: 0 10px;534line-height: 26px;535display: flex;536gap: 8px;537align-items: center;538border-radius: 4px;539cursor: pointer;540541&.active {542background: var(--vscode-editorActionList-focusBackground);543color: var(--vscode-editorActionList-focusForeground);544outline: 1px solid var(--vscode-menu-selectionBorder, transparent);545outline-offset: -1px;546}547}548549.inline-edits-view-gutter-indicator .codicon {550margin-top: 1px; /* TODO: Move into gutter DOM initialization */551}552553@keyframes wiggle {5540% {555transform: rotate(0) scale(1);556}55755815%,55945% {560transform: rotate(.04turn) scale(1.1);561}56256330%,56460% {565transform: rotate(-.04turn) scale(1.2);566}567568100% {569transform: rotate(0) scale(1);570}571}572573.inline-edits-view-gutter-indicator.wiggle .icon {574animation-duration: .8s;575animation-iteration-count: 1;576animation-name: wiggle;577}578`;579expect(580await srcWithAnnotatedStructure(source, 'css', {581tabSize: 4,582insertSpaces: false,583})584).toMatchInlineSnapshot(`585"<LINE>/*---------------------------------------------------------------------------------------------586</LINE><LINE-1>* Copyright (c) Microsoft Corporation. All rights reserved.587</LINE-1><LINE-2>* Licensed under the MIT License. See License.txt in the project root for license information.588</LINE-2><LINE-3>*--------------------------------------------------------------------------------------------*/589</LINE-3><LINE-4>590</LINE-4><FOLD>/*591@keyframes blink { 50% { border-color: orange; } }592</FOLD><LINE-5>*/593</LINE-5><LINE-6>594</LINE-6><FOLD-1>.monaco-editor {595<FOLD-2> .inline-edits-view-indicator {596<LINE-7> display: flex;597</LINE-7><LINE-8>598</LINE-8><LINE-9> z-index: 34; /* Below the find widget */599</LINE-9><LINE-10> height: 20px;600</LINE-10><LINE-11>601</LINE-11><LINE-12> color: var(--vscode-inlineEdit-indicator-foreground);602</LINE-12><LINE-13> background-color: var(--vscode-inlineEdit-indicator-background);603</LINE-13><LINE-14> border: 1px solid var(--vscode-inlineEdit-indicator-border);604</LINE-14><LINE-15> border-radius: 3px;605</LINE-15><LINE-16>606</LINE-16><LINE-17> align-items: center;607</LINE-17><LINE-18> padding: 2px;608</LINE-18><LINE-19> padding-right: 10px;609</LINE-19><LINE-20> margin: 0 4px;610</LINE-20><LINE-21>611</LINE-21><LINE-22> /*612</LINE-22><LINE-23> animation: blink 1s;613</LINE-23><LINE-24> animation-iteration-count: 3;614</LINE-24><LINE-25> */615</LINE-25><LINE-26>616</LINE-26><LINE-27> opacity: 0;617</LINE-27><LINE-28>618</LINE-28><FOLD-3> &.contained {619<LINE-29> transition: opacity 0.2s ease-in-out;620</LINE-29><LINE-30> transition-delay: 0.4s;621</LINE-30> }622</FOLD-3><LINE-31>623</LINE-31><FOLD-4> &.visible {624<LINE-32> opacity: 1;625</LINE-32> }626</FOLD-4><LINE-33>627</LINE-33><FOLD-5> &.top {628<LINE-34> opacity: 1;629</LINE-34><LINE-35>630</LINE-35><FOLD-6> .icon {631<LINE-36> transform: rotate(90deg);632</LINE-36> }633</FOLD-6> }634</FOLD-5><LINE-37>635</LINE-37><FOLD-7> &.bottom {636<LINE-38> opacity: 1;637</LINE-38><LINE-39>638</LINE-39><FOLD-8> .icon {639<LINE-40> transform: rotate(-90deg);640</LINE-40> }641</FOLD-8> }642</FOLD-7><LINE-41>643</LINE-41><FOLD-9> .icon {644<LINE-42> display: flex;645</LINE-42><LINE-43> align-items: center;646</LINE-43><LINE-44> margin: 0 2px;647</LINE-44><LINE-45> transform: none;648</LINE-45><LINE-46> transition: transform 0.2s ease-in-out;649</LINE-46><FOLD-10> .codicon {650<LINE-47> color: var(--vscode-inlineEdit-indicator-foreground);651</LINE-47> }652</FOLD-10> }653</FOLD-9><LINE-48>654</LINE-48><FOLD-11> .label {655<LINE-49> margin: 0 2px;656</LINE-49><LINE-50>657</LINE-50><LINE-51> display: flex;658</LINE-51><LINE-52> justify-content: center;659</LINE-52><LINE-53> width: 100%;660</LINE-53> }661</FOLD-11> }662</FOLD-2><LINE-54>663</LINE-54><FOLD-12> .inline-edits-view {664<FOLD-13> &.toolbarDropdownVisible, .editorContainer.showHover:hover {665<FOLD-14> .toolbar {666<LINE-55> display: block;667</LINE-55> }668</FOLD-14> }669</FOLD-13><LINE-56>670</LINE-56><FOLD-15> .editorContainer {671<LINE-57> color: var(--vscode-editorHoverWidget-foreground);672</LINE-57><LINE-58>673</LINE-58><FOLD-16> .toolbar {674<LINE-59> display: none;675</LINE-59><LINE-60> border-top: 1px solid rgba(69, 69, 69, 0.5);676</LINE-60><LINE-61> background-color: var(--vscode-editorHoverWidget-statusBarBackground);677</LINE-61><LINE-62>678</LINE-62><FOLD-17> a {679<LINE-63> color: var(--vscode-foreground);680</LINE-63> }681</FOLD-17><LINE-64>682</LINE-64><FOLD-18> a:hover {683<LINE-65> color: var(--vscode-foreground);684</LINE-65> }685</FOLD-18><LINE-66>686</LINE-66><FOLD-19> .keybinding {687<LINE-67> display: flex;688</LINE-67><LINE-68> margin-left: 4px;689</LINE-68><LINE-69> opacity: 0.6;690</LINE-69> }691</FOLD-19><LINE-70>692</LINE-70><FOLD-20> .keybinding .monaco-keybinding-key {693<LINE-71> font-size: 8px;694</LINE-71><LINE-72> padding: 2px 3px;695</LINE-72> }696</FOLD-20><LINE-73>697</LINE-73><FOLD-21> .availableSuggestionCount a {698<LINE-74> display: flex;699</LINE-74><LINE-75> min-width: 19px;700</LINE-75><LINE-76> justify-content: center;701</LINE-76> }702</FOLD-21><LINE-77>703</LINE-77><FOLD-22> .inlineSuggestionStatusBarItemLabel {704<LINE-78> margin-right: 2px;705</LINE-78> }706</FOLD-22><LINE-79>707</LINE-79> }708</FOLD-16><LINE-80>709</LINE-80><FOLD-23> .preview {710<FOLD-24> .monaco-editor {711<FOLD-25> .view-overlays .current-line-exact {712<LINE-81> border: none;713</LINE-81> }714</FOLD-25><LINE-82>715</LINE-82><FOLD-26> .current-line-margin {716<LINE-83> border: none;717</LINE-83> }718</FOLD-26> }719</FOLD-24> }720</FOLD-23><LINE-84>721</LINE-84><FOLD-27> .inline-edits-view-zone.diagonal-fill {722<LINE-85> opacity: 0.5;723</LINE-85> }724</FOLD-27> }725</FOLD-15> }726</FOLD-12><LINE-86>727</LINE-86><FOLD-28> .strike-through {728<LINE-87> text-decoration: line-through;729</LINE-87> }730</FOLD-28><LINE-88>731</LINE-88><FOLD-29> .inlineCompletions-line-insert {732<LINE-89> background: var(--vscode-inlineEdit-modifiedChangedLineBackground);733</LINE-89> }734</FOLD-29><LINE-90>735</LINE-90><FOLD-30> .inlineCompletions-line-delete {736<LINE-91> background: var(--vscode-inlineEdit-originalChangedLineBackground);737</LINE-91> }738</FOLD-30><LINE-92>739</LINE-92><FOLD-31> .inlineCompletions-char-insert {740<LINE-93> background: var(--vscode-inlineEdit-modifiedChangedTextBackground);741</LINE-93> }742</FOLD-31><LINE-94>743</LINE-94><FOLD-32> .inlineCompletions-char-delete {744<LINE-95> background: var(--vscode-inlineEdit-originalChangedTextBackground);745</LINE-95> }746</FOLD-32><LINE-96>747</LINE-96><FOLD-33> .inlineCompletions-char-delete.diff-range-empty {748<LINE-97> margin-left: -1px;749</LINE-97><LINE-98> border-left: solid var(--vscode-inlineEdit-originalChangedTextBackground) 3px;750</LINE-98> }751</FOLD-33><LINE-99>752</LINE-99><FOLD-34> .inlineCompletions-char-insert.diff-range-empty {753<LINE-100> border-left: solid var(--vscode-inlineEdit-modifiedChangedTextBackground) 3px;754</LINE-100> }755</FOLD-34><LINE-101>756</LINE-101><LINE-102> .inlineCompletions-char-delete.single-line-inline,757</LINE-102><FOLD-35> .inlineCompletions-char-insert.single-line-inline {758<LINE-103> border-radius: 4px;759</LINE-103><LINE-104> border: 1px solid var(--vscode-editorHoverWidget-border);760</LINE-104><LINE-105> padding: 2px;761</LINE-105> }762</FOLD-35><LINE-106>763</LINE-106><LINE-107> .inlineCompletions-char-delete.single-line-inline.empty,764</LINE-107><FOLD-36> .inlineCompletions-char-insert.single-line-inline.empty {765<LINE-108> display: none;766</LINE-108> }767</FOLD-36><LINE-109>768</LINE-109><LINE-110> /* Adjustments due to being a decoration */769</LINE-110><FOLD-37> .inlineCompletions-char-delete.single-line-inline {770<LINE-111> margin: -2px 0 0 -2px;771</LINE-111> }772</FOLD-37><LINE-112>773</LINE-112><FOLD-38> .inlineCompletions.strike-through {774<LINE-113> text-decoration-thickness: 1px;775</LINE-113> }776</FOLD-38><LINE-114>777</LINE-114><LINE-115> /* line replacement bubbles */778</LINE-115><LINE-116>779</LINE-116><FOLD-39> .inlineCompletions-modified-bubble{780<LINE-117> background: var(--vscode-inlineEdit-modifiedChangedTextBackground);781</LINE-117> }782</FOLD-39><LINE-118>783</LINE-118><FOLD-40> .inlineCompletions-original-bubble{784<LINE-119> background: var(--vscode-inlineEdit-originalChangedTextBackground);785</LINE-119><LINE-120> border-radius: 4px;786</LINE-120> }787</FOLD-40><LINE-121>788</LINE-121><LINE-122> .inlineCompletions-modified-bubble,789</LINE-122><FOLD-41> .inlineCompletions-original-bubble {790<LINE-123> pointer-events: none;791</LINE-123> }792</FOLD-41><LINE-124>793</LINE-124><FOLD-42> .inlineCompletions-modified-bubble.start {794<LINE-125> border-top-left-radius: 4px;795</LINE-125><LINE-126> border-bottom-left-radius: 4px;796</LINE-126> }797</FOLD-42><LINE-127>798</LINE-127><FOLD-43> .inlineCompletions-modified-bubble.end {799<LINE-128> border-top-right-radius: 4px;800</LINE-128><LINE-129> border-bottom-right-radius: 4px;801</LINE-129> }802</FOLD-43><LINE-130>803</LINE-130><LINE-131> .inline-edit.ghost-text,804</LINE-131><LINE-132> .inline-edit.ghost-text-decoration,805</LINE-132><LINE-133> .inline-edit.ghost-text-decoration-preview,806</LINE-133><FOLD-44> .inline-edit.suggest-preview-text .ghost-text {807<FOLD-45> &.syntax-highlighted {808<LINE-134> opacity: 1 !important;809</LINE-134> }810</FOLD-45><LINE-135> background: var(--vscode-inlineEdit-modifiedChangedTextBackground) !important;811</LINE-135><LINE-136> outline: 2px slid var(--vscode-inlineEdit-modifiedChangedTextBackground) !important;812</LINE-136><LINE-137>813</LINE-137><LINE-138> font-style: normal !important;814</LINE-138> }815</FOLD-44>}816</FOLD-1><LINE-139>817</LINE-139><FOLD-46>.monaco-menu-option {818<LINE-140> color: var(--vscode-editorActionList-foreground);819</LINE-140><LINE-141> font-size: 13px;820</LINE-141><LINE-142> padding: 0 10px;821</LINE-142><LINE-143> line-height: 26px;822</LINE-143><LINE-144> display: flex;823</LINE-144><LINE-145> gap: 8px;824</LINE-145><LINE-146> align-items: center;825</LINE-146><LINE-147> border-radius: 4px;826</LINE-147><LINE-148> cursor: pointer;827</LINE-148><LINE-149>828</LINE-149><FOLD-47> &.active {829<LINE-150> background: var(--vscode-editorActionList-focusBackground);830</LINE-150><LINE-151> color: var(--vscode-editorActionList-focusForeground);831</LINE-151><LINE-152> outline: 1px solid var(--vscode-menu-selectionBorder, transparent);832</LINE-152><LINE-153> outline-offset: -1px;833</LINE-153> }834</FOLD-47>}835</FOLD-46><LINE-154>836</LINE-154><FOLD-48>.inline-edits-view-gutter-indicator .codicon {837<LINE-155> margin-top: 1px; /* TODO: Move into gutter DOM initialization */838</LINE-155>}839</FOLD-48><LINE-156>840</LINE-156><FOLD-49>@keyframes wiggle {841<FOLD-50> 0% {842<LINE-157> transform: rotate(0) scale(1);843</LINE-157> }844</FOLD-50><LINE-158>845</LINE-158><LINE-159> 15%,846</LINE-159><FOLD-51> 45% {847<LINE-160> transform: rotate(.04turn) scale(1.1);848</LINE-160> }849</FOLD-51><LINE-161>850</LINE-161><LINE-162> 30%,851</LINE-162><FOLD-52> 60% {852<LINE-163> transform: rotate(-.04turn) scale(1.2);853</LINE-163> }854</FOLD-52><LINE-164>855</LINE-164><FOLD-53> 100% {856<LINE-165> transform: rotate(0) scale(1);857</LINE-165> }858</FOLD-53>}859</FOLD-49><LINE-166>860</LINE-166><FOLD-54>.inline-edits-view-gutter-indicator.wiggle .icon {861<LINE-167> animation-duration: .8s;862</LINE-167><LINE-168> animation-iteration-count: 1;863</LINE-168><LINE-169> animation-name: wiggle;864</LINE-169>}</FOLD-54>"865`);866});867});868});869870871