1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.addImports = addImports;
7082815dcSEvan Baconexports.appendContentsInsideDeclarationBlock = appendContentsInsideDeclarationBlock;
8082815dcSEvan Baconexports.findNewInstanceCodeBlock = findNewInstanceCodeBlock;
9082815dcSEvan Baconfunction _commonCodeMod() {
10082815dcSEvan Bacon  const data = require("../utils/commonCodeMod");
11082815dcSEvan Bacon  _commonCodeMod = function () {
12082815dcSEvan Bacon    return data;
13082815dcSEvan Bacon  };
14082815dcSEvan Bacon  return data;
15082815dcSEvan Bacon}
16082815dcSEvan Baconfunction _matchBrackets() {
17082815dcSEvan Bacon  const data = require("../utils/matchBrackets");
18082815dcSEvan Bacon  _matchBrackets = function () {
19082815dcSEvan Bacon    return data;
20082815dcSEvan Bacon  };
21082815dcSEvan Bacon  return data;
22082815dcSEvan Bacon}
23082815dcSEvan Bacon/**
24082815dcSEvan Bacon * Find java or kotlin new class instance code block
25082815dcSEvan Bacon *
26082815dcSEvan Bacon * @param contents source contents
27082815dcSEvan Bacon * @param classDeclaration class declaration or just a class name
28082815dcSEvan Bacon * @param language 'java' | 'kt'
29082815dcSEvan Bacon * @returns `CodeBlock` for start/end offset and code block contents
30082815dcSEvan Bacon */
31082815dcSEvan Baconfunction findNewInstanceCodeBlock(contents, classDeclaration, language) {
32082815dcSEvan Bacon  const isJava = language === 'java';
33082815dcSEvan Bacon  let start = isJava ? contents.indexOf(` new ${classDeclaration}(`) : contents.search(new RegExp(` (object\\s*:\\s*)?${classDeclaration}\\(`));
34082815dcSEvan Bacon  if (start < 0) {
35082815dcSEvan Bacon    return null;
36*ee216927STomasz Sapeta  }
37*ee216927STomasz Sapeta  // `+ 1` for the prefix space
38082815dcSEvan Bacon  start += 1;
39*ee216927STomasz Sapeta  let end = (0, _matchBrackets().findMatchingBracketPosition)(contents, '(', start);
40*ee216927STomasz Sapeta
41*ee216927STomasz Sapeta  // For anonymous class, should search further to the {} block.
42082815dcSEvan Bacon  // ```java
43082815dcSEvan Bacon  // new Foo() {
44082815dcSEvan Bacon  //   @Override
45082815dcSEvan Bacon  //   protected void interfaceMethod {}
46082815dcSEvan Bacon  // };
47082815dcSEvan Bacon  // ```
48082815dcSEvan Bacon  //
49082815dcSEvan Bacon  // ```kotlin
50082815dcSEvan Bacon  // object : Foo() {
51082815dcSEvan Bacon  //   override fun interfaceMethod {}
52082815dcSEvan Bacon  // }
53082815dcSEvan Bacon  // ```
54082815dcSEvan Bacon  const nextBrace = contents.indexOf('{', end + 1);
55082815dcSEvan Bacon  const isAnonymousClass = nextBrace >= end && !!contents.substring(end + 1, nextBrace).match(/^\s*$/);
56082815dcSEvan Bacon  if (isAnonymousClass) {
57082815dcSEvan Bacon    end = (0, _matchBrackets().findMatchingBracketPosition)(contents, '{', end);
58082815dcSEvan Bacon  }
59082815dcSEvan Bacon  return {
60082815dcSEvan Bacon    start,
61082815dcSEvan Bacon    end,
62082815dcSEvan Bacon    code: contents.substring(start, end + 1)
63082815dcSEvan Bacon  };
64082815dcSEvan Bacon}
65*ee216927STomasz Sapeta
66082815dcSEvan Bacon/**
67082815dcSEvan Bacon * Append contents to the end of code declaration block, support class or method declarations.
68082815dcSEvan Bacon *
69082815dcSEvan Bacon * @param srcContents source contents
70082815dcSEvan Bacon * @param declaration class declaration or method declaration
71082815dcSEvan Bacon * @param insertion code to append
72082815dcSEvan Bacon * @returns updated contents
73082815dcSEvan Bacon */
74082815dcSEvan Baconfunction appendContentsInsideDeclarationBlock(srcContents, declaration, insertion) {
75082815dcSEvan Bacon  const start = srcContents.search(new RegExp(`\\s*${declaration}.*?[\\(\\{]`));
76082815dcSEvan Bacon  if (start < 0) {
77082815dcSEvan Bacon    throw new Error(`Unable to find code block - declaration[${declaration}]`);
78082815dcSEvan Bacon  }
79082815dcSEvan Bacon  const end = (0, _matchBrackets().findMatchingBracketPosition)(srcContents, '{', start);
80082815dcSEvan Bacon  return (0, _commonCodeMod().insertContentsAtOffset)(srcContents, insertion, end);
81082815dcSEvan Bacon}
82082815dcSEvan Baconfunction addImports(source, imports, isJava) {
83082815dcSEvan Bacon  const lines = source.split('\n');
84082815dcSEvan Bacon  const lineIndexWithPackageDeclaration = lines.findIndex(line => line.match(/^package .*;?$/));
85082815dcSEvan Bacon  for (const javaImport of imports) {
86082815dcSEvan Bacon    if (!source.includes(javaImport)) {
87082815dcSEvan Bacon      const importStatement = `import ${javaImport}${isJava ? ';' : ''}`;
88082815dcSEvan Bacon      lines.splice(lineIndexWithPackageDeclaration + 1, 0, importStatement);
89082815dcSEvan Bacon    }
90082815dcSEvan Bacon  }
91082815dcSEvan Bacon  return lines.join('\n');
92082815dcSEvan Bacon}
93082815dcSEvan Bacon//# sourceMappingURL=codeMod.js.map