From 7034933cee778d4f74b5e4e348c0f291da638134 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 13 Oct 2021 11:22:19 +0000 Subject: [PATCH] "Parse" YAML without errors --- Cargo.lock | 2 +- extractor/Cargo.toml | 2 +- generator/Cargo.toml | 2 +- ql/src/codeql_ql/ast/internal/TreeSitter.qll | 68 ++++++++++++++++++-- ql/src/ql.dbscheme | 38 ++++++++++- 5 files changed, 103 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4965134079c..1fbfc0c3097 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -589,7 +589,7 @@ dependencies = [ [[package]] name = "tree-sitter-ql" version = "0.19.0" -source = "git+https://github.com/tausbn/tree-sitter-ql.git?rev=a9348d405de3b2dde0e6d7e59d476ae91516b7af#a9348d405de3b2dde0e6d7e59d476ae91516b7af" +source = "git+https://github.com/tausbn/tree-sitter-ql.git?rev=577c43d96c93915bd7ae9c2765d11be8db102952#577c43d96c93915bd7ae9c2765d11be8db102952" dependencies = [ "cc", "tree-sitter", diff --git a/extractor/Cargo.toml b/extractor/Cargo.toml index 292755208bb..522aa605f47 100644 --- a/extractor/Cargo.toml +++ b/extractor/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" flate2 = "1.0" node-types = { path = "../node-types" } tree-sitter = "0.19" -tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "a9348d405de3b2dde0e6d7e59d476ae91516b7af" } +tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "577c43d96c93915bd7ae9c2765d11be8db102952" } clap = "2.33" tracing = "0.1" tracing-subscriber = { version = "0.2", features = ["env-filter"] } diff --git a/generator/Cargo.toml b/generator/Cargo.toml index 0dab1945bec..c3d9111137f 100644 --- a/generator/Cargo.toml +++ b/generator/Cargo.toml @@ -10,4 +10,4 @@ edition = "2018" node-types = { path = "../node-types" } tracing = "0.1" tracing-subscriber = { version = "0.2", features = ["env-filter"] } -tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "a9348d405de3b2dde0e6d7e59d476ae91516b7af" } +tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "577c43d96c93915bd7ae9c2765d11be8db102952" } diff --git a/ql/src/codeql_ql/ast/internal/TreeSitter.qll b/ql/src/codeql_ql/ast/internal/TreeSitter.qll index 65ce161bb52..15191b154f2 100644 --- a/ql/src/codeql_ql/ast/internal/TreeSitter.qll +++ b/ql/src/codeql_ql/ast/internal/TreeSitter.qll @@ -1687,26 +1687,86 @@ module Generated { override AstNode getAFieldOrChild() { variable_def(this, result, _) } } + /** A class representing `yaml_comment` nodes. */ + class YamlComment extends @yaml_comment, AstNode { + /** Gets the name of the primary QL class for this element. */ + override string getAPrimaryQlClass() { result = "YamlComment" } + + /** Gets the location of this element. */ + override Location getLocation() { yaml_comment_def(this, _, result) } + + /** Gets the child of this node. */ + YamlValue getChild() { yaml_comment_def(this, result, _) } + + /** Gets a field or child node of this node. */ + override AstNode getAFieldOrChild() { yaml_comment_def(this, result, _) } + } + /** A class representing `yaml_entry` nodes. */ class YamlEntry extends @yaml_entry, AstNode { /** Gets the name of the primary QL class for this element. */ override string getAPrimaryQlClass() { result = "YamlEntry" } /** Gets the location of this element. */ - override Location getLocation() { yaml_entry_def(this, _, _, result) } + override Location getLocation() { yaml_entry_def(this, _, result) } + + /** Gets the child of this node. */ + AstNode getChild() { yaml_entry_def(this, result, _) } + + /** Gets a field or child node of this node. */ + override AstNode getAFieldOrChild() { yaml_entry_def(this, result, _) } + } + + /** A class representing `yaml_key` nodes. */ + class YamlKey extends @yaml_key, AstNode { + /** Gets the name of the primary QL class for this element. */ + override string getAPrimaryQlClass() { result = "YamlKey" } + + /** Gets the location of this element. */ + override Location getLocation() { yaml_key_def(this, result) } + + /** Gets the `i`th child of this node. */ + AstNode getChild(int i) { yaml_key_child(this, i, result) } + + /** Gets a field or child node of this node. */ + override AstNode getAFieldOrChild() { yaml_key_child(this, _, result) } + } + + /** A class representing `yaml_keyvaluepair` nodes. */ + class YamlKeyvaluepair extends @yaml_keyvaluepair, AstNode { + /** Gets the name of the primary QL class for this element. */ + override string getAPrimaryQlClass() { result = "YamlKeyvaluepair" } + + /** Gets the location of this element. */ + override Location getLocation() { yaml_keyvaluepair_def(this, _, _, result) } /** Gets the node corresponding to the field `key`. */ - SimpleId getKey() { yaml_entry_def(this, result, _, _) } + YamlKey getKey() { yaml_keyvaluepair_def(this, result, _, _) } /** Gets the node corresponding to the field `value`. */ - YamlValue getValue() { yaml_entry_def(this, _, result, _) } + YamlValue getValue() { yaml_keyvaluepair_def(this, _, result, _) } /** Gets a field or child node of this node. */ override AstNode getAFieldOrChild() { - yaml_entry_def(this, result, _, _) or yaml_entry_def(this, _, result, _) + yaml_keyvaluepair_def(this, result, _, _) or yaml_keyvaluepair_def(this, _, result, _) } } + /** A class representing `yaml_listitem` nodes. */ + class YamlListitem extends @yaml_listitem, AstNode { + /** Gets the name of the primary QL class for this element. */ + override string getAPrimaryQlClass() { result = "YamlListitem" } + + /** Gets the location of this element. */ + override Location getLocation() { yaml_listitem_def(this, _, result) } + + /** Gets the child of this node. */ + YamlValue getChild() { yaml_listitem_def(this, result, _) } + + /** Gets a field or child node of this node. */ + override AstNode getAFieldOrChild() { yaml_listitem_def(this, result, _) } + } + /** A class representing `yaml_value` tokens. */ class YamlValue extends @token_yaml_value, Token { /** Gets the name of the primary QL class for this element. */ diff --git a/ql/src/ql.dbscheme b/ql/src/ql.dbscheme index edb987475c1..36e57f03df4 100644 --- a/ql/src/ql.dbscheme +++ b/ql/src/ql.dbscheme @@ -1042,13 +1042,47 @@ variable_def( int loc: @location ref ); +yaml_comment_def( + unique int id: @yaml_comment, + int child: @token_yaml_value ref, + int loc: @location ref +); + +@yaml_entry_child_type = @yaml_comment | @yaml_keyvaluepair | @yaml_listitem + yaml_entry_def( unique int id: @yaml_entry, - int key__: @token_simple_id ref, + int child: @yaml_entry_child_type ref, + int loc: @location ref +); + +@yaml_key_child_type = @token_simple_id | @yaml_key + +#keyset[yaml_key, index] +yaml_key_child( + int yaml_key: @yaml_key ref, + int index: int ref, + unique int child: @yaml_key_child_type ref +); + +yaml_key_def( + unique int id: @yaml_key, + int loc: @location ref +); + +yaml_keyvaluepair_def( + unique int id: @yaml_keyvaluepair, + int key__: @yaml_key ref, int value: @token_yaml_value ref, int loc: @location ref ); +yaml_listitem_def( + unique int id: @yaml_listitem, + int child: @token_yaml_value ref, + int loc: @location ref +); + tokeninfo( unique int id: @token, int kind: int ref, @@ -1120,7 +1154,7 @@ case @diagnostic.severity of ; -@ast_node = @add_expr | @aggregate | @annot_arg | @annotation | @arityless_predicate_expr | @as_expr | @as_exprs | @body | @bool | @call_body | @call_or_unqual_agg_expr | @charpred | @class_member | @classless_predicate | @comp_term | @conjunction | @dataclass | @datatype | @datatype_branch | @datatype_branches | @db_annotation | @db_args_annotation | @db_branch | @db_case_decl | @db_col_type | @db_column | @db_entry | @db_repr_type | @db_table | @db_table_name | @db_union_decl | @disjunction | @expr_aggregate_body | @expr_annotation | @field | @full_aggregate_body | @higher_order_term | @if_term | @implication | @import_directive | @import_module_expr | @in_expr | @instance_of | @literal | @member_predicate | @module | @module_alias_body | @module_expr | @module_member | @module_name | @mul_expr | @negation | @order_by | @order_bys | @par_expr | @predicate_alias_body | @predicate_expr | @prefix_cast | @ql | @qual_module_expr | @qualified_expr | @qualified_rhs | @quantified | @range | @select | @set_literal | @special_call | @super_ref | @token | @type_alias_body | @type_expr | @type_union_body | @unary_expr | @unqual_agg_body | @var_decl | @var_name | @variable | @yaml_entry +@ast_node = @add_expr | @aggregate | @annot_arg | @annotation | @arityless_predicate_expr | @as_expr | @as_exprs | @body | @bool | @call_body | @call_or_unqual_agg_expr | @charpred | @class_member | @classless_predicate | @comp_term | @conjunction | @dataclass | @datatype | @datatype_branch | @datatype_branches | @db_annotation | @db_args_annotation | @db_branch | @db_case_decl | @db_col_type | @db_column | @db_entry | @db_repr_type | @db_table | @db_table_name | @db_union_decl | @disjunction | @expr_aggregate_body | @expr_annotation | @field | @full_aggregate_body | @higher_order_term | @if_term | @implication | @import_directive | @import_module_expr | @in_expr | @instance_of | @literal | @member_predicate | @module | @module_alias_body | @module_expr | @module_member | @module_name | @mul_expr | @negation | @order_by | @order_bys | @par_expr | @predicate_alias_body | @predicate_expr | @prefix_cast | @ql | @qual_module_expr | @qualified_expr | @qualified_rhs | @quantified | @range | @select | @set_literal | @special_call | @super_ref | @token | @type_alias_body | @type_expr | @type_union_body | @unary_expr | @unqual_agg_body | @var_decl | @var_name | @variable | @yaml_comment | @yaml_entry | @yaml_key | @yaml_keyvaluepair | @yaml_listitem @ast_node_parent = @ast_node | @file