Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ static ImmutableArray<DiagnosticDescriptor> GetSupportedDiagnostics ()
diagDescriptorsArrayBuilder.Add (DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.DynamicallyAccessedMembersMismatchOnImplicitThisBetweenOverrides));
diagDescriptorsArrayBuilder.Add (DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.DynamicallyAccessedMembersConflictsBetweenPropertyAndAccessor));
diagDescriptorsArrayBuilder.Add (DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.PropertyAccessorParameterInLinqExpressionsCannotBeStaticallyDetermined));
diagDescriptorsArrayBuilder.Add (DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.MakeGenericType));
diagDescriptorsArrayBuilder.Add (DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.MakeGenericMethod));
return diagDescriptorsArrayBuilder.ToImmutable ();

void AddRange (DiagnosticId first, DiagnosticId last)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ internal readonly partial struct GenericParameterProxy
{
public GenericParameterProxy (ITypeParameterSymbol typeParameterSymbol) => TypeParameterSymbol = typeParameterSymbol;

internal partial bool HasDefaultConstructorConstraint () =>
TypeParameterSymbol.HasConstructorConstraint |
TypeParameterSymbol.HasValueTypeConstraint |
TypeParameterSymbol.HasUnmanagedTypeConstraint;

public readonly ITypeParameterSymbol TypeParameterSymbol;

public override string ToString () => TypeParameterSymbol.ToString ();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@ partial record GenericParameterValue
{
public GenericParameterValue (ITypeParameterSymbol typeParameterSymbol) => GenericParameter = new (typeParameterSymbol);

public partial bool HasDefaultConstructorConstraint () =>
GenericParameter.TypeParameterSymbol.HasConstructorConstraint |
GenericParameter.TypeParameterSymbol.HasValueTypeConstraint |
GenericParameter.TypeParameterSymbol.HasUnmanagedTypeConstraint;

public override DynamicallyAccessedMemberTypes DynamicallyAccessedMemberTypes => GenericParameter.TypeParameterSymbol.GetDynamicallyAccessedMemberTypes ();

public override IEnumerable<string> GetDiagnosticArgumentsForAnnotationMismatch ()
Expand Down
14 changes: 14 additions & 0 deletions src/ILLink.RoslynAnalyzer/TrimAnalysis/MethodProxy.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Collections.Immutable;
using ILLink.RoslynAnalyzer;
using Microsoft.CodeAnalysis;

Expand Down Expand Up @@ -29,6 +30,19 @@ internal partial bool HasParameterOfType (int parameterIndex, string fullTypeNam

internal partial bool HasGenericParametersCount (int genericParameterCount) => Method.TypeParameters.Length == genericParameterCount;

internal partial ImmutableArray<GenericParameterProxy> GetGenericParameters ()
{
if (Method.TypeParameters.IsEmpty)
return ImmutableArray<GenericParameterProxy>.Empty;

var builder = ImmutableArray.CreateBuilder<GenericParameterProxy> (Method.TypeParameters.Length);
foreach (var typeParameter in Method.TypeParameters) {
builder.Add (new GenericParameterProxy (typeParameter));
}

return builder.ToImmutableArray ();
}

internal partial bool IsStatic () => Method.IsStatic;

internal partial bool ReturnsVoid () => Method.ReturnType.SpecialType == SpecialType.System_Void;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,19 @@

namespace ILLink.RoslynAnalyzer.TrimAnalysis
{
public readonly record struct TrimAnalysisAssignmentPattern (
MultiValue Source,
MultiValue Target,
IOperation Operation)
public readonly record struct TrimAnalysisAssignmentPattern
{
public MultiValue Source { init; get; }
public MultiValue Target { init; get; }
public IOperation Operation { init; get; }

public TrimAnalysisAssignmentPattern (MultiValue source, MultiValue target, IOperation operation)
{
Source = source.Clone ();
Target = target.Clone ();
Operation = operation;
}

public TrimAnalysisAssignmentPattern Merge (ValueSetLattice<SingleValue> lattice, TrimAnalysisAssignmentPattern other)
{
Debug.Assert (Operation == other.Operation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,36 @@

namespace ILLink.RoslynAnalyzer.TrimAnalysis
{
public readonly record struct TrimAnalysisMethodCallPattern (
IMethodSymbol CalledMethod,
MultiValue Instance,
ImmutableArray<MultiValue> Arguments,
IOperation Operation,
ISymbol OwningSymbol)
public readonly record struct TrimAnalysisMethodCallPattern
{
public IMethodSymbol CalledMethod { init; get; }
public MultiValue Instance { init; get; }
public ImmutableArray<MultiValue> Arguments { init; get; }
public IOperation Operation { init; get; }
public ISymbol OwningSymbol { init; get; }

public TrimAnalysisMethodCallPattern (
IMethodSymbol calledMethod,
MultiValue instance,
ImmutableArray<MultiValue> arguments,
IOperation operation,
ISymbol owningSymbol)
{
CalledMethod = calledMethod;
Instance = instance.Clone ();
if (arguments.IsEmpty) {
Arguments = ImmutableArray<MultiValue>.Empty;
} else {
var builder = ImmutableArray.CreateBuilder<MultiValue> ();
foreach (var argument in arguments) {
builder.Add (argument.Clone ());
}
Arguments = builder.ToImmutableArray ();
}
Operation = operation;
OwningSymbol = owningSymbol;
}

public TrimAnalysisMethodCallPattern Merge (ValueSetLattice<SingleValue> lattice, TrimAnalysisMethodCallPattern other)
{
Debug.Assert (Operation == other.Operation);
Expand Down
2 changes: 2 additions & 0 deletions src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ public override void HandleAssignment (MultiValue source, MultiValue target, IOp
// TODO: consider not tracking patterns unless the target is something
// annotated with DAMT.
TrimAnalysisPatterns.Add (
// This will copy the values if necessary
new TrimAnalysisAssignmentPattern (source, target, operation),
isReturnValue: false
);
Expand Down Expand Up @@ -264,6 +265,7 @@ public override MultiValue HandleMethodCall (IMethodSymbol calledMethod, MultiVa
}
}

// This will copy the values if necessary
TrimAnalysisPatterns.Add (new TrimAnalysisMethodCallPattern (
calledMethod,
instance,
Expand Down
15 changes: 15 additions & 0 deletions src/ILLink.RoslynAnalyzer/TrimAnalysis/TypeProxy.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Collections.Immutable;
using ILLink.RoslynAnalyzer;
using Microsoft.CodeAnalysis;

Expand All @@ -10,6 +11,20 @@ internal readonly partial struct TypeProxy
{
public TypeProxy (ITypeSymbol type) => Type = type;

internal partial ImmutableArray<GenericParameterProxy> GetGenericParameters ()
{
if (Type is not INamedTypeSymbol namedType ||
namedType.TypeParameters.IsEmpty)
return ImmutableArray<GenericParameterProxy>.Empty;

var builder = ImmutableArray.CreateBuilder<GenericParameterProxy> (namedType.TypeParameters.Length);
foreach (var typeParameter in namedType.TypeParameters) {
builder.Add (new GenericParameterProxy (typeParameter));
}

return builder.ToImmutableArray ();
}

public readonly ITypeSymbol Type;

public string Name { get => Type.MetadataName; }
Expand Down
2 changes: 0 additions & 2 deletions src/ILLink.Shared/TrimAnalysis/GenericParameterValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,5 @@ namespace ILLink.Shared.TrimAnalysis
sealed partial record GenericParameterValue : ValueWithDynamicallyAccessedMembers
{
public readonly GenericParameterProxy GenericParameter;

public partial bool HasDefaultConstructorConstraint ();
}
}
Loading