utils.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. "use strict";
  2. var path = require("path");
  3. var ts = require("typescript");
  4. function getSourceFile(fileName, source) {
  5. var normalizedName = path.normalize(fileName).replace(/\\/g, "/");
  6. var compilerOptions = createCompilerOptions();
  7. var compilerHost = {
  8. fileExists: function () { return true; },
  9. getCanonicalFileName: function (filename) { return filename; },
  10. getCurrentDirectory: function () { return ""; },
  11. getDefaultLibFileName: function () { return "lib.d.ts"; },
  12. getNewLine: function () { return "\n"; },
  13. getSourceFile: function (filenameToGet) {
  14. if (filenameToGet === normalizedName) {
  15. return ts.createSourceFile(filenameToGet, source, compilerOptions.target, true);
  16. }
  17. },
  18. readFile: function () { return null; },
  19. useCaseSensitiveFileNames: function () { return true; },
  20. writeFile: function () { return null; }
  21. };
  22. var program = ts.createProgram([normalizedName], compilerOptions, compilerHost);
  23. return program.getSourceFile(normalizedName);
  24. }
  25. exports.getSourceFile = getSourceFile;
  26. function createCompilerOptions() {
  27. return {
  28. noResolve: true,
  29. target: ts.ScriptTarget.ES5
  30. };
  31. }
  32. exports.createCompilerOptions = createCompilerOptions;
  33. function doesIntersect(failure, disabledIntervals) {
  34. return disabledIntervals.some(function (interval) {
  35. var maxStart = Math.max(interval.startPosition, failure.getStartPosition().getPosition());
  36. var minEnd = Math.min(interval.endPosition, failure.getEndPosition().getPosition());
  37. return maxStart <= minEnd;
  38. });
  39. }
  40. exports.doesIntersect = doesIntersect;
  41. function scanAllTokens(scanner, callback) {
  42. var lastStartPos = -1;
  43. while (scanner.scan() !== ts.SyntaxKind.EndOfFileToken) {
  44. var startPos = scanner.getStartPos();
  45. if (startPos === lastStartPos) {
  46. break;
  47. }
  48. lastStartPos = startPos;
  49. callback(scanner);
  50. }
  51. }
  52. exports.scanAllTokens = scanAllTokens;
  53. function hasModifier(modifiers) {
  54. var modifierKinds = [];
  55. for (var _i = 1; _i < arguments.length; _i++) {
  56. modifierKinds[_i - 1] = arguments[_i];
  57. }
  58. if (modifiers == null || modifierKinds == null) {
  59. return false;
  60. }
  61. return modifiers.some(function (m) {
  62. return modifierKinds.some(function (k) { return m.kind === k; });
  63. });
  64. }
  65. exports.hasModifier = hasModifier;
  66. function isBlockScopedVariable(node) {
  67. var parentNode = (node.kind === ts.SyntaxKind.VariableDeclaration)
  68. ? node.parent
  69. : node.declarationList;
  70. return isNodeFlagSet(parentNode, ts.NodeFlags.Let)
  71. || isNodeFlagSet(parentNode, ts.NodeFlags.Const);
  72. }
  73. exports.isBlockScopedVariable = isBlockScopedVariable;
  74. function isBlockScopedBindingElement(node) {
  75. var variableDeclaration = getBindingElementVariableDeclaration(node);
  76. return (variableDeclaration == null) || isBlockScopedVariable(variableDeclaration);
  77. }
  78. exports.isBlockScopedBindingElement = isBlockScopedBindingElement;
  79. function getBindingElementVariableDeclaration(node) {
  80. var currentParent = node.parent;
  81. while (currentParent.kind !== ts.SyntaxKind.VariableDeclaration) {
  82. if (currentParent.parent == null) {
  83. return null;
  84. }
  85. else {
  86. currentParent = currentParent.parent;
  87. }
  88. }
  89. return currentParent;
  90. }
  91. exports.getBindingElementVariableDeclaration = getBindingElementVariableDeclaration;
  92. function isNodeFlagSet(node, flagToCheck) {
  93. return (node.flags & flagToCheck) !== 0;
  94. }
  95. exports.isNodeFlagSet = isNodeFlagSet;