I am using the ReSharper to re-factor my code. When I try to move a block of code to the method, I get the following warning:
The extracted code has multiple entry points
Here is the method signature I am planning to use:
private void GetRatePlanComponents(ProductPlan productPlan,
ProductRatePlan productRatePlan)
I searched the web to understand what does it mean. But didn't have much luck. Would someone explain it?
For your reference, here is the code snippet I am trying to move to a separate method:
QueryResult productRatePlanChargeQueryResult =
_zuoraService.query(string.Format(@"select Id, Name, IncludedUnits from
ProductRatePlanCharge where ProductRatePlanId = '{0}' and
ChargeModel = 'Overage Pricing'", productRatePlan.Id));
if (productRatePlanChargeQueryResult.size > 0)
{
foreach (ProductRatePlanCharge productRatePlanCharge
in productRatePlanChargeQueryResult.records)
{
string numberOfUnits = productRatePlanCharge.IncludedUnits.ToString();
if (productRatePlanCharge.Name.Equals("Users"))
{
productPlan.NumberofUsers = numberOfUnits;
}
else if (productRatePlanCharge.Name.Equals("Projects"))
{
productPlan.NumberofProjects = numberOfUnits;
}
else if (productRatePlanCharge.Name.Equals("Storage"))
{
decimal volumeOfStorage;
if (decimal.TryParse(productRatePlanCharge.IncludedUnits.ToString(),
out volumeOfStorage))
{
if (volumeOfStorage < 1) volumeOfStorage *= 1000;
productPlan.VolumeofStorage = volumeOfStorage.ToString();
}
else
{
productPlan.VolumeofStorage = numberOfUnits;
}
}
}
}
}
It looks like you may have encountered a known issue:
public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile ) { var targetPath = FileSystemPath.Empty; var projectFile = sourceFile.ToProjectFile(); if (projectFile != null) targetPath = projectFile.Location; foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath)) yield return holder; foreach(var holder in GetHoldersInFile(sourceFile, targetPath)) yield return holder; }
Select both foreach-loops and extract method. It gives strange warning that the fragment has multiple entry points (??!) and results in the following code:
public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile ) { var targetPath = FileSystemPath.Empty; var projectFile = sourceFile.ToProjectFile(); if (projectFile != null) targetPath = projectFile.Location; foreach(var tagPrefixHolder in Foo(sourceFile, targetPath)) yield return tagPrefixHolder; } private static IEnumerable<ITagPrefixHolder> Foo(IPsiSourceFile sourceFile, FileSystemPath targetPath) { foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath)) yield return holder; foreach(var holder in GetHoldersInFile(sourceFile, targetPath)) yield return holder; }
It would be better to replace generated foreach with simple return
Foo(sourceFile, targetPath);
.
I have seen ReSharper do this same thing when the code I was trying to extract had a couple of throw statements.
You can do what I did in that case--systematically comment out one line at a time until you find the one that ReSharper trips over. Then you can extract the method and uncomment the line afterwards.
Or you can just refactor it by hand.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With