Skip to content

Commit 85e7319

Browse files
maca88hazzik
authored andcommitted
generating only relevant tests
1 parent 2181c75 commit 85e7319

File tree

523 files changed

+1032
-33036
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

523 files changed

+1032
-33036
lines changed

src/NHibernate.AsyncGenerator/DocumentInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ public MethodInfo GetOrCreateMethodInfo(IMethodSymbol symbol)
109109
return GetNamespaceInfo(symbol, true).GetTypeInfo(symbol, true).GetMethodInfo(symbol, true);
110110
}
111111

112-
public MethodInfo GetOrCreateMethodInfo(MethodDeclarationSyntax node)
112+
public MethodInfo GetOrCreateMethodInfo(MethodDeclarationSyntax node, bool lazyCreate)
113113
{
114-
return GetNamespaceInfo(node, true).GetTypeInfo(node, true).GetMethodInfo(node, true);
114+
return GetNamespaceInfo(node, true).GetTypeInfo(node, true).GetMethodInfo(node, true, lazyCreate);
115115
}
116116

117117
public MethodInfo GetMethodInfo(IMethodSymbol symbol)

src/NHibernate.AsyncGenerator/DocumentWriter.cs

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,20 @@ private BlockSyntax AsyncLockBlock(BlockSyntax block)
100100
);
101101
}
102102

103-
private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyzeResult analyzeResult)
103+
private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo)
104104
{
105+
// TODO: if a method cannot be converted to async we should not convert dependencies too
106+
if (!methodInfo.CanBeAsnyc && !methodInfo.Dependencies.Any() && !methodInfo.Missing)
107+
{
108+
if (methodInfo.TypeInfo.TypeTransformation == TypeTransformation.Partial)
109+
{
110+
return null;
111+
}
112+
return methodInfo.Node;
113+
}
114+
105115
var taskConflict = !DocumentInfo.ProjectInfo.IsNameUniqueInsideNamespace(methodInfo.TypeInfo.NamespaceInfo.Symbol, "Task");
106-
if (!analyzeResult.HasBody)
116+
if (!methodInfo.HasBody)
107117
{
108118
return methodInfo.Node
109119
.WithoutAttribute("Async")
@@ -136,8 +146,8 @@ private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyz
136146
}
137147

138148
var referenceAnnotations = new Dictionary<string, MethodReferenceResult>();
139-
foreach (var referenceResult in analyzeResult.ReferenceResults
140-
.Where(o => o.CanBeAsync))
149+
foreach (var referenceResult in methodInfo.ReferenceResults
150+
.Where(o => !o.Ignore))
141151
{
142152
var reference = referenceResult.ReferenceLocation;
143153
var startSpan = reference.Location.SourceSpan.Start - methodInfo.Node.Span.Start;
@@ -180,7 +190,7 @@ private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyz
180190
continue;
181191
}
182192

183-
if (analyzeResult.CanSkipAsync)
193+
if (methodInfo.CanSkipAsync)
184194
{
185195
// return task instead of awaiting
186196
if (referenceResult.UsedAsReturnValue)
@@ -254,8 +264,8 @@ private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyz
254264
}
255265

256266
if (methodInfo.TypeInfo.ParentTypeInfo?.TypeTransformation != TypeTransformation.NewType &&
257-
methodInfo.TypeInfo.TypeTransformation != TypeTransformation.NewType &&
258-
!analyzeResult.CanBeAsnyc && !analyzeResult.IsEmpty) // forward call
267+
methodInfo.TypeInfo.TypeTransformation != TypeTransformation.NewType &&
268+
!methodInfo.CanBeAsnyc && !methodInfo.IsEmpty) // forward call
259269
{
260270
var name = methodInfo.Node.TypeParameterList != null
261271
? GenericName(methodInfo.Node.Identifier.ValueText)
@@ -282,20 +292,20 @@ private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyz
282292
methodNode = methodNode.WithBody(Block(ReturnStatement(invocation)));
283293
}
284294
}
285-
else if (analyzeResult.Yields)
295+
else if (methodInfo.HasYields)
286296
{
287297
var yieldRewriter = new YieldToAsyncMethodRewriter();
288298
methodNode = (MethodDeclarationSyntax)yieldRewriter.VisitMethodDeclaration(methodNode);
289299
}
290300

291-
if (!analyzeResult.CanBeAsnyc || analyzeResult.CanSkipAsync || analyzeResult.Yields)
301+
if (!methodInfo.CanBeAsnyc || methodInfo.CanSkipAsync || methodInfo.HasYields)
292302
{
293303
var taskRewriter = new ReturnTaskMethodRewriter(Configuration.Async.CustomTaskType);
294304
methodNode = (MethodDeclarationSyntax)taskRewriter.VisitMethodDeclaration(methodNode);
295305
}
296306

297307
// check if method must run synhronized
298-
if (analyzeResult.MustRunSynchronized)
308+
if (methodInfo.MustRunSynchronized)
299309
{
300310
methodNode = methodNode
301311
.WithBody(AsyncLockBlock(methodNode.Body))
@@ -306,15 +316,52 @@ private MethodDeclarationSyntax RewiteMethod(MethodInfo methodInfo, MethodAnalyz
306316
.ReturnAsTask(methodInfo.Symbol, taskConflict)
307317
.WithIdentifier(Identifier(methodNode.Identifier.Value + "Async"));
308318

309-
if (analyzeResult.MustRunSynchronized || (!analyzeResult.CanSkipAsync && !analyzeResult.Yields && analyzeResult.CanBeAsnyc))
319+
if (methodInfo.MustRunSynchronized || (!methodInfo.CanSkipAsync && !methodInfo.HasYields && methodInfo.CanBeAsnyc))
310320
{
311321
methodNode = methodNode.AddAsync(methodNode);
312322
}
313-
return methodNode
314-
.WithLeadingTrivia(methodInfo.Node.GetLeadingTrivia())
323+
324+
return RemoveLeadingRegions(methodNode.WithLeadingTrivia(methodInfo.Node.GetLeadingTrivia()))
315325
.WithTrailingTrivia(methodInfo.Node.GetTrailingTrivia());
316326
}
317327

328+
private SyntaxTriviaList RemoveRegions(SyntaxTriviaList list)
329+
{
330+
var toRemove = new List<int>();
331+
for (var i = list.Count - 1; i >= 0; i--)
332+
{
333+
var trivia = list[i];
334+
if (trivia.IsKind(SyntaxKind.RegionDirectiveTrivia) || trivia.IsKind(SyntaxKind.EndRegionDirectiveTrivia))
335+
{
336+
toRemove.Add(i);
337+
}
338+
}
339+
while (toRemove.Count > 0)
340+
{
341+
list = list.RemoveAt(toRemove[0]);
342+
toRemove.RemoveAt(0);
343+
}
344+
return list;
345+
}
346+
347+
private T RemoveLeadingRegions<T>(T memberNode) where T : MemberDeclarationSyntax
348+
{
349+
// remove all regions as not all methods will be written in the type
350+
var leadingTrivia = memberNode.GetLeadingTrivia();
351+
memberNode = memberNode.WithLeadingTrivia(RemoveRegions(leadingTrivia));
352+
353+
var baseTypeNode = memberNode as BaseTypeDeclarationSyntax;
354+
if (baseTypeNode == null)
355+
{
356+
return memberNode;
357+
}
358+
return memberNode
359+
.ReplaceToken(
360+
baseTypeNode.CloseBraceToken,
361+
baseTypeNode.CloseBraceToken
362+
.WithLeadingTrivia(RemoveRegions(baseTypeNode.CloseBraceToken.LeadingTrivia)));
363+
}
364+
318365
private class RewrittenNode
319366
{
320367
public SyntaxNode Original { get; set; }
@@ -353,7 +400,6 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
353400
var startRootTypeSpan = rootTypeInfo.Node.SpanStart;
354401

355402
rootTypeNode = rootTypeNode.WithoutTrivia(); // references have spans without trivia
356-
var leadingTrivia = rootTypeInfo.Node.GetLeadingTrivia();
357403

358404
// we first need to annotate nodes that will be modified in order to find them later on. We cannot rely on spans after the first modification as they will change
359405
var typeInfoMetadatas = new Dictionary<TypeInfo, TypeInfoMetadata>();
@@ -415,7 +461,7 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
415461

416462

417463
// process methods
418-
foreach (var methodInfo in typeInfo.MethodInfos.Values.Where(o => !o.Ignore))
464+
foreach (var methodInfo in typeInfo.MethodInfos.Values)
419465
{
420466
var methodSpanStart = methodInfo.Node.SpanStart - startRootTypeSpan;
421467
var methodSpanLength = methodInfo.Node.Span.Length;
@@ -425,27 +471,25 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
425471
annotation = Guid.NewGuid().ToString();
426472
rootTypeNode = rootTypeNode.ReplaceNode(methodNode, methodNode.WithAdditionalAnnotations(new SyntaxAnnotation(annotation)));
427473

428-
var methodAnalyzeResult = methodInfo.PostAnalyzeResult;
429-
if (!methodAnalyzeResult.IsValid)
430-
{
431-
continue;
432-
}
433-
var removeNode = false;
474+
var removeNode = methodInfo.Ignore;
475+
476+
//TODO: REMOVE THIS
477+
/*
434478
if (typeInfo.TypeTransformation == TypeTransformation.NewType &&
435-
methodAnalyzeResult.ReferenceResults.Any(o => !o.CanBeAsync && o.DeclaredWithinSameType))
479+
methodInfo.ReferenceResults.Any(o => !o.CanBeAsync && o.DeclaredWithinSameType))
436480
{
437481
//TODO: handle dependencies and methods from other types
438482
removeNode = true;
439-
}
483+
}*/
440484

441-
metadata.TaskUsed |= methodAnalyzeResult.CanSkipAsync || methodAnalyzeResult.IsEmpty || methodAnalyzeResult.Yields || !methodAnalyzeResult.CanBeAsnyc;
485+
metadata.TaskUsed |= methodInfo.CanSkipAsync || methodInfo.IsEmpty || methodInfo.HasYields || !methodInfo.CanBeAsnyc;
442486
result.TaskUsed |= metadata.TaskUsed;
443-
metadata.AsyncLockUsed |= methodAnalyzeResult.MustRunSynchronized;
487+
metadata.AsyncLockUsed |= methodInfo.MustRunSynchronized;
444488
result.AsyncLockUsed |= metadata.AsyncLockUsed;
445489
metadata.RewrittenNodes.Add(new RewrittenNode
446490
{
447491
Original = methodNode,
448-
Rewritten = removeNode ? null : RewiteMethod(methodInfo, methodAnalyzeResult),
492+
Rewritten = removeNode ? null : RewiteMethod(methodInfo),
449493
MethodInfo = methodInfo,
450494
Annotation = annotation
451495
});
@@ -473,7 +517,7 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
473517
{
474518
// replace all rewritten nodes
475519
foreach (var rewNode in metadata.RewrittenNodes
476-
.Where(o => o.MethodInfo == null || (!o.MethodInfo.Missing && !o.MethodInfo.IsRequired))
520+
.Where(o => o.MethodInfo == null || (!o.MethodInfo.Missing /*&& !o.MethodInfo.HasRequiredExternalMethods()*/))
477521
.OrderByDescending(o => o.Original.SpanStart))
478522
{
479523
var node = rootTypeNode.GetAnnotatedNodes(rewNode.Annotation).First();
@@ -488,9 +532,11 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
488532
}
489533
// add missing members
490534
var typeNode = rootTypeNode.GetAnnotatedNodes(metadata.NodeAnnotation).OfType<TypeDeclarationSyntax>().First();
535+
491536
rootTypeNode = rootTypeNode.ReplaceNode(typeNode, typeNode.WithMembers(
492-
typeNode.Members.AddRange(
493-
metadata.RewrittenNodes
537+
typeNode.Members.Select(RemoveLeadingRegions).ToSyntaxList()
538+
.AddRange(
539+
metadata.RewrittenNodes
494540
.OrderBy(o => o.Original.SpanStart)
495541
.Where(o => o.MethodInfo != null && o.MethodInfo.Missing)
496542
.Select(o => o.Rewritten)
@@ -509,7 +555,7 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
509555
// rename all constructors
510556
if (typeInfo.TypeTransformation == TypeTransformation.NewType)
511557
{
512-
while(true)
558+
while (true)
513559
{
514560
var ctorNode = rootTypeNode.DescendantNodes()
515561
.OfType<ConstructorDeclarationSyntax>()
@@ -527,11 +573,13 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
527573
var typeNode = rootTypeNode.GetAnnotatedNodes(metadata.NodeAnnotation).OfType<TypeDeclarationSyntax>().First();
528574
var newNodes = (onlyMissingMembers
529575
? metadata.RewrittenNodes
576+
.Where(o => o.Rewritten != null)
530577
.Where(o => o.MethodInfo != null && o.MethodInfo.Missing)
531578
.OrderBy(o => o.Original.SpanStart)
532579
.Select(o => o.Rewritten)
533580
: metadata.RewrittenNodes
534-
.Where(o => o.MethodInfo == null || (o.MethodInfo != null && (!o.MethodInfo.IsRequired || o.MethodInfo.Missing))) // for partials we wont have onlyMissingMembers = true
581+
.Where(o => o.Rewritten != null)
582+
.Where(o => o.MethodInfo == null || (o.MethodInfo != null && (!o.MethodInfo.HasRequiredExternalMethods() || o.MethodInfo.Missing))) // for partials we wont have onlyMissingMembers = true
535583
.OrderBy(o => o.Original.SpanStart)
536584
.Select(o => o.Rewritten))
537585
.Union(typeNode.DescendantNodes().OfType<TypeDeclarationSyntax>())
@@ -552,11 +600,12 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
552600
.Any(n => n.AttributeLists.Any(o => o.Attributes.Any(a => a.Name.ToString().EndsWith("GeneratedCode"))))
553601
? newTypeNode.WithoutAttributes()
554602
: newTypeNode.AddGeneratedCodeAttribute(false);
603+
/*
555604
newTypeNode = newTypeNode.RemoveNodes(
556605
newTypeNode.DescendantNodes(descendIntoTrivia: true).OfType<DirectiveTriviaSyntax>(), SyntaxRemoveOptions.KeepNoTrivia); // remove invalid #endregion
557-
606+
*/
558607
rootTypeNode = rootTypeNode
559-
.ReplaceNode(typeNode, newTypeNode);
608+
.ReplaceNode(typeNode, RemoveLeadingRegions(newTypeNode));
560609
}
561610
}
562611

@@ -569,7 +618,8 @@ private RewriteTypeResult RewriteType(TypeInfo rootTypeInfo, bool onlyMissingMem
569618
}
570619
}
571620

572-
result.Node = rootTypeNode
621+
// remove all regions as not all methods will be written in the type
622+
result.Node = RemoveLeadingRegions(rootTypeNode);
573623
/*.WithTriviaFrom(rootTypeInfo.Node)*/;
574624
return result;
575625
}
@@ -592,6 +642,11 @@ public void Write()
592642
var typeNodes = new List<MemberDeclarationSyntax>();
593643
foreach (var typeInfo in namespaceInfo.Values.Where(o => o.TypeTransformation != TypeTransformation.None).OrderBy(o => o.Node.SpanStart))
594644
{
645+
if (typeInfo.CanIgnore())
646+
{
647+
continue;
648+
}
649+
595650
var rewriteResult = RewriteType(typeInfo);
596651
if (rewriteResult.Node == null)
597652
{

src/NHibernate.AsyncGenerator/Extensions/SymbolExtensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,17 @@ public static List<INamedTypeSymbol> GetAllBaseTypes(this INamedTypeSymbol type)
434434
return bases;
435435
}
436436

437+
public static IEnumerable<INamedTypeSymbol> EnumerateBaseTypesAndSelf(this INamedTypeSymbol type)
438+
{
439+
yield return type;
440+
var currType = type.BaseType;
441+
while (currType != null)
442+
{
443+
yield return currType;
444+
currType = currType.BaseType;
445+
}
446+
}
447+
437448

438449
public static async Task<ISymbol> FindApplicableAlias(this ITypeSymbol type, int position, SemanticModel semanticModel, CancellationToken cancellationToken)
439450
{

src/NHibernate.AsyncGenerator/MethodAnalyzeResult.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ public class MethodAnalyzeResult
1212

1313
public HashSet<MethodReferenceResult> ReferenceResults { get; } = new HashSet<MethodReferenceResult>();
1414

15-
public bool CanBeCompletelyAsync => CanBeAsnyc && ReferenceResults.All(o => o.CanBeAsync);
16-
17-
public bool CanBeAsnyc { get; internal set; }
15+
//public bool CanBeCompletelyAsync => CanBeAsnyc && ReferenceResults.All(o => o.CanBeAsync);
1816

1917
public bool CanSkipAsync { get; internal set; }
2018

0 commit comments

Comments
 (0)