고급 린터 검사 스크립트

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기3분
  • Linter 검사 스크립트는 스크립트에서 문제를 찾는 검사를 작성하는 데 도움이 됩니다. 레코드에 대해 linter 검사가 실행되면 해당 코드에 대한 추상 구문 트리가 제공됩니다. 이 추상 구문 트리를 사용하여 너무 많은 중첩된 if 문 또는 while 루프의 느린 API 사용과 같은 코드 문제를 분석할 수 있습니다.

    Linter 검사 사용량

    Linter 검사에는 rootNode라는 고유한 개체가 있습니다. 현재 레코드의 스크립트에 대해 구문 분석된 AST(추상 구문 트리)의 루트 노드입니다. 이 객체에는 많은 기능이 있지만 방문 기능이 가장 중요합니다. 방문 함수는 트리의 모든 노드에서 호출되는 콜백 함수를 매개변수로 사용합니다. 그런 다음 콜백 함수는 노드를 반복 중에 현재 노드를 나타내는 매개 변수로 사용합니다. 콜백 함수에서 false를 반환하여 트리 반복을 조기에 중지할 수 있으며, 그렇지 않으면 visit를 호출한 노드의 트리에 있는 모든 하위 노드를 계속 방문합니다.

    예를 들어 badFunction()이라는 더 이상 사용되지 않는 API를 스캔하려는 경우입니다. 다음 예제에서 스크립트를 사용하여 Linter 검사를 작성할 수 있습니다.
    (function(engine) {
    	engine.rootNode.visit(function(node) {
    		if (node.getTypeName() === "NAME" &&
    				node.getNameIdentifier() === "badFunction" &&
    				node.getParent().getTypeName() === "CALL") {
    			engine.finding.incrementWithNode(node);
    		}
    	});
    })(engine);
    이 린터 검사로 스캔을 실행하면 스크립트 필드로 스캔의 모든 기록을 검사합니다. 예를 들어 해당 스캔의 기록에 다음과 같은 스크립트가 있는 경우 스캔은 이 기록에 대한 발견 사항을 선택합니다.
    /*
    badFunction()
    */
    // badFunction()
    function badFunction() {
    	return;
    }
    var GoodClass = Class.create();
    GoodClass.prototype = Object.extendsObject(Object, {
    	badFunction: function() {
    		// actually good
    	}
    });
    var badFunction = ["badFunction", "badFunction()"];
    badFunctionButSometimesGood();
    
    badFunction();

    노드 기능

    다음은 노드 객체에서 호출할 수 있는 함수 목록입니다.
    • getRootNode(): 이 노드에 대한 트리의 루트 노드를 가져옵니다.
    • getParent(): 이 노드의 부모를 가져옵니다.
    • getLineNo(): 이 노드의 줄 번호 위치를 가져옵니다.
    • getColumnNo(): 이 노드의 열 번호 위치를 가져옵니다.
    • toSource(): 이 노드의 소스를 가져옵니다. 소스는 이 노드와 해당 하위 항목을 기반으로 합니다.
    • getTypeName(): 이 노드의 노드 유형 이름을 가져옵니다. 예를 들어 source의 함수 호출은 유형 이름이 "CALL"인 노드로 토큰화됩니다
      주:
      node.getTypeName()의 값은 AST(Abstract Syntax Tree)의 다른 유형의 노드에서 가져온 것입니다. 가능한 값은 Rhino의 AST 파서 자체에서 가져옵니다.
    • getNameIdentifier(): 이 노드의 노드 유형이 "NAME"인 경우 이름 자체의 문자열 값인 식별자를 반환합니다. "NAME" 노드는 함수 이름이나 변수 이름과 같이 키워드가 아닌 단순한 이름을 나타냅니다.
      주:
      이 노드가 NAME 노드가 아닌 경우 결과는 널(NULL)이다.
    • getAbsolutePosition(): 이 노드의 절대 위치를 가져옵니다. 절대 위치는 스크립트 시작부터 이 노드까지의 문자 수입니다
    • compareTo(other): 이 노드를 다른 노드와 비교합니다. 절대 위치와 길이가 더 긴 노드가 상대적으로 더 큽니다. other 는 이 노드와 비교할 노드입니다.
    • visit(callbackFunction): 이 노드에서 시작하여 하위 트리의 각 노드를 방문하고 각 노드에서 주어진 콜백 함수를 실행합니다. callbackFunction 은 이 노드의 하위 트리에 있는 각 노드에서 실행되는 함수입니다. 이 콜백 함수는 LinterCheckAstNode를 매개 변수로 사용하며, 이는 방문 중인 노드가 됩니다.
    • debugPrint(): 이 노드에서 시작하여 추상 구문 트리의 문자열 표현을 반환합니다. 각 줄에는 노드에 대한 정보가 포함되어 있으며 들여쓰기는 노드 간의 계층 관계를 나타냅니다. 각 줄의 정보는 다음과 같이 정렬됩니다
      1. 절대 위치
      2. 노드 유형 이름
      3. 상위를 기준으로 한 위치
      4. 길이
      5. 이름 식별자(NAME 노드인 경우)
    자세한 내용은 LinterCheckAstNode API - 범위가 지정됨, 전역을 참조하세요.