Skip to content

Commit fec15fb

Browse files
committed
Merge main into redsun82/swift-qltestgen
2 parents 1cb8e61 + b0c66dd commit fec15fb

File tree

16 files changed

+223
-46
lines changed

16 files changed

+223
-46
lines changed

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.ir.types.*
2121
import org.jetbrains.kotlin.ir.util.*
2222
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
2323
import org.jetbrains.kotlin.load.java.structure.JavaClass
24+
import org.jetbrains.kotlin.load.java.structure.JavaMethod
2425
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
26+
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameterListOwner
2527
import org.jetbrains.kotlin.name.FqName
2628
import org.jetbrains.kotlin.types.Variance
2729
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -514,7 +516,7 @@ open class KotlinFileExtractor(
514516
else
515517
null
516518
} ?: vp.type
517-
val javaType = ((vp.parent as? IrFunction)?.let { getJavaMethod(it) })?.valueParameters?.getOrNull(idx)?.type
519+
val javaType = (vp.parent as? IrFunction)?.let { getJavaCallable(it)?.let { jCallable -> getJavaValueParameterType(jCallable, idx) } }
518520
val typeWithWildcards = addJavaLoweringWildcards(maybeErasedType, !hasWildcardSuppressionAnnotation(vp), javaType)
519521
val substitutedType = typeSubstitution?.let { it(typeWithWildcards, TypeContext.OTHER, pluginContext) } ?: typeWithWildcards
520522
val id = useValueParameter(vp, parent)
@@ -691,8 +693,8 @@ open class KotlinFileExtractor(
691693
with("function", f) {
692694
DeclarationStackAdjuster(f).use {
693695

694-
val javaMethod = getJavaMethod(f)
695-
getFunctionTypeParameters(f).mapIndexed { idx, tp -> extractTypeParameter(tp, idx, javaMethod?.typeParameters?.getOrNull(idx)) }
696+
val javaCallable = getJavaCallable(f)
697+
getFunctionTypeParameters(f).mapIndexed { idx, tp -> extractTypeParameter(tp, idx, (javaCallable as? JavaTypeParameterListOwner)?.typeParameters?.getOrNull(idx)) }
696698

697699
val id =
698700
idOverride
@@ -726,7 +728,7 @@ open class KotlinFileExtractor(
726728

727729
val paramsSignature = allParamTypes.joinToString(separator = ",", prefix = "(", postfix = ")") { it.javaResult.signature!! }
728730

729-
val adjustedReturnType = addJavaLoweringWildcards(getAdjustedReturnType(f), false, javaMethod?.returnType)
731+
val adjustedReturnType = addJavaLoweringWildcards(getAdjustedReturnType(f), false, (javaCallable as? JavaMethod)?.returnType)
730732
val substReturnType = typeSubstitution?.let { it(adjustedReturnType, TypeContext.RETURN, pluginContext) } ?: adjustedReturnType
731733

732734
val locId = locOverride ?: getLocation(f, classTypeArgsIncludingOuterClasses)

java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.ir.allOverridden
99
import org.jetbrains.kotlin.backend.common.ir.isFinalClass
1010
import org.jetbrains.kotlin.backend.common.lower.parents
1111
import org.jetbrains.kotlin.backend.common.lower.parentsWithSelf
12-
import org.jetbrains.kotlin.backend.jvm.ir.getJvmNameFromAnnotation
1312
import org.jetbrains.kotlin.backend.jvm.ir.propertyIfAccessor
1413
import org.jetbrains.kotlin.builtins.StandardNames
1514
import org.jetbrains.kotlin.descriptors.*
@@ -996,7 +995,7 @@ open class KotlinUsesExtractor(
996995
getFunctionTypeParameters(f),
997996
classTypeArgsIncludingOuterClasses,
998997
overridesCollectionsMethodWithAlteredParameterTypes(f),
999-
getJavaMethod(f),
998+
getJavaCallable(f),
1000999
!hasWildcardSuppressionAnnotation(f)
10011000
)
10021001

@@ -1028,7 +1027,7 @@ open class KotlinUsesExtractor(
10281027
// parameter erasure to match the way this class will appear to an external consumer of the .class file.
10291028
overridesCollectionsMethod: Boolean,
10301029
// The Java signature of this callable, if known.
1031-
javaSignature: JavaMethod?,
1030+
javaSignature: JavaMember?,
10321031
// If true, Java wildcards implied by Kotlin type parameter variance should be added by default to this function's value parameters' types.
10331032
// (Return-type wildcard addition is always off by default)
10341033
addParameterWildcardsByDefault: Boolean,
@@ -1056,7 +1055,7 @@ open class KotlinUsesExtractor(
10561055
// If this has happened, erase the type again to get the correct Java signature.
10571056
val maybeAmendedForCollections = if (overridesCollectionsMethod) eraseCollectionsMethodParameterType(it.value.type, name, it.index) else it.value.type
10581057
// Add any wildcard types that the Kotlin compiler would add in the Java lowering of this function:
1059-
val withAddedWildcards = addJavaLoweringWildcards(maybeAmendedForCollections, addParameterWildcardsByDefault, javaSignature?.let { sig -> sig.valueParameters[it.index].type })
1058+
val withAddedWildcards = addJavaLoweringWildcards(maybeAmendedForCollections, addParameterWildcardsByDefault, javaSignature?.let { sig -> getJavaValueParameterType(sig, it.index) })
10601059
// Now substitute any class type parameters in:
10611060
val maybeSubbed = withAddedWildcards.substituteTypeAndArguments(substitutionMap, TypeContext.OTHER, pluginContext)
10621061
// Finally, mimic the Java extractor's behaviour by naming functions with type parameters for their erased types;
@@ -1103,7 +1102,13 @@ open class KotlinUsesExtractor(
11031102
}
11041103

11051104
@OptIn(ObsoleteDescriptorBasedAPI::class)
1106-
fun getJavaMethod(f: IrFunction) = (f.descriptor.source as? JavaSourceElement)?.javaElement as? JavaMethod
1105+
fun getJavaCallable(f: IrFunction) = (f.descriptor.source as? JavaSourceElement)?.javaElement as? JavaMember
1106+
1107+
fun getJavaValueParameterType(m: JavaMember, idx: Int) = when(m) {
1108+
is JavaMethod -> m.valueParameters[idx].type
1109+
is JavaConstructor -> m.valueParameters[idx].type
1110+
else -> null
1111+
}
11071112

11081113
fun hasWildcardSuppressionAnnotation(d: IrDeclaration) =
11091114
d.hasAnnotation(jvmWildcardSuppressionAnnotaton) ||

ql/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ql/extractor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ edition = "2018"
1010
flate2 = "1.0"
1111
node-types = { path = "../node-types" }
1212
tree-sitter = "0.19"
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "725395405e65814f10095a451404b0ced5dc6289" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "99f3bc30fa772b07ad19a23799fe7433dc15f765" }
1414
clap = "2.33"
1515
tracing = "0.1"
1616
tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }

ql/generator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ clap = "2.33"
1111
node-types = { path = "../node-types" }
1212
tracing = "0.1"
1313
tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }
14-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "725395405e65814f10095a451404b0ced5dc6289" }
14+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "99f3bc30fa772b07ad19a23799fe7433dc15f765" }

ql/ql/src/codeql_ql/ast/Ast.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ class TypeExpr extends TType, AstNode {
673673
* Gets the module of the type, if it exists.
674674
* E.g. `DataFlow` in `DataFlow::Node`.
675675
*/
676-
ModuleExpr getModule() { toQL(result) = type.getChild() }
676+
ModuleExpr getModule() { toQL(result) = type.getQualifier() }
677677

678678
/**
679679
* Gets the type that this type reference refers to.

ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,13 @@ module QL {
137137
/** Gets the node corresponding to the field `name`. */
138138
final LiteralId getName() { ql_arityless_predicate_expr_def(this, result) }
139139

140-
/** Gets the child of this node. */
141-
final ModuleExpr getChild() { ql_arityless_predicate_expr_child(this, result) }
140+
/** Gets the node corresponding to the field `qualifier`. */
141+
final ModuleExpr getQualifier() { ql_arityless_predicate_expr_qualifier(this, result) }
142142

143143
/** Gets a field or child node of this node. */
144144
final override AstNode getAFieldOrChild() {
145145
ql_arityless_predicate_expr_def(this, result) or
146-
ql_arityless_predicate_expr_child(this, result)
146+
ql_arityless_predicate_expr_qualifier(this, result)
147147
}
148148
}
149149

@@ -944,15 +944,24 @@ module QL {
944944
/** Gets the name of the primary QL class for this element. */
945945
final override string getAPrimaryQlClass() { result = "Module" }
946946

947+
/** Gets the node corresponding to the field `implements`. */
948+
final SignatureExpr getImplements(int i) { ql_module_implements(this, i, result) }
949+
947950
/** Gets the node corresponding to the field `name`. */
948951
final ModuleName getName() { ql_module_def(this, result) }
949952

953+
/** Gets the node corresponding to the field `parameter`. */
954+
final ModuleParam getParameter(int i) { ql_module_parameter(this, i, result) }
955+
950956
/** Gets the `i`th child of this node. */
951957
final AstNode getChild(int i) { ql_module_child(this, i, result) }
952958

953959
/** Gets a field or child node of this node. */
954960
final override AstNode getAFieldOrChild() {
955-
ql_module_def(this, result) or ql_module_child(this, _, result)
961+
ql_module_implements(this, _, result) or
962+
ql_module_def(this, result) or
963+
ql_module_parameter(this, _, result) or
964+
ql_module_child(this, _, result)
956965
}
957966
}
958967

@@ -985,6 +994,18 @@ module QL {
985994
}
986995
}
987996

997+
/** A class representing `moduleInstantiation` nodes. */
998+
class ModuleInstantiation extends @ql_module_instantiation, AstNode {
999+
/** Gets the name of the primary QL class for this element. */
1000+
final override string getAPrimaryQlClass() { result = "ModuleInstantiation" }
1001+
1002+
/** Gets the `i`th child of this node. */
1003+
final SignatureExpr getChild(int i) { ql_module_instantiation_child(this, i, result) }
1004+
1005+
/** Gets a field or child node of this node. */
1006+
final override AstNode getAFieldOrChild() { ql_module_instantiation_child(this, _, result) }
1007+
}
1008+
9881009
/** A class representing `moduleMember` nodes. */
9891010
class ModuleMember extends @ql_module_member, AstNode {
9901011
/** Gets the name of the primary QL class for this element. */
@@ -1009,6 +1030,23 @@ module QL {
10091030
final override AstNode getAFieldOrChild() { ql_module_name_def(this, result) }
10101031
}
10111032

1033+
/** A class representing `moduleParam` nodes. */
1034+
class ModuleParam extends @ql_module_param, AstNode {
1035+
/** Gets the name of the primary QL class for this element. */
1036+
final override string getAPrimaryQlClass() { result = "ModuleParam" }
1037+
1038+
/** Gets the node corresponding to the field `parameter`. */
1039+
final SimpleId getParameter() { ql_module_param_def(this, result, _) }
1040+
1041+
/** Gets the node corresponding to the field `signature`. */
1042+
final SignatureExpr getSignature() { ql_module_param_def(this, _, result) }
1043+
1044+
/** Gets a field or child node of this node. */
1045+
final override AstNode getAFieldOrChild() {
1046+
ql_module_param_def(this, result, _) or ql_module_param_def(this, _, result)
1047+
}
1048+
}
1049+
10121050
/** A class representing `mul_expr` nodes. */
10131051
class MulExpr extends @ql_mul_expr, AstNode {
10141052
/** Gets the name of the primary QL class for this element. */
@@ -1277,6 +1315,23 @@ module QL {
12771315
final override AstNode getAFieldOrChild() { ql_set_literal_child(this, _, result) }
12781316
}
12791317

1318+
/** A class representing `signatureExpr` nodes. */
1319+
class SignatureExpr extends @ql_signature_expr, AstNode {
1320+
/** Gets the name of the primary QL class for this element. */
1321+
final override string getAPrimaryQlClass() { result = "SignatureExpr" }
1322+
1323+
/** Gets the node corresponding to the field `predicate`. */
1324+
final PredicateExpr getPredicate() { ql_signature_expr_predicate(this, result) }
1325+
1326+
/** Gets the node corresponding to the field `type_expr`. */
1327+
final TypeExpr getTypeExpr() { ql_signature_expr_type_expr(this, result) }
1328+
1329+
/** Gets a field or child node of this node. */
1330+
final override AstNode getAFieldOrChild() {
1331+
ql_signature_expr_predicate(this, result) or ql_signature_expr_type_expr(this, result)
1332+
}
1333+
}
1334+
12801335
/** A class representing `simpleId` tokens. */
12811336
class SimpleId extends @ql_token_simple_id, Token {
12821337
/** Gets the name of the primary QL class for this element. */
@@ -1357,12 +1412,17 @@ module QL {
13571412
/** Gets the node corresponding to the field `name`. */
13581413
final ClassName getName() { ql_type_expr_name(this, result) }
13591414

1415+
/** Gets the node corresponding to the field `qualifier`. */
1416+
final ModuleExpr getQualifier() { ql_type_expr_qualifier(this, result) }
1417+
13601418
/** Gets the child of this node. */
13611419
final AstNode getChild() { ql_type_expr_child(this, result) }
13621420

13631421
/** Gets a field or child node of this node. */
13641422
final override AstNode getAFieldOrChild() {
1365-
ql_type_expr_name(this, result) or ql_type_expr_child(this, result)
1423+
ql_type_expr_name(this, result) or
1424+
ql_type_expr_qualifier(this, result) or
1425+
ql_type_expr_child(this, result)
13661426
}
13671427
}
13681428

ql/ql/src/ql.dbscheme

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ ql_annotation_def(
9595
int name: @ql_token_annot_name ref
9696
);
9797

98-
ql_arityless_predicate_expr_child(
98+
ql_arityless_predicate_expr_qualifier(
9999
unique int ql_arityless_predicate_expr: @ql_arityless_predicate_expr ref,
100-
unique int child: @ql_module_expr ref
100+
unique int qualifier: @ql_module_expr ref
101101
);
102102

103103
ql_arityless_predicate_expr_def(
@@ -601,6 +601,20 @@ ql_member_predicate_def(
601601
int return_type: @ql_memberPredicate_returnType_type ref
602602
);
603603

604+
#keyset[ql_module, index]
605+
ql_module_implements(
606+
int ql_module: @ql_module ref,
607+
int index: int ref,
608+
unique int implements: @ql_signature_expr ref
609+
);
610+
611+
#keyset[ql_module, index]
612+
ql_module_parameter(
613+
int ql_module: @ql_module ref,
614+
int index: int ref,
615+
unique int parameter: @ql_module_param ref
616+
);
617+
604618
@ql_module_child_type = @ql_module_alias_body | @ql_module_member
605619

606620
#keyset[ql_module, index]
@@ -625,13 +639,24 @@ ql_module_expr_name(
625639
unique int name: @ql_token_simple_id ref
626640
);
627641

628-
@ql_moduleExpr_child_type = @ql_module_expr | @ql_token_simple_id
642+
@ql_moduleExpr_child_type = @ql_module_expr | @ql_module_instantiation | @ql_token_simple_id
629643

630644
ql_module_expr_def(
631645
unique int id: @ql_module_expr,
632646
int child: @ql_moduleExpr_child_type ref
633647
);
634648

649+
#keyset[ql_module_instantiation, index]
650+
ql_module_instantiation_child(
651+
int ql_module_instantiation: @ql_module_instantiation ref,
652+
int index: int ref,
653+
unique int child: @ql_signature_expr ref
654+
);
655+
656+
ql_module_instantiation_def(
657+
unique int id: @ql_module_instantiation
658+
);
659+
635660
@ql_moduleMember_child_type = @ql_annotation | @ql_classless_predicate | @ql_dataclass | @ql_datatype | @ql_import_directive | @ql_module | @ql_select | @ql_token_qldoc
636661

637662
#keyset[ql_module_member, index]
@@ -650,6 +675,12 @@ ql_module_name_def(
650675
int child: @ql_token_simple_id ref
651676
);
652677

678+
ql_module_param_def(
679+
unique int id: @ql_module_param,
680+
int parameter: @ql_token_simple_id ref,
681+
int signature: @ql_signature_expr ref
682+
);
683+
653684
@ql_mul_expr_left_type = @ql_add_expr | @ql_aggregate | @ql_call_or_unqual_agg_expr | @ql_comp_term | @ql_conjunction | @ql_disjunction | @ql_expr_annotation | @ql_if_term | @ql_implication | @ql_in_expr | @ql_instance_of | @ql_literal | @ql_mul_expr | @ql_negation | @ql_par_expr | @ql_prefix_cast | @ql_qualified_expr | @ql_quantified | @ql_range | @ql_set_literal | @ql_special_call | @ql_super_ref | @ql_unary_expr | @ql_variable
654685

655686
@ql_mul_expr_right_type = @ql_add_expr | @ql_aggregate | @ql_call_or_unqual_agg_expr | @ql_comp_term | @ql_conjunction | @ql_disjunction | @ql_expr_annotation | @ql_if_term | @ql_implication | @ql_in_expr | @ql_instance_of | @ql_literal | @ql_mul_expr | @ql_negation | @ql_par_expr | @ql_prefix_cast | @ql_qualified_expr | @ql_quantified | @ql_range | @ql_set_literal | @ql_special_call | @ql_super_ref | @ql_unary_expr | @ql_variable
@@ -855,6 +886,20 @@ ql_set_literal_def(
855886
unique int id: @ql_set_literal
856887
);
857888

889+
ql_signature_expr_predicate(
890+
unique int ql_signature_expr: @ql_signature_expr ref,
891+
unique int predicate: @ql_predicate_expr ref
892+
);
893+
894+
ql_signature_expr_type_expr(
895+
unique int ql_signature_expr: @ql_signature_expr ref,
896+
unique int type_expr: @ql_type_expr ref
897+
);
898+
899+
ql_signature_expr_def(
900+
unique int id: @ql_signature_expr
901+
);
902+
858903
ql_special_call_def(
859904
unique int id: @ql_special_call,
860905
int child: @ql_token_special_id ref
@@ -883,7 +928,12 @@ ql_type_expr_name(
883928
unique int name: @ql_token_class_name ref
884929
);
885930

886-
@ql_typeExpr_child_type = @ql_module_expr | @ql_token_dbtype | @ql_token_primitive_type
931+
ql_type_expr_qualifier(
932+
unique int ql_type_expr: @ql_type_expr ref,
933+
unique int qualifier: @ql_module_expr ref
934+
);
935+
936+
@ql_typeExpr_child_type = @ql_token_dbtype | @ql_token_primitive_type
887937

888938
ql_type_expr_child(
889939
unique int ql_type_expr: @ql_type_expr ref,
@@ -1057,7 +1107,7 @@ case @ql_token.kind of
10571107
;
10581108

10591109

1060-
@ql_ast_node = @ql_add_expr | @ql_aggregate | @ql_annot_arg | @ql_annotation | @ql_arityless_predicate_expr | @ql_as_expr | @ql_as_exprs | @ql_body | @ql_bool | @ql_call_body | @ql_call_or_unqual_agg_expr | @ql_charpred | @ql_class_member | @ql_classless_predicate | @ql_comp_term | @ql_conjunction | @ql_dataclass | @ql_datatype | @ql_datatype_branch | @ql_datatype_branches | @ql_db_annotation | @ql_db_args_annotation | @ql_db_branch | @ql_db_case_decl | @ql_db_col_type | @ql_db_column | @ql_db_entry | @ql_db_repr_type | @ql_db_table | @ql_db_table_name | @ql_db_union_decl | @ql_disjunction | @ql_expr_aggregate_body | @ql_expr_annotation | @ql_field | @ql_full_aggregate_body | @ql_higher_order_term | @ql_if_term | @ql_implication | @ql_import_directive | @ql_import_module_expr | @ql_in_expr | @ql_instance_of | @ql_literal | @ql_member_predicate | @ql_module | @ql_module_alias_body | @ql_module_expr | @ql_module_member | @ql_module_name | @ql_mul_expr | @ql_negation | @ql_order_by | @ql_order_bys | @ql_par_expr | @ql_predicate_alias_body | @ql_predicate_expr | @ql_prefix_cast | @ql_ql | @ql_qual_module_expr | @ql_qualified_expr | @ql_qualified_rhs | @ql_quantified | @ql_range | @ql_select | @ql_set_literal | @ql_special_call | @ql_super_ref | @ql_token | @ql_type_alias_body | @ql_type_expr | @ql_type_union_body | @ql_unary_expr | @ql_unqual_agg_body | @ql_var_decl | @ql_var_name | @ql_variable | @ql_yaml_comment | @ql_yaml_entry | @ql_yaml_key | @ql_yaml_keyvaluepair | @ql_yaml_listitem
1110+
@ql_ast_node = @ql_add_expr | @ql_aggregate | @ql_annot_arg | @ql_annotation | @ql_arityless_predicate_expr | @ql_as_expr | @ql_as_exprs | @ql_body | @ql_bool | @ql_call_body | @ql_call_or_unqual_agg_expr | @ql_charpred | @ql_class_member | @ql_classless_predicate | @ql_comp_term | @ql_conjunction | @ql_dataclass | @ql_datatype | @ql_datatype_branch | @ql_datatype_branches | @ql_db_annotation | @ql_db_args_annotation | @ql_db_branch | @ql_db_case_decl | @ql_db_col_type | @ql_db_column | @ql_db_entry | @ql_db_repr_type | @ql_db_table | @ql_db_table_name | @ql_db_union_decl | @ql_disjunction | @ql_expr_aggregate_body | @ql_expr_annotation | @ql_field | @ql_full_aggregate_body | @ql_higher_order_term | @ql_if_term | @ql_implication | @ql_import_directive | @ql_import_module_expr | @ql_in_expr | @ql_instance_of | @ql_literal | @ql_member_predicate | @ql_module | @ql_module_alias_body | @ql_module_expr | @ql_module_instantiation | @ql_module_member | @ql_module_name | @ql_module_param | @ql_mul_expr | @ql_negation | @ql_order_by | @ql_order_bys | @ql_par_expr | @ql_predicate_alias_body | @ql_predicate_expr | @ql_prefix_cast | @ql_ql | @ql_qual_module_expr | @ql_qualified_expr | @ql_qualified_rhs | @ql_quantified | @ql_range | @ql_select | @ql_set_literal | @ql_signature_expr | @ql_special_call | @ql_super_ref | @ql_token | @ql_type_alias_body | @ql_type_expr | @ql_type_union_body | @ql_unary_expr | @ql_unqual_agg_body | @ql_var_decl | @ql_var_name | @ql_variable | @ql_yaml_comment | @ql_yaml_entry | @ql_yaml_key | @ql_yaml_keyvaluepair | @ql_yaml_listitem
10611111

10621112
@ql_ast_node_parent = @file | @ql_ast_node
10631113

swift/codegen/schema.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ ValueDecl:
293293

294294
AbstractClosureExpr:
295295
_extends: Expr
296+
_children:
297+
params: ParamDecl*
296298

297299
AnyTryExpr:
298300
_extends: Expr

0 commit comments

Comments
 (0)