* Copyright (c) 2021-2022 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.
*/
const path = require('path');
const {
ErrorType,
ErrorLevel,
FileType,
getApiVersion,
getCheckApiVersion,
requireTypescriptModule
} = require('./utils');
const { addAPICheckErrorLogs, getParentkind } = require('./compile_info');
const ts = requireTypescriptModule();
const nameDictionary = require('./name_dictionary.json');
const nameScenarioScope = require('./name_scenario_scope.json');
function checkNaming(node, sourcefile, fileName) {
const apiVersionToBeVerified = getCheckApiVersion();
const apiVersion = Number(getApiVersion(node));
if (apiVersionToBeVerified.indexOf('^') === 0) {
const minCheckApiVersion = Number(apiVersionToBeVerified.substr(1));
checkApiVerion(minCheckApiVersion);
if (apiVersion > minCheckApiVersion) {
checkApiNaming(node, sourcefile, fileName);
}
} else if (apiVersion === Number(apiVersionToBeVerified)) {
checkApiNaming(node, sourcefile, fileName);
} else {
checkApiVerion(apiVersionToBeVerified);
}
}
exports.checkNaming = checkNaming;
function checkApiNaming(node, sourcefile, fileName) {
const lowIdentifier = node.getText().toLowerCase();
const apiParentKind = [];
getParentkind(node, apiParentKind);
if (node.parent.kind === ts.SyntaxKind.TypeReference || apiParentKind.includes('JSDoc')) {
return;
}
checkApiNamingWords(node, sourcefile, fileName, lowIdentifier);
checkApiNamingScenario(node, sourcefile, fileName, lowIdentifier);
}
function checkApiNamingWords(node, sourcefile, fileName, lowIdentifier) {
const lowercaseNamingMap = getlowercaseNamingMap();
for (const [key, value] of lowercaseNamingMap) {
const prohibitedWordIndex = lowIdentifier.indexOf(key);
if (prohibitedWordIndex === -1) {
continue;
}
const lowercaseIgnoreWordArr = value.ignore.map(word => word.toLowerCase());
const internalWord = node.getText().substr(prohibitedWordIndex, key.length);
const errorInfo = `Prohibited word in [${node.getText()}]:{${internalWord}}.The word allowed is [${value.suggestion}]`;
if (lowercaseIgnoreWordArr.length === 0) {
addAPICheckErrorLogs(node, sourcefile, fileName, ErrorType.NAMING_ERRORS, errorInfo, FileType.LOG_API,
ErrorLevel.MIDDLE
);
break;
} else {
const isIgnoreWord = checkIgnoreWord(lowercaseIgnoreWordArr, lowIdentifier, value.badWord);
if (isIgnoreWord === false) {
addAPICheckErrorLogs(node, sourcefile, fileName, ErrorType.NAMING_ERRORS, errorInfo, FileType.LOG_API,
ErrorLevel.MIDDLE
);
}
}
}
}
function checkIgnoreWord(lowercaseIgnoreWordArr, lowIdentifier, badWord) {
let isIgnoreWord = false;
const isNamingFoot = lowIdentifier.substring(lowIdentifier.length - badWord.length, lowIdentifier.length) === badWord;
for (let i = 0; i < lowercaseIgnoreWordArr.length; i++) {
if (lowercaseIgnoreWordArr[i] && lowIdentifier.indexOf(lowercaseIgnoreWordArr[i]) !== -1) {
isIgnoreWord = true;
break;
}
}
if (!isNamingFoot) {
isIgnoreWord = true;
}
return isIgnoreWord;
}
function checkApiVerion(apiVersion) {
if (isNaN(parseInt(apiVersion))) {
throw 'Please configure the correct API version to be verified';
}
}
function checkApiNamingScenario(node, sourcefile, fileName, lowIdentifier) {
const lowercaseNamingScenarioMap = getlowercaseNamingScenarioMap();
for (const [key, value] of lowercaseNamingScenarioMap) {
const prohibitedWordIndex = lowIdentifier.indexOf(key);
if (
prohibitedWordIndex !== -1 &&
!isInAllowedFiles(value.files, path.basename(fileName))
) {
const internalWord = node.getText().substr(prohibitedWordIndex, key.length);
const errorInfo = `Prohibited word in [${node.getText()}]:{${internalWord}} in the [${path.basename(fileName)}] file`;
addAPICheckErrorLogs(node, sourcefile, fileName, ErrorType.NAMING_ERRORS, errorInfo, FileType.LOG_API,
ErrorLevel.MIDDLE
);
}
}
}
function getlowercaseNamingMap() {
const lowercaseNamingMap = new Map();
for (const item of nameDictionary) {
const key = item.badWord.toLowerCase();
const { badWord, suggestion, ignore } = item;
lowercaseNamingMap.set(key, { badWord, suggestion, ignore });
}
return lowercaseNamingMap;
}
function getlowercaseNamingScenarioMap() {
const lowercaseNamingScenarioMap = new Map();
for (const item of nameScenarioScope) {
const key = item.word.toLowerCase();
const { word, files } = item;
lowercaseNamingScenarioMap.set(key, { word, files });
}
return lowercaseNamingScenarioMap;
}
function isInAllowedFiles(files, fileName) {
for (const item of files) {
const pattern = new RegExp(item);
pattern.test(fileName);
if (pattern.test(fileName)) {
return true;
}
}
return false;
}