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>()); }
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()); }
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(); }