mirror of
https://github.com/github/codeql.git
synced 2026-04-21 06:55:31 +02:00
C#: Deprecate Record and introduce RecordClass instead. Also make flow summary support for record struct constructors.
This commit is contained in:
@@ -451,6 +451,14 @@ class SimpleType extends ValueType, @simple_type {
|
||||
override SystemNamespace getDeclaringNamespace() { any() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A `record` like type.
|
||||
* This can be either a `class` or a `struct`.
|
||||
*/
|
||||
abstract class RecordType extends ValueOrRefType {
|
||||
RecordType() { this.isRecord() }
|
||||
}
|
||||
|
||||
/**
|
||||
* The Boolean type, `bool`.
|
||||
*/
|
||||
@@ -721,7 +729,7 @@ class Struct extends ValueType, @struct_type {
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
class RecordStruct extends Struct {
|
||||
class RecordStruct extends RecordType, Struct {
|
||||
RecordStruct() { this.isRecord() }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "RecordStruct" }
|
||||
@@ -781,6 +789,18 @@ class Class extends RefType, @class_type {
|
||||
override string getAPrimaryQlClass() { result = "Class" }
|
||||
}
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `RecordClass` instead.
|
||||
*/
|
||||
deprecated class Record extends Class {
|
||||
Record() { this.isRecord() }
|
||||
|
||||
/** Gets the clone method of this record. */
|
||||
RecordCloneMethod getCloneMethod() { result = this.getAMember() }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "Record" }
|
||||
}
|
||||
|
||||
/**
|
||||
* A `record`, for example
|
||||
*
|
||||
@@ -790,13 +810,11 @@ class Class extends RefType, @class_type {
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
class Record extends Class {
|
||||
Record() { this.isRecord() }
|
||||
|
||||
class RecordClass extends RecordType, Class {
|
||||
/** Gets the clone method of this record. */
|
||||
RecordCloneMethod getCloneMethod() { result = this.getAMember() }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "Record" }
|
||||
override string getAPrimaryQlClass() { result = "RecordClass" }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -111,7 +111,7 @@ module SummaryComponentStack {
|
||||
class SummarizedCallable = Impl::Public::SummarizedCallable;
|
||||
|
||||
private predicate recordConstructorFlow(Constructor c, int i, Property p) {
|
||||
c = any(Record r).getAMember() and
|
||||
c = any(RecordType r).getAMember() and
|
||||
exists(string name |
|
||||
c.getParameter(i).getName() = name and
|
||||
c.getDeclaringType().getAMember(name) = p
|
||||
|
||||
@@ -1175,7 +1175,9 @@ class WithExpr extends Expr, @with_expr {
|
||||
Expr getExpr() { result = this.getChild(0) }
|
||||
|
||||
/** Gets the clone method of the `record` that is targetted by this `with` expression. */
|
||||
RecordCloneMethod getCloneMethod() { result = this.getExpr().getType().(Record).getCloneMethod() }
|
||||
RecordCloneMethod getCloneMethod() {
|
||||
result = this.getExpr().getType().(RecordClass).getCloneMethod()
|
||||
}
|
||||
|
||||
override string toString() { result = "... with { ... }" }
|
||||
|
||||
|
||||
@@ -776,7 +776,7 @@ ParenthesizedPattern.cs:
|
||||
# 26| 0: [TypeMention] string
|
||||
# 26| 2: [IntLiteral] 5
|
||||
Record.cs:
|
||||
# 4| [Record] Person
|
||||
# 4| [Record,RecordClass] Person
|
||||
# 4| 11: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 4| 0: [Parameter] left
|
||||
@@ -806,7 +806,7 @@ Record.cs:
|
||||
# 9| 1: [TupleExpr] (..., ...)
|
||||
# 9| 0: [ParameterAccess] access to parameter first
|
||||
# 9| 1: [ParameterAccess] access to parameter last
|
||||
# 12| [Record] Teacher
|
||||
# 12| [Record,RecordClass] Teacher
|
||||
# 12| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 12| 0: [Parameter] left
|
||||
@@ -834,7 +834,7 @@ Record.cs:
|
||||
# 17| 4: [AssignExpr] ... = ...
|
||||
# 17| 0: [PropertyCall] access to property Subject
|
||||
# 17| 1: [ParameterAccess] access to parameter sub
|
||||
# 20| [Record] Student
|
||||
# 20| [Record,RecordClass] Student
|
||||
# 20| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 20| 0: [Parameter] left
|
||||
@@ -862,7 +862,7 @@ Record.cs:
|
||||
# 24| 4: [AssignExpr] ... = ...
|
||||
# 24| 0: [PropertyCall] access to property Level
|
||||
# 24| 1: [ParameterAccess] access to parameter level
|
||||
# 27| [Record] Person1
|
||||
# 27| [Record,RecordClass] Person1
|
||||
# 27| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 27| 0: [Parameter] left
|
||||
@@ -889,7 +889,7 @@ Record.cs:
|
||||
# 27| 4: [Setter] set_LastName
|
||||
#-----| 2: (Parameters)
|
||||
# 27| 0: [Parameter] value
|
||||
# 29| [Record] Teacher1
|
||||
# 29| [Record,RecordClass] Teacher1
|
||||
# 29| 13: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 29| 0: [Parameter] left
|
||||
@@ -913,7 +913,7 @@ Record.cs:
|
||||
# 29| 4: [Setter] set_Subject
|
||||
#-----| 2: (Parameters)
|
||||
# 29| 0: [Parameter] value
|
||||
# 32| [Record] Student1
|
||||
# 32| [Record,RecordClass] Student1
|
||||
# 32| 13: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 32| 0: [Parameter] left
|
||||
@@ -937,7 +937,7 @@ Record.cs:
|
||||
# 32| 4: [Setter] set_Level
|
||||
#-----| 2: (Parameters)
|
||||
# 32| 0: [Parameter] value
|
||||
# 35| [Record] Pet
|
||||
# 35| [Record,RecordClass] Pet
|
||||
# 35| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 35| 0: [Parameter] left
|
||||
@@ -963,7 +963,7 @@ Record.cs:
|
||||
# 38| -1: [TypeAccess] access to type Console
|
||||
# 38| 0: [TypeMention] Console
|
||||
# 38| 0: [StringLiteral] "Shredding furniture"
|
||||
# 41| [Record] Dog
|
||||
# 41| [Record,RecordClass] Dog
|
||||
# 41| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 41| 0: [Parameter] left
|
||||
@@ -1002,7 +1002,7 @@ Record.cs:
|
||||
# 50| 0: [MethodCall] call to method ToString
|
||||
# 50| -1: [LocalVariableAccess] access to local variable s
|
||||
# 50| 1: [StringLiteral] " is a dog"
|
||||
# 54| [Record] R1
|
||||
# 54| [Record,RecordClass] R1
|
||||
# 54| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 54| 0: [Parameter] left
|
||||
@@ -1022,7 +1022,7 @@ Record.cs:
|
||||
# 54| 4: [Setter] set_A
|
||||
#-----| 2: (Parameters)
|
||||
# 54| 0: [Parameter] value
|
||||
# 56| [Record] R2
|
||||
# 56| [Record,RecordClass] R2
|
||||
# 56| 13: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 56| 0: [Parameter] left
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import csharp
|
||||
|
||||
query predicate records(Record t, string i, RecordCloneMethod clone) {
|
||||
query predicate records(RecordClass t, string i, RecordCloneMethod clone) {
|
||||
t.getABaseInterface().toStringWithTypes() = i and
|
||||
clone = t.getCloneMethod() and
|
||||
t.fromSource()
|
||||
@@ -10,7 +10,7 @@ private string getMemberName(Member m) {
|
||||
result = m.getDeclaringType().getQualifiedName() + "." + m.toStringWithTypes()
|
||||
}
|
||||
|
||||
query predicate members(Record t, string ms, string l) {
|
||||
query predicate members(RecordClass t, string ms, string l) {
|
||||
t.fromSource() and
|
||||
exists(Member m | t.hasMember(m) |
|
||||
ms = getMemberName(m) and
|
||||
|
||||
@@ -281,7 +281,7 @@ Tuples.cs:
|
||||
# 81| 2: [ExprStmt] ...;
|
||||
# 81| 0: [MethodCall] call to method Sink<Int32>
|
||||
# 81| 0: [LocalVariableAccess] access to local variable q
|
||||
# 85| 9: [Record] R1
|
||||
# 85| 9: [RecordClass] R1
|
||||
# 85| 12: [NEOperator] !=
|
||||
#-----| 2: (Parameters)
|
||||
# 85| 0: [Parameter] left
|
||||
|
||||
Reference in New Issue
Block a user