<commit_before>/*
 JavaScript는 global, function block, catch block에 변수가 달린다.
 ES6는 일반 block에도 달린다.

 VarBlock는 각 block에 달린 변수들을 나타낸다.
 - paren      : BlockVars, 바깥 block을 나타내는 객체
 - originLabel: number, 해당 BlockVars가 선언된 AST node의 @label
    origin이 될 수 있는 node는
    Function.body, CatchClause.block 두가지다.
    두가지 모두 BlockStatement이다.
 - isCatch    : boolean,
   * true  -> catch block
   * false -> function block, or global

 - paramVarNames : 매개변수 이름 목록, 매개 변수 순서대로
 - localVarNames : 지역 변수 이름 목록, 순서 무의미
    arguments를 사용하는 경우 localVarNames에 등장하고,
    arguments object를 사용하면 useArgumentsObject == true

 - (optional) useArgumentsObject: boolean
    함수 body block인 경우에만 사용 가능
    * true  : arguments object가 사용되었다.
      즉 함수 body에서 변수 arguments를 선언 없이 사용했다.
      이 경우, arguments는 함수의 지역 변수로 등록된다.
    * false 인 경우는 없다. 그럴거면 아예 변수 자체가 없다.

 - usedVariables : 각 block의 매개변수, 지역변수 중
   사용되는 위치가 있는 것들의 목록

 - instances : Delta -> VarBlock의 변수들 -> AVal
   getInstance(delta) 를 통해 같은 delta는 같은 mapping 주게 만듬

 - scopeInstances : [Scope]
   현재 VarBlock을 마지막으로 하는 Scope를 모두 모은다.
   getScopeInstance(delta, paren) 을 통해 같은 scope chain은
   같은 객체가 되도록 만든다.
*/
'use strict';

import * as types from './domains/types'
import * as myWalker from './util/myWalker'
const walk = require('acorn/dist/walk');
const aux = require('./helper');

export class VarBlock {
    constructor(paren, originNode, bType, isStrict) {
        this.paren = paren;
        this.originNode = originNode;
        this.blockType = bType;
        this.isStrict = isStrict;

        this.originLabel = originNode['@label'];
        this.paramVarNames = [];
        this.localVarNames = [];

        this.usedVariables = [];
        // this.useArgumentsObject
        this.instances = new Map();
        this.scopeInstances = [];
    }

    isGlobal() {
        return this.blockType === VarBlock.blockTypes.globalBlock;
        // return this.paren == null;
    }

    isOldFunctionBlock() {
        return this.blockType === VarBlock.blockTypes.oldFunctionBlock;
        // return this.paren != null && this.localVarNames != null;
    }

    isArrowFunctionBlock() {
        return this.blockType === VarBlock.blockTypes.arrowFunctionBlock;
    }

    isCatchBlock() {
        return this.blockType === VarBlock.blockTypes.catchBlock;
        // return this.isCatch;
    }

    isNormalBlock() {
        return this.blockType === VarBlock.blockTypes.normalBlock;
        // return this.isCatch;
    }

    getLocalVarNames() {
        return this.localVarNames;
    }

    getParamVarNames() {
        return this.paramVarNames;
    }

    getVarNames() {
        return this.getLocalVarNames().concat(this.getParamVarNames());
    }

    hasLocalVar(varName) {
        return this.localVarNames && this.localVarNames.indexOf(varName) > -1;
    }

    hasParamVar(varName) {
        return this.paramVarNames.indexOf(varName) > -1;
    }

    hasVar(varName) {
        return this.hasParamVar(varName) || this.hasLocalVar(varName);
    }

    addDeclaredLocalVar(varName, dType) {
        let currBlock = this;
        switch(dType) {
            case VarBlock.declarationTypes.varDeclaration:
                // Go up until function or global
                while (!currBlock.isOldFunctionBlock()
                    && !currBlock.isArrowFunctionBlock()
                    && !currBlock.isGlobal()) {
                    currBlock = currBlock.paren;
                }
                break;
            case VarBlock.declarationTypes.functionDeclaration:
                // Go up until function or global
                // or catch block having varName as its parameter
                // TODO: Be strict in strict mode
                // In strict mode, function declaration should in global or function block
                // However, it is not clear how to handle them. ignore?
                while (currBlock.isNormalBlock() &&
                       !(currBlock.isCatchBlock() && currBlock.hasParamVar(varName))) {
                    currBlock = currBlock.paren;
                }
                break;
            case VarBlock.declarationTypes.letDeclaration:
            case VarBlock.declarationTypes.constDeclaration:
                break;
            case VarBlock.declarationTypes.implicitGlobalDeclaration:
                // not global or strict => do not add the variable
                if (!this.isGlobal() || this.isStrict) {<commit_msg>[TASK] Remove some unnecessary comments and imports<commit_after>/*
 JavaScript는 global, function block, catch block에 변수가 달린다.
 ES6는 일반 block에도 달린다.

 VarBlock는 각 block에 달린 변수들을 나타낸다.
 - paren      : BlockVars, 바깥 block을 나타내는 객체
 - originLabel: number, 해당 BlockVars가 선언된 AST node의 @label
    origin이 될 수 있는 node는
    Function.body, CatchClause.block 두가지다.
    두가지 모두 BlockStatement이다.
 - isCatch    : boolean,
   * true  -> catch block
   * false -> function block, or global

 - paramVarNames : 매개변수 이름 목록, 매개 변수 순서대로
 - localVarNames : 지역 변수 이름 목록, 순서 무의미
    arguments를 사용하는 경우 localVarNames에 등장하고,
    arguments object를 사용하면 useArgumentsObject == true

 - (optional) useArgumentsObject: boolean
    함수 body block인 경우에만 사용 가능
    * true  : arguments object가 사용되었다.
      즉 함수 body에서 변수 arguments를 선언 없이 사용했다.
      이 경우, arguments는 함수의 지역 변수로 등록된다.
    * false 인 경우는 없다. 그럴거면 아예 변수 자체가 없다.

 - usedVariables : 각 block의 매개변수, 지역변수 중
   사용되는 위치가 있는 것들의 목록

 - instances : Delta -> VarBlock의 변수들 -> AVal
   getInstance(delta) 를 통해 같은 delta는 같은 mapping 주게 만듬

 - scopeInstances : [Scope]
   현재 VarBlock을 마지막으로 하는 Scope를 모두 모은다.
   getScopeInstance(delta, paren) 을 통해 같은 scope chain은
   같은 객체가 되도록 만든다.
*/
'use strict';

import * as types from './domains/types'
import * as myWalker from './util/myWalker'
const walk = require('acorn/dist/walk');

export class VarBlock {
    constructor(paren, originNode, bType, isStrict) {
        this.paren = paren;
        this.originNode = originNode;
        this.blockType = bType;
        this.isStrict = isStrict;

        this.originLabel = originNode['@label'];
        this.paramVarNames = [];
        this.localVarNames = [];

        this.usedVariables = [];
        // this.useArgumentsObject
        this.instances = new Map();
        this.scopeInstances = [];
    }

    isGlobal() {
        return this.blockType === VarBlock.blockTypes.globalBlock;
    }

    isOldFunctionBlock() {
        return this.blockType === VarBlock.blockTypes.oldFunctionBlock;
    }

    isArrowFunctionBlock() {
        return this.blockType === VarBlock.blockTypes.arrowFunctionBlock;
    }

    isCatchBlock() {
        return this.blockType === VarBlock.blockTypes.catchBlock;
    }

    isNormalBlock() {
        return this.blockType === VarBlock.blockTypes.normalBlock;
    }

    getLocalVarNames() {
        return this.localVarNames;
    }

    getParamVarNames() {
        return this.paramVarNames;
    }

    getVarNames() {
        return this.getLocalVarNames().concat(this.getParamVarNames());
    }

    hasLocalVar(varName) {
        return this.localVarNames && this.localVarNames.indexOf(varName) > -1;
    }

    hasParamVar(varName) {
        return this.paramVarNames.indexOf(varName) > -1;
    }

    hasVar(varName) {
        return this.hasParamVar(varName) || this.hasLocalVar(varName);
    }

    addDeclaredLocalVar(varName, dType) {
        let currBlock = this;
        switch(dType) {
            case VarBlock.declarationTypes.varDeclaration:
                // Go up until function or global
                while (!currBlock.isOldFunctionBlock()
                    && !currBlock.isArrowFunctionBlock()
                    && !currBlock.isGlobal()) {
                    currBlock = currBlock.paren;
                }
                break;
            case VarBlock.declarationTypes.functionDeclaration:
                // Go up until function or global
                // or catch block having varName as its parameter
                while (currBlock.isNormalBlock() &&
                       !(currBlock.isCatchBlock() && currBlock.hasParamVar(varName))) {
                    currBlock = currBlock.paren;
                }
                break;
            case VarBlock.declarationTypes.letDeclaration:
            case VarBlock.declarationTypes.constDeclaration:
                break;
            case VarBlock.declarationTypes.implicitGlobalDeclaration:
                // not global or strict => do not add the variable
                if (!this.isGlobal() || this.isStrict) {
{'fraction_non_alphanumeric': 0.09193776520509193, 'fraction_numerical': 0.0007072135785007072, 'mean_word_length': 2.1484230055658626, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '569825', 'n_tokens_mistral': 2856, 'n_tokens_neox': 3077, 'n_words': 658}