public override Tuple <ICollection <IDeclaredElement>, bool> GetNavigateToTargets(IDeclaredElement element) { if (element is ResolvedFSharpSymbolElement resolvedSymbolElement && resolvedSymbolElement.Symbol is FSharpActivePatternCase activePatternCase) { var activePattern = activePatternCase.Group; var entityOption = activePattern.DeclaringEntity; var patternNameOption = activePattern.Name; if (entityOption == null || patternNameOption == null) { return(null); } var typeElement = FSharpElementsUtil.GetTypeElement(entityOption.Value, resolvedSymbolElement.Module); var pattern = typeElement.EnumerateMembers(patternNameOption.Value, true).FirstOrDefault() as IDeclaredElement; if (pattern is IFSharpTypeMember) { if (!(pattern.GetDeclarations().FirstOrDefault() is IFSharpDeclaration patternDecl)) { return(null); } var caseElement = patternDecl.GetActivePatternByIndex(activePatternCase.Index); if (caseElement != null) { return(CreateTarget(caseElement)); } } else if (pattern != null) { return(CreateTarget(pattern)); } } if (element is IFSharpGeneratedFromOtherElement generated && generated.OriginElement is IDeclaredElement origin) { return(CreateTarget(origin)); } if (!(element is IFSharpTypeMember fsTypeMember) || fsTypeMember.CanNavigateTo) { return(null); } return(fsTypeMember.GetContainingType() is IDeclaredElement containingType ? CreateTarget(containingType) : null); }
public Tuple <ICollection <IDeclaredElement>, bool> GetNavigateToTargets(IDeclaredElement element) { // todo: for union cases navigate to case declarations var resolvedSymbolElement = element as ResolvedFSharpSymbolElement; if (resolvedSymbolElement?.Symbol is FSharpActivePatternCase activePatternCase) { var activePattern = activePatternCase.Group; var entityOption = activePattern.DeclaringEntity; var patternNameOption = activePattern.Name; if (entityOption == null || patternNameOption == null) { return(null); } var typeElement = FSharpElementsUtil.GetTypeElement(entityOption.Value, resolvedSymbolElement.Module); var pattern = typeElement.EnumerateMembers(patternNameOption.Value, true).FirstOrDefault() as IDeclaredElement; if (pattern is IFSharpTypeMember) { var patternDecl = pattern.GetDeclarations().FirstOrDefault(); if (patternDecl == null) { return(null); } var caseElement = FSharpImplUtil.GetActivePatternByIndex(patternDecl, activePatternCase.Index); if (caseElement != null) { return(Tuple.Create(new[] { caseElement }.AsCollection(), false)); } } else if (pattern != null) { return(Tuple.Create(new[] { pattern }.AsCollection(), false)); } } if (!(element is IFSharpTypeMember fsTypeMember) || fsTypeMember.IsVisibleFromFSharp) { return(null); } return(fsTypeMember.GetContainingType() is IDeclaredElement containingType ? Tuple.Create(new[] { containingType }.AsCollection(), false) : null); }