C#: Deprecate Record and introduce RecordClass instead. Also make flow summary support for record struct constructors.

This commit is contained in:
Michael Nebel
2022-01-17 14:00:39 +01:00
parent 55cb2aa160
commit 9770f09839
6 changed files with 40 additions and 20 deletions

View File

@@ -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" }
}
/**

View File

@@ -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

View File

@@ -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 { ... }" }

View File

@@ -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

View File

@@ -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

View File

@@ -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