2817d9fb3a5fe19ecbfce97dfc473ecf64820d6d7dca228c31abf6ec286af180fbfb539fb2e6048f75ddd2f741b770ddff4bf1ab13466b2fb11307605d6b84 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. export class BasicInplaceReplace {
  6. constructor() {
  7. this._defaultValueSet = [
  8. ['true', 'false'],
  9. ['True', 'False'],
  10. ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'],
  11. ['public', 'protected', 'private'],
  12. ];
  13. }
  14. navigateValueSet(range1, text1, range2, text2, up) {
  15. if (range1 && text1) {
  16. const result = this.doNavigateValueSet(text1, up);
  17. if (result) {
  18. return {
  19. range: range1,
  20. value: result
  21. };
  22. }
  23. }
  24. if (range2 && text2) {
  25. const result = this.doNavigateValueSet(text2, up);
  26. if (result) {
  27. return {
  28. range: range2,
  29. value: result
  30. };
  31. }
  32. }
  33. return null;
  34. }
  35. doNavigateValueSet(text, up) {
  36. const numberResult = this.numberReplace(text, up);
  37. if (numberResult !== null) {
  38. return numberResult;
  39. }
  40. return this.textReplace(text, up);
  41. }
  42. numberReplace(value, up) {
  43. const precision = Math.pow(10, value.length - (value.lastIndexOf('.') + 1));
  44. let n1 = Number(value);
  45. const n2 = parseFloat(value);
  46. if (!isNaN(n1) && !isNaN(n2) && n1 === n2) {
  47. if (n1 === 0 && !up) {
  48. return null; // don't do negative
  49. // } else if(n1 === 9 && up) {
  50. // return null; // don't insert 10 into a number
  51. }
  52. else {
  53. n1 = Math.floor(n1 * precision);
  54. n1 += up ? precision : -precision;
  55. return String(n1 / precision);
  56. }
  57. }
  58. return null;
  59. }
  60. textReplace(value, up) {
  61. return this.valueSetsReplace(this._defaultValueSet, value, up);
  62. }
  63. valueSetsReplace(valueSets, value, up) {
  64. let result = null;
  65. for (let i = 0, len = valueSets.length; result === null && i < len; i++) {
  66. result = this.valueSetReplace(valueSets[i], value, up);
  67. }
  68. return result;
  69. }
  70. valueSetReplace(valueSet, value, up) {
  71. let idx = valueSet.indexOf(value);
  72. if (idx >= 0) {
  73. idx += up ? +1 : -1;
  74. if (idx < 0) {
  75. idx = valueSet.length - 1;
  76. }
  77. else {
  78. idx %= valueSet.length;
  79. }
  80. return valueSet[idx];
  81. }
  82. return null;
  83. }
  84. }
  85. BasicInplaceReplace.INSTANCE = new BasicInplaceReplace();