diff --git a/ql/src/codeql_ql/ast/Ast.qll b/ql/src/codeql_ql/ast/Ast.qll new file mode 100644 index 00000000000..ee20b45a2f4 --- /dev/null +++ b/ql/src/codeql_ql/ast/Ast.qll @@ -0,0 +1,24 @@ +import ql +private import codeql_ql.ast.internal.AstNodes + +/** An AST node of a QL program */ +class AstNode extends TAstNode { + string toString() { result = "ASTNode" } + + Location getLocation() { result = toGenerated(this).getLocation() } +} + +/** + * A classless predicate. + */ +class ClasslessPredicate extends TClasslessPredicate, AstNode { + Generated::ModuleMember member; + Generated::ClasslessPredicate pred; + + ClasslessPredicate() { this = TClasslessPredicate(member, pred) } + + predicate isPrivate() { + member.getAFieldOrChild().(Generated::Annotation).getName().getValue() = "private" + } +} + diff --git a/ql/src/codeql_ql/ast/internal/AstNodes.qll b/ql/src/codeql_ql/ast/internal/AstNodes.qll new file mode 100644 index 00000000000..0213b2d6fad --- /dev/null +++ b/ql/src/codeql_ql/ast/internal/AstNodes.qll @@ -0,0 +1,13 @@ +import codeql_ql.ast.Ast as AST +import TreeSitter + +cached +newtype TAstNode = + TClasslessPredicate(Generated::ModuleMember member, Generated::ClasslessPredicate pred) { + pred.getParent() = member + } + +/** + * Gets the underlying TreeSitter entity for a given AST node. + */ +Generated::AstNode toGenerated(AST::AstNode n) { n = TClasslessPredicate(_, result) } diff --git a/ql/src/ql.qll b/ql/src/ql.qll index 496c4d1f595..43d144aa343 100644 --- a/ql/src/ql.qll +++ b/ql/src/ql.qll @@ -1,3 +1,3 @@ import codeql.Locations import codeql.files.FileSystem -import codeql_ql.ast.internal.TreeSitter::Generated +import codeql_ql.ast.Ast \ No newline at end of file