@@ -22,8 +22,6 @@ sealed class ApiInvocationProcessor(
2222 INameProvider nameProvider )
2323 : IApiInvocationProcessor
2424{
25- private static readonly char [ ] TypeNamePartsSeparators = [ '.' ] ;
26-
2725 public void ProcessInvocation (
2826 IMetadataVisitor metadataVisitor ,
2927 SemanticModel semanticModel ,
@@ -1138,17 +1136,20 @@ private void VisitFactory(
11381136 var factoryApiWalker = factoryApiWalkerFactory ( ) ;
11391137 factoryApiWalker . Initialize ( semanticModel , contextParameter , lambdaExpression ) ;
11401138 factoryApiWalker . Visit ( lambdaExpression ) ;
1139+ var contextSymbol = contextParameter . SyntaxTree == semanticModel . SyntaxTree
1140+ ? semanticModel . GetDeclaredSymbol ( contextParameter )
1141+ : null ;
11411142 var resolversHasContextTag = false ;
11421143 var resolvers = factoryApiWalker . Meta
11431144 . Where ( i => i . Kind == FactoryMetaKind . Resolver )
1144- . Select ( meta => CreateResolver ( semanticModel , resultType , meta , contextParameter , ref resolversHasContextTag , localVariableRenamingRewriter ) )
1145+ . Select ( meta => CreateResolver ( semanticModel , resultType , meta , contextParameter , contextSymbol , ref resolversHasContextTag , localVariableRenamingRewriter ) )
11451146 . Where ( i => i != default )
11461147 . ToImmutableArray ( ) ;
11471148
11481149 var initializersHasContextTag = false ;
11491150 var initializers = factoryApiWalker . Meta
11501151 . Where ( i => i . Kind == FactoryMetaKind . Initializer )
1151- . Select ( meta => CreateInitializer ( semanticModel , resultType , meta , contextParameter , ref initializersHasContextTag , localVariableRenamingRewriter ) )
1152+ . Select ( meta => CreateInitializer ( semanticModel , resultType , meta , contextParameter , contextSymbol , ref initializersHasContextTag , localVariableRenamingRewriter ) )
11521153 . Where ( i => i != default )
11531154 . ToImmutableArray ( ) ;
11541155
@@ -1170,12 +1171,13 @@ private MdOverride CreateOverride(
11701171 SemanticModel semanticModel ,
11711172 OverrideMeta @override ,
11721173 ParameterSyntax contextParameter ,
1174+ ISymbol ? contextSymbol ,
11731175 ILocalVariableRenamingRewriter localVariableRenamingRewriter ,
11741176 out bool hasContextTag )
11751177 {
11761178 hasContextTag = false ;
11771179 var invocation = @override . Expression ;
1178- if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter ) )
1180+ if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter , contextSymbol ) )
11791181 {
11801182 return default ;
11811183 }
@@ -1282,11 +1284,12 @@ private MdInitializer CreateInitializer(
12821284 ITypeSymbol resultType ,
12831285 FactoryMeta meta ,
12841286 ParameterSyntax contextParameter ,
1287+ ISymbol ? contextSymbol ,
12851288 ref bool hasContextTag ,
12861289 ILocalVariableRenamingRewriter localVariableRenamingRewriter )
12871290 {
12881291 var invocation = meta . Expression ;
1289- if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter ) )
1292+ if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter , contextSymbol ) )
12901293 {
12911294 return default ;
12921295 }
@@ -1301,7 +1304,7 @@ private MdInitializer CreateInitializer(
13011304 // ReSharper disable once LoopCanBeConvertedToQuery
13021305 foreach ( var @override in meta . Overrides )
13031306 {
1304- var mdOverride = CreateOverride ( semanticModel , @override , contextParameter , localVariableRenamingRewriter , out hasContextTag ) ;
1307+ var mdOverride = CreateOverride ( semanticModel , @override , contextParameter , contextSymbol , localVariableRenamingRewriter , out hasContextTag ) ;
13051308 if ( mdOverride != default )
13061309 {
13071310 overrides . Add ( mdOverride ) ;
@@ -1322,11 +1325,12 @@ private MdResolver CreateResolver(
13221325 ITypeSymbol resultType ,
13231326 FactoryMeta meta ,
13241327 ParameterSyntax contextParameter ,
1328+ ISymbol ? contextSymbol ,
13251329 ref bool hasContextTag ,
13261330 ILocalVariableRenamingRewriter localVariableRenamingRewriter )
13271331 {
13281332 var invocation = meta . Expression ;
1329- if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter ) )
1333+ if ( ! IsContextInvocation ( semanticModel , invocation , contextParameter , contextSymbol ) )
13301334 {
13311335 return default ;
13321336 }
@@ -1340,7 +1344,7 @@ private MdResolver CreateResolver(
13401344 // ReSharper disable once LoopCanBeConvertedToQuery
13411345 foreach ( var overrideInvocation in meta . Overrides )
13421346 {
1343- var mdOverride = CreateOverride ( semanticModel , overrideInvocation , contextParameter , localVariableRenamingRewriter , out hasContextTag ) ;
1347+ var mdOverride = CreateOverride ( semanticModel , overrideInvocation , contextParameter , contextSymbol , localVariableRenamingRewriter , out hasContextTag ) ;
13441348 if ( mdOverride != default )
13451349 {
13461350 overrides . Add ( mdOverride ) ;
@@ -1407,7 +1411,8 @@ private MdResolver CreateResolver(
14071411 private static bool IsContextInvocation (
14081412 SemanticModel semanticModel ,
14091413 InvocationExpressionSyntax invocation ,
1410- ParameterSyntax contextParameter )
1414+ ParameterSyntax contextParameter ,
1415+ ISymbol ? contextSymbol )
14111416 {
14121417 if ( invocation . Expression is not MemberAccessExpressionSyntax
14131418 {
@@ -1432,7 +1437,6 @@ private static bool IsContextInvocation(
14321437 return false ;
14331438 }
14341439
1435- var contextSymbol = semanticModel . GetDeclaredSymbol ( contextParameter ) ;
14361440 if ( contextSymbol is null )
14371441 {
14381442 return false ;
@@ -1521,23 +1525,44 @@ private void NotSupported(SyntaxNode source) =>
15211525
15221526 private IReadOnlyList < T > BuildConstantArgs < T > (
15231527 SemanticModel semanticModel ,
1524- SeparatedSyntaxList < ArgumentSyntax > args ) =>
1525- args
1526- . SelectMany ( a => semantic . GetConstantValues < T > ( semanticModel , a . Expression ) . Select ( value => ( value , a . Expression ) ) )
1527- . Select ( a => a . value ?? throw new CompileErrorException (
1528- string . Format ( Strings . Error_Template_MustBeValueOfType , a . Expression , typeof ( T ) ) ,
1529- ImmutableArray . Create ( locationProvider . GetLocation ( a . Expression ) ) ,
1530- LogId . ErrorMustBeValueOfType ,
1531- nameof ( Strings . Error_Template_MustBeValueOfType ) ) )
1532- . ToList ( ) ;
1528+ SeparatedSyntaxList < ArgumentSyntax > args )
1529+ {
1530+ var values = new List < T > ( args . Count ) ;
1531+ foreach ( var arg in args )
1532+ {
1533+ foreach ( var value in semantic . GetConstantValues < T > ( semanticModel , arg . Expression ) )
1534+ {
1535+ if ( value is null )
1536+ {
1537+ throw new CompileErrorException (
1538+ string . Format ( Strings . Error_Template_MustBeValueOfType , arg . Expression , typeof ( T ) ) ,
1539+ ImmutableArray . Create ( locationProvider . GetLocation ( arg . Expression ) ) ,
1540+ LogId . ErrorMustBeValueOfType ,
1541+ nameof ( Strings . Error_Template_MustBeValueOfType ) ) ;
1542+ }
1543+
1544+ values . Add ( value ) ;
1545+ }
1546+ }
1547+
1548+ return values ;
1549+ }
15331550
15341551 private ImmutableArray < MdTag > BuildTags (
15351552 SemanticModel semanticModel ,
1536- IEnumerable < ArgumentSyntax > args ) =>
1537- args
1538- . SelectMany ( t => semantic . GetConstantValues < object > ( semanticModel , t . Expression , SmartTagKind . Tag ) )
1539- . Select ( ( tag , i ) => new MdTag ( i , tag ) )
1540- . ToImmutableArray ( ) ;
1553+ IEnumerable < ArgumentSyntax > args )
1554+ {
1555+ var tags = new List < MdTag > ( ) ;
1556+ foreach ( var arg in args )
1557+ {
1558+ foreach ( var tag in semantic . GetConstantValues < object > ( semanticModel , arg . Expression , SmartTagKind . Tag ) )
1559+ {
1560+ tags . Add ( new MdTag ( tags . Count , tag ) ) ;
1561+ }
1562+ }
1563+
1564+ return tags . ToImmutableArray ( ) ;
1565+ }
15411566
15421567 private static CompositionName CreateCompositionName (
15431568 string name ,
@@ -1548,9 +1573,18 @@ private static CompositionName CreateCompositionName(
15481573 string newNamespace ;
15491574 if ( ! string . IsNullOrWhiteSpace ( name ) )
15501575 {
1551- var compositionTypeNameParts = name . Split ( TypeNamePartsSeparators , StringSplitOptions . RemoveEmptyEntries ) ;
1552- className = compositionTypeNameParts . Last ( ) ;
1553- newNamespace = string . Join ( "." , compositionTypeNameParts . Take ( compositionTypeNameParts . Length - 1 ) ) . Trim ( ) ;
1576+ var trimmedName = name . Trim ( ) ;
1577+ var separatorIndex = trimmedName . LastIndexOf ( '.' ) ;
1578+ if ( separatorIndex >= 0 )
1579+ {
1580+ className = separatorIndex + 1 < trimmedName . Length ? trimmedName [ ( separatorIndex + 1 ) ..] : "" ;
1581+ newNamespace = separatorIndex > 0 ? trimmedName [ ..separatorIndex ] : "" ;
1582+ }
1583+ else
1584+ {
1585+ className = trimmedName ;
1586+ newNamespace = "" ;
1587+ }
15541588 }
15551589 else
15561590 {
0 commit comments