aboutsummaryrefslogtreecommitdiff
path: root/ql/test/semantic_analysis/test_semantic_analysis.py
blob: ca01231144bd226ee76734b9ff3651f1fd73c009 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from ql.ast.checkers.dependency_checker import DependencyChecker
from ql.ast.checkers.question_checker import QuestionChecker
from ql.ast.checkers.reference_checker import ReferenceChecker
from ql.ast.extractors.extractor import extract_identifier_dependencies
from ql.ast.extractors.extractor import extract_identifier_scopes
from ql.ast.extractors.extractor import extract_identifier_types
from ql.ast.extractors.extractor import extract_questions
from ql.ast.visitors.type_visitor import TypeVisitor
from ql.test.test import Test


class TestSemanticAnalysis(Test):
    def __init__(self, directory, lexer, parser):
        super(TestSemanticAnalysis, self).__init__('semantic analysis', directory)
        self.__lexer = lexer
        self.__parser = parser

    def test_file(self, file):
        ast = self.__parser.parse(file, self.__lexer.lexer)

        reference_errors = ReferenceChecker(extract_identifier_scopes(ast)).errors
        if reference_errors:
            return False

        dependency_errors = DependencyChecker(extract_identifier_dependencies(ast)).errors
        if dependency_errors:
            return False

        question_errors = QuestionChecker(extract_questions(ast)).errors
        if question_errors:
            return False

        type_visitor = TypeVisitor(extract_identifier_types(ast))
        type_visitor.visit(ast)
        type_errors = type_visitor.errors
        if type_errors:
            return False

        return True