未验证 提交 4a6dff5c 编写于 作者: J Jared Parsons 提交者: GitHub

Merge pull request #30618 from agocke/inject-range-indexers

Inject range indexers
......@@ -2806,7 +2806,7 @@ private BoundExpression BindArrayCreationExpression(ArrayCreationExpressionSynta
var size = BindValue(arg, diagnostics, BindValueKind.RValue);
if (!size.HasAnyErrors)
{
size = ConvertToArrayIndex(size, node, diagnostics);
size = ConvertToArrayIndex(size, node, diagnostics, allowIndexAndRange: false);
if (IsNegativeConstantForArraySize(size))
{
Error(diagnostics, ErrorCode.ERR_NegativeArraySize, arg);
......@@ -6787,7 +6787,7 @@ private BoundExpression BindArrayAccess(ExpressionSyntax node, BoundExpression e
{
BoundExpression argument = arguments.Arguments[i];
BoundExpression index = ConvertToArrayIndex(argument, node, diagnostics);
BoundExpression index = ConvertToArrayIndex(argument, node, diagnostics, allowIndexAndRange: rank == 1);
convertedArguments[i] = index;
// NOTE: Dev10 only warns if rank == 1
......@@ -6803,10 +6803,15 @@ private BoundExpression BindArrayAccess(ExpressionSyntax node, BoundExpression e
}
}
return new BoundArrayAccess(node, expr, convertedArguments.AsImmutableOrNull(), arrayType.ElementType.TypeSymbol, hasErrors);
var resultType = rank == 1 &&
convertedArguments[0].Type == Compilation.GetWellKnownType(WellKnownType.System_Range)
? arrayType
: arrayType.ElementType.TypeSymbol;
return new BoundArrayAccess(node, expr, convertedArguments.AsImmutableOrNull(), resultType, hasErrors);
}
private BoundExpression ConvertToArrayIndex(BoundExpression index, SyntaxNode node, DiagnosticBag diagnostics)
private BoundExpression ConvertToArrayIndex(BoundExpression index, SyntaxNode node, DiagnosticBag diagnostics, bool allowIndexAndRange)
{
Debug.Assert(index != null);
......@@ -6825,7 +6830,14 @@ private BoundExpression ConvertToArrayIndex(BoundExpression index, SyntaxNode no
TryImplicitConversionToArrayIndex(index, SpecialType.System_Int64, node, diagnostics) ??
TryImplicitConversionToArrayIndex(index, SpecialType.System_UInt64, node, diagnostics);
if (result == null)
if (result is null && allowIndexAndRange)
{
result =
TryImplicitConversionToArrayIndex(index, WellKnownType.System_Index, node, diagnostics) ??
TryImplicitConversionToArrayIndex(index, WellKnownType.System_Range, node, diagnostics);
}
if (result is null)
{
// Give the error that would be given upon conversion to int32.
NamedTypeSymbol int32 = GetSpecialType(SpecialType.System_Int32, diagnostics, node);
......@@ -6841,21 +6853,53 @@ private BoundExpression ConvertToArrayIndex(BoundExpression index, SyntaxNode no
return result;
}
private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, WellKnownType wellKnownType, SyntaxNode node, DiagnosticBag diagnostics)
{
HashSet<DiagnosticInfo> useSiteDiagnostics = null;
TypeSymbol type = GetWellKnownType(wellKnownType, ref useSiteDiagnostics);
if (type.IsErrorType())
{
return null;
}
var attemptDiagnostics = DiagnosticBag.GetInstance();
var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
if (!(result is null))
{
diagnostics.AddRange(attemptDiagnostics);
}
attemptDiagnostics.Free();
return result;
}
private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, SpecialType specialType, SyntaxNode node, DiagnosticBag diagnostics)
{
DiagnosticBag attemptDiagnostics = DiagnosticBag.GetInstance();
TypeSymbol type = GetSpecialType(specialType, attemptDiagnostics, node);
var result = TryImplicitConversionToArrayIndex(expr, type, node, attemptDiagnostics);
if (!(result is null))
{
diagnostics.AddRange(attemptDiagnostics);
}
attemptDiagnostics.Free();
return result;
}
private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr, TypeSymbol targetType, SyntaxNode node, DiagnosticBag diagnostics)
{
Debug.Assert(expr != null);
Debug.Assert((object)type != null);
Debug.Assert((object)targetType != null);
HashSet<DiagnosticInfo> useSiteDiagnostics = null;
Conversion conversion = this.Conversions.ClassifyImplicitConversionFromExpression(expr, type, ref useSiteDiagnostics);
Conversion conversion = this.Conversions.ClassifyImplicitConversionFromExpression(expr, targetType, ref useSiteDiagnostics);
diagnostics.Add(node, useSiteDiagnostics);
if (!conversion.Exists)
{
attemptDiagnostics.Free();
return null;
}
......@@ -6864,12 +6908,9 @@ private BoundExpression TryImplicitConversionToArrayIndex(BoundExpression expr,
conversion = conversion.SetArrayIndexConversionForDynamic();
}
BoundExpression result = CreateConversion(expr.Syntax, expr, conversion, isCast: false, conversionGroupOpt: null, destination: type, diagnostics: attemptDiagnostics); // UNDONE: was cast?
BoundExpression result = CreateConversion(expr.Syntax, expr, conversion, isCast: false, conversionGroupOpt: null, destination: targetType, diagnostics); // UNDONE: was cast?
Debug.Assert(result != null); // If this ever fails (it shouldn't), then put a null-check around the diagnostics update.
diagnostics.AddRange(attemptDiagnostics);
attemptDiagnostics.Free();
return result;
}
......@@ -6914,7 +6955,7 @@ private BoundExpression BindPointerElementAccess(ExpressionSyntax node, BoundExp
BoundExpression index = arguments[0];
index = ConvertToArrayIndex(index, index.Syntax, diagnostics);
index = ConvertToArrayIndex(index, index.Syntax, diagnostics, allowIndexAndRange: false);
return new BoundPointerElementAccess(node, expr, index, CheckOverflowAtRuntime, pointedAtType, hasErrors);
}
......@@ -7114,6 +7155,43 @@ private BoundExpression BindIndexedPropertyAccess(SyntaxNode syntax, BoundExpres
if (!analyzedArguments.HasErrors)
{
// https://github.com/dotnet/roslyn/issues/30620
// Pretend like there are indexers that support range and index
if (receiverOpt?.Type.SpecialType == SpecialType.System_String &&
analyzedArguments.Arguments.Count == 1)
{
var argType = analyzedArguments.Arguments[0].Type;
TypeSymbol resultType = null;
if (argType == Compilation.GetWellKnownType(WellKnownType.System_Index))
{
resultType = GetSpecialType(SpecialType.System_Char, diagnostics, syntax);
}
else if (argType == Compilation.GetWellKnownType(WellKnownType.System_Range))
{
resultType = GetSpecialType(SpecialType.System_String, diagnostics, syntax);
}
if (!(resultType is null))
{
var args = analyzedArguments.Arguments.ToImmutable();
overloadResolutionResult.Free();
return new BoundIndexerAccess(
syntax,
receiverOpt,
candidates[0],
args,
argumentNames,
argumentRefKinds,
expanded: false,
argsToParamsOpt: default,
binderOpt: this,
useSetterForDefaultArgumentGeneration: false,
resultType,
hasErrors: false);
}
}
// Dev10 uses the "this" keyword as the method name for indexers.
var candidate = candidates[0];
var name = candidate.IsIndexer ? SyntaxFacts.GetText(SyntaxKind.ThisKeyword) : candidate.Name;
......
......@@ -1365,7 +1365,16 @@ public override BoundNode VisitArrayAccess(BoundArrayAccess node)
VisitRvalue(i);
}
_resultType = type?.ElementType ?? default;
if (node.Indices.Length == 1 &&
node.Indices[0].Type == compilation.GetWellKnownType(WellKnownType.System_Range))
{
_resultType = TypeSymbolWithAnnotations.Create(type);
}
else
{
_resultType = type?.ElementType ?? default;
}
return null;
}
......@@ -3687,7 +3696,16 @@ public override BoundNode VisitIndexerAccess(BoundIndexerAccess node)
// https://github.com/dotnet/roslyn/issues/29964 Update indexer based on inferred receiver type.
VisitArguments(node, node.Arguments, node.ArgumentRefKindsOpt, node.Indexer, node.ArgsToParamsOpt, node.Expanded);
_resultType = node.Indexer.Type;
// https://github.com/dotnet/roslyn/issues/30620 remove before shipping dev16
if (node.Arguments.Length == 1 &&
node.Arguments[0].Type == compilation.GetWellKnownType(WellKnownType.System_Range))
{
_resultType = TypeSymbolWithAnnotations.Create(node.Type);
}
else
{
_resultType = node.Indexer.Type;
}
return null;
}
......
......@@ -525,6 +525,136 @@ public override BoundNode VisitTypeOrInstanceInitializers(BoundTypeOrInstanceIni
return new BoundStatementList(node.Syntax, rewrittenStatements, node.HasErrors);
}
public override BoundNode VisitArrayAccess(BoundArrayAccess node)
{
// https://github.com/dotnet/roslyn/issues/30620
// If the array access index is of type System.Index or System.Range
// we need to emit code as if there were a real indexer, instead
// of a simple array element access.
if (node.Indices.Length != 1)
{
return base.VisitArrayAccess(node);
}
TypeSymbol rawIndexType = node.Indices[0].Type;
if (!(rawIndexType == _compilation.GetWellKnownType(WellKnownType.System_Index) ||
rawIndexType == _compilation.GetWellKnownType(WellKnownType.System_Range)))
{
return base.VisitArrayAccess(node);
}
var syntax = node.Syntax;
var F = _factory;
var indexLocal = F.StoreToTemp(
VisitExpression(node.Indices[0]),
out BoundAssignmentOperator indexAssign);
var arrayLocal = F.StoreToTemp(
VisitExpression(node.Expression),
out BoundAssignmentOperator arrayAssign);
var indexType = VisitType(node.Indices[0].Type);
var indexValueSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Index__Value);
var indexFromEndSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Index__FromEnd);
BoundExpression resultExpr;
if (indexType == _compilation.GetWellKnownType(WellKnownType.System_Index))
{
// array[Index] is translated to:
// index.FromEnd ? array[array.Length - index.Value] : array[index.Value]
var indexValueExpr = F.Property(indexLocal, indexValueSymbol);
resultExpr = F.Sequence(
ImmutableArray.Create<LocalSymbol>(
indexLocal.LocalSymbol,
arrayLocal.LocalSymbol),
ImmutableArray.Create<BoundExpression>(
indexAssign,
arrayAssign),
F.Conditional(
F.Property(indexLocal, indexFromEndSymbol),
F.ArrayAccess(arrayLocal, ImmutableArray.Create<BoundExpression>(F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.ArrayLength(arrayLocal),
indexValueExpr))),
F.ArrayAccess(arrayLocal, ImmutableArray.Create(indexValueExpr)),
node.Type));
}
else if (indexType == _compilation.GetWellKnownType(WellKnownType.System_Range))
{
// array[Range] is translated to:
// var start = range.Start.FromEnd ? array.Length - range.Start.Value : range.Start.Value;
// var end = range.End.FromEnd ? array.Length - range.End.Value : range.End.Value;
// var length = end - start;
// var newArr = new T[length];
// Array.Copy(array, start, newArr, 0, length);
// push newArray
var rangeStartSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Range__Start);
var rangeEndSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Range__End);
var arrayCopySymbol = F.WellKnownMethod(WellKnownMember.System_Array__Copy);
var startLocal = F.StoreToTemp(
F.Conditional(
F.Property(F.Property(indexLocal, rangeStartSymbol), indexFromEndSymbol),
F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.ArrayLength(arrayLocal),
F.Property(F.Property(indexLocal, rangeStartSymbol), indexValueSymbol)),
F.Property(F.Property(indexLocal, rangeStartSymbol), indexValueSymbol),
F.SpecialType(SpecialType.System_Int32)),
out BoundAssignmentOperator startAssign);
var endLocal = F.StoreToTemp(
F.Conditional(
F.Property(F.Property(indexLocal, rangeEndSymbol), indexFromEndSymbol),
F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.ArrayLength(arrayLocal),
F.Property(F.Property(indexLocal, rangeEndSymbol), indexValueSymbol)),
F.Property(F.Property(indexLocal, rangeEndSymbol), indexValueSymbol),
F.SpecialType(SpecialType.System_Int32)),
out BoundAssignmentOperator endAssign);
var lengthLocal = F.StoreToTemp(
F.Binary(BinaryOperatorKind.Subtraction, F.SpecialType(SpecialType.System_Int32), endLocal, startLocal),
out BoundAssignmentOperator lengthAssign);
var elementType = ((ArrayTypeSymbol)node.Type).ElementType.TypeSymbol;
var newArrLocal = F.StoreToTemp(F.Array(elementType, lengthLocal), out BoundAssignmentOperator newArrAssign);
var copyExpr = F.Call(null, arrayCopySymbol, ImmutableArray.Create<BoundExpression>(
arrayLocal,
startLocal,
newArrLocal,
F.Literal(0),
lengthLocal));
resultExpr = F.Sequence(
ImmutableArray.Create(
indexLocal.LocalSymbol,
arrayLocal.LocalSymbol,
startLocal.LocalSymbol,
endLocal.LocalSymbol,
lengthLocal.LocalSymbol,
newArrLocal.LocalSymbol),
ImmutableArray.Create<BoundExpression>(
indexAssign,
arrayAssign,
startAssign,
endAssign,
lengthAssign,
newArrAssign,
copyExpr),
newArrLocal);
}
else
{
throw ExceptionUtilities.Unreachable;
}
return resultExpr;
}
internal static bool IsFieldOrPropertyInitializer(BoundStatement initializer)
{
var syntax = initializer.Syntax;
......
......@@ -5,6 +5,7 @@
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp
{
......@@ -82,6 +83,101 @@ private BoundExpression VisitIndexerAccess(BoundIndexerAccess node, bool isLeftO
// NOTE: This is done later by MakeArguments, for now we just lower each argument.
ImmutableArray<BoundExpression> rewrittenArguments = VisitList(node.Arguments);
// https://github.com/dotnet/roslyn/issues/30620
if (rewrittenReceiver?.Type.SpecialType == SpecialType.System_String &&
rewrittenArguments.Length == 1 && rewrittenArguments[0].Type.SpecialType == SpecialType.None)
{
var F = _factory;
var indexLocal = F.StoreToTemp(rewrittenArguments[0], out BoundAssignmentOperator indexAssign);
var stringLocal = F.StoreToTemp(rewrittenReceiver, out BoundAssignmentOperator stringAssign);
var indexValueSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Index__Value);
var indexFromEndSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Index__FromEnd);
var argType = rewrittenArguments[0].Type;
if (argType == _compilation.GetWellKnownType(WellKnownType.System_Index))
{
// string[Index] is rewritten as:
// index.FromEnd ? s[s.Length - index.Value] : s[index.Value];
var indexValueExpr = F.Property(indexLocal, indexValueSymbol);
return F.Sequence(
ImmutableArray.Create<LocalSymbol>(
indexLocal.LocalSymbol,
stringLocal.LocalSymbol),
ImmutableArray.Create<BoundExpression>(
indexAssign,
stringAssign),
F.Conditional(
F.Property(indexLocal, indexFromEndSymbol),
F.Indexer(stringLocal, node.Indexer,
F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.Call(stringLocal, F.SpecialMethod(SpecialMember.System_String__Length)),
indexValueExpr)),
F.Indexer(stringLocal, node.Indexer, indexValueExpr),
F.SpecialType(SpecialType.System_Char)));
}
else if (argType == _compilation.GetWellKnownType(WellKnownType.System_Range))
{
// string[Range] is translated to:
// var start = range.Start.FromEnd ? array.Length - range.Start.Value : range.Start.Value;
// var end = range.End.FromEnd ? array.Length - range.End.Value : range.End.Value;
// string.Substring(start, end - start)
var rangeStartSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Range__Start);
var rangeEndSymbol = (PropertySymbol)F.WellKnownMember(WellKnownMember.System_Range__End);
var arrayCopySymbol = F.WellKnownMethod(WellKnownMember.System_Array__Copy);
var startLocal = F.StoreToTemp(
F.Conditional(
F.Property(F.Property(indexLocal, rangeStartSymbol), indexFromEndSymbol),
F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.Call(stringLocal, F.SpecialMethod(SpecialMember.System_String__Length)),
F.Property(F.Property(indexLocal, rangeStartSymbol), indexValueSymbol)),
F.Property(F.Property(indexLocal, rangeStartSymbol), indexValueSymbol),
F.SpecialType(SpecialType.System_Int32)),
out BoundAssignmentOperator startAssign);
var endLocal = F.StoreToTemp(
F.Conditional(
F.Property(F.Property(indexLocal, rangeEndSymbol), indexFromEndSymbol),
F.Binary(
BinaryOperatorKind.Subtraction,
F.SpecialType(SpecialType.System_Int32),
F.Call(stringLocal, F.SpecialMethod(SpecialMember.System_String__Length)),
F.Property(F.Property(indexLocal, rangeEndSymbol), indexValueSymbol)),
F.Property(F.Property(indexLocal, rangeEndSymbol), indexValueSymbol),
F.SpecialType(SpecialType.System_Int32)),
out BoundAssignmentOperator endAssign);
var substringExpr = F.Call(
stringLocal,
F.WellKnownMethod(WellKnownMember.System_String__Substring),
startLocal,
F.Binary(BinaryOperatorKind.Subtraction, F.SpecialType(SpecialType.System_Int32), endLocal, startLocal));
return F.Sequence(
ImmutableArray.Create(
indexLocal.LocalSymbol,
stringLocal.LocalSymbol,
startLocal.LocalSymbol,
endLocal.LocalSymbol),
ImmutableArray.Create<BoundExpression>(
indexAssign,
stringAssign,
startAssign,
endAssign),
substringExpr);
}
else
{
throw ExceptionUtilities.Unreachable;
}
}
return MakeIndexerAccess(
node.Syntax,
rewrittenReceiver,
......
......@@ -288,6 +288,12 @@ public BoundExpression Property(BoundExpression receiverOpt, PropertySymbol prop
return Call(receiverOpt, property.GetMethod); // TODO: should we use property.GetBaseProperty().GetMethod to ensure we generate a call to the overridden method?
}
public BoundExpression Indexer(BoundExpression receiverOpt, PropertySymbol property, BoundExpression arg0)
{
Debug.Assert((receiverOpt == null) == property.IsStatic);
return Call(receiverOpt, property.GetMethod, arg0); // TODO: should we use property.GetBaseProperty().GetMethod to ensure we generate a call to the overridden method?
}
public NamedTypeSymbol SpecialType(SpecialType st)
{
NamedTypeSymbol specialType = Compilation.GetSpecialType(st);
......
......@@ -884,6 +884,10 @@ public void AllWellKnownTypeMembers()
case WellKnownMember.System_ReadOnlySpan_T__get_Item:
case WellKnownMember.System_ReadOnlySpan_T__get_Length:
case WellKnownMember.System_Index__ctor:
case WellKnownMember.System_Index__FromEnd:
case WellKnownMember.System_Index__Value:
case WellKnownMember.System_Range__Start:
case WellKnownMember.System_Range__End:
case WellKnownMember.System_Range__All:
case WellKnownMember.System_Range__Create:
case WellKnownMember.System_Range__FromStart:
......
......@@ -10,6 +10,7 @@ internal enum WellKnownMember
System_Array__get_Length,
System_Array__Empty,
System_Array__Copy,
System_Convert__ToBooleanDecimal,
System_Convert__ToBooleanInt32,
......@@ -413,6 +414,7 @@ internal enum WellKnownMember
System_Runtime_CompilerServices_TupleElementNamesAttribute__ctorTransformNames,
System_String__Format_IFormatProvider,
System_String__Substring,
Microsoft_CodeAnalysis_Runtime_Instrumentation__CreatePayloadForMethodsSpanningSingleFile,
Microsoft_CodeAnalysis_Runtime_Instrumentation__CreatePayloadForMethodsSpanningMultipleFiles,
......@@ -448,6 +450,10 @@ internal enum WellKnownMember
Microsoft_CodeAnalysis_EmbeddedAttribute__ctor,
System_Index__ctor,
System_Index__FromEnd,
System_Index__Value,
System_Range__Start,
System_Range__End,
System_Range__Create,
System_Range__ToEnd,
System_Range__FromStart,
......
......@@ -45,6 +45,18 @@ static WellKnownMembers()
0, // Method Signature
(byte)SignatureTypeCode.SZArray, (byte)SignatureTypeCode.GenericMethodParameter, 0, // Return Type
// System_Array__Copy
(byte)(MemberFlags.Method | MemberFlags.Static), // Flags
(byte)WellKnownType.System_Array, // DeclaringTypeId
0, // Arity
5, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Void, // Return Type
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Array,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Array,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
// System_Convert__ToBooleanDecimal
(byte)(MemberFlags.Method | MemberFlags.Static), // Flags
(byte)WellKnownType.System_Convert, // DeclaringTypeId
......@@ -2866,6 +2878,15 @@ static WellKnownMembers()
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_String,
(byte)SignatureTypeCode.SZArray, (byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Object,
// System_String__Substring
(byte)MemberFlags.Method, // Flags
(byte)SpecialType.System_String, // DeclaringTypeId
0, // Arity
2, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_String, // Return Type
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
// Microsoft_CodeAnalysis_Runtime_Instrumentation__CreatePayloadForMethodsSpanningSingleFile
(byte)(MemberFlags.Method | MemberFlags.Static), // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.Microsoft_CodeAnalysis_Runtime_Instrumentation - WellKnownType.ExtSentinel), // DeclaringTypeId
......@@ -3070,6 +3091,34 @@ static WellKnownMembers()
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32,
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Boolean,
// System_Index__FromEnd
(byte)(MemberFlags.Property), // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Index - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Boolean, // Return Type
// System_Index__Value
(byte)(MemberFlags.Property), // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Index - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Int32, // Return type
// System_Range__Start
(byte)MemberFlags.Property, // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Range - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Index - WellKnownType.ExtSentinel), // Return Type: System.Index
// System_Range__End
(byte)MemberFlags.Property, // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Range - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Index - WellKnownType.ExtSentinel), // Return Type: System.Index
// System_Range__Create
(byte)(MemberFlags.Method | MemberFlags.Static), // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Range - WellKnownType.ExtSentinel), // DeclaringTypeId
......@@ -3273,6 +3322,7 @@ static WellKnownMembers()
"Pow", // System_Math__PowDoubleDouble
"get_Length", // System_Array__get_Length
"Empty", // System_Array__Empty
"Copy", // System_Array__Copy
"ToBoolean", // System_Convert__ToBooleanDecimal
"ToBoolean", // System_Convert__ToBooleanInt32
"ToBoolean", // System_Convert__ToBooleanUInt32
......@@ -3622,6 +3672,8 @@ static WellKnownMembers()
".ctor", // System_Runtime_CompilerServices_TupleElementNamesAttribute__ctorTransformNames
"Format", // System_String__Format_IFormatProvider
"Substring", // System_string__Substring
"CreatePayload", // Microsoft_CodeAnalysis_Runtime_Instrumentation__CreatePayloadForMethodsSpanningSingleFile
"CreatePayload", // Microsoft_CodeAnalysis_Runtime_Instrumentation__CreatePayloadForMethodsSpanningMultipleFiles
......@@ -3650,6 +3702,10 @@ static WellKnownMembers()
".ctor", // Microsoft_CodeAnalysis_EmbeddedAttribute__ctor
".ctor", // System_Index__ctor
"FromEnd", // System_Index__FromEnd
"Value", // System_Index__Value
"Start", // System_Range__Start
"End", // System_Range__End
"Create", // System_Range__Create
"ToEnd", // System_Range__ToEnd
"FromStart", // System_Range__FromStart
......
......@@ -658,6 +658,10 @@ End Namespace
WellKnownMember.System_Runtime_CompilerServices_IsByRefLikeAttribute__ctor,
WellKnownMember.System_Runtime_CompilerServices_IsUnmanagedAttribute__ctor,
WellKnownMember.System_Index__ctor,
WellKnownMember.System_Index__FromEnd,
WellKnownMember.System_Index__Value,
WellKnownMember.System_Range__Start,
WellKnownMember.System_Range__End,
WellKnownMember.System_Range__All,
WellKnownMember.System_Range__Create,
WellKnownMember.System_Range__FromStart,
......@@ -781,6 +785,10 @@ End Namespace
WellKnownMember.System_Runtime_CompilerServices_IsByRefLikeAttribute__ctor,
WellKnownMember.System_Runtime_CompilerServices_IsUnmanagedAttribute__ctor,
WellKnownMember.System_Index__ctor,
WellKnownMember.System_Index__FromEnd,
WellKnownMember.System_Index__Value,
WellKnownMember.System_Range__Start,
WellKnownMember.System_Range__End,
WellKnownMember.System_Range__All,
WellKnownMember.System_Range__Create,
WellKnownMember.System_Range__FromStart,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册