c6a35807创建于 2025年5月26日历史提交
/*
 * Copyright (c) 2024 - 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 { BasicBlock } from 'arkanalyzer';
import Logger, { LOG_MODULE_TYPE } from 'arkanalyzer/lib/utils/logger';
import { Variable } from './Variable';

const logger = Logger.getLogger(LOG_MODULE_TYPE.HOMECHECK, 'Scope');

export enum TempLocation {
    NOFOUND = 0,
    LEFT,
    RIGHT
}

export enum ScopeType {
    IF_TYPE = 0,
    ELSE_TYPE,
    FOR_CONDITION_TYPE,
    FOR_IN_TYPE,
    WHILE_TYPE,
    CASE_TYPE,
    UNKNOWN_TYPE = 10
}

export class Scope {
    parentScope: Scope | null;
    childScopeList: Array<Scope>;
    defList: Array<Variable>;
    blocks: Set<BasicBlock>;
    scopeLevel: number;
    scopeType: ScopeType;

    constructor(parent: Scope | null, defList: Array<Variable>, level: number, type: ScopeType = ScopeType.UNKNOWN_TYPE) {
        this.parentScope = parent;
        this.childScopeList = new Array<Scope>();
        this.defList = defList;
        this.blocks = new Set<BasicBlock>();
        this.scopeLevel = level;
        this.scopeType = type;
    }

    public setChildScope(child: Scope): void {
        this.childScopeList.push(child);
    }

    public addVariable(variable: Variable): void {
        this.defList.push(variable);
    }
}