Skip to content

Commit f41ba05

Browse files
committed
Handle extension methods
1 parent e1c9987 commit f41ba05

File tree

5 files changed

+56
-2
lines changed

5 files changed

+56
-2
lines changed

CodeParser/Parser/Parser.Phase2.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ private void AnalyzeMethodDependencies(Solution solution, CodeElement methodElem
109109
AddTypeDependency(methodElement, methodSymbol.ReturnType, DependencyType.Uses);
110110
}
111111

112+
//if (methodSymbol.IsExtensionMethod)
113+
//{
114+
// // The first parameter of an extension method is the extended type
115+
// var extendedType = methodSymbol.Parameters[0].Type;
116+
// AddTypeDependency(methodElement, extendedType, DependencyType.Uses);
117+
//}
118+
112119
// If this method is an interface method or an abstract method, find its implementations
113120
if (methodSymbol.IsAbstract || methodSymbol.ContainingType.TypeKind == TypeKind.Interface)
114121
{
@@ -300,11 +307,16 @@ private void AddEventUsageDependency(CodeElement sourceElement, IEventSymbol eve
300307
}
301308
}
302309

303-
304310
private void AddCallsDependency(CodeElement sourceElement, IMethodSymbol methodSymbol, SourceLocation location)
305311
{
306312
//Trace.WriteLine($"Adding call dependency: {sourceElement.Name} -> {methodSymbol.Name}");
307313

314+
if (methodSymbol.IsExtensionMethod)
315+
{
316+
// Handle calls to extension methods
317+
methodSymbol = methodSymbol.ReducedFrom ?? methodSymbol;
318+
}
319+
308320
if (_symbolKeyToElementMap.TryGetValue(GetSymbolKey(methodSymbol), out var targetElement))
309321
{
310322
AddDependency(sourceElement, DependencyType.Calls, targetElement, [location]);
@@ -414,6 +426,8 @@ private void AddExternalDependency(CodeElement sourceElement, ITypeSymbol typeSy
414426
private void AnalyzeExpressionBody(CodeElement sourceElement, ArrowExpressionClauseSyntax expressionBody,
415427
SemanticModel semanticModel)
416428
{
429+
// TODO atr. Can we just call AnalyzeMethodBody?
430+
// The InvocationExpressionSyntax handles more cases here. But all other methods are also handled in AnalyzeMethodBody
417431
AnalyzeExpression(sourceElement, expressionBody.Expression, semanticModel);
418432
}
419433

CodeParserTests/CodeParserApprovalTests.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,13 @@ public void FindsAllFunctions()
7575
"CSharpLanguage.CSharpLanguage.PinSignalView.PinSignalViewAutomationPeer..ctor",
7676
"CSharpLanguage.CSharpLanguage.MissingInterface.BaseStorage.Load",
7777
"CSharpLanguage.CSharpLanguage.MissingInterface.IStorage.Load",
78-
"CSharpLanguage.CSharpLanguage.NS_Parent.NS_Child.ClassNsChild.Method"
78+
"CSharpLanguage.CSharpLanguage.NS_Parent.NS_Child.ClassNsChild.Method",
79+
80+
// Extension method
81+
"CSharpLanguage.CSharpLanguage.Extensions.Slice",
82+
83+
// Called by extension method
84+
"CSharpLanguage.CSharpLanguage.TheExtendedType.Do"
7985
};
8086

8187

SampleProject/CSharpLanguage/ClassUsingAnEvent.cs

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ void Init()
1515

1616
x.MyEvent2 += MyEventHandler2;
1717

18+
var foo = new TheExtendedType();
19+
foo.Slice(1, 2);
20+
21+
22+
Extensions.Slice(foo, 1, 2);
23+
1824

1925
}
2026

SampleProject/CSharpLanguage/CreatorOfGenericTypes.cs

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ void Create()
2020
{
2121
var x = new List<Project>();
2222
var y = new XmlFile<Project>();
23+
24+
2325
}
2426
}
2527
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Runtime.CompilerServices;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace CSharpLanguage
9+
{
10+
11+
public class TheExtendedType
12+
{
13+
public void Do()
14+
{
15+
16+
}
17+
}
18+
public static class Extensions
19+
{
20+
public static void Slice(this TheExtendedType s, int start, int length)
21+
{
22+
s.Do();
23+
}
24+
}
25+
26+
}

0 commit comments

Comments
 (0)