From 64313c438ad69e43e801e849c7bba8392beba39b Mon Sep 17 00:00:00 2001 From: gafter Date: Thu, 6 Jul 2017 14:01:59 -0700 Subject: [PATCH] First stab at #20648 --- .../CSharp/Portable/Symbols/FieldSymbol.cs | 2 +- .../Portable/Symbols/NamedTypeSymbol.cs | 4 +++ .../Symbols/SubstitutedFieldSymbol.cs | 15 ++++----- .../CSharp/Portable/Symbols/Symbol.cs | 1 + .../Symbols/Tuples/TupleTypeSymbol.cs | 33 +++++++++++++++---- .../Test/Emit/CodeGen/CodeGenTupleTest.cs | 6 ++-- 6 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Symbols/FieldSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/FieldSymbol.cs index a430ca8d253d5..8e1167fba1ee7 100644 --- a/src/Compilers/CSharp/Portable/Symbols/FieldSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/FieldSymbol.cs @@ -310,7 +310,7 @@ internal FieldSymbol AsMember(NamedTypeSymbol newOwner) { Debug.Assert(this.IsDefinition); Debug.Assert(ReferenceEquals(newOwner.OriginalDefinition, this.ContainingSymbol.OriginalDefinition)); - return (newOwner == this.ContainingSymbol) ? this : new SubstitutedFieldSymbol(newOwner as SubstitutedNamedTypeSymbol, this); + return (newOwner == this.ContainingSymbol) ? this : new SubstitutedFieldSymbol(newOwner, this); } #region Use-Site Diagnostics diff --git a/src/Compilers/CSharp/Portable/Symbols/NamedTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/NamedTypeSymbol.cs index bee7216bad11e..ff8bb549e2ab0 100644 --- a/src/Compilers/CSharp/Portable/Symbols/NamedTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/NamedTypeSymbol.cs @@ -684,6 +684,10 @@ internal override bool Equals(TypeSymbol t2, TypeCompareKind comparison) if (this.Equals(t2, comparison)) return true; } } + else + { + if (this.IsTupleType != t2.IsTupleType) return false; + } NamedTypeSymbol other = t2 as NamedTypeSymbol; if ((object)other == null) return false; diff --git a/src/Compilers/CSharp/Portable/Symbols/SubstitutedFieldSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/SubstitutedFieldSymbol.cs index 0902aea31b41a..043ca1a3d3ad5 100644 --- a/src/Compilers/CSharp/Portable/Symbols/SubstitutedFieldSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/SubstitutedFieldSymbol.cs @@ -1,25 +1,22 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using Microsoft.CodeAnalysis.CSharp.Emit; +using Roslyn.Utilities; using System.Collections.Immutable; +using System.Diagnostics; using System.Threading; -using Microsoft.CodeAnalysis.CSharp.Symbols; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Text; -using Roslyn.Utilities; -using Microsoft.CodeAnalysis.CSharp.Emit; -using System.Globalization; namespace Microsoft.CodeAnalysis.CSharp.Symbols { internal sealed class SubstitutedFieldSymbol : WrappedFieldSymbol { - private readonly SubstitutedNamedTypeSymbol _containingType; + private readonly NamedTypeSymbol _containingType; private TypeSymbol _lazyType; - internal SubstitutedFieldSymbol(SubstitutedNamedTypeSymbol containingType, FieldSymbol substitutedFrom) + internal SubstitutedFieldSymbol(NamedTypeSymbol containingType, FieldSymbol substitutedFrom) : base((FieldSymbol)substitutedFrom.OriginalDefinition) { + Debug.Assert(containingType.TypeSubstitution != null); _containingType = containingType; } diff --git a/src/Compilers/CSharp/Portable/Symbols/Symbol.cs b/src/Compilers/CSharp/Portable/Symbols/Symbol.cs index 6a827a51f742b..75948d3cd55fd 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Symbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Symbol.cs @@ -385,6 +385,7 @@ internal static ImmutableArray GetDeclaringSyntaxReferenceHelpe /// the "value" parameter for a property setter, /// the parameters on indexer accessor methods (not on the indexer itself), /// methods in anonymous types, + /// tuple types, /// public virtual bool IsImplicitlyDeclared { diff --git a/src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs index 273dde6228872..9609f11457ad5 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Tuples/TupleTypeSymbol.cs @@ -1146,6 +1146,11 @@ public override Symbol ContainingSymbol } } + /// + /// The locations in source where the tuple type originated. Note that, unlike for most + /// other constructed types, this differs from the locations of the underlying type that + /// the tuple type was constructed from. + /// public override ImmutableArray Locations { get @@ -1266,7 +1271,7 @@ public override int Arity { get { - return 0; + return _underlyingType.Arity; } } @@ -1274,20 +1279,28 @@ public override ImmutableArray TypeParameters { get { - return ImmutableArray.Empty; + return _underlyingType.TypeParameters; + } + } + + internal override TypeMap TypeSubstitution + { + get + { + return _underlyingType.TypeSubstitution; } } public override ImmutableArray GetTypeArgumentCustomModifiers(int ordinal) { - return GetEmptyTypeArgumentCustomModifiers(ordinal); + return _underlyingType.GetTypeArgumentCustomModifiers(ordinal); } internal override bool HasTypeArgumentsCustomModifiers { get { - return false; + return _underlyingType.HasTypeArgumentsCustomModifiers; } } @@ -1295,7 +1308,7 @@ internal override ImmutableArray TypeArgumentsNoUseSiteDiagnostics { get { - return ImmutableArray.Empty; + return _underlyingType.TypeArgumentsNoUseSiteDiagnostics; } } @@ -1303,7 +1316,15 @@ public override NamedTypeSymbol ConstructedFrom { get { - return this; + return _underlyingType.ConstructedFrom; + } + } + + public override NamedTypeSymbol OriginalDefinition + { + get + { + return _underlyingType.OriginalDefinition; } } diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs index 7f80c36091a6a..b8dcf78dbc525 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs @@ -11344,8 +11344,10 @@ static void Main() Assert.False(m1Tuple.IsImplicitlyDeclared); Assert.True(m1Tuple.IsTupleType); Assert.Equal("System.ValueTuple", m1Tuple.TupleUnderlyingType.ToTestDisplayString()); - Assert.Same(m1Tuple, m1Tuple.ConstructedFrom); - Assert.Same(m1Tuple, m1Tuple.OriginalDefinition); + Assert.NotSame(m1Tuple, m1Tuple.ConstructedFrom); + Assert.Same(m1Tuple.ConstructedFrom, m1Tuple.TupleUnderlyingType.ConstructedFrom); + Assert.NotSame(m1Tuple, m1Tuple.OriginalDefinition); + Assert.Same(m1Tuple.OriginalDefinition, m1Tuple.TupleUnderlyingType.OriginalDefinition); AssertTupleTypeEquality(m1Tuple); Assert.Same(m1Tuple.TupleUnderlyingType.ContainingSymbol, m1Tuple.ContainingSymbol); Assert.Null(m1Tuple.GetUseSiteDiagnostic());