ui5plugin-parser
Version:
75 lines (74 loc) • 4.19 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UI5TSParser = void 0;
const path = require("path");
const ts_morph_1 = require("ts-morph");
const PackageParserConfigHandler_1 = require("../classes/config/PackageParserConfigHandler");
const HTTPHandler_1 = require("../classes/http/HTTPHandler");
const URLBuilder_1 = require("../classes/http/URLBuilder");
const SAPIcons_1 = require("../classes/librarydata/SAPIcons");
const SAPNodeDAO_1 = require("../classes/librarydata/SAPNodeDAO");
const UI5MetadataDAO_1 = require("../classes/librarydata/UI5MetadataDAO");
const TSClassFactory_1 = require("../classes/parsing/ui5class/factory/TSClassFactory");
const TSFileReader_1 = require("../classes/parsing/util/filereader/TSFileReader");
const ResourceModelData_1 = require("../classes/parsing/util/i18n/ResourceModelData");
const TextDocumentTransformer_1 = require("../classes/parsing/util/textdocument/TextDocumentTransformer");
const XMLParser_1 = require("../classes/parsing/util/xml/XMLParser");
const ReusableMethods_1 = require("../classes/ReusableMethods");
const AbstractUI5Parser_1 = require("./abstraction/AbstractUI5Parser");
class UI5TSParser extends AbstractUI5Parser_1.AbstractUI5Parser {
constructor(params, packagePath) {
super(packagePath);
this.tsProjects = [];
this.workspaceFolder = params.workspaceFolder;
this.classFactory = params?.classFactory || new TSClassFactory_1.TSClassFactory();
this.classFactory.setParser(this);
this.configHandler = params?.configHandler || new PackageParserConfigHandler_1.PackageParserConfigHandler(packagePath);
this.fileReader = params?.fileReader || new TSFileReader_1.TSFileReader(this.configHandler, this.classFactory);
this.fileReader.setParser(this);
this.icons = new SAPIcons_1.SAPIcons(this);
this.metadataDAO = new UI5MetadataDAO_1.UI5MetadataDAO(this);
this.nodeDAO = new SAPNodeDAO_1.SAPNodeDAO(this);
this.urlBuilder = new URLBuilder_1.URLBuilder(this.configHandler);
this.httpHandler = new HTTPHandler_1.HTTPHandler(this.configHandler);
this.resourceModelData = new ResourceModelData_1.ResourceModelData(this);
this.textDocumentTransformer = new TextDocumentTransformer_1.TextDocumentTransformer(this);
this.reusableMethods = new ReusableMethods_1.ReusableMethods(this.textDocumentTransformer);
this.xmlParser = new XMLParser_1.XMLParser(this);
}
getProject(fsPath) {
return this.tsProjects.find(tsProject => {
const [rootDirectory] = tsProject.getRootDirectories();
return (!!tsProject.getSourceFile(fsPath) ||
(rootDirectory && path.normalize(fsPath).includes(path.normalize(rootDirectory.getPath()))));
});
}
processSourceFiles(project, changedFiles) {
const tsSourceFiles = changedFiles.filter(sourceFile => !sourceFile.compilerNode.fileName.endsWith(".d.ts"));
tsSourceFiles.forEach(sourceFile => {
const className = this.fileReader.getClassNameFromPath(sourceFile.compilerNode.fileName);
if (className) {
this.classFactory.setNewCodeForClass(className, sourceFile.getFullText(), false, sourceFile, project, false);
}
});
}
initializeCustomClasses() {
const { project, sourceFiles } = this._initializeTS(this.workspaceFolder.fsPath);
this.processSourceFiles(project, sourceFiles);
}
_initializeTS(folderPath) {
const configPath = ts_morph_1.ts.findConfigFile(folderPath, ts_morph_1.ts.sys.fileExists, "tsconfig.json");
if (!configPath) {
throw new Error("Could not find a valid 'tsconfig.json'.");
}
const project = new ts_morph_1.Project({
tsConfigFilePath: configPath
});
this.tsProjects.push(project);
const sourceFiles = project.getSourceFiles();
const pathMap = project.getCompilerOptions().paths;
const paths = pathMap ? Object.keys(pathMap).flatMap(key => pathMap[key]) : [];
return { paths, sourceFiles, project };
}
}
exports.UI5TSParser = UI5TSParser;