1+ // Copyright (c) .NET Foundation. All rights reserved.
2+ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+ using System . Linq . Expressions ;
5+ using System . Reflection ;
6+
7+ namespace NuGet . Server . DataServices
8+ {
9+ public class NormalizeVersionInterceptor : ExpressionVisitor
10+ {
11+ private static readonly MemberInfo _versionMember = typeof ( ODataPackage ) . GetProperty ( "Version" ) ;
12+ private static readonly MemberInfo _normalizedVersionMember = typeof ( ODataPackage ) . GetProperty ( "NormalizedVersion" ) ;
13+
14+ protected override Expression VisitBinary ( BinaryExpression node )
15+ {
16+ // Change equality comparisons on Version to normalized comparisons on NormalizedVersion
17+ if ( node . NodeType == ExpressionType . Equal )
18+ {
19+ // Figure out which side is the target
20+ ConstantExpression constSide = ( node . Left as ConstantExpression ) ?? ( node . Right as ConstantExpression ) ;
21+ if ( constSide != null && constSide . Type == typeof ( string ) )
22+ {
23+ MemberExpression memberSide = ( node . Right as MemberExpression ) ?? ( node . Left as MemberExpression ) ;
24+ if ( memberSide != null && memberSide . Member == _versionMember )
25+ {
26+ // We have a "Package.Version == <constant>" expression!
27+
28+ // Transform the constant version into a normalized version
29+ SemanticVersion semanticVersion ;
30+ if ( SemanticVersion . TryParse ( ( string ) constSide . Value , out semanticVersion ) )
31+ {
32+ // Create a new expression that checks the new constant against NormalizedVersion instead
33+ return Expression . MakeBinary (
34+ ExpressionType . Equal ,
35+ left : Expression . Constant ( semanticVersion . ToNormalizedString ( ) ) ,
36+ right : Expression . MakeMemberAccess ( memberSide . Expression , _normalizedVersionMember ) ) ;
37+ }
38+ }
39+ }
40+ }
41+ return node ;
42+ }
43+ }
44+ }
0 commit comments