public override void VisitFSharpFile(IFSharpFile fsFile) { var sourceFile = fsFile.GetSourceFile(); if (sourceFile == null) { return; } var fileKind = GetFSharpFileKind(fsFile); var hasPairFile = myCheckerService.HasPairFile(sourceFile); Builder.CreateProjectFilePart(new FSharpProjectFilePart(sourceFile, fileKind, hasPairFile)); foreach (var declaration in fsFile.DeclarationsEnumerable) { var qualifiers = declaration.LongIdentifier.Qualifiers; foreach (var qualifier in qualifiers) { var qualifierName = qualifier.GetText().RemoveBackticks(); Builder.StartPart(new QualifiedNamespacePart(qualifier.GetTreeStartOffset(), Builder.Intern(qualifierName))); } declaration.Accept(this); foreach (var _ in qualifiers) { Builder.EndPart(); } } }
protected FSharpDaemonStageProcessBase(IFSharpFile fsFile, IDaemonProcess daemonProcess) { FSharpFile = fsFile; DaemonProcess = daemonProcess; ResolveContext = fsFile.GetResolveContext(); SeldomInterruptChecker = new SeldomInterruptCheckerWithCheckTime(InterruptCheckTime); }
public override void VisitFSharpFile(IFSharpFile fsFile) { fsFile.TokenBuffer = fsFile.ActualTokenBuffer; // todo: remove this when/if a proper lexer is implemented var sourceFile = fsFile.GetSourceFile(); var fileKind = GetFSharpFileKind(fsFile); var hasPairFile = myCheckerService.HasPairFile(sourceFile); Builder.CreateProjectFilePart(new FSharpProjectFilePart(sourceFile, fileKind, hasPairFile)); foreach (var declaration in fsFile.DeclarationsEnumerable) { var qualifiers = declaration.LongIdentifier.Qualifiers; foreach (var qualifier in qualifiers) { var qualifierName = qualifier.GetText().RemoveBackticks(); Builder.StartPart(new QualifiedNamespacePart(qualifier.GetTreeStartOffset(), Builder.Intern(qualifierName))); } declaration.Accept(this); foreach (var _ in qualifiers) { Builder.EndPart(); } } }
private static FSharpFileKind GetFSharpFileKind(IFSharpFile file) { if (file is IFSharpImplFile) { return(FSharpFileKind.ImplFile); } if (file is IFSharpSigFile) { return(FSharpFileKind.SigFile); } throw new ArgumentOutOfRangeException(); }
public override void VisitFSharpFile(IFSharpFile fsFile) { var sourceFile = fsFile.GetSourceFile(); if (sourceFile == null) { return; } var fileKind = GetFSharpFileKind(fsFile); var hasPairFile = myCheckerService.HasPairFile(sourceFile); Builder.CreateProjectFilePart(new FSharpProjectFilePart(sourceFile, fileKind, hasPairFile)); foreach (var declaration in fsFile.DeclarationsEnumerable) { declaration.Accept(this); } }
public static IEnumerable <IObjExpr> GetObjectExpressions(IFSharpFile fsFile, IPsiSourceFile sourceFile) { var tokens = fsFile.CachingLexer.TokenBuffer.CachedTokens; if (tokens == null) { return(EmptyList <IObjExpr> .Instance); } var objectExpressions = new List <IObjExpr>(); var seenLBrace = false; for (var i = 0; i < tokens.Count; i++) { var token = tokens[i]; var tokenType = token.Type; Assertion.Assert(tokenType != null, "tokenType != null"); if (tokenType.IsFiltered) { continue; } if (tokenType == FSharpTokenType.LBRACE) { seenLBrace = true; continue; } if (seenLBrace && tokenType == FSharpTokenType.NEW) { if (fsFile.FindNodeAt(new TreeOffset(token.Start)) is ITokenNode node && node.Parent is IObjExpr objExpr) { objectExpressions.Add(objExpr); } } seenLBrace = false; } return(objectExpressions); }
protected abstract IDaemonStageProcess CreateStageProcess([NotNull] IFSharpFile fsFile, IContextBoundSettingsStore settings, [NotNull] IDaemonProcess process);
protected abstract IDaemonStageProcess CreateProcess([NotNull] IFSharpFile fsFile, [NotNull] IDaemonProcess process);
public HighlightIdentifiersStageProcess([NotNull] IFSharpFile fsFile, [NotNull] IDaemonProcess process) : base(fsFile, process) => myDocument = process.Document;
protected override IDaemonStageProcess CreateStageProcess(IFSharpFile psiFile, IContextBoundSettingsStore settings, IDaemonProcess process) => new HighlightIdentifiersStageProcess(psiFile, process);
private static void AddUsagesRanges(FSharpSymbol symbol, HashSet <DocumentRange> ranges, FSharpCheckFileResults checkResults, IDocument document, IFSharpFile fsFile) { var isActivePatternCase = symbol is FSharpActivePatternCase; var isGreaterOp = symbol is FSharpMemberOrFunctionOrValue mfv && mfv.LogicalName == StandardOperatorNames.GreaterThan; var symbolUsages = checkResults?.GetUsesOfSymbolInFile(symbol).RunAsTask(); if (symbolUsages == null) { return; } foreach (var symbolUse in symbolUsages) { var treeOffset = document.GetTreeEndOffset(symbolUse.RangeAlternate); var usageToken = fsFile.FindTokenAt(treeOffset - 1); if (usageToken == null) { continue; } if (isActivePatternCase && symbolUse.IsFromDefinition) { if (!(symbolUse.Symbol is FSharpActivePatternCase useSymbol)) { continue; } if (useSymbol.DeclarationLocation.Equals(symbolUse.RangeAlternate)) { var caseDeclaration = usageToken.GetContainingNode <IActivePatternId>()?.Cases[useSymbol.Index]; if (caseDeclaration != null) { ranges.Add(caseDeclaration.GetDocumentRange()); continue; } } } if (!(usageToken is FSharpIdentifierToken identToken)) { continue; } var tokenType = identToken.GetTokenType(); if ((tokenType == FSharpTokenType.GREATER || tokenType == FSharpTokenType.GREATER_RBRACK) && !isGreaterOp) { continue; // found usage of generic symbol with specified type parameter } ranges.Add(identToken.GetDocumentRange()); } }
private static FSharpFileKind GetFSharpFileKind(IFSharpFile file) => file switch {
protected override IDaemonStageProcess CreateProcess(IFSharpFile psiFile, IDaemonProcess process) => new HighlightIdentifiersStageProcess(psiFile, process);