diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.AnonymousTypeSymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.AnonymousTypeSymbolKey.cs index 00f407ff446177af1b10dc2b39221eb8e8892098..844db2b799eb309538cbe1cf4f07ebb5491a406c 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.AnonymousTypeSymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.AnonymousTypeSymbolKey.cs @@ -28,13 +28,12 @@ public static void Create(INamedTypeSymbol symbol, SymbolKeyWriter visitor) public static SymbolKeyResolution Resolve(SymbolKeyReader reader) { - using var propertyTypes = reader.ReadSymbolArray(); + using var propertyTypes = reader.ReadSymbolKeyArray(); using var propertyNames = reader.ReadStringArray(); using var propertyIsReadOnly = reader.ReadBooleanArray(); using var propertyLocations = reader.ReadLocationArray(); - Debug.Assert(propertyTypes.Count == 0 || propertyTypes.Count == propertyNames.Count); - if (propertyTypes.Count == propertyNames.Count) + if (propertyTypes.IsDefault) { try { diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.ErrorTypeSymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.ErrorTypeSymbolKey.cs index 64b55cc123f73f610b7578c494ff6693c6e7b9c1..7cf5633ffdc6486a64e2cc0e61fe6ac92079ede4 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.ErrorTypeSymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.ErrorTypeSymbolKey.cs @@ -17,11 +17,11 @@ public static void Create(INamedTypeSymbol symbol, SymbolKeyWriter visitor) if (!symbol.Equals(symbol.ConstructedFrom)) { - visitor.WriteSymbolArray(symbol.TypeArguments); + visitor.WriteSymbolKeyArray(symbol.TypeArguments); } else { - visitor.WriteSymbolArray(ImmutableArray.Empty); + visitor.WriteSymbolKeyArray(ImmutableArray.Empty); } } @@ -31,49 +31,38 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) var containingSymbolResolution = reader.ReadSymbolKey(); var arity = reader.ReadInteger(); - using var typeArguments = reader.ReadSymbolArray(); - if (typeArguments.Count != arity) + using var typeArguments = reader.ReadSymbolKeyArray(); + if (typeArguments.IsDefault) { return default; } - using var errorTypes = CreateErrorTypes(reader, containingSymbolResolution, name, arity); - if (arity == 0) - { - return CreateSymbolInfo(errorTypes); - } - using var result = PooledArrayBuilder.GetInstance(); - var typeArgumentsArray = typeArguments.Builder.ToArray(); - foreach (var type in errorTypes) - { - result.AddIfNotNull(type.Construct(typeArgumentsArray)); - } - - return CreateSymbolInfo(result); - } - - private static PooledArrayBuilder CreateErrorTypes( - SymbolKeyReader reader, - SymbolKeyResolution containingSymbolResolution, string name, int arity) - { - var errorTypes = PooledArrayBuilder.GetInstance(); + var typeArgumentsArray = arity > 0 ? typeArguments.Builder.ToArray() : null; foreach (var container in containingSymbolResolution) { if (container is INamespaceOrTypeSymbol containerTypeOrNS) { - errorTypes.AddIfNotNull(reader.Compilation.CreateErrorTypeSymbol(containerTypeOrNS, name, arity)); + result.AddIfNotNull(Construct( + reader, containerTypeOrNS, name, arity, typeArgumentsArray)); } } // Always ensure at least one error type was created. - if (errorTypes.Count == 0) + if (result.Count == 0) { - errorTypes.AddIfNotNull(reader.Compilation.CreateErrorTypeSymbol(null, name, arity)); + result.AddIfNotNull(Construct( + reader, containerTypeOrNS: null, name, arity, typeArgumentsArray)); } - return errorTypes; + return CreateSymbolInfo(result); + } + + private static INamedTypeSymbol Construct(SymbolKeyReader reader, INamespaceOrTypeSymbol containerTypeOrNS, string name, int arity, ITypeSymbol[] typeArguments) + { + var result = reader.Compilation.CreateErrorTypeSymbol(containerTypeOrNS, name, arity); + return typeArguments != null ? result.Construct(typeArguments) : result; } } } diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.MethodSymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.MethodSymbolKey.cs index a46b7f4e0078b723e09b45b08d52717d86828a7a..e521e0b6adf8d94bc61ba37d38bb335e96ce7c64 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.MethodSymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.MethodSymbolKey.cs @@ -48,15 +48,16 @@ private static class ConstructedMethodSymbolKey public static void Create(IMethodSymbol symbol, SymbolKeyWriter visitor) { visitor.WriteSymbolKey(symbol.ConstructedFrom); - visitor.WriteSymbolArray(symbol.TypeArguments); + visitor.WriteSymbolKeyArray(symbol.TypeArguments); } public static SymbolKeyResolution Resolve(SymbolKeyReader reader) { var constructedFrom = reader.ReadSymbolKey(); - using var typeArguments = reader.ReadSymbolArray(); + using var typeArguments = reader.ReadSymbolKeyArray(); - if (constructedFrom.SymbolCount == 0) + if (constructedFrom.SymbolCount == 0 || + typeArguments.IsDefault) { return default; } @@ -164,7 +165,7 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) // read out the values. We don't actually need to use them, but we have // to effectively read past them in the string. - using (reader.ReadSymbolArray()) + using (reader.ReadSymbolKeyArray()) { _ = reader.ReadSymbolKey(); } @@ -213,7 +214,7 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) private static IMethodSymbol Resolve( SymbolKeyReader reader, bool isPartialMethodImplementationPart, IMethodSymbol method) { - using var originalParameterTypes = reader.ReadSymbolArray(); + using var originalParameterTypes = reader.ReadSymbolKeyArray(); var returnType = (ITypeSymbol)reader.ReadSymbolKey().GetAnySymbol(); if (reader.ParameterTypesMatch(method.OriginalDefinition.Parameters, originalParameterTypes)) diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.NamedTypeSymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.NamedTypeSymbolKey.cs index a024671c67f936b4672114df452a34367af68e60..ad06e25455bc60d2cdf1f303bc5c889be62dd551 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.NamedTypeSymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.NamedTypeSymbolKey.cs @@ -18,13 +18,11 @@ public static void Create(INamedTypeSymbol symbol, SymbolKeyWriter visitor) if (!symbol.Equals(symbol.ConstructedFrom) && !symbol.IsUnboundGenericType) { - visitor.WriteBoolean(/*instantiate*/true); - visitor.WriteSymbolArray(symbol.TypeArguments); + visitor.WriteSymbolKeyArray(symbol.TypeArguments); } else { - visitor.WriteBoolean(/*instantiate*/false); - visitor.WriteSymbolArray(ImmutableArray.Empty); + visitor.WriteSymbolKeyArray(ImmutableArray.Empty); } } @@ -34,10 +32,9 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) var containingSymbolResolution = reader.ReadSymbolKey(); var arity = reader.ReadInteger(); var isUnboundGenericType = reader.ReadBoolean(); - var instantiate = reader.ReadBoolean(); - using var typeArguments = reader.ReadSymbolArray(); + using var typeArguments = reader.ReadSymbolKeyArray(); - if (instantiate && arity != typeArguments.Count) + if (typeArguments.IsDefault) { return default; } @@ -52,7 +49,7 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) { Resolve( result, nsOrType, metadataName, arity, - isUnboundGenericType, instantiate, typeArgumentArray); + isUnboundGenericType, typeArgumentArray); } } @@ -65,12 +62,11 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) string metadataName, int arity, bool isUnboundGenericType, - bool instantiate, ITypeSymbol[] typeArguments) { foreach (var type in container.GetTypeMembers(GetName(metadataName), arity)) { - var currentType = instantiate ? type.Construct(typeArguments) : type; + var currentType = typeArguments.Length > 0 ? type.Construct(typeArguments) : type; currentType = isUnboundGenericType ? currentType.ConstructUnboundGenericType() : currentType; result.AddIfNotNull(currentType); diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PooledArrayBuilder.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PooledArrayBuilder.cs index cd0db8d93574558a8094a110d909fc1926796b62..3d7f977967147926ce779f2c1b69ac1118066d98 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PooledArrayBuilder.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PooledArrayBuilder.cs @@ -15,6 +15,7 @@ internal partial struct SymbolKey private PooledArrayBuilder(ArrayBuilder builder) => Builder = builder; + public bool IsDefault => Builder == null; public int Count => Builder.Count; public T this[int index] => Builder[index]; @@ -26,7 +27,7 @@ public void AddIfNotNull(T value) } } - public void Dispose() => Builder.Free(); + public void Dispose() => Builder?.Free(); public ImmutableArray ToImmutable() => Builder.ToImmutable(); diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PropertySymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PropertySymbolKey.cs index a3382e4878ff38592b6b617d5b5fcf9999f8cdbb..4454881c7506a1df91b7e4e759f3639eb2692b65 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PropertySymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.PropertySymbolKey.cs @@ -24,10 +24,9 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) var isIndexer = reader.ReadBoolean(); using var refKinds = reader.ReadRefKindArray(); - using var parameterTypes = reader.ReadSymbolArray(); + using var parameterTypes = reader.ReadSymbolKeyArray(); - Debug.Assert(parameterTypes.Count == 0 || parameterTypes.Count == refKinds.Count); - if (refKinds.Count != parameterTypes.Count) + if (parameterTypes.IsDefault) { return default; } diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyReader.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyReader.cs index de5af9419eec0264f21b71d0434c7dacfefcebcb..2e0fe940c0b55d91e3755318b586b7b7bfcd55fb 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyReader.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyReader.cs @@ -340,7 +340,7 @@ public override void Dispose() ImmutableArray parameters, PooledArrayBuilder originalParameterTypes) { - if (parameters.Length != originalParameterTypes.Count) + if (originalParameterTypes.IsDefault || parameters.Length != originalParameterTypes.Count) { return false; } @@ -455,12 +455,12 @@ private SymbolKeyResolution ReadWorker(SymbolKeyType type) /// /// Reads an array of symbols out from the key. Note: the number of symbols returned - /// will either be the same as the original amount writtern, or it will be zero. It will - /// never be less or more. Zero will be returned if the original array written had zero - /// elements, or if any elements could not be resolved to the requested - /// type in the provided . + /// will either be the same as the original amount writtern, or default will be + /// returned. It will never be less or more. default will be returned if any + /// elements could not be resolved to the requested type + /// in the provided . /// - public PooledArrayBuilder ReadSymbolArray() where TSymbol : ISymbol + public PooledArrayBuilder ReadSymbolKeyArray() where TSymbol : ISymbol { using var resolutions = ReadArray(_readSymbolKey); @@ -473,8 +473,7 @@ private SymbolKeyResolution ReadWorker(SymbolKeyType type) } else { - result.Builder.Clear(); - break; + return default; } } diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyWriter.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyWriter.cs index b014c38f511044b27f5fa62e08924520485a1282..15739610f8f8b8e64198e6da16f2cda63c8e079d 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyWriter.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.SymbolKeyWriter.cs @@ -265,7 +265,7 @@ internal void WriteLocation(Location location) /// Writes out the provided symbols to the key. The array provided must not /// be default. /// - internal void WriteSymbolArray(ImmutableArray symbols) + internal void WriteSymbolKeyArray(ImmutableArray symbols) where TSymbol : ISymbol { WriteArray(symbols, _writeSymbolKey); diff --git a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.TupleTypeSymbolKey.cs b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.TupleTypeSymbolKey.cs index ca3a70137f8d8dc8401b43581ac5b29f41b2d6be..4f04fad86728a5d738a1c5cc0adff728eded5f37 100644 --- a/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.TupleTypeSymbolKey.cs +++ b/src/Workspaces/Core/Portable/SymbolKey/SymbolKey.TupleTypeSymbolKey.cs @@ -52,12 +52,11 @@ public static SymbolKeyResolution Resolve(SymbolKeyReader reader) var isError = reader.ReadBoolean(); if (isError) { - using var elementTypes = reader.ReadSymbolArray(); + using var elementTypes = reader.ReadSymbolKeyArray(); using var elementNames = reader.ReadStringArray(); var elementLocations = ReadElementLocations(reader); - Debug.Assert(elementTypes.Count == 0 || elementTypes.Count == elementNames.Count); - if (elementTypes.Count == elementNames.Count) + if (elementTypes.IsDefault) { try {