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();
                }
            }
        }
Example #2
0
 protected FSharpDaemonStageProcessBase(IFSharpFile fsFile, IDaemonProcess daemonProcess)
 {
     FSharpFile             = fsFile;
     DaemonProcess          = daemonProcess;
     ResolveContext         = fsFile.GetResolveContext();
     SeldomInterruptChecker = new SeldomInterruptCheckerWithCheckTime(InterruptCheckTime);
 }
Example #3
0
        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();
                }
            }
        }
Example #4
0
 private static FSharpFileKind GetFSharpFileKind(IFSharpFile file)
 {
     if (file is IFSharpImplFile)
     {
         return(FSharpFileKind.ImplFile);
     }
     if (file is IFSharpSigFile)
     {
         return(FSharpFileKind.SigFile);
     }
     throw new ArgumentOutOfRangeException();
 }
Example #5
0
        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);
            }
        }
Example #6
0
        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);
Example #8
0
 protected abstract IDaemonStageProcess CreateProcess([NotNull] IFSharpFile fsFile,
                                                      [NotNull] IDaemonProcess process);
Example #9
0
 public HighlightIdentifiersStageProcess([NotNull] IFSharpFile fsFile, [NotNull] IDaemonProcess process)
     : base(fsFile, process) => myDocument = process.Document;
Example #10
0
 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());
            }
        }
Example #12
0
 private static FSharpFileKind GetFSharpFileKind(IFSharpFile file) =>
 file switch
 {
 protected override IDaemonStageProcess CreateProcess(IFSharpFile psiFile, IDaemonProcess process) =>
 new HighlightIdentifiersStageProcess(psiFile, process);