Merge pull request #10238 from michaelnebel/csharp/theoremsforfree

C#: Theorems for Free - Model generation
This commit is contained in:
Michael Nebel
2022-09-20 09:30:10 +02:00
committed by GitHub
34 changed files with 735 additions and 66 deletions

View File

@@ -4,10 +4,10 @@
* @id csharp/utils/model-generator/discarded-summary-models
*/
private import semmle.code.csharp.dataflow.ExternalFlow
private import internal.CaptureModels
private import internal.CaptureSummaryFlow
import semmle.code.csharp.dataflow.ExternalFlow
import internal.CaptureModels
import internal.CaptureSummaryFlow
from TargetApi api, string flow
from DataFlowTargetApi api, string flow
where flow = captureFlow(api) and hasSummary(api, false)
select flow order by flow

View File

@@ -6,10 +6,12 @@
* @tags model-generator
*/
private import semmle.code.csharp.dataflow.ExternalFlow
private import internal.CaptureModels
private import internal.CaptureSummaryFlow
import semmle.code.csharp.dataflow.ExternalFlow
import internal.CaptureModels
import internal.CaptureSummaryFlow
from TargetApi api, string noflow
where noflow = captureNoFlow(api) and not hasSummary(api, false)
from DataFlowTargetApi api, string noflow
where
noflow = captureNoFlow(api) and
not hasSummary(api, false)
select noflow order by noflow

View File

@@ -6,8 +6,8 @@
* @tags model-generator
*/
private import internal.CaptureModels
import internal.CaptureModels
from TargetApi api, string sink
from DataFlowTargetApi api, string sink
where sink = captureSink(api)
select sink order by sink

View File

@@ -6,8 +6,8 @@
* @tags model-generator
*/
private import internal.CaptureModels
import internal.CaptureModels
from TargetApi api, string source
from DataFlowTargetApi api, string source
where source = captureSource(api)
select source order by source

View File

@@ -6,10 +6,10 @@
* @tags model-generator
*/
private import semmle.code.csharp.dataflow.ExternalFlow
private import internal.CaptureModels
private import internal.CaptureSummaryFlow
import semmle.code.csharp.dataflow.ExternalFlow
import internal.CaptureModels
import internal.CaptureSummaryFlow
from TargetApi api, string flow
from DataFlowTargetApi api, string flow
where flow = captureFlow(api) and not hasSummary(api, false)
select flow order by flow

View File

@@ -0,0 +1,14 @@
/**
* @name Capture typed based summary models.
* @description Finds applicable summary models to be used by other queries.
* @kind diagnostic
* @id cs/utils/model-generator/summary-models-typed-based
* @tags model-generator
*/
import semmle.code.csharp.dataflow.ExternalFlow
import internal.CaptureTypeBasedSummaryModels
from TypeBasedFlowTargetApi api, string flow
where flow = captureFlow(api)
select flow order by flow

View File

@@ -5,7 +5,9 @@
private import CaptureModelsSpecific
class TargetApi = TargetApiSpecific;
class DataFlowTargetApi extends TargetApiSpecific {
DataFlowTargetApi() { isRelevantForDataFlowModels(this) }
}
/**
* Holds if data can flow from `node1` to `node2` either via a read or a write of an intermediate field `f`.
@@ -40,7 +42,7 @@ private predicate isRelevantContent(DataFlow::Content c) {
* Gets the summary model for `api` with `input`, `output` and `kind`.
*/
bindingset[input, output, kind]
private string asSummaryModel(TargetApi api, string input, string output, string kind) {
private string asSummaryModel(TargetApiSpecific api, string input, string output, string kind) {
result =
asPartialModel(api) + input + ";" //
+ output + ";" //
@@ -48,13 +50,15 @@ private string asSummaryModel(TargetApi api, string input, string output, string
+ "generated"
}
string asNegativeSummaryModel(TargetApi api) { result = asPartialNegativeModel(api) + "generated" }
string asNegativeSummaryModel(TargetApiSpecific api) {
result = asPartialNegativeModel(api) + "generated"
}
/**
* Gets the value summary model for `api` with `input` and `output`.
*/
bindingset[input, output]
private string asValueModel(TargetApi api, string input, string output) {
string asValueModel(TargetApiSpecific api, string input, string output) {
result = asSummaryModel(api, input, output, "value")
}
@@ -62,7 +66,7 @@ private string asValueModel(TargetApi api, string input, string output) {
* Gets the taint summary model for `api` with `input` and `output`.
*/
bindingset[input, output]
private string asTaintModel(TargetApi api, string input, string output) {
private string asTaintModel(TargetApiSpecific api, string input, string output) {
result = asSummaryModel(api, input, output, "taint")
}
@@ -70,7 +74,7 @@ private string asTaintModel(TargetApi api, string input, string output) {
* Gets the sink model for `api` with `input` and `kind`.
*/
bindingset[input, kind]
private string asSinkModel(TargetApi api, string input, string kind) {
private string asSinkModel(TargetApiSpecific api, string input, string kind) {
result =
asPartialModel(api) + input + ";" //
+ kind + ";" //
@@ -81,7 +85,7 @@ private string asSinkModel(TargetApi api, string input, string kind) {
* Gets the source model for `api` with `output` and `kind`.
*/
bindingset[output, kind]
private string asSourceModel(TargetApi api, string output, string kind) {
private string asSourceModel(TargetApiSpecific api, string output, string kind) {
result =
asPartialModel(api) + output + ";" //
+ kind + ";" //
@@ -91,7 +95,7 @@ private string asSourceModel(TargetApi api, string output, string kind) {
/**
* Gets the summary model of `api`, if it follows the `fluent` programming pattern (returns `this`).
*/
string captureQualifierFlow(TargetApi api) {
string captureQualifierFlow(TargetApiSpecific api) {
exists(DataFlowImplCommon::ReturnNodeExt ret |
api = returnNodeEnclosingCallable(ret) and
isOwnInstanceAccessNode(ret)
@@ -140,7 +144,7 @@ private class ThroughFlowConfig extends TaintTracking::Configuration {
override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) {
source instanceof DataFlow::ParameterNode and
source.getEnclosingCallable() instanceof TargetApi and
source.getEnclosingCallable() instanceof DataFlowTargetApi and
state.(TaintRead).getStep() = 0
}
@@ -184,7 +188,7 @@ private class ThroughFlowConfig extends TaintTracking::Configuration {
/**
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
*/
string captureThroughFlow(TargetApi api) {
string captureThroughFlow(DataFlowTargetApi api) {
exists(
ThroughFlowConfig config, DataFlow::ParameterNode p,
DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output
@@ -211,7 +215,7 @@ private class FromSourceConfiguration extends TaintTracking::Configuration {
override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) }
override predicate isSink(DataFlow::Node sink) {
exists(TargetApi c |
exists(DataFlowTargetApi c |
sink instanceof DataFlowImplCommon::ReturnNodeExt and
sink.getEnclosingCallable() = c
)
@@ -229,7 +233,7 @@ private class FromSourceConfiguration extends TaintTracking::Configuration {
/**
* Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`.
*/
string captureSource(TargetApi api) {
string captureSource(DataFlowTargetApi api) {
exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind |
config.hasFlow(source, sink) and
ExternalFlow::sourceNode(source, kind) and
@@ -259,7 +263,7 @@ private class PropagateToSinkConfiguration extends PropagateToSinkConfigurationS
/**
* Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink.
*/
string captureSink(TargetApi api) {
string captureSink(DataFlowTargetApi api) {
exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind |
config.hasFlow(src, sink) and
ExternalFlow::sinkNode(sink, kind) and

View File

@@ -36,10 +36,21 @@ private predicate isRelevantForModels(CS::Callable api) {
api.getDeclaringType().getNamespace().getQualifiedName() != "" and
not api instanceof CS::ConversionOperator and
not api instanceof Util::MainMethod and
not isHigherOrder(api) and
not api instanceof CS::Destructor
}
/**
* Holds if it is relevant to generate models for `api` based on data flow analysis.
*/
predicate isRelevantForDataFlowModels(CS::Callable api) {
isRelevantForModels(api) and not isHigherOrder(api)
}
/**
* Holds if it is relevant to generate models for `api` based on its type.
*/
predicate isRelevantForTypeBasedFlowModels = isRelevantForModels/1;
/**
* A class of callables that are relevant generating summary, source and sinks models for.
*
@@ -49,8 +60,7 @@ private predicate isRelevantForModels(CS::Callable api) {
class TargetApiSpecific extends DotNet::Callable {
TargetApiSpecific() {
this.fromSource() and
this.isUnboundDeclaration() and
isRelevantForModels(this)
this.isUnboundDeclaration()
}
}
@@ -100,7 +110,7 @@ predicate isRelevantType(CS::Type t) {
*/
string qualifierString() { result = "Argument[this]" }
private string parameterAccess(CS::Parameter p) {
string parameterAccess(CS::Parameter p) {
if Collections::isCollectionType(p.getType())
then result = "Argument[" + p.getPosition() + "].Element"
else result = "Argument[" + p.getPosition() + "]"

View File

@@ -75,7 +75,7 @@ private import CaptureModels
* Captured Model:
* ```Summaries;BasicFlow;false;AssignToArray;(System.Int32,System.Int32[]);Argument[0];Argument[1].Element;taint```
*/
string captureFlow(TargetApi api) {
string captureFlow(DataFlowTargetApi api) {
result = captureQualifierFlow(api) or
result = captureThroughFlow(api)
}
@@ -84,7 +84,7 @@ string captureFlow(TargetApi api) {
* Gets the negative summary for `api`, if any.
* A negative summary is generated, if there does not exist any positive flow.
*/
string captureNoFlow(TargetApi api) {
string captureNoFlow(DataFlowTargetApi api) {
not exists(captureFlow(api)) and
result = asNegativeSummaryModel(api)
}

View File

@@ -0,0 +1,224 @@
private import csharp
private import dotnet
private import semmle.code.csharp.frameworks.system.collections.Generic as GenericCollections
private import semmle.code.csharp.dataflow.internal.DataFlowPrivate
private import semmle.code.csharp.frameworks.system.linq.Expressions
private import CaptureModelsSpecific as Specific
private import CaptureModels
/**
* Holds if `t` is a subtype (reflexive/transitive) of `IEnumerable<T>`, where `T` = `tp`.
*/
private predicate genericCollectionType(ValueOrRefType t, TypeParameter tp) {
exists(ConstructedGeneric t2 |
t2 = t.getABaseType*() and
t2.getUnboundDeclaration() instanceof
GenericCollections::SystemCollectionsGenericIEnumerableTInterface and
tp = t2.getATypeArgument()
)
}
/**
* Holds if `tp` is a type parameter of the immediate type declaring `callable`.
*/
private predicate classTypeParameter(DotNet::Callable callable, TypeParameter tp) {
callable.getDeclaringType().(UnboundGeneric).getATypeParameter() = tp
}
/**
* Holds if `tp` is type parameter of `callable` or the type declaring `callable`.
*/
private predicate localTypeParameter(DotNet::Callable callable, TypeParameter tp) {
classTypeParameter(callable, tp) or
callable.(UnboundGeneric).getATypeParameter() = tp
}
/**
* Holds if `callable` has a parameter of type `tp`
* or collection parameterized over type `tp`.
*/
private predicate parameter(DotNet::Callable callable, string input, TypeParameter tp) {
exists(Parameter p |
input = Specific::parameterAccess(p) and
p = callable.getAParameter() and
(
// Parameter of type tp
p.getType() = tp
or
// Parameter is a collection of type tp
genericCollectionType(p.getType(), tp)
)
)
}
/**
* Gets the string representation of a synthetic field corresponding to `tp`.
*/
private string getSyntheticField(TypeParameter tp) {
result = ".SyntheticField[ArgType" + tp.getIndex() + "]"
}
/**
* Gets a models as data string representation of, how a value of type `tp`
* can be read or stored implicitly in relation to `callable`.
*/
private string implicit(DotNet::Callable callable, TypeParameter tp) {
classTypeParameter(callable, tp) and
exists(string access |
if genericCollectionType(callable.getDeclaringType(), tp)
then access = ".Element"
else access = getSyntheticField(tp)
|
result = Specific::qualifierString() + access
)
}
/**
* Holds if `callable` has a delegate parameter `dt` at parameter position `position`.
*/
private predicate delegate(DotNet::Callable callable, DelegateType dt, int position) {
exists(Parameter p |
p = callable.getAParameter() and
dt = p.getType().(SystemLinqExpressions::DelegateExtType).getDelegateType() and
position = p.getPosition()
)
}
/**
* Gets models as data input/output access relative to the type parameter `tp` in the
* type `t` in the scope of `callable`.
*
* Note: This predicate has to be inlined as `callable` is not related to `return` or `tp`
* in every disjunction.
*/
bindingset[callable]
private string getAccess(DotNet::Callable callable, Type return, TypeParameter tp) {
return = tp and result = ""
or
genericCollectionType(return, tp) and result = ".Element"
or
not genericCollectionType(return, tp) and
(
return.(ConstructedGeneric).getATypeArgument() = tp
or
callable.getDeclaringType() = return and return.(UnboundGeneric).getATypeParameter() = tp
) and
result = getSyntheticField(tp)
}
/**
* Holds if `input` is a models as data string representation of, how a value of type `tp`
* (or a generic parameterized over `tp`) can be generated by a delegate parameter of `callable`.
*/
private predicate delegateSource(DotNet::Callable callable, string input, TypeParameter tp) {
exists(DelegateType dt, int position, Type return, string access |
delegate(callable, dt, position) and
return = dt.getReturnType() and
access = getAccess(callable, return, tp) and
input = "Argument[" + position + "].ReturnValue" + access
)
}
/**
* Holds if `input` is a models as data string representation of, how a
* value of type `tp` (or a generic parameterized over `tp`)
* can be provided as input to `callable`.
* This includes
* (1) The implicit synthetic field(s) of the declaring type of `callable`.
* (2) The parameters of `callable`.
* (3) Any delegate parameters of `callable`.
*/
private predicate input(DotNet::Callable callable, string input, TypeParameter tp) {
input = implicit(callable, tp)
or
parameter(callable, input, tp)
or
delegateSource(callable, input, tp)
}
/**
* Holds if `callable` returns a value of type `tp` (or a generic parameterized over `tp`) and `output`
* is a models as data string representation of, how data is routed to the return.
*/
private predicate returns(DotNet::Callable callable, TypeParameter tp, string output) {
exists(Type return, string access | return = callable.getReturnType() |
access = getAccess(callable, return, tp) and
output = "ReturnValue" + access
)
}
/**
* Holds if `callable` has a delegate parameter that accepts a value of type `tp`
* and `output` is the models as data string representation of, how data is routed to
* the delegate parameter.
*/
private predicate delegateSink(DotNet::Callable callable, TypeParameter tp, string output) {
exists(DelegateType dt, int position, Parameter p |
delegate(callable, dt, position) and
p = dt.getAParameter() and
p.getType() = tp and
output = "Argument[" + position + "]" + ".Parameter[" + p.getPosition() + "]"
)
}
/**
* Holds if `output` is a models as data string representation of, how values of type `tp`
* (or generics parameterized over `tp`) can be routed.
* This includes
* (1) The implicit synthetic field(s) of the declaring type of `callable`.
* (2) The return of `callable`.
* (3) Any delegate parameters of `callable`.
*/
private predicate output(DotNet::Callable callable, TypeParameter tp, string output) {
output = implicit(callable, tp)
or
returns(callable, tp, output)
or
delegateSink(callable, tp, output)
}
/**
* A class of callables that are relevant generating summaries for based
* on the Theorems for Free approach.
*/
class TypeBasedFlowTargetApi extends Specific::TargetApiSpecific {
TypeBasedFlowTargetApi() { Specific::isRelevantForTypeBasedFlowModels(this) }
/**
* Gets the string representation of all type based summaries for `this`
* inspired by the Theorems for Free approach.
*
* Examples could be (see C# psuedo code below)
* (1) `Get` returns a value of type `T`. We assume that the returned
* value was fetched from a (synthetic) field.
* (2) `Set` consumes a value of type `T`. We assume that the value is stored in
* a (synthetic) field.
* (3) `Apply<S>` is assumed to apply the provided function to a value stored in
* a (synthetic) field and return the result.
* (4) `Apply<S1,S2>` is assumed to apply the provided function to provided value
* and return the result.
* ```csharp
* public class MyGeneric<T> {
* public void Set(T x) { ... }
* public T Get() { ... }
* public S Apply<S>(Func<T, S> f) { ... }
* public S2 Apply<S1, S2>(S1 x, Func<S1, S2> f) { ... }
* }
* ```
*/
string getSummaries() {
exists(TypeParameter tp, string input, string output |
localTypeParameter(this, tp) and
input(this, input, tp) and
output(this, tp, output) and
input != output
|
result = asValueModel(this, input, output)
)
}
}
/**
* Returns the Theorems for Free inspired typed based summaries for `api`.
*/
string captureFlow(TypeBasedFlowTargetApi api) { result = api.getSummaries() }

View File

@@ -259,4 +259,4 @@ public class EqualsGetHashCodeNoFlow
{
return intTainted;
}
}
}

View File

@@ -1,2 +1,2 @@
semmle-extractor-options: /r:System.Linq.dll /r:System.Collections.Specialized.dll
semmle-extractor-options: ${testdir}/../../resources/stubs/System.Web.cs
semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.cs

View File

@@ -0,0 +1,165 @@
| Summaries;IGrouping<,>;true;get_Key;();;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;IOrderedEnumerable<>;true;CreateOrderedEnumerable<>;(System.Func<TElement,TKey>,System.Collections.Generic.IComparer<TKey>,System.Boolean);;Argument[this].Element;Argument[0].Parameter[0];value;generated |
| Summaries;IOrderedEnumerable<>;true;CreateOrderedEnumerable<>;(System.Func<TElement,TKey>,System.Collections.Generic.IComparer<TKey>,System.Boolean);;Argument[this].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[0].Element;Argument[2].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[1];Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[1];Argument[3].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[2].ReturnValue;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>,System.Func<TAccumulate,TResult>);;Argument[3].ReturnValue;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>);;Argument[0].Element;Argument[2].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>);;Argument[1];Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>);;Argument[1];ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>);;Argument[2].ReturnValue;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable<TSource>,TAccumulate,System.Func<TAccumulate,TSource,TAccumulate>);;Argument[2].ReturnValue;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[0].Element;Argument[1].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[1].ReturnValue;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[1].ReturnValue;Argument[1].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TSource,TSource>);;Argument[1].ReturnValue;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;All<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Any<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Append<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Append<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Average<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Decimal>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Concat<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Concat<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Count<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;DistinctBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;DistinctBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;First<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;First<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;First<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;IntersectBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;IntersectBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable<TOuter>,System.Collections.Generic.IEnumerable<TInner>,System.Func<TOuter,TKey>,System.Func<TInner,TKey>,System.Func<TOuter,TInner,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable<TOuter>,System.Collections.Generic.IEnumerable<TInner>,System.Func<TOuter,TKey>,System.Func<TInner,TKey>,System.Func<TOuter,TInner,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable<TOuter>,System.Collections.Generic.IEnumerable<TInner>,System.Func<TOuter,TKey>,System.Func<TInner,TKey>,System.Func<TOuter,TInner,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable<TOuter>,System.Collections.Generic.IEnumerable<TInner>,System.Func<TOuter,TKey>,System.Func<TInner,TKey>,System.Func<TOuter,TInner,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable<TOuter>,System.Collections.Generic.IEnumerable<TInner>,System.Func<TOuter,TKey>,System.Func<TInner,TKey>,System.Func<TOuter,TInner,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Last<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Last<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Last<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Max<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Max<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[1].ReturnValue;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Max<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Max<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Decimal>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;MaxBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;MaxBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Min<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Min<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[1].ReturnValue;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Min<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;MinBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;MinBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Prepend<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Prepend<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Repeat<>;(TResult,System.Int32);;Argument[0];ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Select<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Select<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TResult>);;Argument[1].ReturnValue;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TCollection>>,System.Func<TSource,TCollection,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TCollection>>,System.Func<TSource,TCollection,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TCollection>>,System.Func<TSource,TCollection,TResult>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TCollection>>,System.Func<TSource,TCollection,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Collections.Generic.IEnumerable<TResult>>);;Argument[1].ReturnValue.Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Single<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Single<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Single<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue;value;generated |
| Summaries;SystemLinqEnumerable;false;Skip<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;SkipLast<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Take<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;TakeLast<>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;ThenBy<,>;(Summaries.IOrderedEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;ThenBy<,>;(Summaries.IOrderedEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;ThenByDescending<,>;(Summaries.IOrderedEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;ThenByDescending<,>;(Summaries.IOrderedEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;ToHashSet<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;ToList<>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Union<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Union<>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;UnionBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;UnionBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;UnionBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;UnionBy<,>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Where<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Where<>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue.Element;value;generated |
| Summaries;SystemLinqEnumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable<TFirst>,System.Collections.Generic.IEnumerable<TSecond>,System.Func<TFirst,TSecond,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value;generated |
| Summaries;SystemLinqEnumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable<TFirst>,System.Collections.Generic.IEnumerable<TSecond>,System.Func<TFirst,TSecond,TResult>);;Argument[1].Element;Argument[2].Parameter[1];value;generated |
| Summaries;SystemLinqEnumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable<TFirst>,System.Collections.Generic.IEnumerable<TSecond>,System.Func<TFirst,TSecond,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value;generated |
| Summaries;TypeBasedCollection<>;false;Add;(T);;Argument[0];Argument[this].Element;value;generated |
| Summaries;TypeBasedCollection<>;false;AddMany;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;generated |
| Summaries;TypeBasedCollection<>;false;First;();;Argument[this].Element;ReturnValue;value;generated |
| Summaries;TypeBasedCollection<>;false;GetEnumerator;();;Argument[this].Element;ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedCollection<>;false;GetMany;();;Argument[this].Element;ReturnValue.Element;value;generated |
| Summaries;TypeBasedComplex<>;false;AddMany;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;Apply;(System.Func<T,System.Int32>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;Apply<,>;(T1,System.Func<T1,T2>);;Argument[0];Argument[1].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;Apply<,>;(T1,System.Func<T1,T2>);;Argument[1].ReturnValue;ReturnValue;value;generated |
| Summaries;TypeBasedComplex<>;false;Apply<>;(System.Func<T,S>);;Argument[0].ReturnValue;ReturnValue;value;generated |
| Summaries;TypeBasedComplex<>;false;Apply<>;(System.Func<T,S>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap;(System.Func<T,System.Collections.Generic.IEnumerable<T>>);;Argument[0].ReturnValue.Element;Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap;(System.Func<T,System.Collections.Generic.IEnumerable<T>>);;Argument[0].ReturnValue.Element;Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap;(System.Func<T,System.Collections.Generic.IEnumerable<T>>);;Argument[0].ReturnValue.Element;ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap;(System.Func<T,System.Collections.Generic.IEnumerable<T>>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap;(System.Func<T,System.Collections.Generic.IEnumerable<T>>);;Argument[this].SyntheticField[ArgType0];ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap<>;(System.Func<T,System.Collections.Generic.IEnumerable<S>>);;Argument[0].ReturnValue.Element;ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;FlatMap<>;(System.Func<T,System.Collections.Generic.IEnumerable<S>>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;GetMany;();;Argument[this].SyntheticField[ArgType0];ReturnValue.Element;value;generated |
| Summaries;TypeBasedComplex<>;false;Map<>;(System.Func<T,S>);;Argument[0].ReturnValue;ReturnValue;value;generated |
| Summaries;TypeBasedComplex<>;false;Map<>;(System.Func<T,S>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;MapComplex<>;(System.Func<T,S>);;Argument[0].ReturnValue;ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;MapComplex<>;(System.Func<T,S>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;Return;(System.Func<T,Summaries.TypeBasedComplex<>>);;Argument[0].ReturnValue.SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;Return;(System.Func<T,Summaries.TypeBasedComplex<>>);;Argument[0].ReturnValue.SyntheticField[ArgType0];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;Return;(System.Func<T,Summaries.TypeBasedComplex<>>);;Argument[0].ReturnValue.SyntheticField[ArgType0];ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;Return;(System.Func<T,Summaries.TypeBasedComplex<>>);;Argument[this].SyntheticField[ArgType0];Argument[0].Parameter[0];value;generated |
| Summaries;TypeBasedComplex<>;false;Return;(System.Func<T,Summaries.TypeBasedComplex<>>);;Argument[this].SyntheticField[ArgType0];ReturnValue.SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedComplex<>;false;Set;(System.Int32,System.Func<System.Int32,T>);;Argument[1].ReturnValue;Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedNoCollection<>;false;Get;();;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;TypeBasedNoCollection<>;false;Set;(T);;Argument[0];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedSimple<>;false;Get;();;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;Get;(System.Object);;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;Id;(T);;Argument[0];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedSimple<>;false;Id;(T);;Argument[0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;Id;(T);;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;Id<>;(S);;Argument[0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;Set;(System.Int32,T);;Argument[1];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedSimple<>;false;Set;(T);;Argument[0];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedSimple<>;false;TypeBasedSimple;(T);;Argument[0];Argument[this].SyntheticField[ArgType0];value;generated |
| Summaries;TypeBasedSimple<>;false;get_Prop;();;Argument[this].SyntheticField[ArgType0];ReturnValue;value;generated |
| Summaries;TypeBasedSimple<>;false;set_Prop;(T);;Argument[0];Argument[this].SyntheticField[ArgType0];value;generated |

View File

@@ -0,0 +1 @@
utils/model-generator/CaptureTypeBasedSummaryModels.ql

View File

@@ -0,0 +1,210 @@
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
namespace Summaries;
public class TypeBasedSimple<T> {
public T Prop {
get { throw null; }
set { throw null; }
}
public TypeBasedSimple(T t) { throw null; }
public T Get() { throw null; }
public T Get(object x) { throw null; }
public T Id(T x) { throw null; }
public S Id<S>(S x) { throw null; }
public void Set(T x) { throw null; }
public void Set(int x, T y) { throw null; }
public void Set<S>(S x) { throw null; } // No summary as S is unrelated to T
}
public class TypeBasedComplex<T> {
public void AddMany(IEnumerable<T> xs) { throw null; }
public int Apply(Func<T, int> f) { throw null; }
public S Apply<S>(Func<T, S> f) { throw null; }
public T2 Apply<T1,T2>(T1 x, Func<T1, T2> f) { throw null; }
public TypeBasedComplex<T> FlatMap(Func<T, IEnumerable<T>> f) { throw null; }
public TypeBasedComplex<S> FlatMap<S>(Func<T, IEnumerable<S>> f) { throw null; }
public IList<T> GetMany() { throw null; }
public S Map<S>(Func<T, S> f) { throw null; }
public TypeBasedComplex<S> MapComplex<S>(Func<T, S> f) { throw null; }
public TypeBasedComplex<T> Return(Func<T, TypeBasedComplex<T>> f) { throw null; }
public void Set(int x, Func<int, T> f) { throw null;}
}
// It is assumed that this is a collection with elements of type T.
public class TypeBasedCollection<T> : IEnumerable<T> {
IEnumerator<T> IEnumerable<T>.GetEnumerator() { throw null; }
IEnumerator IEnumerable.GetEnumerator() { throw null; }
public void Add(T x) { throw null; }
public void AddMany(IEnumerable<T> x) { throw null; }
public T First() { throw null; }
public ICollection<T> GetMany() { throw null; }
}
// It is assumed that this is NOT a collection with elements of type T.
public class TypeBasedNoCollection<T> : IEnumerable {
IEnumerator IEnumerable.GetEnumerator() { throw null; }
public T Get() { throw null; }
public void Set(T x) { throw null; }
}
/*
* Representative subset of Linq.
*
* Only methods that will get summaries generated correctly are commented in.
* The remaning methods and interfaces are commented out with a descriptive reason.
* In some cases we will not be able correctly generate a summary based purely on the
* type information.
*/
public static class SystemLinqEnumerable {
public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func) { throw null; }
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func) { throw null; }
public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector) { throw null; }
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static bool Any<TSource>(this IEnumerable<TSource> source) { throw null; }
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element) { throw null; }
public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source) { throw null; }
public static decimal Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector) { throw null; }
// Summary will not be derivables based on type information.
// public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) { throw null; }
public static IEnumerable<TSource[]> Chunk<TSource>(this IEnumerable<TSource> source, int size) { throw null; }
public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { throw null; }
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) { throw null; }
public static int Count<TSource>(this IEnumerable<TSource> source) { throw null; }
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static IEnumerable<TSource?> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source) { throw null; }
public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source, TSource defaultValue) { throw null; }
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource? ElementAtOrDefault<TSource>(this IEnumerable<TSource> source, int index) { throw null; }
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index) { throw null; }
public static IEnumerable<TResult> Empty<TResult>() { throw null; }
// These summaries will not be derivable based on type information.
// public static IEnumerable<TSource> ExceptBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector) { throw null; }
// public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { throw null; }
public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) { throw null; }
public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
// Summary will not be correctly derivable based on type information.
// public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource defaultValue) { throw null; }
public static TSource First<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
// Missing summary for Argument[0].Element -> Argument[2].Parameter[1].Element and similar problem for GroupJoin (issue with generator)
// public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector) { throw null; }
// public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector) { throw null; }
public static IEnumerable<TSource> IntersectBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TKey> second, Func<TSource, TKey> keySelector) { throw null; }
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { throw null; }
public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector) { throw null; }
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource LastOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) { throw null; }
public static TSource? LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
// Summary will not be correctly derivable based on type information (same problem as for FirstOrDefault)
// public static TSource LastOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource defaultValue) { throw null; }
public static TSource Last<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource Last<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static long LongCount<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static TSource? MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static TSource? Max<TSource>(this IEnumerable<TSource> source) { throw null; }
public static decimal Max<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector) { throw null; }
public static TResult? Max<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) { throw null; }
public static TSource? MinBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static TSource? Min<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TResult? Min<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) { throw null; }
// These summaries will not be derivable based on type information.
// public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) { throw null; }
public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static IEnumerable<TSource> Prepend<TSource>(this IEnumerable<TSource> source, TSource element) { throw null; }
public static IEnumerable<TResult> Repeat<TResult>(TResult element, int count) { throw null; }
public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source) { throw null; }
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector) { throw null; }
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) { throw null; }
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) { throw null; }
public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { throw null; }
public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue) { throw null; }
public static TSource? SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
// Summary will not be correctly derivable based on type information (same problem as for FirstOrDefault)
// public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource defaultValue) { throw null; }
public static TSource Single<TSource>(this IEnumerable<TSource> source) { throw null; }
public static TSource Single<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static IEnumerable<TSource> SkipLast<TSource>(this IEnumerable<TSource> source, int count) { throw null; }
public static IEnumerable<TSource> SkipWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count) { throw null; }
public static IEnumerable<TSource> TakeLast<TSource>(this IEnumerable<TSource> source, int count) { throw null; }
public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count) { throw null; }
public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
// Missing summary for Argument[0].Element -> ReturnValue.Element (issue with generator)
// public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source) { throw null; }
// Summaries related to dictionaries is not generated correctly as dictionaries are not identified as collections of keys and values (issue with generator).
// public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull { throw null; }
// public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull { throw null; }
public static HashSet<TSource> ToHashSet<TSource>(this IEnumerable<TSource> source) { throw null; }
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) { throw null; }
// Type to complicated to be handled by the generator (issue with generator).
// public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { throw null; }
// public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) { throw null; }
public static IEnumerable<TSource> UnionBy<TSource, TKey>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TKey> keySelector) { throw null; }
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) { throw null; }
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { throw null; }
// Type to complicated to be handled by the generator (issue with generator).
// public static IEnumerable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second) { throw null; }
// public static IEnumerable<(TFirst First, TSecond Second, TThird Third)> Zip<TFirst, TSecond, TThird>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, IEnumerable<TThird> third) { throw null; }
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector) { throw null; }
}
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable {
TKey Key { get; }
}
// public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable {
// IEnumerable<TElement> this[TKey key] { get; }
// bool Contains(TKey key);
// }
public interface IOrderedEnumerable<out TElement> : IEnumerable<TElement>, IEnumerable {
IOrderedEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, TKey> keySelector, IComparer<TKey>? comparer, bool descending);
}
// public partial class Lookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable, ILookup<TKey, TElement>{
// internal Lookup() { }
// public int Count { get { throw null; } }
// public IEnumerable<TElement> this[TKey key] { get { throw null; } }
// public IEnumerable<TResult> ApplyResultSelector<TResult>(Func<TKey, IEnumerable<TElement>, TResult> resultSelector) { throw null; }
// public bool Contains(TKey key) { throw null; }
// public IEnumerator<IGrouping<TKey, TElement>> GetEnumerator() { throw null; }
// IEnumerator IEnumerable.GetEnumerator() { throw null; }
// }