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