private static IClrDeclaredElement FindLocalDeclaration([NotNull] FSharpMemberOrFunctionOrValue mfv,
                                                                [CanBeNull] FSharpIdentifierToken referenceOwnerToken)
        {
            var fsFile   = referenceOwnerToken?.GetContainingFile() as IFSharpFile;
            var document = fsFile?.GetSourceFile()?.Document;

            if (document == null)
            {
                return(null);
            }

            var idToken = fsFile.FindTokenAt(document.GetTreeEndOffset(mfv.DeclarationLocation) - 1);

            return(idToken?.GetContainingNode <LocalDeclaration>());
        }
Example #2
0
        public static string[] GetQualifiersAndName(this FSharpIdentifierToken token)
        {
            if (!(token.Parent is ILongIdentifier longIdentifier))
            {
                return new[] { FSharpNamesUtil.RemoveBackticks(token.GetText()) }
            }
            ;

            var names = new FrugalLocalHashSet <string>();

            foreach (var id in longIdentifier.IdentifiersEnumerable)
            {
                names.Add(FSharpNamesUtil.RemoveBackticks(id.GetText()));

                if (id == token)
                {
                    break;
                }
            }
            return(names.ToArray());
        }
Example #3
0
        public static IDeclaredElement GetDeclaredElement([CanBeNull] FSharpSymbol symbol,
                                                          [NotNull] IPsiModule psiModule, [CanBeNull] FSharpIdentifierToken referenceOwnerToken = null)
        {
            if (symbol == null)
            {
                return(null);
            }

            if (symbol is FSharpEntity entity)
            {
                if (entity.IsUnresolved)
                {
                    return(null);
                }
                return(entity.IsNamespace
          ? GetDeclaredNamespace(entity, psiModule)
          : GetTypeElement(entity, psiModule));
            }

            if (symbol is FSharpMemberOrFunctionOrValue mfv)
            {
                if (mfv.IsUnresolved)
                {
                    return(null);
                }

                if (!mfv.IsModuleValueOrMember)
                {
                    return(FindDeclaration <LocalDeclaration>(mfv.DeclarationLocation, referenceOwnerToken));
                }

                var memberEntity = mfv.IsModuleValueOrMember ? mfv.DeclaringEntity : null;
                if (memberEntity == null)
                {
                    return(null);
                }

                if (mfv.IsImplicitConstructor)
                {
                    return(GetDeclaredElement(memberEntity.Value, psiModule, referenceOwnerToken));
                }

                var typeElement = GetTypeElement(memberEntity.Value, psiModule);
                if (typeElement == null)
                {
                    return(null);
                }

                var members = mfv.IsConstructor
          ? typeElement.Constructors.AsList <ITypeMember>()
          : typeElement.EnumerateMembers(mfv.GetMemberCompiledName(), true).AsList();

                switch (members.Count)
                {
                case 0:
                    return(null);

                case 1:
                    return(members[0]);
                }

                var mfvXmlDocId = GetXmlDocId(mfv);
                return(members.FirstOrDefault(m => m.XMLDocId == mfvXmlDocId));
            }

            if (symbol is FSharpUnionCase unionCase)
            {
                if (unionCase.IsUnresolved)
                {
                    return(null);
                }

                var unionType = unionCase.ReturnType;
                Assertion.AssertNotNull(unionType, "unionType != null");
                var unionTypeElement = GetTypeElement(unionType.TypeDefinition, psiModule);
                if (unionTypeElement == null)
                {
                    return(null);
                }

                var caseMember = unionTypeElement.EnumerateMembers(unionCase.CompiledName, true).FirstOrDefault();
                if (caseMember != null)
                {
                    return(caseMember);
                }

                var newCaseMember = unionTypeElement.EnumerateMembers("New" + unionCase.CompiledName, true).FirstOrDefault();
                if (newCaseMember != null)
                {
                    return(newCaseMember);
                }

                var unionClrName     = unionTypeElement.GetClrName();
                var caseDeclaredType = TypeFactory.CreateTypeByCLRName(unionClrName + "+" + unionCase.CompiledName, psiModule);
                return(caseDeclaredType.GetTypeElement());
            }

            if (symbol is FSharpField field && !field.IsUnresolved)
            {
                return(GetTypeElement(field.DeclaringEntity, psiModule)?.EnumerateMembers(field.Name, true).FirstOrDefault());
            }

            if (symbol is FSharpActivePatternCase activePatternCase)
            {
                return
                    (activePatternCase.Group.DeclaringEntity != null
          ? new ResolvedFSharpSymbolElement(activePatternCase, referenceOwnerToken)
          : FindDeclaration <ActivePatternCaseDeclaration>(activePatternCase.DeclarationLocation, referenceOwnerToken)?.DeclaredElement);
            }

            return(null);
        }
 public ResolvedFSharpSymbolElement(FSharpSymbol symbol, FSharpIdentifierToken referenceOwnerToken)
 {
     Symbol        = symbol;
     Module        = referenceOwnerToken.GetPsiModule();
     myPsiServices = referenceOwnerToken.GetPsiServices();
 }