* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ArkFile, SourceFilePrinter } from 'arkanalyzer';
import { FileReports, IssueReport } from '../../model/Defects';
import { Engine } from '../../model/Engine';
import { FunctionFix } from '../../model/Fix';
import path from 'path';
import { removeSync } from 'fs-extra';
import { FileUtils, WriteFileMode } from '../../utils/common/FileUtils';
import Logger, { LOG_MODULE_TYPE } from 'arkanalyzer/lib/utils/logger';
import { FixUtils } from '../../utils/common/FixUtils';
const FIX_OUTPUT_DIR = './fixedCode';
const logger = Logger.getLogger(LOG_MODULE_TYPE.HOMECHECK, 'HomeCheckFixEngine');
export class HomeCheckFixEngine implements Engine {
constructor() {
removeSync(FIX_OUTPUT_DIR);
}
applyFix(arkFile: ArkFile, issues: IssueReport[]): FileReports {
let fixPath = '';
const remainIssues: IssueReport[] = [];
for (let issue of issues) {
let fix = issue.fix;
if (fix === undefined) {
remainIssues.push(issue);
continue;
}
if (!FixUtils.isFunctionFix(fix)) {
remainIssues.push(issue);
continue;
}
let functionFix = fix as FunctionFix;
if (!issue.defect.fixable) {
remainIssues.push(issue);
continue;
}
if (!functionFix.fix(arkFile, issue.defect.fixKey)) {
remainIssues.push(issue);
continue;
}
fixPath = path.join(FIX_OUTPUT_DIR, arkFile.getName() + '.fix');
if (this.arkFileToFile(arkFile, fixPath)) {
functionFix.fixed = true;
break;
}
}
return { defects: remainIssues.map((issue => issue.defect)), output: '', filePath: fixPath };
}
private arkFileToFile(arkFile: ArkFile, outputPath: string): boolean {
if (!arkFile) {
return false;
}
const printer = new SourceFilePrinter(arkFile);
try {
FileUtils.writeToFile(outputPath, printer.dump(), WriteFileMode.OVERWRITE);
return true;
} catch (e) {
logger.error(e);
return false;
}
}
}